ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNGYxM2NmYi4uMmQ0ZjYzZiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTczNSw2ICs3MzUsOSBAQAogY3Jvc3M6ICQoQkFTRV9UQVJHRVRTKQogY29tcGlsZXI6ICQoZmlsdGVyIGNyb3NzX2NvbXBpbGVyLCQoQkFTRV9UQVJHRVRTKSkKIAordmVyc2lvbjoKKwkuL3N1cHBvcnQvc2NyaXB0cy92ZXJzaW9uLnNoCisKIHdoYXQtdGFyZ2V0czoKIAlAZWNobyAkKFRBUkdFVFMpCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZmRzX2RlZmNvbmZpZyBiL2NvbmZpZ3MvZmRzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQxYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9mZHNfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKK0JSMl94ODZfNjQ9eQorQlIyX0RMX0RJUj0iJHtUT1BESVJ9Ly4uL3ZlbmRvci9vcGVuc291cmNlL3RhcmJhbGxzIgorQlIyX0pMRVZFTD00OAorQlIyX0NDQUNIRT15CitCUjJfT1BUSU1JWkVfMj15CitCUjJfVE9PTENIQUlOX0VYVEVSTkFMPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfQ1VTVE9NPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfUEFUSD0iJHtUT1BESVJ9Ly4uL3Rvb2xjaGFpbnMva3ZtIgorQlIyX1RPT0xDSEFJTl9FWFRFUk5BTF9DVVNUT01fUFJFRklYPSJ4ODZfNjQtYnVpbGRyb290LWxpbnV4LWdudSIKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfQ1VTVE9NX0dMSUJDPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfQ1hYPXkKK0JSMl9FTkFCTEVfTE9DQUxFX1BVUkdFPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9TUEFDRUNBU1Q9eQorQlIyX1BBQ0tBR0VfR09PR0xFX1NQQUNFQ0FTVF9UQVJHRVQ9InNwYWNlY2FzdF9GRFMubWsiCisjIEJSMl9QQUNLQUdFX0JVU1lCT1ggaXMgbm90IHNldAorIyBCUjJfVEFSR0VUX1JPT1RGU19UQVIgaXMgbm90IHNldAorQlIyX1RBUkdFVF9HRU5FUklDX1BMQVRGT1JNX05BTUU9Imdmc2Nfbm9uZSIKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZ2ZsdDQwMF9kZWZjb25maWcgYi9jb25maWdzL2dmbHQ0MDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDUzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2dmbHQ0MDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTUgQEAKK0JSMl9hcm09eQorQlIyX2FybTkyNnQ9eQorQlIyX0dDQ19UQVJHRVRfVFVORT0ibWFydmVsbC1mIgorQlIyX0RMX0RJUj0iJHtUT1BESVJ9Ly4uL3ZlbmRvci9vcGVuc291cmNlL3RhcmJhbGxzIgorQlIyX0pMRVZFTD0xNQorQlIyX0NDQUNIRT15CitCUjJfVE9PTENIQUlOX0VYVEVSTkFMPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfQ1VTVE9NPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfUEFUSD0iJHtUT1BESVJ9Ly4uL3Rvb2xjaGFpbnMvcHJpc20iCitCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0NVU1RPTV9QUkVGSVg9ImFybS1tYXJ2ZWxsLWxpbnV4LXVjbGliY2dudWVhYmkiCitCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0xBUkdFRklMRT15CitCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0lORVRfSVBWNj15CitCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0lORVRfUlBDPXkKK0JSMl9UT09MQ0hBSU5fRVhURVJOQUxfV0NIQVI9eQorQlIyX1RPT0xDSEFJTl9FWFRFUk5BTF9DWFg9eQorQlIyX1RBUkdFVF9HRU5FUklDX0hPU1ROQU1FPSJnZmliZXJqYWNrIgorQlIyX1RBUkdFVF9HRU5FUklDX0lTU1VFPSJXZWxjb21lIHRvIEdvb2dsZSBGaWJlciIKK0JSMl9ST09URlNfREVWSUNFX0NSRUFUSU9OX0RZTkFNSUNfREVWVE1QRlM9eQorQlIyX1JPT1RGU19ERVZJQ0VfVEFCTEU9Ii9kZXYvbnVsbCIKK0JSMl9ST09URlNfU0tFTEVUT05fQ1VTVE9NPXkKK0JSMl9ST09URlNfUE9TVF9CVUlMRF9TQ1JJUFQ9IiR7VE9QRElSfS9zdXBwb3J0L3NjcmlwdHMvcG9zdGJ1aWxkLnNoIgorQlIyX1RBUkdFVF9HRU5FUklDX1BMQVRGT1JNX05BTUU9ImdmbHQ0MDAiCitCUjJfVEFSR0VUX0dFTkVSSUNfUExBVEZPUk1TX1NVUFBPUlRFRD0iR0ZMVDQwMCIKKyMgQlIyX1BBQ0tBR0VfQlVTWUJPWCBpcyBub3Qgc2V0CitCUjJfUEFDS0FHRV9UT09MQk9YPXkKK0JSMl9QQUNLQUdFX1RPWUJPWD15CitCUjJfUEFDS0FHRV9HUkVQPXkKK0JSMl9QQUNLQUdFX0RFVk1FTTI9eQorQlIyX1BBQ0tBR0VfSTJDX1RPT0xTPXkKK0JSMl9QQUNLQUdFX01URD15CisjIEJSMl9QQUNLQUdFX01URF9VQklBVFRBQ0ggaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJQ1JDMzIgaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQlIyX1BBQ0tBR0VfTVREX1VCSUZPUk1BVCBpcyBub3Qgc2V0CisjIEJSMl9QQUNLQUdFX01URF9VQklNS1ZPTCBpcyBub3Qgc2V0CisjIEJSMl9QQUNLQUdFX01URF9VQklORk8gaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJTklaRSBpcyBub3Qgc2V0CisjIEJSMl9QQUNLQUdFX01URF9VQklSRU5BTUUgaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJUk1WT0wgaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJUlNWT0wgaXMgbm90IHNldAorIyBCUjJfUEFDS0FHRV9NVERfVUJJVVBEQVRFVk9MIGlzIG5vdCBzZXQKKyMgQlIyX1BBQ0tBR0VfTVREX1VCSVNDUlVCQkVSIGlzIG5vdCBzZXQKK0JSMl9QQUNLQUdFX1VCT09UX1RPT0xTPXkKK0JSMl9QQUNLQUdFX1BZVEhPTl9TU0w9eQorQlIyX1BBQ0tBR0VfUFlUSE9OX1BZRVhQQVQ9eQorQlIyX1BBQ0tBR0VfUFlfRE5TPXkKK0JSMl9QQUNLQUdFX1BZX01PTk9USU1FPXkKK0JSMl9QQUNLQUdFX1BZVEhPTl9DUllQVE89eQorQlIyX1BBQ0tBR0VfU1FMSVRFPXkKK0JSMl9QQUNLQUdFX1BST1RPQlVGX1ZFUlNJT05fVkFMVUU9IjIuNi4xIgorQlIyX1BBQ0tBR0VfREhDUD15CitCUjJfUEFDS0FHRV9ESENQX0NMSUVOVD15CitCUjJfUEFDS0FHRV9EUk9QQkVBUj15CitCUjJfUEFDS0FHRV9FVEhUT09MPXkKK0JSMl9QQUNLQUdFX0lQUk9VVEUyPXkKK0JSMl9QQUNLQUdFX0lQVVRJTFM9eQorQlIyX1BBQ0tBR0VfTkRJU0M2PXkKK0JSMl9QQUNLQUdFX05ESVNDNl9ORElTQzY9eQorQlIyX1BBQ0tBR0VfTkRJU0M2X1JESVNDNj15CitCUjJfUEFDS0FHRV9ORVRLSVRURUxORVQ9eQorQlIyX1BBQ0tBR0VfREFTSD15CitCUjJfUEFDS0FHRV9aU0g9eQorQlIyX1BBQ0tBR0VfWlNIX0JJTkFSSUVTX09OTFk9eQorQlIyX1BBQ0tBR0VfU1lTS0xPR0Q9eQorQlIyX1BBQ0tBR0VfVVRJTF9MSU5VWD15CitCUjJfUEFDS0FHRV9VVElMX0xJTlVYX0FHRVRUWT15CitCUjJfUEFDS0FHRV9VVElMX0xJTlVYX0xPR0lOX1VUSUxTPXkKK0JSMl9QQUNLQUdFX05BTk89eQorQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STV9CQVNFPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STV9ITlZSQU09eQorQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNX0xPR1VQTE9BRD15CitCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fU1lTTUdSPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STV9MRURQQVRURVJOPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9GSUJFUl9KQUNLPXkKK0JSMl9QQUNLQUdFX0dPT0dMRV9QUklTTT15CitCUjJfUEFDS0FHRV9DQVRBV0FNUFVTPXkKK0JSMl9QQUNLQUdFX01WX0FQUF9QT05fVFlQRT0iR1BPTiIKK0JSMl9QQUNLQUdFX01WX0FQUD15CitCUjJfUEFDS0FHRV9ERUtfVE9PTFM9eQorQlIyX1RBUkdFVF9ST09URlNfSU5JVFJBTUZTPXkKK0JSMl9UQVJHRVRfUk9PVEZTX0dJTlNUQUxMPXkKK0JSMl9UQVJHRVRfUk9PVEZTX0dJTlNUQUxMX0xPQURFUl9ESVI9Ii4uL2xvYWRlci1iaW4vbWFydmVsbCIKK0JSMl9UQVJHRVRfVUJPT1Q9eQorQlIyX1RBUkdFVF9VQk9PVF9CT0FSRE5BTUU9ImdmbHQ0MDAiCitCUjJfVEFSR0VUX1VCT09UX0NVU1RPTV9HSVQ9eQorQlIyX1RBUkdFVF9VQk9PVF9DVVNUT01fR0lUX1JFUE9fVVJMPSJyZXBvOi8vdWJvb3QvcHJpc20iCitCUjJfVEFSR0VUX1VCT09UX0NVU1RPTV9HSVRfVkVSU0lPTj0iSEVBRCIKK0JSMl9UQVJHRVRfVUJPT1RfRk9STUFUX1NQSV9CSU49eQorQlIyX0xJTlVYX0tFUk5FTD15CitCUjJfTElOVVhfS0VSTkVMX0NVU1RPTV9HSVQ9eQorQlIyX0xJTlVYX0tFUk5FTF9DVVNUT01fR0lUX1JFUE9fVVJMPSJyZXBvOi8va2VybmVsL3ByaXNtIgorQlIyX0xJTlVYX0tFUk5FTF9DVVNUT01fR0lUX1ZFUlNJT049IkhFQUQiCitCUjJfTElOVVhfS0VSTkVMX0RFRkNPTkZJRz0iZ2ZsdDQwMCIKK0JSMl9MSU5VWF9LRVJORUxfWklNQUdFPXkKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZ2ZyZzIwMF9kZWZjb25maWcgYi9jb25maWdzL2dmcmcyMDBfZGVmY29uZmlnCmluZGV4IDM5MWNiMWYuLmU4M2I0ZTEgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvZ2ZyZzIwMF9kZWZjb25maWcKKysrIGIvY29uZmlncy9nZnJnMjAwX2RlZmNvbmZpZwpAQCAtMTA0LDYgKzEwNCw3IEBACiBCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fQ0FDSEVfV0FSTUlORz15CiBCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fTE9HVVBMT0FEPXkKIEJSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STV9TWVNNR1I9eQorQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNX1NZU0xPRz15CiBCUjJfUEFDS0FHRV9HT09HTEVfVEVTVD15CiBCUjJfUEFDS0FHRV9HT09HTEVfTkVUV09SS19CT1g9eQogQlIyX1BBQ0tBR0VfR09PR0xFX1NUT1JBR0VfQk9YPXkKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZ2ZyZzI0MF9kZWZjb25maWcgYi9jb25maWdzL2dmcmcyNDBfZGVmY29uZmlnCmluZGV4IDVmNTFkYTcuLjc1NDU5NzcgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3MvZ2ZyZzI0MF9kZWZjb25maWcKKysrIGIvY29uZmlncy9nZnJnMjQwX2RlZmNvbmZpZwpAQCAtMTAsNyArMTAsNyBAQAogQlIyX1RPT0xDSEFJTl9FWFRFUk5BTF9JTkVUX1JQQz15CiBCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0xPQ0FMRT15CiBCUjJfVE9PTENIQUlOX0VYVEVSTkFMX0NYWD15Ci1CUjJfVE9PTENIQUlOX0VYVFJBX0VYVEVSTkFMX0xJQlM9ImxpYmMuc28gbGQtdUNsaWJjIGxpYmNyeXB0IGxpYnJlc29sdiBsaWJydCBsaWJwdGhyZWFkIGxpYmRsIGxpYm0gbGlidXRpbCIKK0JSMl9UT09MQ0hBSU5fRVhUUkFfRVhURVJOQUxfTElCUz0ibGliYy5zbyBsZC11Q2xpYmMgbGliY3J5cHQgbGlicmVzb2x2IGxpYnJ0IGxpYnB0aHJlYWQgbGliZGwgbGlibSBsaWJ1dGlsIGxpYnViYWNrdHJhY2UiCiBCUjJfVEFSR0VUX0dFTkVSSUNfSVNTVUU9IldlbGNvbWUgdG8gR29vZ2xlIEZpYmVyIgogQlIyX1JPT1RGU19ERVZJQ0VfQ1JFQVRJT05fRFlOQU1JQ19ERVZUTVBGUz15CiBCUjJfUk9PVEZTX0RFVklDRV9UQUJMRT0iL2Rldi9udWxsIgpAQCAtMjIsNyArMjIsNiBAQAogQlIyX1BBQ0tBR0VfVE9PTEJPWD15CiBCUjJfUEFDS0FHRV9UT1lCT1g9eQogQlIyX1BBQ0tBR0VfR1pJUD15Ci1CUjJfUEFDS0FHRV9NRU1URVNURVI9eQogQlIyX1BBQ0tBR0VfTVREPXkKIEJSMl9QQUNLQUdFX1BZVEhPTl9TU0w9eQogQlIyX1BBQ0tBR0VfUFlUSE9OX1BZRVhQQVQ9eQpAQCAtMzAsMTMgKzI5LDExIEBACiBCUjJfUEFDS0FHRV9QWV9NT05PVElNRT15CiBCUjJfUEFDS0FHRV9QWVRIT05fQ1JZUFRPPXkKIEJSMl9QQUNLQUdFX0xJQk5FVEZJTFRFUl9DT05OVFJBQ0s9eQotQlIyX1BBQ0tBR0VfTkNVUlNFUz15CitCUjJfUEFDS0FHRV9QUk9UT0JVRl9PTkxZX0xJVEU9eQogQlIyX1BBQ0tBR0VfQlJJREdFX1VUSUxTPXkKIEJSMl9QQUNLQUdFX0RIQ1A9eQogQlIyX1BBQ0tBR0VfREhDUF9DTElFTlQ9eQogQlIyX1BBQ0tBR0VfRE5TTUFTUT15Ci1CUjJfUEFDS0FHRV9EUk9QQkVBUj15Ci1CUjJfUEFDS0FHRV9FVEhUT09MPXkKIEJSMl9QQUNLQUdFX0lQUk9VVEUyPXkKIEJSMl9QQUNLQUdFX0lQVEFCTEVTPXkKIEJSMl9QQUNLQUdFX0lQVVRJTFM9eQpAQCAtNDUsMjkgKzQyLDI2IEBACiBCUjJfUEFDS0FHRV9ORElTQzY9eQogQlIyX1BBQ0tBR0VfTkRJU0M2X05ESVNDNj15CiBCUjJfUEFDS0FHRV9ORElTQzZfUkRJU0M2PXkKLUJSMl9QQUNLQUdFX1RDUERVTVA9eQogQlIyX1BBQ0tBR0VfVkNPTkZJRz15CiBCUjJfUEFDS0FHRV9XSVJFTEVTU19UT09MUz15CiBCUjJfUEFDS0FHRV9XSVJFTEVTU19UT09MU19MSUI9eQogQlIyX1BBQ0tBR0VfREFTSD15Ci1CUjJfUEFDS0FHRV9aU0g9eQotQlIyX1BBQ0tBR0VfWlNIX0JJTkFSSUVTX09OTFk9eQogQlIyX1BBQ0tBR0VfTU9EVUxFX0lOSVRfVE9PTFM9eQogQlIyX1BBQ0tBR0VfU1lTS0xPR0Q9eQogQlIyX1BBQ0tBR0VfVVRJTF9MSU5VWD15Ci1CUjJfUEFDS0FHRV9VVElMX0xJTlVYX0FHRVRUWT15Ci1CUjJfUEFDS0FHRV9VVElMX0xJTlVYX0xPR0lOX1VUSUxTPXkKIEJSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STT15CiBCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fQkFTRT15CiBCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fSE5WUkFNPXkKIEJSMl9QQUNLQUdFX0dPT0dMRV9QTEFURk9STV9XQVZFR1VJREU9eQogQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNX0xPR1VQTE9BRD15CitCUjJfUEFDS0FHRV9HT09HTEVfVEVTVD15CiBCUjJfUEFDS0FHRV9HT09HTEVfTkVUV09SS19CT1g9eQogQlIyX1BBQ0tBR0VfQ0FUQVdBTVBVUz15CiBCUjJfUEFDS0FHRV9IT1NUQVBEX1FVQU5URU5OQT15CiBCUjJfUEFDS0FHRV9IT1NUQVBEX1FVQU5URU5OQV9XUFM9eQogQlIyX1BBQ0tBR0VfV1BBX1NVUFBMSUNBTlRfUVVBTlRFTk5BPXkKIEJSMl9QQUNLQUdFX1dQQV9TVVBQTElDQU5UX1FVQU5URU5OQV9XUFM9eQorQlIyX1BBQ0tBR0VfV1BBX1NVUFBMSUNBTlRfUVVBTlRFTk5BX0NMST15CiBCUjJfUEFDS0FHRV9GSVJNV0FSRT15CiBCUjJfUEFDS0FHRV9GSVJNV0FSRV9GSUxFTkFNRVM9Im1ydmwvcGNpZSoiCiBCUjJfUEFDS0FHRV9IT1NUX1VCT09UX1RPT0xTPXkKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2Jpbi9hY3RpdmV3YW4tdHlwZSBiL2ZzL3NrZWxldG9uL2Jpbi9hY3RpdmV3YW4tdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjQ2ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc2tlbGV0b24vYmluL2FjdGl2ZXdhbi10eXBlCkBAIC0wLDAgKzEsODQgQEAKKyMhL2Jpbi9zaAorCisjIFByaW50IHRoZSB0eXBlIG9mIGludGVyZmFjZSBmb3IgdGhlIHVwbGluay4KKyMgRm9yIGV4YW1wbGU6CisjICAgRmliZXIgSmFjayB3aWxsIHByaW50ICJHUE9OIgorIyAgIE5ldHdvcmsgQm94IHdpbGwgcHJpbnQgIkVUSEVSTkVUIiBiZWNhdXNlIHRoZSBXQU4gcG9ydCBpcyBFdGhlcm5ldAorIyAgIFRWIEJveCB3aWxsIHByaW50ICJXSUZJIiwgIk1PQ0EiLCBvciAiRVRIRVJORVQiIGRlcGVuZGluZyBvbiBob3cKKyMgICAgIGl0IGlzIGNvbm5lY3RlZC4KKworLiAvZXRjL3V0aWxzLnNoCisKKyMgUFJPQ19ORVRfQVJQIGFuZCBCUl9JRl9QQVRIIGFsbG93IGEgZ2Z0ZXN0IHRvIHBhc3MgaW4gYWx0ZXJuYXRlCisjIHBhdGhzIHRvIHRlc3QgZmlsZXMuCisKK3Byb2NfbmV0X2FycD0ke1BST0NfTkVUX0FSUDotIi9wcm9jL25ldC9hcnAifQorbG9va3VwX21hY19mb3JfaXAoKSB7CisgIGxvY2FsIG5leHRob3A9IiQxIgorICB3aGlsZSByZWFkIGlwIGp1bmsganVuayBtYWMganVuazsgZG8KKyAgICBpZiBbICIkaXAiID0gIiRuZXh0aG9wIiBdOyB0aGVuCisgICAgICBlY2hvICIkbWFjIgorICAgICAgcmV0dXJuCisgICAgZmkKKyAgZG9uZSA8IiRwcm9jX25ldF9hcnAiCit9CisKK2JyX2lmX3BhdGg9JHtCUl9JRl9QQVRIOi0iL3N5cy9kZXZpY2VzL3ZpcnR1YWwvbmV0LyJ9Citsb29rdXBfYnJpZGdlX2lmbmFtZV9mb3JfbWFjKCkgeworICBicmlkZ2U9IiQxIgorICBtYWM9IiQyIgorICBpZm51bT0kKGJyY3RsIHNob3dtYWNzICIkYnJpZGdlIiB8IGdyZXAgIiRtYWMiIHwgY3V0IC1mMSkKKyAgaWYgWyAtbiAiJGlmbnVtIiBdOyB0aGVuCisgICAgZWNobyAkKGxzIC0xICIke2JyX2lmX3BhdGh9LyR7YnJpZGdlfS9icmlmIiB8IGhlYWQgLW4gIiRpZm51bSIgfCB0YWlsIC1uIDEpCisgIGZpCit9CisKK2xvb2t1cF9icmlkZ2VfaWZuYW1lX2Zvcl9uZXh0aG9wKCkgeworICBicmlkZ2U9IiQxIgorICBuZXh0aG9wPSIkMiIKKyAgbWFjPSQobG9va3VwX21hY19mb3JfaXAgIiRuZXh0aG9wIikKKyAgaWYgWyAtbiAiJG1hYyIgXTsgdGhlbgorICAgIGxvb2t1cF9icmlkZ2VfaWZuYW1lX2Zvcl9tYWMgIiRicmlkZ2UiICIkbWFjIgorICBmaQorfQorCitsaW5rdHlwZV9mb3JfaWZuYW1lKCkgeworICBpZm5hbWU9IiQxIgorICBpZiBzdGFydHN3aXRoICIkaWZuYW1lIiAicG9uIjsgdGhlbgorICAgIGVjaG8gR1BPTgorICBlbGlmIHN0YXJ0c3dpdGggIiRpZm5hbWUiICJtYW4iOyB0aGVuCisgICAgZWNobyBHUE9OCisgIGVsaWYgc3RhcnRzd2l0aCAiJGlmbmFtZSIgIndhbiI7IHRoZW4KKyAgICBlY2hvIEVUSEVSTkVUCisgIGVsaWYgc3RhcnRzd2l0aCAiJGlmbmFtZSIgIndjbGkiOyB0aGVuCisgICAgZWNobyBXSUZJCisgIGVsaWYgc3RhcnRzd2l0aCAiJGlmbmFtZSIgIndsYW4iOyB0aGVuCisgICAgZWNobyBXSUZJCisgIGVsaWYgc3RhcnRzd2l0aCAiJGlmbmFtZSIgImxhbiI7IHRoZW4KKyAgICBlY2hvIEVUSEVSTkVUCisgIGVsaWYgc3RhcnRzd2l0aCAiJGlmbmFtZSIgImV0aDAiOyB0aGVuCisgICAgZWNobyBFVEhFUk5FVAorICBlbGlmIHN0YXJ0c3dpdGggIiRpZm5hbWUiICJldGgxIjsgdGhlbgorICAgIGVjaG8gTU9DQQorICBlbGlmIHN0YXJ0c3dpdGggIiRpZm5hbWUiICJtb2NhIjsgdGhlbgorICAgIGVjaG8gTU9DQQorICBlbGlmIHN0YXJ0c3dpdGggIiRpZm5hbWUiICJldGgyIjsgdGhlbgorICAgIGVjaG8gV0lGSQorICBlbHNlCisgICAgZWNobyBVTktOT1dOX1RZUEUKKyAgZmkKK30KKworaWZuYW1lPSIkKGFjdGl2ZXdhbikiCitpZiBzdGFydHN3aXRoICIkaWZuYW1lIiAiYnIiIDsgdGhlbgorICBuZXh0aG9wPSQoaXAgLW8gcm91dGUgbGlzdCAwLzAgZGV2ICIkaWZuYW1lIiAyPi9kZXYvbnVsbCB8IGhlYWQgLW4gMSB8IGN1dCAtZCcgJyAtZjMpCisgIGlmbmFtZT0kKGxvb2t1cF9icmlkZ2VfaWZuYW1lX2Zvcl9uZXh0aG9wICIkaWZuYW1lIiAiJG5leHRob3AiKQorZmkKKworaWYgWyAtbiAiJGlmbmFtZSIgXTsgdGhlbgorICBsaW5rdHlwZV9mb3JfaWZuYW1lICIkaWZuYW1lIgorZWxzZQorICBlY2hvIFVOS05PV05fSUYKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vYmluL2FjdGl2ZXdhbi10eXBlLnRlc3QgYi9mcy9za2VsZXRvbi9iaW4vYWN0aXZld2FuLXR5cGUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NWJkNjAxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc2tlbGV0b24vYmluL2FjdGl2ZXdhbi10eXBlLnRlc3QKQEAgLTAsMCArMSwxMTEgQEAKKyMhL2Jpbi9zaAorCisuIC9ldGMvdXRpbHMuc2gKKy4gL2V0Yy93dnRlc3Quc2gKKworaXAoKSB7CisgIGVjaG8gIjEuMi4zLjQiCit9CisKK2JyY3RsX3BvcnRfdmFsPTEKK2JyY3RsKCkgeworICBlY2hvICJwb3J0IG5vCW1hYyBhZGRyCWlzIGxvY2FsPwlhZ2VpbmcgdGltZXIiCisgIGVjaG8gIiAgJHticmN0bF9wb3J0X3ZhbH0JMDE6MDI6MDM6MDQ6MDU6MDYJeWVzCTAuMDAiCit9CisKK2FjdGl2ZXdhbigpIHsKKyAgZWNobyAiJGFjdGl2ZXdhbl92YWwiCit9CisKK1dWU1RBUlQgImFjdGl2ZXdhbi10eXBlIgorCithY3RpdmV3YW5fdmFsPSJwb24wLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJHUE9OIgorCithY3RpdmV3YW5fdmFsPSJtYW4wLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJHUE9OIgorCithY3RpdmV3YW5fdmFsPSJ3YW4wLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJFVEhFUk5FVCIKKworYWN0aXZld2FuX3ZhbD0id2NsaTAtdGVzdCIKK291dHB1dD0kKC4gYWN0aXZld2FuLXR5cGUpCitXVlBBU1NFUSAiJG91dHB1dCIgIldJRkkiCisKK2FjdGl2ZXdhbl92YWw9IndsYW4wLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJXSUZJIgorCithY3RpdmV3YW5fdmFsPSJldGgyLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJXSUZJIgorCithY3RpdmV3YW5fdmFsPSJsYW4wLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJFVEhFUk5FVCIKKworYWN0aXZld2FuX3ZhbD0iZXRoMC10ZXN0Igorb3V0cHV0PSQoLiBhY3RpdmV3YW4tdHlwZSkKK1dWUEFTU0VRICIkb3V0cHV0IiAiRVRIRVJORVQiCisKK2FjdGl2ZXdhbl92YWw9ImV0aDEtdGVzdCIKK291dHB1dD0kKC4gYWN0aXZld2FuLXR5cGUpCitXVlBBU1NFUSAiJG91dHB1dCIgIk1PQ0EiCisKK2FjdGl2ZXdhbl92YWw9Im1vY2EwLXRlc3QiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJNT0NBIgorCithY3RpdmV3YW5fdmFsPSJ6b21nMC10ZXN0Igorb3V0cHV0PSQoLiBhY3RpdmV3YW4tdHlwZSkKK1dWUEFTU0VRICIkb3V0cHV0IiAiVU5LTk9XTl9UWVBFIgorCithY3RpdmV3YW5fdmFsPSIiCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJVTktOT1dOX0lGIgorCisKKyMgU2V0IHVwIGZvciBicjAgdGVzdCBpcyBzb21ld2hhdCBleHRlbnNpdmUuCitCUl9JRl9QQVRIPS90bXAvYWN0aXZld2FuLXR5cGUtdGVzdC4kJC5icl9pZgorbWtkaXIgLXAgIiRCUl9JRl9QQVRIIi9icjAtdGVzdC9icmlmCitlY2hvID4iJEJSX0lGX1BBVEgiL2JyMC10ZXN0L2JyaWYvbGFuMC10ZXN0CitlY2hvID4iJEJSX0lGX1BBVEgiL2JyMC10ZXN0L2JyaWYvbW9jYTAtdGVzdAorZWNobyA+IiRCUl9JRl9QQVRIIi9icjAtdGVzdC9icmlmL3BvbjAtdGVzdAorZWNobyA+IiRCUl9JRl9QQVRIIi9icjAtdGVzdC9icmlmL3dsYW4wLXRlc3QKK2VjaG8gPiIkQlJfSUZfUEFUSCIvYnIwLXRlc3QvYnJpZi96b21nMC10ZXN0CisKK1BST0NfTkVUX0FSUD0vdG1wL2FjdGl2ZXdhbi10eXBlLXRlc3QuJCQucHJvY19uZXRfYXJwCitlY2hvICJJUCBhZGRyZXNzICAgSFcgdHlwZSAgIEZsYWdzICAgSFcgYWRkcmVzcyAgIE1hc2sgICBEZXZpY2UKKzEuMi4zLjQgICAweDEgIDB4MiAgMDE6MDI6MDM6MDQ6MDU6MDYgICAqICAgYnIwLXRlc3QiID4iJFBST0NfTkVUX0FSUCIKKworYWN0aXZld2FuX3ZhbD0iYnIwLXRlc3QiCiticl9pZl9wYXRoPSR7QlJfSUZfUEFUSDotIi9zeXMvZGV2aWNlcy92aXJ0dWFsL25ldC8ifQorCiticmN0bF9wb3J0X3ZhbD0xCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJFVEhFUk5FVCIKKworYnJjdGxfcG9ydF92YWw9Mgorb3V0cHV0PSQoLiBhY3RpdmV3YW4tdHlwZSkKK1dWUEFTU0VRICIkb3V0cHV0IiAiTU9DQSIKKworIyBHUE9OIGludGVyZmFjZXMgYXJlIG5vdCBpbiBhIGJyaWRnZSBpbiB0aGUgcmVhbCBwcm9kdWN0LCBidXQKKyMgd2UgY2FuIHRlc3QgZm9yIGl0IGFueXdheS4gSXQgc2hvdWxkIHdvcmsuCiticmN0bF9wb3J0X3ZhbD0zCitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJHUE9OIgorCiticmN0bF9wb3J0X3ZhbD00CitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJXSUZJIgorCiticmN0bF9wb3J0X3ZhbD01CitvdXRwdXQ9JCguIGFjdGl2ZXdhbi10eXBlKQorV1ZQQVNTRVEgIiRvdXRwdXQiICJVTktOT1dOX1RZUEUiCisKKworcm0gLWYgIiRQUk9DX05FVF9BUlAiCitybSAtcmYgIiRCUl9JRl9QQVRIIgpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vYmluL2FwbWFuIGIvZnMvc2tlbGV0b24vYmluL2FwbWFuCmluZGV4IDUyYTFkMTcuLjk0ZDc3NzggMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2Jpbi9hcG1hbgorKysgYi9mcy9za2VsZXRvbi9iaW4vYXBtYW4KQEAgLTEzLDYgKzEzLDEwIEBACiAgIGluaXRyd25kPQogZmkKIAoraWYgZXhwZXJpbWVudCBDb25tYW5EZWJ1ZzsgdGhlbgorICBzZXQgLXgKK2ZpCisKIFRNUF9ESVI9Ii90bXAvY29ubWFuIgogQ09ORklHX0RJUj0iL2NvbmZpZy9jb25tYW4iCiAKQEAgLTI0LDM0ICsyOCwzMCBAQAogICBpcCAiJEAiCiB9CiAKLSMgZXh0ZW5zaW9uIGlzIGVpdGhlciAiaW50ZXJmYWNlX3N1ZmZpeC5iYW5kIiBvciBqdXN0ICJiYW5kIgotc3RvcGFwKCkgewotICBsb2NhbCBleHRlbnNpb249IiQxIgordmFsaWRfd29yZCgpIHsKKyAgY2FzZSAiJDEiIGluCisgICAgYWNjZXNzX3BvaW50fGNvbW1hbmQpIHJldHVybiAwIDs7CisgICAgKikgcmV0dXJuIDEgOzsKKyAgZXNhYworfQogCi0gIGJhbmRzPSIyLjQgNSIKLSAgZm9yIGJhbmQgaW4gJGJhbmRzOyBkbwotICAgIGlmIFsgIiRleHRlbnNpb24iID0gIiRiYW5kIiBdOyB0aGVuCi0gICAgICBicmVhawotICAgIGVsc2UKLSAgICAgIGlmIGVuZHN3aXRoICIkZXh0ZW5zaW9uIiAiJGJhbmQiOyB0aGVuCi0gICAgICAgIGludGVyZmFjZV9zdWZmaXg9JHtleHRlbnNpb24lLiRiYW5kfQotICAgICAgICBicmVhawotICAgICAgZWxzZQotICAgICAgICBpbnRlcmZhY2Vfc3VmZml4PQotICAgICAgICBiYW5kPQotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIGlmIFsgLXogIiRiYW5kIiBdOyB0aGVuCi0gICAgZWNobyAiRmFpbGVkIHRvIHBhcnNlIGV4dGVuc2lvbiAnJGV4dGVuc2lvbiciCi0gICAgcmV0dXJuCi0gIGZpCit2YWxpZF9iYW5kKCkgeworICBjYXNlICIkMSIgaW4KKyAgICAyLjR8NSkgcmV0dXJuIDAgOzsKKyAgICAqKSByZXR1cm4gMSA7OworICBlc2FjCit9CisKK3N0b3BhcCgpIHsKKyAgbG9jYWwgaW50ZXJmYWNlX3N1ZmZpeD0iJDEiCisgIGxvY2FsIGJhbmQ9IiQyIgorCiAgIGZsYWdzPSItLWJhbmQgJGJhbmQiCiAgIGlmIFsgLW4gIiRpbnRlcmZhY2Vfc3VmZml4IiBdOyB0aGVuCiAgICAgZmxhZ3M9IiRmbGFncyAtLWludGVyZmFjZS1zdWZmaXggIiRpbnRlcmZhY2Vfc3VmZml4IiIKICAgZmkKICAgaWYgISAkKHdpZmkgc3RvcGFwICRmbGFncyk7IHRoZW4KLSAgICBlY2hvICJGYWlsZWQgdG8gc3RvcCBhY2Nlc3MgcG9pbnQgZm9yICckZXh0ZW5zaW9uJyIKKyAgICBlY2hvICJGYWlsZWQgdG8gc3RvcCBhY2Nlc3MgcG9pbnQgZm9yICRzdWZmaXggJGJhbmQiCiAgICAgZmFsc2UKICAgZmkKIH0KQEAgLTczLDYgKzczLDEyIEBACiAgICAgZmlsZXBhdGg9IiRUTVBfRElSLyRmaWxlbmFtZSIKICAgICBpZiBbIC1lICIkZmlsZXBhdGgiIF07IHRoZW4KICAgICAgIGludGVyZmFjZT0ke2ZpbGVuYW1lIyR7cm91dGVfdHlwZX0ufQorCisgICAgICAjIG1ha2Ugc3VyZSBpbnRlcmZhY2UgaXMgYWN0dWFsbHkgYW4gaW50ZXJmYWNlLCBhbmQgbm90IGEgLnRtcCBmaWxlCisgICAgICBpZiBbICEgLWUgIi9zeXMvY2xhc3MvbmV0LyRpbnRlcmZhY2UiIF07IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisKICAgICAgICMgVHJ5aW5nIHRvIGFkZCBhIGRlZmF1bHQgcm91dGUgd2l0aG91dCBhIHN1Ym5ldCByb3V0ZSBmYWlscywgYmVjYXVzZQogICAgICAgIyB0aGVyZSBpcyBubyByb3V0ZSB0byB0aGUgZ2F0ZXdheS4gIFNvIGp1c3QgYWx3YXlzIHVwZGF0ZSB0aGUgc3VibmV0CiAgICAgICAjIHJvdXRlIGZpcnN0LCBhbmQgdGhlbiB1cGRhdGUgdGhlIGRlZmF1bHQgcm91dGUgaWYgd2Uga25vdyB0aGUgZ2F0ZXdheS4KQEAgLTEwNCw3ICsxMTAsNyBAQAogICAgICAgICBnYXRld2F5X2ZpbGVwYXRoPSIkVE1QX0RJUi9nYXRld2F5LiRpbnRlcmZhY2UiCiAgICAgICAgIGlmIFsgLWUgIiRnYXRld2F5X2ZpbGVwYXRoIiBdOyB0aGVuCiAgICAgICAgICAgZ2F0ZXdheT0kKGNhdCAiJGdhdGV3YXlfZmlsZXBhdGgiKQotICAgICAgICAgIGlmICEgaXAgcm91dGUgZGV2ICIkaW50ZXJmYWNlIiB8IGdyZXAgZGVmYXVsdCB8IGdyZXAgInZpYSAkZ2F0ZXdheSI7IHRoZW4KKyAgICAgICAgICBpZiAhIGlwIHJvdXRlIHNob3cgZGV2ICIkaW50ZXJmYWNlIiB8IGdyZXAgZGVmYXVsdCB8IGdyZXAgInZpYSAkZ2F0ZXdheSI7IHRoZW4KICAgICAgICAgICAgIGlwbG9nIC00IHJvdXRlIGRlbCBkZWZhdWx0IGRldiAiJGludGVyZmFjZSIKICAgICAgICAgICAgIGlwbG9nIC00IHJvdXRlIGFkZCBkZWZhdWx0IHZpYSAiJGdhdGV3YXkiIGRldiAiJGludGVyZmFjZSIgJGluaXRyd25kCiAgICAgICAgICAgZmkKQEAgLTExNCwyOCArMTIwLDM0IEBACiAgICAgY29udGludWUKICAgZmkKIAotICBjb21tYW5kPQotICBhY2Nlc3NfcG9pbnQ9CiAgICMgVGhpcyBhc3N1bWVzIGNvbW1hbmQgZmlsZXMgaW4gL3RtcCAoZm9yIHByb3Zpc2lvbmluZyBuZXR3b3Jrcykgd2lsbCBoYXZlIGFuCi0gICMgaW50ZXJmYWNlIHN1ZmZpeCwgYW5kIHRob3NlIGluIC9jb25maWcgKHRoZSB1c2VyJ3MgV0xBTikgd2lsbCBub3QuICBPciwgbW9yZQotICAjIGdlbmVyYWxseSwgdGhhdCBmb3IgYW55IGdpdmVuIGZpbGVuYW1lLCBmaWxlcyBvZiB0aGF0IGZpbGVuYW1lIGNhbiBvbmx5Ci0gICMgYXBwZWFyIGluIG9uZSBvZiAoJFRNUF9ESVIsICRDT05GSUdfRElSKS4KLSAgaWYgWyAtZSAiJENPTkZJR19ESVIvJGZpbGVuYW1lIiBdOyB0aGVuCi0gICAgd2hpY2hfZGlyPSIkQ09ORklHX0RJUiIKKyAgIyBpbnRlcmZhY2Ugc3VmZml4LCBhbmQgdGhvc2UgaW4gL2NvbmZpZyAodGhlIHVzZXIncyBXTEFOKSB3aWxsIG5vdC4KKyAgd29yZD0KKyAgc3VmZml4PQorICBiYW5kPQorCisgIElGUz0nLicgcmVhZCB3b3JkIGJhbmQgPDxFT0YKKyRmaWxlbmFtZQorRU9GCisgIGlmIHZhbGlkX3dvcmQgIiR3b3JkIiAmJiB2YWxpZF9iYW5kICIkYmFuZCI7IHRoZW4KKyAgICBleHBlY3RfZGlyPSIkQ09ORklHX0RJUiIKICAgZWxzZQotICAgIHdoaWNoX2Rpcj0iJFRNUF9ESVIiCisgICAgSUZTPScuJyByZWFkIHdvcmQgc3VmZml4IGJhbmQgPDxFT0YKKyRmaWxlbmFtZQorRU9GCisgICAgaWYgdmFsaWRfd29yZCAiJHdvcmQiICYmIHZhbGlkX2JhbmQgIiRiYW5kIjsgdGhlbgorICAgICAgZXhwZWN0X2Rpcj0iJFRNUF9ESVIiCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQogICBmaQogCi0gIGlmIHN0YXJ0c3dpdGggIiRmaWxlbmFtZSIgImNvbW1hbmQuIjsgdGhlbgotICAgIGV4dGVuc2lvbj0ke2ZpbGVuYW1lI2NvbW1hbmQufQotICAgIGNvbW1hbmQ9IiR3aGljaF9kaXIvJGZpbGVuYW1lIgotICAgIGFjY2Vzc19wb2ludD0iJHdoaWNoX2Rpci9hY2Nlc3NfcG9pbnQuJGV4dGVuc2lvbiIKKyAgaWYgWyAteiAiJHN1ZmZpeCIgXTsgdGhlbgorICAgIGNvbW1hbmQ9IiRleHBlY3RfZGlyL2NvbW1hbmQuJGJhbmQiCisgICAgYWNjZXNzX3BvaW50PSIkZXhwZWN0X2Rpci9hY2Nlc3NfcG9pbnQuJGJhbmQiCiAgIGVsc2UKLSAgICBpZiBzdGFydHN3aXRoICIkZmlsZW5hbWUiICJhY2Nlc3NfcG9pbnQuIjsgdGhlbgotICAgICAgZXh0ZW5zaW9uPSR7ZmlsZW5hbWUjYWNjZXNzX3BvaW50Ln0KLSAgICAgIGNvbW1hbmQ9IiR3aGljaF9kaXIvY29tbWFuZC4kZXh0ZW5zaW9uIgotICAgICAgYWNjZXNzX3BvaW50PSIkd2hpY2hfZGlyLyRmaWxlbmFtZSIKLSAgICBmaQorICAgIGNvbW1hbmQ9IiRleHBlY3RfZGlyL2NvbW1hbmQuJHN1ZmZpeC4kYmFuZCIKKyAgICBhY2Nlc3NfcG9pbnQ9IiRleHBlY3RfZGlyL2FjY2Vzc19wb2ludC4kc3VmZml4LiRiYW5kIgogICBmaQogCiAgIGlmIFsgLWUgIiRjb21tYW5kIiBdICYmIFsgLWUgIiRhY2Nlc3NfcG9pbnQiIF07IHRoZW4KQEAgLTE0Myw2ICsxNTUsNiBAQAogICAgICAgZWNobyAiRmFpbGVkIHRvIHN0YXJ0IGFjY2VzcyBwb2ludCBmb3IgJyRleHRlbnNpb24nIgogICAgIGZpCiAgIGVsc2UKLSAgICBzdG9wYXAgIiRleHRlbnNpb24iCisgICAgc3RvcGFwICIkc3VmZml4IiAiJGJhbmQiCiAgIGZpCiBkb25lCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9iaW4vYXBtYW4udGVzdCBiL2ZzL3NrZWxldG9uL2Jpbi9hcG1hbi50ZXN0CmluZGV4IDhlMjdiNGMuLmE4ODhiNzMgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2Jpbi9hcG1hbi50ZXN0CisrKyBiL2ZzL3NrZWxldG9uL2Jpbi9hcG1hbi50ZXN0CkBAIC04MSw2ICs4MSw4IEBACiBwa2lsbCAiYXBtYW4kIgogcm0gLWYgL2NvbmZpZy9jb25tYW4vY29tbWFuZCoKIHJtIC1mIC9jb25maWcvY29ubWFuL2FjY2Vzc19wb2ludCoKK3JtIC1mIC90bXAvY29ubWFuL2NvbW1hbmQqCitybSAtZiAvdG1wL2Nvbm1hbi9hY2Nlc3NfcG9pbnQqCiAjIENyZWF0aW5nIHdsYW4wX2FwbWFudGVzdCBzb21ldGltZXMgZmFpbHMgaWYgd2UgZG9uJ3QgcmVzZXQgd2xhbjAuCiB3bGFuMG1hYz0kKGNhdCAvc3lzL2NsYXNzL25ldC93bGFuMC9hZGRyZXNzKQogbWFjPSQobWFjX2FkZHJfaW5jcmVtZW50ICR3bGFuMG1hYyAxMDApCkBAIC0xMDEsMzAgKzEwMyw1MSBAQAogV1ZGQUlMIGhvc3RhcGRfcnVubmluZwogCiBlY2hvICJFbmFibGUgNSBHSHogYWNjZXNzIHBvaW50IgorZWNobyAiZW52XG5XSUZJX1BTSz1wYXNzd29yZFxud2lmaVxuc2V0XG4tYlxuNVxuLXNcbnNzaWQiID4gL3RtcC9jb25tYW4vY29tbWFuZC41CitlY2hvICJXYWl0aW5nIHRvIG1ha2Ugc3VyZSBob3N0YXBkIGRvZXNuJ3Qgc3RhcnQgKHdyb25nIGxvY2F0aW9uKSIKK2hvc3RhcGRfd2FpdF9jaGVja19ydW5uaW5nIGZhbHNlCisKK2VjaG8gIkVuYWJsZSA1IEdIeiBhY2Nlc3MgcG9pbnQiCiBlY2hvICJlbnZcbldJRklfUFNLPXBhc3N3b3JkXG53aWZpXG5zZXRcbi1iXG41XG4tc1xuc3NpZCIgPiAvY29uZmlnL2Nvbm1hbi9jb21tYW5kLjUKIGhvc3RhcGRfd2FpdF9jaGVja19ydW5uaW5nIHRydWUKIAogZWNobyAiRGlzYWJsZSA1IEdIeiBhY2Nlc3MgcG9pbnQiCiBybSAvY29uZmlnL2Nvbm1hbi9hY2Nlc3NfcG9pbnQuNQordG91Y2ggL3RtcC9jb25tYW4vYWNjZXNzX3BvaW50LjUKIGhvc3RhcGRfd2FpdF9jaGVja19ydW5uaW5nIGZhbHNlCiAKLXRvdWNoIC9jb25maWcvY29ubWFuL2FjY2Vzc19wb2ludC5fYXBtYW50ZXN0LjIuNAordG91Y2ggL3RtcC9jb25tYW4vYWNjZXNzX3BvaW50Ll9hcG1hbnRlc3QuMi40CiBlY2hvICJXYWl0aW5nIHRvIG1ha2Ugc3VyZSBob3N0YXBkIGRvZXNuJ3Qgc3RhcnQiCiBob3N0YXBkX3dhaXRfY2hlY2tfcnVubmluZyBmYWxzZQogCiBlY2hvICJlbnZcbldJRklfUFNLPXBhc3N3b3JkXG53aWZpXG5zZXRcbi1iXG4yLjRcbi1zXG5zc2lkIiA+IC9jb25maWcvY29ubWFuL2NvbW1hbmQuMi40Ci1lY2hvICJXYWl0aW5nIHRvIG1ha2Ugc3VyZSBob3N0YXBkIGRvZXNuJ3Qgc3RhcnQiCitlY2hvICJXYWl0aW5nIHRvIG1ha2Ugc3VyZSBob3N0YXBkIGRvZXNuJ3Qgc3RhcnQgKHdyb25nIHN1ZmZpeCkiCiBob3N0YXBkX3dhaXRfY2hlY2tfcnVubmluZyBmYWxzZQogCi1lY2hvICJlbnZcbldJRklfUFNLPXBhc3N3b3JkXG53aWZpXG5zZXRcbi1iXG4yLjRcbi1zXG5zc2lkXG4tU1xuX2FwbWFudGVzdCIgPiAvY29uZmlnL2Nvbm1hbi9jb21tYW5kLl9hcG1hbnRlc3QuMi40CitlY2hvICJlbnZcbldJRklfUFNLPXBhc3N3b3JkXG53aWZpXG5zZXRcbi1iXG4yLjRcbi1zXG5zc2lkIiA+IC9jb25maWcvY29ubWFuL2NvbW1hbmQuX2FwbWFudGVzdC4yLjQKK2VjaG8gIldhaXRpbmcgdG8gbWFrZSBzdXJlIGhvc3RhcGQgZG9lc24ndCBzdGFydCAod3JvbmcgbG9jYXRpb24pIgoraG9zdGFwZF93YWl0X2NoZWNrX3J1bm5pbmcgZmFsc2UKKworZWNobyAiZW52XG5XSUZJX1BTSz1wYXNzd29yZFxud2lmaVxuc2V0XG4tYlxuMi40XG4tc1xuc3NpZFxuLVNcbl9hcG1hbnRlc3QiID4gL3RtcC9jb25tYW4vY29tbWFuZC5fYXBtYW50ZXN0LjIuNAogaG9zdGFwZF93YWl0X2NoZWNrX3J1bm5pbmcgdHJ1ZQogCitybSAvdG1wL2Nvbm1hbi9hY2Nlc3NfcG9pbnQuX2FwbWFudGVzdC4yLjQKK3RvdWNoIC9jb25maWcvY29ubWFuL2FjY2Vzc19wb2ludC5fYXBtYW50ZXN0LjIuNAorZWNobyAiV2FpdGluZyB0byBtYWtlIHN1cmUgaG9zdGFwZCBkb2Vzbid0IHN0YXJ0ICh3cm9uZyBsb2NhdGlvbikiCitob3N0YXBkX3dhaXRfY2hlY2tfcnVubmluZyBmYWxzZQorCiBXVlNUQVJUICJyb3V0ZSBtYW5hZ2VtZW50IgogZWNobyAiMTkyLjE2OC4xLjEiID4gL3RtcC9jb25tYW4vZ2F0ZXdheS53bGFuMF9hcG1hbnRlc3QKIGVjaG8gIjE5Mi4xNjguMS4wLzI0IiA+IC90bXAvY29ubWFuL3N1Ym5ldC53bGFuMF9hcG1hbnRlc3QKIFdWUEFTUyB3YWl0X3JvdXRlX2NoYW5nZWQgImFkZCIgImRlZmF1bHQgdmlhIDE5Mi4xNjguMS4xIiAid2xhbjBfYXBtYW50ZXN0IgogV1ZQQVNTIHdhaXRfcm91dGVfY2hhbmdlZCAiYWRkIiAiMTkyLjE2OC4xLjAvMjQiICJ3bGFuMF9hcG1hbnRlc3QiCiAKKyMgTWFrZSBzdXJlIG5vbi1pbnRlcmZhY2VzIGFyZSBpZ25vcmVkLgorZWNobyAiMTkyLjE2OC4yLjEiID4gL3RtcC9jb25tYW4vZ2F0ZXdheS53bGFuMF9hcG1hbnRlc3QudG1wCitlY2hvICIxOTIuMTY4LjIuMC8xNiIgPiAvdG1wL2Nvbm1hbi9zdWJuZXQud2xhbjBfYXBtYW50ZXN0LnRtcAorZWNobyAiMTkyLjE2OC4zLjEiID4gL3RtcC9jb25tYW4vZ2F0ZXdheS53bGFuMF9hcG1hbnRlc3RfdG1wCitlY2hvICIxOTIuMTY4LjMuMC8xNiIgPiAvdG1wL2Nvbm1hbi9zdWJuZXQud2xhbjBfYXBtYW50ZXN0X3RtcAorCiBlY2hvICJkZWZhdWx0IHZpYSAxOTIuMTY4LjEuMSBkZXYgd2xhbjBfYXBtYW50ZXN0IiA+ICR0bXBkaXIvaXBfcm91dGVfc2hvdwogZWNobyAiMTkyLjE2OC4xLjAvMjQgZGV2IHdsYW4wX2FwbWFudGVzdCIgPj4gJHRtcGRpci9pcF9yb3V0ZV9zaG93CiAKQEAgLTEzNCw2ICsxNTcsOSBAQAogV1ZQQVNTIHdhaXRfcm91dGVfY2hhbmdlZCAiZGVsIiAiMTkyLjE2OC4xLjAvMjQiICJ3bGFuMF9hcG1hbnRlc3QiCiBXVlBBU1Mgd2FpdF9yb3V0ZV9jaGFuZ2VkICJhZGQiICIxOTIuMTY4LjEuMC8xNiIgIndsYW4wX2FwbWFudGVzdCIKIAorV1ZQQVNTIGdyZXAgIjE5MlwuMTY4XC4xXC4iICIkaXBfb3V0IgorV1ZGQUlMIGdyZXAgIjE5MlwuMTY4XC4yXC4iICIkaXBfb3V0IgorV1ZGQUlMIGdyZXAgIjE5MlwuMTY4XC4zXC4iICIkaXBfb3V0IgogCiBlY2hvICJDbGVhbmluZyB1cCIKIFdWUEFTUyBpdyBkZXYgd2xhbjBfYXBtYW50ZXN0IGRlbApAQCAtMTQxLDUgKzE2Nyw3IEBACiB3aWZpIG9mZgogcm0gLWYgL2NvbmZpZy9jb25tYW4vY29tbWFuZCoKIHJtIC1mIC9jb25maWcvY29ubWFuL2FjY2Vzc19wb2ludCoKK3JtIC1mIC90bXAvY29ubWFuL2NvbW1hbmQqCitybSAtZiAvdG1wL2Nvbm1hbi9hY2Nlc3NfcG9pbnQqCiBybSAtZiAvdG1wL2Nvbm1hbi9nYXRld2F5LmJyMAogcm0gLXJmICR0bXBkaXIKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2Jpbi9pcGFwcGx5IGIvZnMvc2tlbGV0b24vYmluL2lwYXBwbHkKaW5kZXggOTBkYmRmMi4uZDIxMTdjZiAxMDA3NTUKLS0tIGEvZnMvc2tlbGV0b24vYmluL2lwYXBwbHkKKysrIGIvZnMvc2tlbGV0b24vYmluL2lwYXBwbHkKQEAgLTIzLDYgKzIzLDggQEAKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCiBpbXBvcnQgb3B0aW9ucwogCiBvcHRzcGVjID0gIiIiCkBAIC0zOCw2ICs0MCw3IEBACiBTVEFUSUNfSVBfQ09ORklHU19ESVIgPSBiYXNlX3BhdGggKyAnL2NvbmZpZy9pcC9zdGF0aWMnCiBEWU5BTUlDX0lQX0NPTkZJR1NfRElSID0gYmFzZV9wYXRoICsgJy90bXAvaXAvZHluYW1pYycKIFRNUF9DT05NQU5fRElSID0gYmFzZV9wYXRoICsgJy90bXAvY29ubWFuJworRElTQUJMRURfRklMRSA9IGJhc2VfcGF0aCArICcvdG1wL2lwYXBwbHlfZGlzYWJsZWQnCiAKIAogZGVmIEF0b21pY1dyaXRlKGZpbGVuYW1lLCBkYXRhKToKQEAgLTEzMiw5ICsxMzUsMTYgQEAKICAgICBJcEFkZHJEZWwoaWZhY2VfbmFtZSwgb2xkX2lwKQogCiAKLWRlZiBJcEFkZHJBZGQoaWZhY2VfbmFtZSwgaXApOgotICBMb2coJ0FkZGluZyBhZGRyZXNzICVyIG9uIGludGVyZmFjZSAlcicsIGlwLCBpZmFjZV9uYW1lKQotICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWydpcCcsICdhZGRyJywgJ2FkZCcsIGlwLCAnZGV2JywgaWZhY2VfbmFtZV0pCitkZWYgSXBBZGRyQWRkKGlmYWNlLCBpcCk6CisgIExvZygnQWRkaW5nIGFkZHJlc3MgJXIgb24gaW50ZXJmYWNlICVyJywgaXAsIGlmYWNlKQorICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWydpcCcsICdhZGRyJywgJ2FkZCcsIGlwLCAnZGV2JywgaWZhY2VdKQorICAjIFdlIGRvbid0IHdhbnQgJ3Byb3RvIGtlcm5lbCcgcm91dGVzLgorICBpcF9yb3V0ZV9zaG93ID0gWydpcCcsICdyb3V0ZScsICdzaG93JywgJ2RldicsIGlmYWNlXQorICBmb3IgbGluZSBpbiBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChpcF9yb3V0ZV9zaG93KS5zcGxpdGxpbmVzKCk6CisgICAgaWYgJ3Byb3RvIGtlcm5lbCcgaW4gbGluZToKKyAgICAgIHJvdXRlID0gbGluZS5zcGxpdCgpWzBdCisgICAgICBpZiBzdWJwcm9jZXNzLmNhbGwoWydpcCcsICdyb3V0ZScsICdkZWwnLCByb3V0ZSwgJ2RldicsIGlmYWNlXSkgIT0gMDoKKyAgICAgICAgTG9nKCdGYWlsZWQgdG8gZGVsZXRlIHJvdXRlICVzIG9uIGludGVyZmFjZSAlcycsIHJvdXRlLCBpZmFjZSkKIAogCiBkZWYgSXBBZGRyRGVsKGlmYWNlX25hbWUsIGlwKToKQEAgLTIwMSw4ICsyMTEsNyBAQAogICAgIGlmICduZXdfaXBfYWRkcmVzcycgaW4gaXA6CiAgICAgICBpcF9zdHJpbmcgPSBpcFsnbmV3X2lwX2FkZHJlc3MnXQogICAgICAgbmV0bWFzayA9ICczMicKLSAgICAgIGlmICgoc2VsZWN0ZWRfY29uZmlnX2ZpbGUgPT0gc3RhdGljX2NvbmZpZ19maWxlIG9yIG5vdCBJc1dpcmVsZXNzQ2xpZW50KCkpCi0gICAgICAgICAgYW5kICduZXdfc3VibmV0X21hc2snIGluIGlwKToKKyAgICAgIGlmICduZXdfc3VibmV0X21hc2snIGluIGlwOgogICAgICAgICBuZXRtYXNrID0gc3RyKE5vcm1hbGl6ZU5ldG1hc2soaXBbJ25ld19zdWJuZXRfbWFzayddKSkKICAgICAgIGlwX3N0cmluZyA9IGlwX3N0cmluZyArICcvJyArIG5ldG1hc2sKICAgICAgIG5ld19pcHMuYWRkKGlwX3N0cmluZykKQEAgLTIxMywxNCArMjIyLDEwIEBACiAgICAgc3VibmV0ID0gTm9uZQogICAgIGlmICduZXdfaXBfYWRkcmVzcycgaW4gaXAgYW5kICduZXdfc3VibmV0X21hc2snIGluIGlwOgogICAgICAgbWFzayA9IHN0cihOb3JtYWxpemVOZXRtYXNrKGlwWyduZXdfc3VibmV0X21hc2snXSkpCi0gICAgICBzdWJuZXQgPSAnJy5qb2luKChBcHBseU5ldG1hc2soaXBbJ25ld19pcF9hZGRyZXNzJ10sIG1hc2spLCAnLycsIG1hc2spKQorICAgICAgc3VibmV0ID0gR2V0U3VibmV0KGlwWyduZXdfaXBfYWRkcmVzcyddLCBtYXNrKQogICAgIFJvdXRlQWRkKGlmYWNlX25hbWUsIHJvdXRlcnM9aXAuZ2V0KCduZXdfcm91dGVycycsIE5vbmUpLCBzdWJuZXQ9c3VibmV0KQogCiAKLWRlZiBJc1dpcmVsZXNzQ2xpZW50KCk6Ci0gIHJldHVybiBzdWJwcm9jZXNzLmNhbGwoWydpcy13aXJlbGVzcy1jbGllbnQnXSkgPT0gMAotCi0KIGRlZiBJcFRvSW50KGlwKToKICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJyFJJywgc29ja2V0LmluZXRfcHRvbihzb2NrZXQuQUZfSU5FVCwgaXApKVswXQogCkBAIC0yNjQsNyArMjY5LDI1IEBACiAgIHJldHVybiBJbnRUb0lwKGludF9pcCAmIGludF9uZXRtYXNrKQogCiAKK2RlZiBHZXRTdWJuZXQoaXAsIG5ldG1hc2spOgorICByZXR1cm4gJycuam9pbigoQXBwbHlOZXRtYXNrKGlwLCBuZXRtYXNrKSwgJy8nLCBuZXRtYXNrKSkKKworCitkZWYgRGlzYWJsZWQoKToKKyAgIiIiUmV0dXJucyB3aGV0aGVyIC90bXAvaXBhcHBseV9kaXNhYmxlZCBoYXMgYmVlbiB3cml0dGVuIGluIHRoZSBsYXN0IGhvdXIuIiIiCisgIGlmIG9zLnBhdGguZXhpc3RzKERJU0FCTEVEX0ZJTEUpOgorICAgIGRpc2FibGVkX3MgPSAob3Muc3RhdChESVNBQkxFRF9GSUxFKS5zdF9tdGltZSArIDYwICogNjApIC0gdGltZS50aW1lKCkKKyAgICBpZiBkaXNhYmxlZF9zID4gMDoKKyAgICAgIExvZygnRGlzYWJsZWQgZm9yIHRoZSBuZXh0ICVkIHNlY29uZHMnLCBkaXNhYmxlZF9zKQorICAgICAgcmV0dXJuIFRydWUKKworICByZXR1cm4gRmFsc2UKKworCiBkZWYgbWFpbigpOgorICBpZiBEaXNhYmxlZCgpOgorICAgIHJldHVybgorCiAgIG8gPSBvcHRpb25zLk9wdGlvbnMob3B0c3BlYykKICAgKF8sIF8sIGV4dHJhKSA9IG8ucGFyc2Uoc3lzLmFyZ3ZbMTpdKQogICBpZiBub3QgZXh0cmE6CmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9iaW4vaXBhcHBseS50ZXN0IGIvZnMvc2tlbGV0b24vYmluL2lwYXBwbHkudGVzdAppbmRleCBmM2Q5YjVlLi44N2VhMDc0IDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9iaW4vaXBhcHBseS50ZXN0CisrKyBiL2ZzL3NrZWxldG9uL2Jpbi9pcGFwcGx5LnRlc3QKQEAgLTEwLDYgKzEwLDcgQEAKIFNUQVRJQ19QQVRIPS9jb25maWcvaXAvc3RhdGljCiBEWU5BTUlDX1BBVEg9L3RtcC9pcC9keW5hbWljCiBUTVBfQ09OTUFOPS90bXAvY29ubWFuCitESVNBQkxFRF9GSUxFPS90bXAvaXBhcHBseV9kaXNhYmxlZAogCiBydW5uYWJsZSBta3RlbXAgJiYKIHRtcGRpcj0kKG1rdGVtcCAtZCBpcGFwcGx5WFhYWFhYWFhYWCkgfHwKQEAgLTQxLDI1ICs0MiwyMyBAQAogY2F0ID4kdG1wZGlyL3Rlc3RfYmluL2lwIDw8LUVPRgogCSMhL2Jpbi9zaAogCWVjaG8gdGVzdF9iaW4vaXAgXCRAIDE+JjIKLQlpZiBbICJ4XCQyIiA9ICJ4c2hvdyIgLWEgLWUgJHRtcGRpci9pcF9hZGRyX3Nob3cgXTsgdGhlbgorCWlmIFsgInhcJDEiID0gInhhZGRyIiAtYSAieFwkMiIgPSAieHNob3ciIC1hIC1lICR0bXBkaXIvaXBfYWRkcl9zaG93IF07IHRoZW4KIAkgIGNhdCAkdG1wZGlyL2lwX2FkZHJfc2hvdworCWVsaWYgWyAieFwkMSIgPSAieHJvdXRlIiAtYSAgInhcJDIiID0gInhzaG93IiAtYSAtZSAkdG1wZGlyL2lwX3JvdXRlX3Nob3cgXTsgdGhlbgorCSAgY2F0ICR0bXBkaXIvaXBfcm91dGVfc2hvdwogCWZpCiAJZXhpdCAwCiBFT0YKIGNobW9kIDc3NyAkdG1wZGlyL3Rlc3RfYmluL2lwCiAKLWNhdCA+JHRtcGRpci90ZXN0X2Jpbi9pcy13aXJlbGVzcy1jbGllbnQgPDwtRU9GCi0JIyEvYmluL3NoCi0JWyAtZSAkdG1wZGlyL2lzX3dpcmVsZXNzX2NsaWVudCBdCi1FT0YKLWNobW9kIDc3NyAkdG1wZGlyL3Rlc3RfYmluL2lzLXdpcmVsZXNzLWNsaWVudAotCiBQQVRIPSR0bXBkaXIvdGVzdF9iaW46JFBBVEgKIAogd2lwZV9jb25maWdzKCkgewogICBybSAtcmYgJHRtcGRpci8kU1RBVElDX1BBVEgKICAgcm0gLXJmICR0bXBkaXIvJERZTkFNSUNfUEFUSAogICBybSAtcmYgJHRtcGRpci8kVE1QX0NPTk1BTgorICBybSAtZiAkdG1wZGlyLyRESVNBQkxFRF9GSUxFCisKIAogICBta2RpciAtcCAkdG1wZGlyLyRTVEFUSUNfUEFUSAogICBta2RpciAtcCAkdG1wZGlyLyREWU5BTUlDX1BBVEgKQEAgLTcwLDEwICs2OSw2IEBACiAKIHdpcGVfY29uZmlncwogCi0jIFdlJ2xsIGV4cGxpY2l0bHkgcmVtb3ZlIHRoaXMgdG8gc2ltdWxhdGUgbm9uLXdpcmVsZXNzIGRldmljZXMsIGUuZy4gU3BhY2VjYXN0LAotIyBsYXRlciBpbiB0aGUgdGVzdC4KLXRvdWNoICR0bXBkaXIvaXNfd2lyZWxlc3NfY2xpZW50Ci0KIGVjaG8KIGVjaG8gIlRFU1QgbWlzc2luZyBpbnRlcmZhY2UgcGFyYW1ldGVyIgogV1ZGQUlMIGlwYXBwbHkKQEAgLTkwLDcgKzg1LDcgQEAKIFdWUEFTU0VRICQ/IDAKIAogZWNobwotZWNobyAiVEVTVCBzdGF0aWMgY29uZmlnIgorZWNobyAiVEVTVCBzdGF0aWMgY29uZmlnIGFuZCBkaXNhYmxlIgogZXhwb3J0IElJVV9URVNUX1VQX0lOVEVSRkFDRVM9ImlmYWNlMCIKIG1rZGlyIC1wICR0bXBkaXIvJFNUQVRJQ19QQVRICiBjYXQgPiR0bXBkaXIvJFNUQVRJQ19QQVRIL2lmYWNlMCA8PC1FT0YKQEAgLTk5LDEwICs5NCwyMiBAQAogCX0gfQogRU9GCiAKKworZWNobyAiMS4xLjEuMC8yNCBkZXYgYnIwICBwcm90byBrZXJuZWwgIHNjb3BlIGxpbmsgIHNyYyAxLjEuMS4xIiA+IiR0bXBkaXIvaXBfcm91dGVfc2hvdyIKKwordG91Y2ggJHRtcGRpci8kRElTQUJMRURfRklMRQorb3V0cHV0PSQoaXBhcHBseSBpZmFjZTAgMj4mMSAxPi9kZXYvbnVsbCkKK1dWUEFTU0VRICQ/IDAKK2VjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJEaXNhYmxlZCBmb3IgdGhlIG5leHQiID4vZGV2L251bGwKK1dWUEFTU0VRICQ/IDAKKworcm0gJHRtcGRpci8kRElTQUJMRURfRklMRQogb3V0cHV0PSQoaXBhcHBseSBpZmFjZTAgMj4mMSAxPi9kZXYvbnVsbCkKIFdWUEFTU0VRICQ/IDAKIGVjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAxLjEuMS4xLzI0IGRldiBpZmFjZTAiID4vZGV2L251bGwKIFdWUEFTU0VRICQ/IDAKK2VjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCByb3V0ZSBkZWwgMS4xLjEuMC8yNCBkZXYgaWZhY2UwIiA+L2Rldi9udWxsCitXVlBBU1NFUSAkPyAwCiAKIAogZWNobyAiVEVTVCBkZWx0YXMiCkBAIC0xMjMsNiArMTMwLDcgQEAKIAl9IH0KIEVPRgogZWNobyAiICAgaW5ldCAxLjEuMS4zLzMyIGJyZCAyNTUuMjU1LjI1NS4wIHNjb3BlIGdsb2JhbCBpZmFjZTAiID4+IiR0bXBkaXIvaXBfYWRkcl9zaG93IgorZWNobyAiMS4xLjEuMC8yNCBkZXYgYnIwICBwcm90byBrZXJuZWwgIHNjb3BlIGxpbmsgIHNyYyAxLjEuMS4zIiA+IiR0bXBkaXIvaXBfcm91dGVfc2hvdyIKIG91dHB1dD0kKGlwYXBwbHkgaWZhY2UwIDI+JjEgMT4vZGV2L251bGwpCiBXVlBBU1NFUSAkPyAwCiBlY2hvICIke291dHB1dH0iIHwgZ3JlcCAiaXAgYWRkciBhZGQgMS4xLjEuMS8yNCBkZXYgaWZhY2UwIiA+L2Rldi9udWxsCkBAIC0xMzUsNiArMTQzLDggQEAKIFdWUEFTU0VRICQ/IDAKIGVjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAxLjEuMS40LzMyIGRldiBpZmFjZTAiID4vZGV2L251bGwKIFdWUEFTU0VRICQ/IDAKK2VjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCByb3V0ZSBkZWwgMS4xLjEuMC8yNCBkZXYgaWZhY2UwIiA+L2Rldi9udWxsCitXVlBBU1NFUSAkPyAwCiAKIHN1Ym5ldF9maWxlPSR0bXBkaXIvJFRNUF9DT05NQU4vc3VibmV0LmlmYWNlMAogV1ZQQVNTIFsgLWUgJHN1Ym5ldF9maWxlIF0KQEAgLTE1OSwxMCArMTY5LDEzIEBACiAJfSB9CiBFT0YKIAorZWNobyAiMS4xLjAuMC8xNiBkZXYgYnIwICBwcm90byBrZXJuZWwgIHNjb3BlIGxpbmsgIHNyYyAxLjEuMS4xMDAiID4iJHRtcGRpci9pcF9yb3V0ZV9zaG93Igogb3V0cHV0PSQoaXBhcHBseSBpZmFjZTAgMj4mMSAxPi9kZXYvbnVsbCkKIFdWUEFTU0VRICQ/IDAKIGVjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAxLjEuMS4xMDAvMTYgZGV2IGlmYWNlMCIgPi9kZXYvbnVsbAogV1ZQQVNTRVEgJD8gMAorZWNobyAiJHtvdXRwdXR9IiB8IGdyZXAgImlwIHJvdXRlIGRlbCAxLjEuMC4wLzE2IGRldiBpZmFjZTAiID4vZGV2L251bGwKK1dWUEFTU0VRICQ/IDAKIAogCiBlY2hvCkBAIC0xODAsNiArMTkzLDggQEAKIFdWUEFTU0VRICQ/IDAKIGVjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAxLjEuMS4xMDAvMTYgZGV2IGlmYWNlMCIgPi9kZXYvbnVsbAogV1ZQQVNTRVEgJD8gMAorZWNobyAiJHtvdXRwdXR9IiB8IGdyZXAgImlwIHJvdXRlIGRlbCAxLjEuMC4wLzE2IGRldiBpZmFjZTAiID4vZGV2L251bGwKK1dWUEFTU0VRICQ/IDAKIHN1Ym5ldF9maWxlPSR0bXBkaXIvJFRNUF9DT05NQU4vc3VibmV0LmlmYWNlMAogV1ZQQVNTIFsgLWUgJHN1Ym5ldF9maWxlIF0KIGdhdGV3YXlfZmlsZT0kdG1wZGlyLyRUTVBfQ09OTUFOL2dhdGV3YXkuaWZhY2UwCkBAIC0xOTcsOSArMjEyLDEyIEBACiBpcGFwcGx5IGlmYWNlMAogcm0gJHRtcGRpci8kU1RBVElDX1BBVEgvaWZhY2UwCiAKK2VjaG8gIjIuMi4yLjAvMjQgZGV2IGJyMCAgcHJvdG8ga2VybmVsICBzY29wZSBsaW5rICBzcmMgMi4yLjIuMiIgPiIkdG1wZGlyL2lwX3JvdXRlX3Nob3ciCiBvdXRwdXQ9JChpcGFwcGx5IGlmYWNlMCAyPiYxIDE+L2Rldi9udWxsKQogV1ZQQVNTRVEgJD8gMAotZWNobyAiJHtvdXRwdXR9IiB8IGdyZXAgImlwIGFkZHIgYWRkIDIuMi4yLjIvMzIgZGV2IGlmYWNlMCIgPi9kZXYvbnVsbAorZWNobyAiJHtvdXRwdXR9IiB8IGdyZXAgImlwIGFkZHIgYWRkIDIuMi4yLjIvMjQgZGV2IGlmYWNlMCIgPi9kZXYvbnVsbAorV1ZQQVNTRVEgJD8gMAorZWNobyAiJHtvdXRwdXR9IiB8IGdyZXAgImlwIHJvdXRlIGRlbCAyLjIuMi4wLzI0IGRldiBpZmFjZTAiID4vZGV2L251bGwKIFdWUEFTU0VRICQ/IDAKIHN1Ym5ldF9maWxlPSR0bXBkaXIvJFRNUF9DT05NQU4vc3VibmV0LmlmYWNlMAogV1ZQQVNTIFsgLWUgJHN1Ym5ldF9maWxlIF0KQEAgLTIxMywxNSArMjMxLDYgQEAKIHJtICRleHBlY3RlZF9maWxlCiAKIGVjaG8KLWVjaG8gIlRFU1QgZHluYW1pYyBjb25maWcsIG5vdCB3aXJlbGVzcyBjbGllbnQiCi1ybSAtZiAkdG1wZGlyL2lzX3dpcmVsZXNzX2NsaWVudAotaXBhcHBseSBpZmFjZTAKLW91dHB1dD0kKGlwYXBwbHkgaWZhY2UwIDI+JjEgMT4vZGV2L251bGwpCi1XVlBBU1NFUSAkPyAwCi1lY2hvICIke291dHB1dH0iIHwgZ3JlcCAiaXAgYWRkciBhZGQgMi4yLjIuMi8yNCBkZXYgaWZhY2UwIiA+L2Rldi9udWxsCi1XVlBBU1NFUSAkPyAwCi10b3VjaCAkdG1wZGlyL2lzX3dpcmVsZXNzX2NsaWVudAotCiAKIHdpcGVfY29uZmlncwogCkBAIC0yNDUsMTAgKzI1NCwxMyBAQAogbWtkaXIgLXAgJHRtcGRpci9zeXMvY2xhc3MvbmV0L3dhbjAKIG1rZGlyIC1wICR0bXBkaXIvc3lzL2NsYXNzL25ldC9icjAKIAorZWNobyAiMS4xLjEuMC8yNCBkZXYgYnIwICBwcm90byBrZXJuZWwgIHNjb3BlIGxpbmsgIHNyYyAxLjEuMS4yIiA+IiR0bXBkaXIvaXBfcm91dGVfc2hvdyIKIG91dHB1dD0kKGlwYXBwbHkgYnIwIDI+JjEgMT4vZGV2L251bGwpCiBXVlBBU1NFUSAkPyAwCiBlY2hvICIke291dHB1dH0iIHwgZ3JlcCAiaXAgYWRkciBhZGQgMS4xLjEuMi8yNCBkZXYgYnIwIiA+L2Rldi9udWxsCiBXVlBBU1NFUSAkPyAwCitlY2hvICIke291dHB1dH0iIHwgZ3JlcCAiaXAgcm91dGUgZGVsIDEuMS4xLjAvMjQgZGV2IGJyMCIgPi9kZXYvbnVsbAorV1ZQQVNTRVEgJD8gMAogc3VibmV0X2ZpbGU9JHRtcGRpci8kVE1QX0NPTk1BTi9zdWJuZXQuYnIwCiBXVlBBU1MgWyAtZSAkc3VibmV0X2ZpbGUgXQogZ2F0ZXdheV9maWxlPSR0bXBkaXIvJFRNUF9DT05NQU4vZ2F0ZXdheS5icjAKQEAgLTI2Niw5ICsyNzgsMTIgQEAKICMgbm93IGZsaXAgd2FuMCB0byBkb3duCiBleHBvcnQgSUlVX1RFU1RfVVBfSU5URVJGQUNFUz0iYnIwIgogCitlY2hvICIyLjIuMi4wLzI0IGRldiBicjAgIHByb3RvIGtlcm5lbCAgc2NvcGUgbGluayAgc3JjIDIuMi4yLjIiID4iJHRtcGRpci9pcF9yb3V0ZV9zaG93Igogb3V0cHV0PSQoaXBhcHBseSBicjAgMj4mMSAxPi9kZXYvbnVsbCkKIFdWUEFTU0VRICQ/IDAKLWVjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAyLjIuMi4yLzMyIGRldiBicjAiID4vZGV2L251bGwKK2VjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCBhZGRyIGFkZCAyLjIuMi4yLzI0IGRldiBicjAiID4vZGV2L251bGwKK1dWUEFTU0VRICQ/IDAKK2VjaG8gIiR7b3V0cHV0fSIgfCBncmVwICJpcCByb3V0ZSBkZWwgMi4yLjIuMC8yNCBkZXYgYnIwIiA+L2Rldi9udWxsCiBXVlBBU1NFUSAkPyAwCiBzdWJuZXRfZmlsZT0kdG1wZGlyLyRUTVBfQ09OTUFOL3N1Ym5ldC5icjAKIFdWUEFTUyBbIC1lICRzdWJuZXRfZmlsZSBdCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9iaW4vaXMtYW5kcm9pZC1ib3ggYi9mcy9za2VsZXRvbi9iaW4vaXMtYW5kcm9pZC1ib3gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vYmluL29wdGljYWx3YXRjaGRvZy5wbGF0Zm9ybV9nZmliZXJsdCBiL2ZzL3NrZWxldG9uL2Jpbi9vcHRpY2Fsd2F0Y2hkb2cucGxhdGZvcm1fZ2ZpYmVybHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWM5MTMwMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NrZWxldG9uL2Jpbi9vcHRpY2Fsd2F0Y2hkb2cucGxhdGZvcm1fZ2ZpYmVybHQKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisjCisjIFRyeSB0byBkZXRlY3Qgd2hlbiB0aGUgb3B0aWNhbCBsaW5rIGdldHMgaW50byBhbiB1bnJlY292ZXJhYmxlIHN0YXRlIGFuZAorIyBhdHRlbXB0IHRvIHJlYm9vdCB0aGUgc3lzdGVtIHRvIHJlY292ZXIgaXQuCisjIFdvcmthcm91bmQgZm9yIGIvMzIwOTc2MDggdW50aWwgYSBiZXR0ZXIgc29sdXRpb24gY2FuIGJlIGZvdW5kLgorCisuIC9ldGMvdXRpbHMuc2gKKworR1BPTl9BTEFSTV9GSUxFPSIvc3lzL2RldmljZXMvcGxhdGZvcm0vZ3Bvbi9pbmZvL2FsYXJtR3BvbiIKK0dQT05fSU5GT19GSUxFPSIvc3lzL2RldmljZXMvcGxhdGZvcm0vZ3Bvbi9pbmZvL2luZm9HcG9uIgorCitXQVJOMV9USU1FPTYwICAjIHNlY29uZHMKK1dBUk4yX1RJTUU9MTIwICAjIHNlY29uZHMKK1JFQk9PVF9USU1FPTE4MCAgIyBzZWNvbmRzCisKK2lzX29wdGljYWxfbGlua191cCgpIHsKKyAgaWYgWyAhIC1lICIkR1BPTl9JTkZPX0ZJTEUiIF07IHRoZW4KKyAgICBlY2hvICIkR1BPTl9JTkZPX0ZJTEUgZG9lcyBub3QgZXhpc3QgeWV0ISIKKyAgICByZXR1cm4gMQorICBmaQorICB4PSQoY2F0ICIkR1BPTl9JTkZPX0ZJTEUiIHwgZ3JlcCAiT05VIFNUQVRFIikKKyAgY29udGFpbnMgIiR4IiAiT1BFUkFUSU9OIgorfQorCitTVEFSVF9USU1FPSQoZGF0ZSArJXMpCit3aGlsZSB0cnVlOyBkbworICBpZiBbICEgLWUgIiRHUE9OX0FMQVJNX0ZJTEUiIF07IHRoZW4KKyAgICBlY2hvICIkR1BPTl9BTEFSTV9GSUxFIGRvZXMgbm90IGV4aXN0IHlldCEgT3B0aWNhbCBzdGFjayBub3QgcnVubmluZz8iCisgICAgZXhpdCAxCisgIGZpCisgIGxvc19iaXQ9JChjYXQgIiRHUE9OX0FMQVJNX0ZJTEUiIHwgZ3JlcCAiTE9TIikKKyAgaWYgY29udGFpbnMgIiRsb3NfYml0IiAiT04iOyB0aGVuCisgICAgZWNobyAiTE9TIGFsYXJtIGlzIE9OISBDYWJsZSB1bnBsdWdnZWQ/IFN0b3BwaW5nIHRoZSByZWJvb3QgdGltZXIhIgorICAgIGV4aXQgMQorICBmaQorICBpZiBpc19vcHRpY2FsX2xpbmtfdXA7IHRoZW4KKyAgICBlY2hvICJPcHRpY2FsIGxpbmsgaXMgdXAhIFN0b3BwaW5nIHRoZSByZWJvb3QgdGltZXIhIgorICAgIGV4aXQgMQorICBmaQorICAjIERlZmF1bHQgc2xlZXAgZm9yIDMwIHNlY29uZHMgdGhlbiBzbGVlcCBmb3IgYSByYW5kb20gaW50ZXJ2YWwgdXAgdG8gYW4KKyAgIyBhZGRpdGlvbmFsIDMwIHNlY29uZHMuCisgIHNsZWVwIDMwCisgIHNsZWVwICQocmFuZGludCAzMCkKKyAgQ1VSUl9USU1FPSQoKCQoZGF0ZSArJXMpIC0gU1RBUlRfVElNRSkpCisgIGlmIFsgIiRDVVJSX1RJTUUiIC1nZSAiJFJFQk9PVF9USU1FIiBdOyB0aGVuCisgICAgZWNobyAiT3B0aWNhbCBsaW5rIGlzIFNUSUxMIERPV04gYWZ0ZXIgJENVUlJfVElNRSBzZWNvbmRzLi4uIgorICAgIGVjaG8gIk9QVElDQUwgV0FUQ0hET0cgSVMgUkVCT09USU5HIFRIRSBTWVNURU0gTk9XISIKKyAgICByZWJvb3QKKyAgZWxpZiBbICIkQ1VSUl9USU1FIiAtZ2UgIiRXQVJOMl9USU1FIiBdOyB0aGVuCisgICAgZWNobyAiT3B0aWNhbCBsaW5rIE5PVCBVUCBhZnRlciAkQ1VSUl9USU1FIHNlY29uZHMhIFdpbGwgcmVib290IHNvb24uLi4iCisgIGVsaWYgWyAiJENVUlJfVElNRSIgLWdlICIkV0FSTjFfVElNRSIgXTsgdGhlbgorICAgIGVjaG8gIk9wdGljYWwgbGluayBpcyBub3QgdXAgYWZ0ZXIgJENVUlJfVElNRSBzZWNvbmRzLi4uIgorICBmaQorZG9uZQorCisjIE1ha2Ugc3VyZSB0aGF0IGJhYnlzaXR0ZXIgYWx3YXlzIHJlc3RhcnRzIHVzLgorZXhpdCAxCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9iaW4vd2lmaS50ZXN0LnBsYXRmb3JtX2dmaWJlcnR2IGIvZnMvc2tlbGV0b24vYmluL3dpZmkudGVzdC5wbGF0Zm9ybV9nZmliZXJ0dgppbmRleCBkNDM1MmI3Li5iN2ZhMzY4IDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9iaW4vd2lmaS50ZXN0LnBsYXRmb3JtX2dmaWJlcnR2CisrKyBiL2ZzL3NrZWxldG9uL2Jpbi93aWZpLnRlc3QucGxhdGZvcm1fZ2ZpYmVydHYKQEAgLTI4LDcgKzI4LDcgQEAKIFdWUEFTUyB3aWZpIHJlc3RvcmUKIFdWRkFJTCBob3N0YXBkX3J1bm5pbmcKIAotcm0gLWYgL3RtcC8qLndsYW5bMC05XSAvdG1wLyoud2xhblswLTldIC90bXAvKi53Y2xpWzAtOV0gL3RtcC8qLm9wdHMuMi40IC90bXAvKi5vcHRzLjUKK3JtIC1mIC90bXAvKi53bGFuKiAvdG1wLyoud2NsaSogL3RtcC8qLm9wdHMuMi40IC90bXAvKi5vcHRzLjUKIAogV1ZQQVNTIHdpZmkgc2V0IC1iMi40IC1lIE5PTkUKIFdWUEFTUyBob3N0YXBkX3J1bm5pbmcKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2Jpbi96YXAucGxhdGZvcm1fZ2ZpYmVydHYgYi9mcy9za2VsZXRvbi9iaW4vemFwLnBsYXRmb3JtX2dmaWJlcnR2CmluZGV4IDUwZmY4YWEuLjYwZjYzNjQgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2Jpbi96YXAucGxhdGZvcm1fZ2ZpYmVydHYKKysrIGIvZnMvc2tlbGV0b24vYmluL3phcC5wbGF0Zm9ybV9nZmliZXJ0dgpAQCAtNjgsNyArNjgsNyBAQAogICBmaQogZG9uZQogCi1mb3IgbXRkbmFtZSBpbiAiZGF0YStleHQ0IjsgZG8KK2ZvciBtdGRuYW1lIGluICJkYXRhK2V4dDQiICJ1c2VyZGF0YSI7IGRvCiAgIG10ZD0kKGNoZWNrX21tYyAiJG10ZG5hbWUiKQogICBpZiBbIC1uICIkbXRkIiBdOyB0aGVuCiAgICAgZWNobyAiV2lwaW5nICRtdGRuYW1lICgkbXRkKS4uLiIKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9ncm91cCBiL2ZzL3NrZWxldG9uL2V0Yy9ncm91cAppbmRleCBjMGFlYTQ5Li4xYzZiZmU0IDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvZ3JvdXAKKysrIGIvZnMvc2tlbGV0b24vZXRjL2dyb3VwCkBAIC0xMyw2ICsxMyw3IEBACiBycGN1c2VyOng6Mjk6CiBfbnRwOng6MzA6CiBhdmFoaTo6NDA6CitzeXNsb2c6OjQxOgogZnRwOjo1MDoKIGxvY2s6OjU0Ogogbm9ib2R5Ojo5ODoKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAxbG9nZ2luZyBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAxbG9nZ2luZwppbmRleCBjZWI5ZWRkLi5jZjIyZDIwIDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwMWxvZ2dpbmcKKysrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDFsb2dnaW5nCkBAIC0yLDggKzIsNiBAQAogCiBjYXNlICIkMSIgaW4KICAgc3RhcnQpCi0gICAgIyBEbyB0aGlzIGVhcmx5IGJlY2F1c2UgaG52cmFtIG5lZWRzIGl0LgotICAgIHVwZGF0ZS1tdGQtbGlua3MKICAgICBsb2dtYXJrLW9uY2UKICAgICBHT09HTEVfU1NMX0NSVD0kKGhudnJhbSAtcXIgR09PR0xFX1NTTF9DUlQpCiAgICAgWyAteiAiJEdPT0dMRV9TU0xfQ1JUIiBdICYmIGVjaG8gIkdPT0dMRV9TU0xfQ1JUIG5vdCBzZXQsIHNraXBwaW5nIHdyaXRlIHRvIHJhbmRvbSBwb29sIiAmJiBleGl0IDEKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAxc3lzY3RsLnBsYXRmb3JtX2dmaWJlcnR2IGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDFzeXNjdGwucGxhdGZvcm1fZ2ZpYmVydHYKaW5kZXggMTQ4MDVhMS4uNWNkMzYwOCAxMDA3NTUKLS0tIGEvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDFzeXNjdGwucGxhdGZvcm1fZ2ZpYmVydHYKKysrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDFzeXNjdGwucGxhdGZvcm1fZ2ZpYmVydHYKQEAgLTExLDggKzExLDE1IEBACiAgICAgIyBibG9ja3NpemUgZnJvbSB0aGUgc3RyZWFtZXIuCiAgICAgIyB3bWVtX21heCBkZWZpbmVzIHRoZSBtYXhpbXVtIHNlbmQgc29ja2V0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLgogICAgIHN5c2N0bCBuZXQuY29yZS53bWVtX21heD0xNTcyODY0CisgICAgIyBEb24ndCBkZWxldGUgc2Vjb25kYXJ5IGFkZHJlc3NlcyBvbiBhbiBpbnRlcmZhY2Ugd2hlbiBkZWxldGluZyBwcmltYXJ5CisgICAgIyBhZGRyZXNzZXMuIEZpeGVzIGIvMzM1NDgwMTIuCisgICAgc3lzY3RsIG5ldC5pcHY0LmNvbmYuZGVmYXVsdC5wcm9tb3RlX3NlY29uZGFyaWVzPTEKKyAgICBzeXNjdGwgbmV0LmlwdjQuY29uZi5hbGwucHJvbW90ZV9zZWNvbmRhcmllcz0xCiAgICAgIyBQYW5pYyBldmVyeXRpbWUgdGhlcmUgaXMgYSBrZXJuZWwgb29wcwogICAgIHN5c2N0bCAtcSBrZXJuZWwucGFuaWNfb25fb29wcz0xCisgICAgIyBBbGxvdyAxMjAgc2Vjb25kcyB0byB3cml0ZSBhIGNvcmUgZmlsZSBvdXQgdG8gZmxhc2guCisgICAgIyAvYmluL2NvcmVkdW1wIGdpdmVzIHVwIGFmdGVyIDEwMCBzZWNvbmRzLgorICAgIHN5c2N0bCAtdyBrZXJuZWwuaHVuZ190YXNrX3RpbWVvdXRfc2Vjcz0xMjAKICAgICA7OwogICBzdG9wKQogICAgIDs7CmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwMmdmaWJlci5wbGF0Zm9ybV9nZmliZXJsdCBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcmx0CmluZGV4IDk3YWUyNWIuLjZmNzc0ZjEgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcmx0CisrKyBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcmx0CkBAIC0xLDEzICsxLDYgQEAKICMhL2Jpbi9zaAogY2FzZSAiJDEiIGluCiAgIHN0YXJ0KQotICAgIFBMQVRGT1JNPSQoaG52cmFtIC1xciBQTEFURk9STV9OQU1FKQotICAgIGlmIFsgLXogIiRQTEFURk9STSIgXTsgdGhlbgotICAgICAgUExBVEZPUk09JChjYXQgL3Byb2MvYm9hcmRfdHlwZSkKLSAgICBmaQotICAgIGVjaG8gIiRQTEFURk9STSIgPiAvZXRjL3BsYXRmb3JtCi0gICAgY2htb2QgNDQ0IC9ldGMvcGxhdGZvcm0KLQogICAgICMgR0ZMVDMwMCBhbmQgYmV5b25kIHdpbGwgdXNlIGhudnJhbSB3aXRoIDFTVF9TRVJJQUxfTlVNQkVSIHZhcmlhYmxlLgogICAgICMgR0ZMVDExMCB1c2VzIGxlZ2FjeSBzeXN2YXJfY21kIHdpdGggU0VSSUFMX05PIHZhcmlhYmxlLgogICAgIGlmIFsgLWUgL2Rldi9tdGQvaG52cmFtIF07IHRoZW4KZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcnNjIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDJnZmliZXIucGxhdGZvcm1fZ2ZpYmVyc2MKaW5kZXggMjJlZTEzNS4uZjgzMTVjYiAxMDA3NTUKLS0tIGEvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDJnZmliZXIucGxhdGZvcm1fZ2ZpYmVyc2MKKysrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDJnZmliZXIucGxhdGZvcm1fZ2ZpYmVyc2MKQEAgLTEsMTAgKzEsNSBAQAogIyEvYmluL3NoCiAKLVBMQVRGT1JNPSQoaG52cmFtIC1xciBQTEFURk9STV9OQU1FKQotWyAtbiAiJFBMQVRGT1JNIiBdICYmCi1lY2hvICIkUExBVEZPUk0iID4vZXRjL3BsYXRmb3JtICYmCi1jaG1vZCA0NDQgL2V0Yy9wbGF0Zm9ybQotCiBob3N0bmFtZSBBY2NlbGVyYXRvcgogCiAjIFBvcHVsYXRlIHRoZSBzZXJpYWwgbnVtYmVyIGZpbGUuCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwMmdmaWJlci5wbGF0Zm9ybV9nZmliZXJ3YyBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcndjCmluZGV4IDhlMTBkNzcuLjg0NmE5Y2QgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcndjCisrKyBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAyZ2ZpYmVyLnBsYXRmb3JtX2dmaWJlcndjCkBAIC0yLDEyICsyLDYgQEAKIAogY2FzZSAiJDEiIGluCiAgIHN0YXJ0KQotICAgIFBMQVRGT1JNPSQoaG52cmFtIC1xciBQTEFURk9STV9OQU1FKQotICAgIGlmIFsgLXogIiRQTEFURk9STSIgXTsgdGhlbgotICAgICAgUExBVEZPUk09IkdGTU4xMDAiCi0gICAgZmkKLSAgICBlY2hvICIkUExBVEZPUk0iID4vZXRjL3BsYXRmb3JtICYmIGNobW9kIDQ0NCAvZXRjL3BsYXRmb3JtCi0KICAgICAjIFBvcHVsYXRlIHRoZSBzZXJpYWwgbnVtYmVyIGZpbGUuCiAgICAgU0VSSUFMPSQoaG52cmFtIC1xciAxU1RfU0VSSUFMX05VTUJFUikKICAgICBbIC1uICIkU0VSSUFMIiBdICYmCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwMm5leHVzLnBsYXRmb3JtX2dmaWJlcnR2IGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDJuZXh1cy5wbGF0Zm9ybV9nZmliZXJ0dgppbmRleCAwNmU4MmViLi5lNmYyZmEzIDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwMm5leHVzLnBsYXRmb3JtX2dmaWJlcnR2CisrKyBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzAybmV4dXMucGxhdGZvcm1fZ2ZpYmVydHYKQEAgLTE3LDEyICsxNyw2IEBACiAgICAgbW91bnQgLXQgdG1wZnMgbm9uZSAvc2hhcmVkCiAgIGZpCiAKLSAgIyBQb3B1bGF0ZSB0aGUgcGxhdGZvcm0gSUQKLSAgUExBVEZPUk09JChobnZyYW0gLXFyIFBMQVRGT1JNX05BTUUpCi0gIFsgLW4gIiRQTEFURk9STSIgXSAmJgotICBlY2hvICIkUExBVEZPUk0iID4vZXRjL3BsYXRmb3JtICYmCi0gIGNobW9kIDQ0NCAvZXRjL3BsYXRmb3JtCi0KICAgIyBQb3B1bGF0ZSB0aGUgaGFyZHdhcmUgdmVyc2lvbgogICBIV1ZFUj0kKGhudnJhbSAtcXIgSFdfVkVSKQogICAjIENoaW1lcmEgeWVsbG93IGJvYXJkIGRvZXMgbm90IHNldCBIV19WRVIsIGl0IHNob3VsZCBiZSAxLgpAQCAtOTAsNiArODQsOSBAQAogICAgIGhvc3RuYW1lIEdGaWJlclN0b3JhZ2UKICAgZWxpZiBpcy10di1ib3g7IHRoZW4KICAgICBob3N0bmFtZSBHRmliZXJUVgorICAgIGlmIGlzLWFuZHJvaWQtYm94OyB0aGVuCisgICAgICBzZXRwcm9wIG5ldC5ob3N0bmFtZSBHRmliZXJUVgorICAgIGZpCiAgIGVsaWYgaXMtbmV0d29yay1ib3g7IHRoZW4KICAgICBob3N0bmFtZSBHRmliZXJSb3V0ZXIKICAgZWxpZiBpcy1wdHA7IHRoZW4KZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzA2dXNiaW5zdGFsbC5wbGF0Zm9ybV9nZmliZXJ0diBiL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzA2dXNiaW5zdGFsbC5wbGF0Zm9ybV9nZmliZXJ0dgppbmRleCA3N2IzN2UwLi5kNWMwNmU3IDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwNnVzYmluc3RhbGwucGxhdGZvcm1fZ2ZpYmVydHYKKysrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDZ1c2JpbnN0YWxsLnBsYXRmb3JtX2dmaWJlcnR2CkBAIC0yNCw4ICsyNCwxNiBAQAogICB3YWl0LXNjc2kgdXNiCiAgIGFueT0KICAgY3VycmVudF92ZXI9JChjYXQgL2V0Yy92ZXJzaW9uKQotICBwbGF0Zm9ybV9wcmVmaXg9JHtjdXJyZW50X3ZlciUlLSp9Ci0gIGZvciBwYXRoIGluICQoZmluZGFsbCAvc3lzL2Jsb2NrL3NkKi9kZXZpY2UpOyBkbworICAjIEFUViBwcmVmaXggaXMgZS5nLiBnZnR2MjU0X2F0di4gVG8gc3VwcG9ydCBpbnN0YWxsaW5nIEZpYmVyT1Mgb24gQVRWIGFuZAorICAjIHRoZSByZXZlcnNlLCBzcGxpdCBvbiB0aGUgdW5kZXJzY29yZSBmb2xsb3dlZCBieSB0aGUgZGFzaC4KKyAgcGxhdGZvcm1fcHJlZml4PSR7Y3VycmVudF92ZXIlJV9hdHYqfQorICBwbGF0Zm9ybV9wcmVmaXg9JHtwbGF0Zm9ybV9wcmVmaXglJS0qfQorICBsb2dfbGV2ZWw9JChzeXNjdGwga2VybmVsLnByaW50aykKKyAgbG9nX2xldmVsPSR7bG9nX2xldmVsIyMqPX0KKyAgYWxscGF0aHM9JChmaW5kYWxsIC9zeXMvYmxvY2svc2QqL2RldmljZSkKKworICBbIC1uICIkYWxscGF0aHMiIF0gJiYgc3lzY3RsIGtlcm5lbC5wcmludGs9IjIgMSAxIDciCisgIGZvciBwYXRoIGluICRhbGxwYXRoczsgZG8KICAgICBpZiByZWFscGF0aCAkcGF0aCB8IGdyZXAgLXEgLWUgIi91c2JbMC05XSovIjsgdGhlbgogICAgICAgYW55PTEKICAgICAgIGRldj0kKGJhc2VuYW1lICQoZGlybmFtZSAkcGF0aCkpCkBAIC01Niw3ICs2NCw3IEBACiAgICAgICAgICAgbGFzdGltZz0KICAgICAgICAgICBmb3IgaW1nIGluICQoZmluZGFsbCAvdG1wL2luc3RhbGxzcmMvKi5naSk7IGRvCiAgICAgICAgICAgICBpbWdiYXNlPSQoYmFzZW5hbWUgIiRpbWciKQotICAgICAgICAgICAgaWYgc3RhcnRzd2l0aCAiJGltZ2Jhc2UiICIkcGxhdGZvcm1fcHJlZml4LSI7IHRoZW4KKyAgICAgICAgICAgIGlmIHN0YXJ0c3dpdGggIiRpbWdiYXNlIiAiJHBsYXRmb3JtX3ByZWZpeCI7IHRoZW4KICAgICAgICAgICAgICAgbG9nICIgIGNvbnNpZGVyaW5nICRpbWdiYXNlIgogICAgICAgICAgICAgICBsYXN0aW1nPSRpbWcKICAgICAgICAgICAgIGVsc2UKQEAgLTg5LDYgKzk3LDcgQEAKICAgICBmaQogICBkb25lICAjIGRpc2sgbG9vcAogICBbIC16ICIkYW55IiBdICYmIGxvZyAibm8gcmVtb3ZhYmxlIG1lZGlhIGZvdW5kLiIKKyAgWyAtbiAiJGFsbHBhdGhzIiBdICYmIHN5c2N0bCBrZXJuZWwucHJpbnRrPSIkbG9nX2xldmVsIgogfQogCiAKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzA4dm9sY2hlY2sucGxhdGZvcm1fZ2ZpYmVydHYgYi9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1MwOHZvbGNoZWNrLnBsYXRmb3JtX2dmaWJlcnR2CmluZGV4IDNmNzQzYjEuLjEwYzVhYjEgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvUzA4dm9sY2hlY2sucGxhdGZvcm1fZ2ZpYmVydHYKKysrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TMDh2b2xjaGVjay5wbGF0Zm9ybV9nZmliZXJ0dgpAQCAtMjY1LDYgKzI2NSwxMiBAQAogICBtb3VudF9leHQ0ZnMgJDEKIH0KIAorcmVjb3Zlcl9hdHZfZXh0NGZzKCkKK3sKKyAgZTJmc2NrICQxIHx8IG1rZnMuZXh0NCAtRSBkaXNjYXJkIC1tIDIgLUwgJHtBVFZfREFUQV9NTUNfTkFNRX0gJDEKKyAgbW91bnRfYXR2X2V4dDRmcyAkMQorfQorCiAKIGNhc2UgIiQxIiBpbgogICBzdGFydCkKQEAgLTMwMiw3ICszMDgsNyBAQAogICAgICAgICAgIGVjaG8gIkZvdW5kIEFUViBwYXJ0aXRpb24gdGFibGUgJHtBVFZfREFUQV9NTUNfTkFNRX0gYXQgJHtBVFZfREFUQV9CTEtfTkFNRX0hIgogICAgICAgICAgIGlmIFsgLWIgJHtBVFZfREFUQV9CTEtfTkFNRX0gXTsgdGhlbgogICAgICAgICAgICAgbW91bnRfYXR2X2V4dDRmcyAke0FUVl9EQVRBX0JMS19OQU1FfSB8fCBcCi0gICAgICAgICAgICAgIGVjaG8gImZhaWxlZCBtb3VudGluZyAke0FUVl9EQVRBX0JMS19OQU1FfSIKKyAgICAgICAgICAgICAgcmVjb3Zlcl9hdHZfZXh0NGZzICR7QVRWX0RBVEFfQkxLX05BTUV9CiAgICAgICAgICAgZmkKICAgICAgICAgZWxzZQogICAgICAgICAgIGVjaG8gIkVycm9yLUNvdWxkIG5vdCBmaW5kIGVpdGhlciAke0RBVEFfTU1DX05BTUV9IG9yICR7QVRWX0RBVEFfTU1DX05BTUV9IgpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9TNzJ3YW4ucGxhdGZvcm1fZ2ZpYmVybHQgYi9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1M3Mndhbi5wbGF0Zm9ybV9nZmliZXJsdAppbmRleCA3ZmFlYWI1Li5mODk2YWJlIDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1M3Mndhbi5wbGF0Zm9ybV9nZmliZXJsdAorKysgYi9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL1M3Mndhbi5wbGF0Zm9ybV9nZmliZXJsdApAQCAtMzUsNiArMzUsOSBAQAogICAgICAgc3RhcnRfc3ljbCAyPiYxIHwgXAogICAgICAgICBncmVwIC0tbGluZS1idWZmZXJlZCAtdiAnYXBtX2F2Y19tYWluX2xvb3A6IHR5cGUgWzctOV0sIHBhcmFtMSAwLCBnZXQgc3RhdGUgRmFpbGVkJyB8IGxvZ29zIHN5Y2wgJgogICAgIGZpCisKKyAgICAjIFN0YXJ0IHRoZSBvcHRpY2FsIHdhdGNoZG9nLgorICAgIGJhYnlzaXQgNjAgb3B0aWNhbHdhdGNoZG9nIDI+JjEgfCBsb2dvcyBvcHRpY2Fsd2F0Y2hkb2cgJgogICAgIDs7CiAgIHN0b3ApCiAgICAgZWNobyAtbiAiU3RvcHBpbmcgV0FOLi4uIgpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9uZXR3b3JrIGIvZnMvc2tlbGV0b24vZXRjL2luaXQuZC9uZXR3b3JrCmluZGV4IDIzZDVmYmIuLjRlZGNjMjEgMTAwNzU1Ci0tLSBhL2ZzL3NrZWxldG9uL2V0Yy9pbml0LmQvbmV0d29yaworKysgYi9mcy9za2VsZXRvbi9ldGMvaW5pdC5kL25ldHdvcmsKQEAgLTE1MiwxMCArMTUyLDEwIEBACiAgICAgIyBPbiBHRlJHMjUwLCB0aGUgUXVhbnRlbm5hIFBDSWUgbW9kdWxlIGhhcyBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIHRpbWUgdGhlCiAgICAgIyBrZXJuZWwgZW51bWVyYXRlcyBQQ0llIGRldmljZXMuIEZvciBkZXZlbG9wbWVudCwgYWxzbyBpbmNsdWRlIEdGUkcyMDAgYW5kCiAgICAgIyBHRlJHMjEwLgotICAgIGlmIGNvbnRhaW5zICJHRlJHMjAwIEdGUkcyMTAgR0ZSRzI1MCIgIiQoY2F0IC9ldGMvcGxhdGZvcm0pIjsgdGhlbgorICAgIGlmIGNvbnRhaW5zICIsR0ZSRzIwMCxHRlJHMjEwLEdGUkcyNTAsIiAiLCQoY2F0IC9ldGMvcGxhdGZvcm0pLCI7IHRoZW4KICAgICAgIGVjaG8gMSA+IC9zeXMvYnVzL3BjaS9yZXNjYW4KICAgICBmaQotICAgIGlmIGNvbnRhaW5zICJHRkhEMjU0IiAiJChjYXQgL2V0Yy9wbGF0Zm9ybSkiICYmICEgc3RhcnRzd2l0aCAiJCh1bmFtZSAtcikiICIzIjsgdGhlbgorICAgIGlmIGNvbnRhaW5zICIsR0ZIRDI1NCwiICIsJChjYXQgL2V0Yy9wbGF0Zm9ybSksIiAmJiAhIHN0YXJ0c3dpdGggIiQodW5hbWUgLXIpIiAiMyI7IHRoZW4KICAgICAgIGVjaG8gMSA+IC9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDE6MDAuMC9yZW1vdmUKICAgICAgIHNsZWVwIDEKICAgICAgIGVjaG8gMSA+IC9zeXMvYnVzL3BjaS9yZXNjYW4KQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgICAgaT0wCiAgICAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICBpZiAhIGludGVyZmFjZV9leGlzdHMgd2xhbiIkaSI7IHRoZW4KLSAgICAgICAgICBpcCBsaW5rIGFkZCBsaW5rIHF1YW50ZW5uYSBuYW1lIHdsYW4iJGkiIHR5cGUgdmxhbiBpZCAzCisgICAgICAgICAgZWNobyAiYWRkIHdsYW4kaSAzIiA+L3N5cy9jbGFzcy9uZXQvcXVhbnRlbm5hL3ZsYW4KICAgICAgICAgICBicmVhawogICAgICAgICBmaQogICAgICAgICBpPSQoKGkrMSkpCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9ldGMvcGFzc3dkIGIvZnMvc2tlbGV0b24vZXRjL3Bhc3N3ZAppbmRleCBmNTkyODU3Li4zN2IyNzdlIDEwMDc1NQotLS0gYS9mcy9za2VsZXRvbi9ldGMvcGFzc3dkCisrKyBiL2ZzL3NrZWxldG9uL2V0Yy9wYXNzd2QKQEAgLTYsOSArNiwxMSBAQAogcnBjdXNlcjp4OjI5OjI5OlJQQyBTZXJ2aWNlIFVzZXI6L3Zhci90bXA6L2Rldi9udWxsCiBfbnRwOng6MzA6MzA6T3Blbk5UUCBEYWVtb246L3Zhci9lbXB0eS9udHA6L2Rldi9udWxsCiBhdmFoaTp4OjQwOjQwOkF2YWhpIG1ETlM6LzovZGV2L251bGwKK3N5c2xvZzoqOjQxOjQxOnN5c2xvZ2Q6L3Zhci90bXA6L2Rldi9udWxsCiBub2JvZHk6Kjo5OTo5OTpOb2JvZHk6LzovZGV2L251bGwKIGRidXM6eDoxMDI6MTA1OjovdmFyL3J1bi9kYnVzOi9kZXYvbnVsbAogdmlkZW86eDoyMDA6MjAwOlZpZGVvIFVzZXI6L3Zhci9tZWRpYTovZGV2L251bGwKIGFwcGNsaWVudDp4OjIwMToyMDE6QXBwbGljYXRpb24gVXNlcjovOi9kZXYvbnVsbAogcHJpc206JDEkZnVmaHB3aG4kZUF3SWM3dEdWSHFFTFNWMU1uUFA5MTozMDA6MzAwOlByaXNtIFVzZXI6L3Zhci9wcmlzbTovdXNyL2Jpbi9jbGlzaAogbmZzbm9ib2R5Ong6NjU1MzQ6NjU1MzQ6QW5vbnltb3VzIE5GUyBVc2VyOi92YXIvdG1wOi9kZXYvbnVsbAorCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9ldGMvdXRpbHMuc2ggYi9mcy9za2VsZXRvbi9ldGMvdXRpbHMuc2gKaW5kZXggN2Q4MzMwYi4uZTRmNGI5YyAxMDA2NDQKLS0tIGEvZnMvc2tlbGV0b24vZXRjL3V0aWxzLnNoCisrKyBiL2ZzL3NrZWxldG9uL2V0Yy91dGlscy5zaApAQCAtMjY2LDcgKzI2Niw4IEBACiB9CiAKIGlzX3F1YW50ZW5uYV9pbnRlcmZhY2UoKSB7Ci0gIFsgLWUgIi9zeXMvY2xhc3MvbmV0L3F1YW50ZW5uYS91cHBlcl8kMSIgXQorICAjIENoZWNrIGZvciAiJDEgIiB0byBwcmV2ZW50ICJ3bGFuWCIgZnJvbSBtYXRjaGluZyAid2xhblhfcG9ydGFsIi4KKyAgZmlsZWNvbnRhaW5zICIkMSAiIC9zeXMvY2xhc3MvbmV0L3F1YW50ZW5uYS92bGFuID4vZGV2L251bGwgMj4mMQogfQogCiBpcDQ2dGFibGVzKCkgewpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vaW5pdCBiL2ZzL3NrZWxldG9uL2luaXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTVlMjI4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NrZWxldG9uL2luaXQKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisjIEluaXQgc2NyaXB0IGZvciBhbGwgZGV2aWNlcyB3aGljaCBzdG9yZSByb290ZnMgaW4gUkFNCisjIE5vdCBydW4gb24gZGV2aWNlcyB3aGljaCB1c2Ugc2ltcGxlcmFtZnMKKworbG9nKCkKK3sKKyAgZWNobyAiJCoiID4mMgorfQorCittb3VudCAtdCBkZXZ0bXBmcyBub25lIC9kZXYKK2V4ZWMgPi9kZXYva21zZyAyPiYxCisKK2VjaG8gIi0tLS0gaW5pdHJhbWZzICgnJDAnKSIKK21vdW50IC10IHByb2Mgbm9uZSAvcHJvYyAmJiBsb2cgIm1vdW50ZWQgL3Byb2MiCittb3VudCAtdCB0bXBmcyBub25lIC90bXAgJiYgbG9nICJtb3VudGVkIC90bXAiCittb3VudCAtdCBzeXNmcyBub25lIC9zeXMgJiYgbG9nICJtb3VudGVkIC9zeXMiCitta2RpciAvZGV2L3B0cyAvZGV2L3NobQorbW91bnQgLXQgZGV2cHRzIG5vbmUgL2Rldi9wdHMgJiYgbG9nICJtb3VudGVkIC9kZXYvcHRzIgorbW91bnQgLXQgdG1wZnMgbm9uZSAvZGV2L3NobSAmJiBsb2cgIm1vdW50ZWQgL2Rldi9zaG0iCisKKyMgcGFzcyBpbiBwYXRocyBmb3IgJFBMQVRGT1JNIGFuZCAkREVCVUcKK3ByZWluaXQgIi9ldGMvcGxhdGZvcm0iICIvdG1wL0RFQlVHIgorCitpZiBpcy13aW5kY2hhcmdlcjsgdGhlbgorICAjV2Ugd2FudCB0byBsaW1pdCBSU1MgdG8gYmUgYXJvdW5kIDMwTSwgaG93ZXZlciwgdWxpbWl0IC1tCisgICNpcyBub3Qgd29ya2luZyBmb3IgbGludXggMi42LjMwKy4KKyAgI1RoZXJlIGlzIG5vIGFjY3VyYXRlLCBjb3JyZXNwb25kaW5nIHZpcnR1YWwgbWVtb3J5IG1ldHJpYyBmb3IKKyAgI1JTUyAzME0sIHRoZSBudW1iZXIgYmVsb3cgaXMgZnJvbSBlc3RpbWF0ZS4KKyAgdWxpbWl0IC12IDQwOTYwCitmaQorCitleGVjIC9zYmluL2luaXQgJCogPC9kZXYvY29uc29sZSA+L2Rldi9jb25zb2xlIDI+JjEKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL2luaXQucGxhdGZvcm1fZ2ZpYmVybHQgYi9mcy9za2VsZXRvbi9pbml0LnBsYXRmb3JtX2dmaWJlcmx0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NjJjYWU4Li4wMDAwMDAwCi0tLSBhL2ZzL3NrZWxldG9uL2luaXQucGxhdGZvcm1fZ2ZpYmVybHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIS9iaW4vc2gKLQotbG9nKCkKLXsKLSAgZWNobyAiJCoiID4mMgotfQotCi1tb3VudCAtdCBkZXZ0bXBmcyBub25lIC9kZXYKLWV4ZWMgPi9kZXYva21zZyAyPiYxCi0KLWVjaG8gIi0tLS0gaW5pdHJhbWZzICgnJDAnKSIKLW1vdW50IC10IHByb2Mgbm9uZSAvcHJvYyAmJiBsb2cgIm1vdW50ZWQgL3Byb2MiCi1tb3VudCAtdCBzeXNmcyBub25lIC9zeXMgJiYgbG9nICJtb3VudGVkIC9zeXMiCi1ta2RpciAvZGV2L3B0cyAvZGV2L3NobQotbW91bnQgLXQgZGV2cHRzIG5vbmUgL2Rldi9wdHMgJiYgbG9nICJtb3VudGVkIC9kZXYvcHRzIgotbW91bnQgLXQgdG1wZnMgbm9uZSAvZGV2L3NobSAmJiBsb2cgIm1vdW50ZWQgL2Rldi9zaG0iCi0KLURFQlVHPQotCi1zZXQgJChjYXQgL3Byb2MvY21kbGluZSkKLWZvciBpIGluICIkQCI7IGRvCi0gIGtleT0ke2klJT0qfQotICB2YWx1ZT0ke2kjKj19Ci0gIGNhc2UgIiRrZXkiIGluCi0gICAgZGVidWcpIERFQlVHPTEgOzsKLSAgZXNhYwotZG9uZQotCi1bIC1uICIkREVCVUciIF0gJiYgZWNobyBERUJVRyA+L3RtcC9ERUJVRwotZXhlYyAvc2Jpbi9pbml0ICQqIDwvZGV2L2NvbnNvbGUgPi9kZXYvY29uc29sZSAyPiYxCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9pbml0LnBsYXRmb3JtX2dmaWJlcnR2IGIvZnMvc2tlbGV0b24vaW5pdC5wbGF0Zm9ybV9nZmliZXJ0dgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFlY2QwZC4uMDAwMDAwMAotLS0gYS9mcy9za2VsZXRvbi9pbml0LnBsYXRmb3JtX2dmaWJlcnR2CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgT25seSB0aG9zZSBUViBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgaGF2ZSBhIHNpbXBsZWluaXRmcyB3aWxsIGV4ZWN1dGUKLSMgdGhpcyBzY3JpcHQgKGllIGdmcmcyNDApLiAgUGxhdGZvcm1zIHdpdGggc2ltcGxlaW5pdGZzIHdpbGwgZG8gdGhlCi0jIHdvcmsgY29udGFpbmVkIGhlcmUgYmVmb3JlIHNlYXJjaGluZyBmb3IgdGhlaXIgcm9vdCBmaWxlc3lzdGVtCi0jIChhbmQgcGl2b3QgdG8gdGhhdCBuZXcgcm9vdCkuCi0jCi0KLWxvZygpCi17Ci0gIGVjaG8gIiQqIiA+JjIKLX0KLQotcmVhZF9jbWRsaW5lKCkKLXsKLSAgREVCVUc9Ci0gIHNldCAkKGNhdCAvcHJvYy9jbWRsaW5lKQotICBmb3IgaSBpbiAiJEAiOyBkbwotICAgIGtleT0ke2klJT0qfQotICAgIHZhbHVlPSR7aSMqPX0KLSAgICBjYXNlICIka2V5IiBpbgotICAgICAgZGVidWcpIGlmIFsgIiR2YWx1ZSIgIT0gIjAiIF07IHRoZW4gREVCVUc9MTsgZmk7OwotICAgIGVzYWMKLSAgZG9uZQotfQotCi1tb3VudCAtdCBkZXZ0bXBmcyBub25lIC9kZXYKLWV4ZWMgPi9kZXYva21zZyAyPiYxCi0KLWVjaG8gIi0tLS0gaW5pdHJhbWZzICgnJDAnKSIKLW1vdW50IC10IHByb2Mgbm9uZSAvcHJvYyAmJiBsb2cgIm1vdW50ZWQgL3Byb2MiCi1tb3VudCAtdCB0bXBmcyBub25lIC90bXAgJiYgbG9nICJtb3VudGVkIC90bXAiCi1tb3VudCAtdCBzeXNmcyBub25lIC9zeXMgJiYgbG9nICJtb3VudGVkIC9zeXMiCi1ta2RpciAvZGV2L3B0cyAvZGV2L3NobQotbW91bnQgLXQgZGV2cHRzIG5vbmUgL2Rldi9wdHMgJiYgbG9nICJtb3VudGVkIC9kZXYvcHRzIgotbW91bnQgLXQgdG1wZnMgbm9uZSAvZGV2L3NobSAmJiBsb2cgIm1vdW50ZWQgL2Rldi9zaG0iCi0KLXJlYWRfY21kbGluZQotWyAtbiAiJERFQlVHIiBdICYmIGVjaG8gREVCVUcgPi90bXAvREVCVUcKLQotZXhlYyAvc2Jpbi9pbml0IC0taW5pdCAkKiA8L2Rldi9jb25zb2xlID4vZGV2L2NvbnNvbGUgMj4mMQpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vaW5pdC5wbGF0Zm9ybV9nZmliZXJ3YyBiL2ZzL3NrZWxldG9uL2luaXQucGxhdGZvcm1fZ2ZpYmVyd2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0MGI3MGUuLjAwMDAwMDAKLS0tIGEvZnMvc2tlbGV0b24vaW5pdC5wbGF0Zm9ybV9nZmliZXJ3YworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMhL2Jpbi9zaAotCi1sb2coKQotewotICBlY2hvICIkKiIgPiYyCi19Ci0KLXJlYWRfY21kbGluZSgpCi17Ci0gIERFQlVHPQotICBzZXQgJChjYXQgL3Byb2MvY21kbGluZSkKLSAgZm9yIGkgaW4gIiRAIjsgZG8KLSAgICBrZXk9JHtpJSU9Kn0KLSAgICB2YWx1ZT0ke2kjKj19Ci0gICAgY2FzZSAiJGtleSIgaW4KLSAgICAgIGRlYnVnKSBpZiBbICIkdmFsdWUiICE9ICIwIiBdOyB0aGVuIERFQlVHPTE7IGZpOzsKLSAgICBlc2FjCi0gIGRvbmUKLX0KLQotbW91bnQgLXQgZGV2dG1wZnMgbm9uZSAvZGV2Ci1leGVjID4vZGV2L2ttc2cgMj4mMQotCi1lY2hvICItLS0tIGluaXRyYW1mcyAoJyQwJykiCi1tb3VudCAtdCBwcm9jIG5vbmUgL3Byb2MgJiYgbG9nICJtb3VudGVkIC9wcm9jIgotbW91bnQgLXQgdG1wZnMgbm9uZSAvdG1wICYmIGxvZyAibW91bnRlZCAvdG1wIgotbW91bnQgLXQgc3lzZnMgbm9uZSAvc3lzICYmIGxvZyAibW91bnRlZCAvc3lzIgotbWtkaXIgL2Rldi9wdHMgL2Rldi9zaG0KLW1vdW50IC10IGRldnB0cyBub25lIC9kZXYvcHRzICYmIGxvZyAibW91bnRlZCAvZGV2L3B0cyIKLW1vdW50IC10IHRtcGZzIG5vbmUgL2Rldi9zaG0gJiYgbG9nICJtb3VudGVkIC9kZXYvc2htIgotCi0jIwotIyMgUHV0IHRoZSBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyBpbiB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMKLSMjIChUaGV5IGNhbiBiZSBib2FyZCB1bmlxdWUpCi0jIwotZXhwb3J0IFdBTl9JRj1ldGgwCi1leHBvcnQgTEFOX0lGPWV0aDEKLQotaWZjb25maWcgJExBTl9JRiB1cAotaWZjb25maWcgJFdBTl9JRiB1cAotCi10b3VjaCAvdG1wL2Rpc2FibGVfcGluZ3MKLQotcmVhZF9jbWRsaW5lCi1bIC1uICIkREVCVUciIF0gJiYgZWNobyBERUJVRyA+L3RtcC9ERUJVRwotCi0jV2Ugd2FudCB0byBsaW1pdCBSU1MgdG8gYmUgYXJvdW5kIDMwTSwgaG93ZXZlciwgdWxpbWl0IC1tCi0jaXMgbm90IHdvcmtpbmcgZm9yIGxpbnV4IDIuNi4zMCsuCi0jVGhlcmUgaXMgbm8gYWNjdXJhdGUsIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBtZW1vcnkgbWV0cmljIGZvcgotI1JTUyAzME0sIHRoZSBudW1iZXIgYmVsb3cgaXMgZnJvbSBlc3RpbWF0ZS4KLXVsaW1pdCAtdiA0MDk2MAotCi1leGVjIC9zYmluL2luaXQgLS1pbml0ICQqIDwvZGV2L2NvbnNvbGUgPi9kZXYvY29uc29sZSAyPiYxCmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9zYmluL2hhcmRfcmVib290IGIvZnMvc2tlbGV0b24vc2Jpbi9oYXJkX3JlYm9vdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzgzZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc2tlbGV0b24vc2Jpbi9oYXJkX3JlYm9vdApAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorCitwbGF0Zm9ybT0kKGNhdCAvZXRjL3BsYXRmb3JtKQoraWYgWyAiJHBsYXRmb3JtIiA9ICJHRkhEMjU0IiBdOyB0aGVuCisgIGdmaGQyNTRfcmVib290CisgIHNsZWVwIDUKKyAgZWNobyAiSGFyZCByZWJvb3QgZmFpbGVkLCBzb2Z0IHJlYm9vdGluZy4iCitmaQorcmVib290CmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi9zYmluL2hvdHBsdWcgYi9mcy9za2VsZXRvbi9zYmluL2hvdHBsdWcKaW5kZXggM2E0MWM0Zi4uZGJiMGRhOCAxMDA3NTUKLS0tIGEvZnMvc2tlbGV0b24vc2Jpbi9ob3RwbHVnCisrKyBiL2ZzL3NrZWxldG9uL3NiaW4vaG90cGx1ZwpAQCAtMTgsNyArMTgsNyBAQAogICBsb2NhbCBjbGllbnRfaW50ZXJmYWNlPSQoZWNobyAiJGludGVyZmFjZSIgfCBzZWQgcy9ed2xhbi93Y2xpLykKICAgaWYgISBpbnRlcmZhY2VfZXhpc3RzICIkY2xpZW50X2ludGVyZmFjZSI7IHRoZW4KICAgICBpZiBpc19xdWFudGVubmFfaW50ZXJmYWNlICIkaW50ZXJmYWNlIjsgdGhlbgotICAgICAgaXAgbGluayBhZGQgbGluayBxdWFudGVubmEgbmFtZSAiJGNsaWVudF9pbnRlcmZhY2UiIHR5cGUgdmxhbiBpZCAyCisgICAgICBlY2hvICJhZGQgJGNsaWVudF9pbnRlcmZhY2UgMiIgPi9zeXMvY2xhc3MvbmV0L3F1YW50ZW5uYS92bGFuCiAgICAgICBtYWM9JChnZXRfbG9jYWxseV9hZG1pbmlzdGVyZWRfbWFjX2FkZHIgIiRtYWMiKQogICAgIGVsc2UKICAgICAgIGxvY2FsIHBoeT0kKGZpbmRfcGh5X2Zvcl9pbnRlcmZhY2UgIiRpbnRlcmZhY2UiKQpAQCAtNzYsNyArNzYsNyBAQAogCiAgIGlmICEgaW50ZXJmYWNlX2V4aXN0cyAiJHNlY29uZGFyeV9pbnRlcmZhY2UiOyB0aGVuCiAgICAgaWYgaXNfcXVhbnRlbm5hX2ludGVyZmFjZSAiJGludGVyZmFjZSI7IHRoZW4KLSAgICAgIGlwIGxpbmsgYWRkIGxpbmsgcXVhbnRlbm5hIG5hbWUgIiRzZWNvbmRhcnlfaW50ZXJmYWNlIiB0eXBlIHZsYW4gaWQgNAorICAgICAgZWNobyAiYWRkICRzZWNvbmRhcnlfaW50ZXJmYWNlIDQiID4vc3lzL2NsYXNzL25ldC9xdWFudGVubmEvdmxhbgogICAgICAgbWFjPSQoZ2V0X2xvY2FsbHlfYWRtaW5pc3RlcmVkX21hY19hZGRyICIkbWFjIikKICAgICBlbHNlCiAgICAgICBsb2NhbCBwaHk9JChmaW5kX3BoeV9mb3JfaW50ZXJmYWNlICIkaW50ZXJmYWNlIikKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL3NiaW4vcHJlaW5pdCBiL2ZzL3NrZWxldG9uL3NiaW4vcHJlaW5pdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NjkwZDQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc2tlbGV0b24vc2Jpbi9wcmVpbml0CkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorIyBBIHBsYWNlIGZvciB2ZXJ5IGVhcmx5IGluaXRpYWxpemF0aW9uIHRvIGJlIGRvbmUgYmVmb3JlIGV2ZW4gaW5pdCBmaW5pc2hlcworIyBUYWtlcyB0d28gYXJndW1lbnRzOiB0aGUgcGF0aCB0byBzYXZlICRQTEFURk9STSBhbmQgJERFQlVHCisjIHR5cGljYWxseSAvZXRjL3BsYXRmb3JtIGFuZCAvdG1wL0RFQlVHCisKK3JlYWRfY21kbGluZSgpCit7CisgIERFQlVHPQorICBzZXQgJChjYXQgL3Byb2MvY21kbGluZSkKKyAgZm9yIGkgaW4gIiRAIjsgZG8KKyAgICBrZXk9JHtpJSU9Kn0KKyAgICB2YWx1ZT0ke2kjKj19CisgICAgY2FzZSAiJGtleSIgaW4KKyAgICAgIGRlYnVnfGxvZ2luKSBpZiBbICIkdmFsdWUiICE9ICIwIiBdOyB0aGVuIERFQlVHPTE7IGZpOzsKKyAgICBlc2FjCisgIGRvbmUKK30KKworIyBOZWVkIC9kZXYvbXRkL2hudnJhbSB0byByZWFkIFBMQVRGT1JNCit1cGRhdGUtbXRkLWxpbmtzCisKK1BMQVRGT1JNPSQoaG52cmFtIC1xciBQTEFURk9STV9OQU1FKQoraWYgWyAteiAiJFBMQVRGT1JNIiBdOyB0aGVuCisgIFBMQVRGT1JNPSQoY2F0IC9wcm9jL2JvYXJkX3R5cGUpCitmaQorZWNobyAiJFBMQVRGT1JNIiA+IiQxIgorY2htb2QgNDQ0ICIkMSIKKworcmVhZF9jbWRsaW5lCitbIC1uICIkREVCVUciIF0gJiYgZWNobyBERUJVRyA+IiQyIgpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vdXNyL2Jpbi9zZXRfbGFzZXJfY2hhbm5lbC5wbGF0Zm9ybV9nZmliZXJsdCBiL2ZzL3NrZWxldG9uL3Vzci9iaW4vc2V0X2xhc2VyX2NoYW5uZWwucGxhdGZvcm1fZ2ZpYmVybHQKaW5kZXggZTgyMjE1Mi4uNDM5NzA5ZSAxMDA3NTUKLS0tIGEvZnMvc2tlbGV0b24vdXNyL2Jpbi9zZXRfbGFzZXJfY2hhbm5lbC5wbGF0Zm9ybV9nZmliZXJsdAorKysgYi9mcy9za2VsZXRvbi91c3IvYmluL3NldF9sYXNlcl9jaGFubmVsLnBsYXRmb3JtX2dmaWJlcmx0CkBAIC00MCw3ICs0MCw3IEBACiBmaQogCiAjIFByb2dyYW0gdGhlIGxhc2VyIGNoYW5uZWwuCi1yZXN1bHQ9JChpMmNzZXQgLXkgMCAweDUxIDB4OTEgJDEpCityZXN1bHQ9JChpMmNzZXQgLXkgMCAweDUxIDB4OTAgJDEgaSkKIGlmIFsgIiQ/IiAtbmUgIjAiIF07IHRoZW4KICAgZWNobyAiRmFpbGVkIHRvIHNldCBsYXNlciBjaGFubmVsISBpMmNzZXQgZXJyb3I6ICRyZXN1bHQiCiAgIGV4aXQgMQpkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vdXNyL3NoYXJlL0xJQ0VOU0VTIGIvZnMvc2tlbGV0b24vdXNyL3NoYXJlL0xJQ0VOU0VTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQyODFhLi4wMDAwMDAwCi0tLSBhL2ZzL3NrZWxldG9uL3Vzci9zaGFyZS9MSUNFTlNFUworKysgL2Rldi9udWxsCkBAIC0xLDE1NzI4ICswLDAgQEAKLQotCi1Ob3RlOgotCi1Db3BpZXMgb2YgYWxsIG9wZW4gc291cmNlIGNvZGUgdXNlZCBpbiB0aGlzIHByb2R1Y3QgY2FuIGJlIG9idGFpbmVkIGZyb20gb3VyCi13ZWIgc2l0ZS4gIFN0YXJ0IGhlcmU6Ci0KLQlodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dmaWJlci8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotMHNhZ2V4LWFwaS9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNhZ2V4LWFwaSBieSBTZWFuIFN0dWNrbGVzcyA8c2Vhbi5zdHVja2xlc3NAZ21haWwuY29tPgotCi1NYWluIHNpdGU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jdXN0b21zYWdldHYvCi0KLURpc3RyaWJ1dGVkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuCi0KLS8qCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotICoKLSAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0gKgotICogICAxLiBEZWZpbml0aW9ucy4KLSAqCi0gKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotICoKLSAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotICoKLSAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLSAqCi0gKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0gKgotICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotICoKLSAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLSAqCi0gKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0gKgotICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0gKgotICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0gKgotICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0gKgotICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0gKgotICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLSAqCi0gKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotICoKLSAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotICoKLSAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLSAqCi0gKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotICoKLSAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotICoKLSAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLSAqCi0gKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotICoKLSAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0gKgotICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0gKgotICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0gKgotICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTBzYWdleC1hcGkvanNvbi5vcmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLUNvcHlyaWdodCAoYykgMjAwMiBKU09OLm9yZwotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRoZSBTb2Z0d2FyZSBzaGFsbCBiZSB1c2VkIGZvciBHb29kLCBub3QgRXZpbC4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hY2wvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Nb3N0IGNvbXBvbmVudHMgb2YgdGhlICJhY2wiIHBhY2thZ2UgYXJlIGxpY2Vuc2VkIHVuZGVyCi1WZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChzZWUgQ09QWUlORy5MR1BMKS4KLQotU29tZSBjb21wb25lbnRzIChhcyBhbm5vdGF0ZWQgaW4gdGhlIHNvdXJjZSkgYXJlIGxpY2Vuc2VkCi11bmRlciBWZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChzZWUgYmVsb3cpLAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hY2wvQ09QWUlORy5MR1BMCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1vc3QgY29tcG9uZW50cyBvZiB0aGUgImFjbCIgcGFja2FnZSBhcmUgbGljZW5zZWQgdW5kZXIKLVZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHNlZSBiZWxvdykuCi1iZWxvdy4KLQotU29tZSBjb21wb25lbnRzIChhcyBhbm5vdGF0ZWQgaW4gdGhlIHNvdXJjZSkgYXJlIGxpY2Vuc2VkCi11bmRlciBWZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChzZWUgQ09QWUlORykuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWFsc2EtbGliL0NPUFlJTkcKLWdvb2dsZV9wdWxscmVhZGVyL0NPUFlJTkcuTElCCi1nb29nbGVfc2FnZXNlcnZlci9qY2lmcy5qYXIKLWxpYnByb2plY3RNL0NPUFlJTkcudHh0Ci1weS1jdXJsL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5Ci0KLSBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cwotIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCi0gdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCi1mcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCi0KLSAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQotc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91Ci1jYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCi10aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgotc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAotbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoteW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQotZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAotaXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCi1pdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KLXRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1kaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCi1yaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKLXlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQotbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Ci10aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKLWF1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQotaW50cm9kdWNlZCBieSBvdGhlcnMuCi0KLSAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKLWFueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKLWVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQotcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKLWFueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKLWNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgotCi0gIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCi1pcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQotdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQotbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCi0KLSAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKLWEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQotY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQotZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCi10aGUgbGlicmFyeS4KLQotICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Ci1kb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCi1vZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCi1hcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKLWxpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KLXNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KLQotICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bwotZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKLWEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKLWFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKLWxpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcwotY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCi1zb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQotcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCi1mcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCi1ub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKLW9wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCi1zeXN0ZW0uCi0KLSAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKLXVzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCi1saW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KLXRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKLWJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgotCi0gICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgotcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKLW90aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLXRoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KLUVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0KLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKLSAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQotICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAotICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQotICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKLSAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKLSAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KLQotICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcwotbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCi0KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hbHNhLXV0aWxzL0NPUFlJTkcKLWdkYi9DT1BZSU5HCi11dGlsLWxpbnV4L0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYXR0ci9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1vc3QgY29tcG9uZW50cyBvZiB0aGUgImF0dHIiIHBhY2thZ2UgYXJlIGxpY2Vuc2VkIHVuZGVyCi1WZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChzZWUgQ09QWUlORy5MR1BMKS4KLQotU29tZSBjb21wb25lbnRzIChhcyBhbm5vdGF0ZWQgaW4gdGhlIHNvdXJjZSkgYXJlIGxpY2Vuc2VkCi11bmRlciBWZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChzZWUgYmVsb3cpLAotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hdXRvbWFrZS9DT1BZSU5HCi1idWlsZHJvb3QvQ09QWUlORwotaXB0YWJsZXMvQ09QWUlORwotcGtnLWNvbmZpZy9DT1BZSU5HCi1zaW1wbGVyYW1mcy9DT1BZSU5HCi1zbWFydG1vbnRvb2xzL0NPUFlJTkcKLXN5c3Zpbml0L0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWF2YWhpL0xJQ0VOU0UKLWxpYmRhZW1vbi9MSUNFTlNFCi11Y2xpYmMvQ09QWUlORy5MSUIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQk1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCi0gYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKLSB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKLWNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKLXRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCi1zdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucwotYmVsb3cuCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAotbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoteW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQotZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAotaXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCi1pdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KLXRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1kaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCi1yaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKLXlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQotbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Ci10aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKLWF1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQotaW50cm9kdWNlZCBieSBvdGhlcnMuCi0KLSAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKLWFueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKLWVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQotcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKLWFueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKLWNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgotCi0gIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCi1pcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQotdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQotbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCi0KLSAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKLWEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQotY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQotZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCi10aGUgbGlicmFyeS4KLQotICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Ci1kb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCi1vZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCi1hcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKLWxpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KLXNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KLQotICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bwotZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0Ci1iZWNvbWVzIGEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QKLWJlIGFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKLWxpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcwotY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCi1zb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQotcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCi1mcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCi1ub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKLW9wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCi1zeXN0ZW0uCi0KLSAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKLXVzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCi1saW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KLXRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKLWJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgotCi0gICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgotcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKLW90aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLXRoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KLUVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCi1jb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0KLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKLSAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQotICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAotICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQotICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKLSAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKLSAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KLQotICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0Ci0gICAgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzIHNwZWNpZmllZCBpbgotICAgIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHRoZSBjb3N0IG9mCi0gICAgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcwotbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5LCBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlCi1jb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwotdmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLSAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4KLUl0IGlzIHNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0Ci1lZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQKLWhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbAotbm90aWNlIGlzIGZvdW5kLgotCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IKLXlvdXIgc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwKLWlmIG5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcwotICBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYmNtX25ldGZsaXgvbmV0ZmxpeAotbmV0ZmxpeF9ucmQvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0oYykgMTk5Ny0yMDEwIE5ldGZsaXgsIEluYy4gIEFsbCBjb250ZW50IGhlcmVpbiBpcyBwcm90ZWN0ZWQgYnkKLVUuUy4gY29weXJpZ2h0IGFuZCBvdGhlciBhcHBsaWNhYmxlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIGFuZAotbWF5IG5vdCBiZSBjb3BpZWQgd2l0aG91dCB0aGUgZXhwcmVzcyBwZXJtaXNzaW9uIG9mIE5ldGZsaXgsIEluYy4sCi13aGljaCByZXNlcnZlcyBhbGwgcmlnaHRzLiAgUmV1c2Ugb2YgYW55IG9mIHRoaXMgY29udGVudCBmb3IgYW55Ci1wdXJwb3NlIHdpdGhvdXQgdGhlIHBlcm1pc3Npb24gb2YgTmV0ZmxpeCwgSW5jLiBpcyBzdHJpY3RseQotcHJvaGliaXRlZC4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9ubmllL2NvcHlyaWdodC50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0OgotCi0gKiBDT1BZUklHSFQgTk9USUNFOgotICogQ29weXJpZ2h0IChjKSBUaW0gQnJheSA8dGJyYXlAdGV4dHVhbGl0eS5jb20+LCAxOTkwLgotICogQ29weXJpZ2h0IChjKSBSdXNzZWxsIENva2VyIDxydXNzZWxsQGNva2VyLmNvbS5hdT4sIDE5OTkuCi0KLQotTGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIgbGljZW5zZS4KLQotICogRElTQ0xBSU1FUjoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBwcm92aWRlZCBBUyBJUyB3aXRoIG5vIHdhcnJhbnR5IG9mIGFueSBraW5kLCBhbmQKLSAqIFRoZSBhdXRob3IgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBhZGVxdWFjeSBvZiB0aGlzCi0gKiAgcHJvZ3JhbSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvciB3aXRoIHJlc3BlY3QgdG8gaXRzIGFkZXF1YWN5IHRvCi0gKiAgcHJvZHVjZSBhbnkgcGFydGljdWxhciByZXN1bHQsIGFuZAotICogVGhlIGF1dGhvciBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBsb3NzIG9yIGRhbWFnZSBhcmlzaW5nIG91dCBvZgotICogIHRoZSB1c2Ugb2YgdGhpcyBwcm9ncmFtIHJlZ2FyZGxlc3Mgb2YgaG93IHN1c3RhaW5lZCwgYW5kCi0gKiBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIGJlIGxpYWJsZSBmb3Igc3BlY2lhbCwgZGlyZWN0LCBpbmRpcmVjdAotICogIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlLCBsb3NzLCBjb3N0cyBvciBmZWVzIG9yIGV4cGVuc2VzIG9mIGFueQotICogIG5hdHVyZSBvciBraW5kLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1icmlkZ2UtdXRpbHMvQ09QWUlORwotbG9ja2ZpbGUtcHJvZ3MvQ09QWUlORwotbWVtdGVzdGVyL0NPUFlJTkcKLW10ZC9DT1BZSU5HCi1wcm9jcHMvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJydW5vL2Jhc2UvbGliamluZ2xlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBsaWJqaW5nbGUKLSAqIENvcHlyaWdodCAyMDA0LS0yMDA5LCBHb29nbGUgSW5jLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYnJ1bm8vY21kcy9ncmVwLmMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyogQ29weXJpZ2h0IChDKSAxOTk5IEx1Y2VudCBUZWNobm9sb2dpZXMgKi8KLS8qIEV4Y2VycHRlZCBmcm9tICdUaGUgUHJhY3RpY2Ugb2YgUHJvZ3JhbW1pbmcnICovCi0vKiBieSBCcmlhbiBXLiBLZXJuaWdoYW4gYW5kIFJvYiBQaWtlICovCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYnJ1bm8vZ2ZpYmVyLW9wZW4tc291cmNlCi1nb29nbGVfZmFsbG9jYXRlL2dmaWJlci1vcGVuLXNvdXJjZQotZ29vZ2xlX2p0dXgvZ2ZpYmVyLW9wZW4tc291cmNlCi1weS1nb29nbGUtYXBpL2dmaWJlci1vcGVuLXNvdXJjZQotcHktbW9ub3RpbWUvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jYWlyby9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNhaXJvIGlzIGZyZWUgc29mdHdhcmUuCi0KLUV2ZXJ5IHNvdXJjZSBmaWxlIGluIHRoZSBpbXBsZW1lbnRhdGlvblsqXSBvZiBjYWlybyBpcyBhdmFpbGFibGUgdG8gYmUKLXJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpIHZlcnNpb24gMi4xIG9yIHRoZSBNb3ppbGxhIFB1YmxpYwotTGljZW5zZSAoTVBMKSB2ZXJzaW9uIDEuMS4gIFNvbWUgZmlsZXMgYXJlIGF2YWlsYWJsZSB1bmRlciBtb3JlCi1saWJlcmFsIHRlcm1zLCBidXQgd2UgYmVsaWV2ZSB0aGF0IGluIGFsbCBjYXNlcywgZWFjaCBmaWxlIG1heSBiZSB1c2VkCi11bmRlciBlaXRoZXIgdGhlIExHUEwgb3IgdGhlIE1QTC4KLQotU2VlIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIHRoZSBwcmVjaXNlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBvZiBlaXRoZXIgbGljZW5zZToKLQotCUNPUFlJTkctTEdQTC0yLjEKLQlDT1BZSU5HLU1QTC0xLjEKLQotUGxlYXNlIHNlZSBlYWNoIGZpbGUgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZwotaW5mb3JtYXRpb24sIChpbiB0aGUgb3BlbmluZyBjb21tZW50IG9mIGVhY2ggZmlsZSkuCi0KLVsqXSBUaGUgaW1wbGVtZW50YXRpb24gb2YgY2Fpcm8gaXMgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiB0aGUgInNyYyIKLWRpcmVjdG9yeSBvZiB0aGUgY2Fpcm8gc291cmNlIGRpc3RyaWJ1dGlvbi4gVGhlcmUgYXJlIG90aGVyIGNvbXBvbmVudHMKLW9mIHRoZSBjYWlybyBzb3VyY2UgZGlzdHJpYnV0aW9uIChzdWNoIGFzIHRoZSAidGVzdCIsICJ1dGlsIiwgYW5kICJwZXJmIikKLXRoYXQgYXJlIGF1eGlsaWFyeSB0byB0aGUgbGlicmFyeSBpdHNlbGYuIE5vbmUgb2YgdGhlIHNvdXJjZSBjb2RlIGluIHRoZXNlCi1kaXJlY3RvcmllcyBjb250cmlidXRlcyB0byBhIGJ1aWxkIG9mIHRoZSBjYWlybyBsaWJyYXJ5IGl0c2VsZiwgKGxpYmNhaXJvLnNvCi1vciBjYWlyby5kbGwgb3Igc2ltaWxhcikuCi0KLVRoZXNlIGF1eGlsaWFyeSBjb21wb25lbnRzIGFyZSBhbHNvIGZyZWUgc29mdHdhcmUsIGJ1dCBtYXkgYmUgdW5kZXIKLWRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIHRoYW4gY2Fpcm8gaXRzZWxmLiBGb3IgZXhhbXBsZSwgbW9zdCBvZiB0aGUKLXRlc3QgY2FzZXMgaW4gdGhlIHBlcmYgYW5kIHRlc3QgZGlyZWN0b3JpZXMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyCi1hbiBNSVQgbGljZW5zZSB0byBzaW1wbGlmeSBhbnkgdXNlIG9mIHRoaXMgY29kZSBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzCi1pbiB1c2luZyBjYWlybyBpdHNlbGYuIE90aGVyIGZpbGVzIG1pZ2h0IGJlIGF2YWlsYWJsZSB1bmRlciB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBmb3IgZXhhbXBsZS4gQWdhaW4sIHBsZWFzZSBzZWUgdGhlIENPUFlJTkcKLWZpbGUgdW5kZXIgZWFjaCBkaXJlY3RvcnkgYW5kIHRoZSBvcGVuaW5nIGNvbW1lbnQgb2YgZWFjaCBmaWxlIGZvciBjb3B5cmlnaHQKLWFuZCBsaWNlbnNpbmcgaW5mb3JtYXRpb24uCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNhaXJvL0NPUFlJTkctTEdQTC0yLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBTdWl0ZSA1MDAsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSwgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKLSBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQotIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQotY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgotdGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKLXN0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zCi1iZWxvdy4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCi1ub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Ci15b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCi1mb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0Ci1pdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKLWl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwotdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWRpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKLXJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoteW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCi1saWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Ci10aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCi1tb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKLXRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAotYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCi1pbnRyb2R1Y2VkIGJ5IG90aGVycy4KLQotICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgotYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAotZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCi1yZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAotYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQotY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKLWlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCi10aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCi1saWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KLQotICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZwotYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCi1jb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCi1lbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKLXRoZSBsaWJyYXJ5LgotCi0gIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKLWRvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKLW9mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKLWFyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQotbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgotc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgotCi0gIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCi1lbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQKLWJlY29tZXMgYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdAotYmUgYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQotbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCi1jYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKLXNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCi1wcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKLWZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KLW5vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQotb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKLXN5c3RlbS4KLQotICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQotdXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKLWxpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgotdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAotYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCi0KLSAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCi1wcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgotb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgotRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKLWNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQotICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCi0gICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCi0gICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCi0gICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgotICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcwotICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgotCi0gICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QKLSAgICB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMgc3BlY2lmaWVkIGluCi0gICAgU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4gdGhlIGNvc3Qgb2YKLSAgICBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgotCi0gICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLSAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKLSAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCi0KLSAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKLSAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KLQotICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKLUxpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCi1yZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKLXRoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCi1ub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKLXRoaXMgTGljZW5zZS4KLQotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHksIGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UKLWNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LgotSXQgaXMgc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QKLWVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZAotaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsCi1ub3RpY2UgaXMgZm91bmQuCi0KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBTdWl0ZSA1MDAsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSwgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IKLXlvdXIgc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwKLWlmIG5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcwotICBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2Fpcm8vQ09QWUlORy1NUEwtMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTU9aSUxMQSBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KLQotMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgMS4wLjEuICJDb21tZXJjaWFsIFVzZSIgbWVhbnMgZGlzdHJpYnV0aW9uIG9yIG90aGVyd2lzZSBtYWtpbmcgdGhlCi0gICAgIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLQotICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvCi0gICAgIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0gICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgQ29kZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucwotICAgICBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotICAgICAxLjMuICJDb3ZlcmVkIENvZGUiIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlCi0gICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UKLSAgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLSAgICAgMS40LiAiRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIiBtZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkKLSAgICAgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgdGhlIGVsZWN0cm9uaWMKLSAgICAgdHJhbnNmZXIgb2YgZGF0YS4KLQotICAgICAxLjUuICJFeGVjdXRhYmxlIiBtZWFucyBDb3ZlcmVkIENvZGUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UKLSAgICAgQ29kZS4KLQotICAgICAxLjYuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQKLSAgICAgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdAotICAgICBBLgotCi0gICAgIDEuNy4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBDb2RlIG9yCi0gICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIDEuOC4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgMS44LjEuICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bQotICAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKLSAgICAgc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyBhbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUKLSAgICAgc3Vic3RhbmNlIG9yIHN0cnVjdHVyZSBvZiBlaXRoZXIgdGhlIE9yaWdpbmFsIENvZGUgb3IgYW55IHByZXZpb3VzCi0gICAgIE1vZGlmaWNhdGlvbnMuIFdoZW4gQ292ZXJlZCBDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhCi0gICAgIE1vZGlmaWNhdGlvbiBpczoKLSAgICAgICAgICBBLiBBbnkgYWRkaXRpb24gdG8gb3IgZGVsZXRpb24gZnJvbSB0aGUgY29udGVudHMgb2YgYSBmaWxlCi0gICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSBvcgotICAgICAgICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuCi0KLSAgICAgMS4xMC4gIk9yaWdpbmFsIENvZGUiIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUKLSAgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzCi0gICAgIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcwotICAgICBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgMS4xMC4xLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yCi0gICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgIG1ldGhvZCwgcHJvY2VzcywKLSAgICAgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgotCi0gICAgIDEuMTEuICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yCi0gICAgIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LCBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMKLSAgICAgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCi0gICAgIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3Igc291cmNlIGNvZGUKLSAgICAgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFub3RoZXIKLSAgICAgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZQotICAgICBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZQotICAgICBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlCi0gICAgIGZvciBubyBjaGFyZ2UuCi0KLSAgICAgMS4xMi4gIllvdSIgKG9yICJZb3VyIikgIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkKLSAgICAgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXNzdWVkIHVuZGVyIFNlY3Rpb24gNi4xLgotICAgICBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzCi0gICAgIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YKLSAgICAgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LAotICAgICB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkKLSAgICAgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50Ci0gICAgICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaAotICAgICBlbnRpdHkuCi0KLTIuIFNvdXJjZSBDb2RlIExpY2Vuc2UuCi0KLSAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eQotICAgICBjbGFpbXM6Ci0gICAgICAgICAgKGEpICB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgotICAgICAgICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciB0byB1c2UsIHJlcHJvZHVjZSwKLSAgICAgICAgICBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsCi0gICAgICAgICAgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vcgotICAgICAgICAgIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0KLSAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50cyBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yCi0gICAgICAgICAgc2VsbGluZyBvZiBPcmlnaW5hbCBDb2RlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsCi0gICAgICAgICAgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlCi0gICAgICAgICAgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0KLSAgICAgICAgICAoYykgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIuMShhKSBhbmQgKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcwotICAgICAgICAgIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCi0gICAgICAgICAgZ3JhbnRlZDogMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIENvZGU7IDIpCi0gICAgICAgICAgc2VwYXJhdGUgZnJvbSB0aGUgT3JpZ2luYWwgQ29kZTsgIG9yIDMpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZAotICAgICAgICAgIGJ5OiBpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGlpKSB0aGUKLSAgICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgQ29kZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLSAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLSAgICAgU3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yCi0gICAgIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UKLQotICAgICAgICAgIChhKSAgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IKLSAgICAgICAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksCi0gICAgICAgICAgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZikgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIENvZGUKLSAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLQotICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3IKLSAgICAgICAgICBzZWxsaW5nIG9mICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUKLSAgICAgICAgICBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMKLSAgICAgICAgICBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZQotICAgICAgICAgIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAyKSB0aGUgY29tYmluYXRpb24gb2YKLSAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvcgotICAgICAgICAgIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotCi0gICAgICAgICAgKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZQotICAgICAgICAgIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBtYWtlcyBDb21tZXJjaWFsIFVzZSBvZgotICAgICAgICAgIHRoZSBDb3ZlcmVkIENvZGUuCi0KLSAgICAgICAgICAoZCkgICAgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcwotICAgICAgICAgIGdyYW50ZWQ6IDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgMikgIHNlcGFyYXRlIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247Ci0gICAgICAgICAgMykgIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZgotICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gb3IgaWkpICB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlCi0gICAgICAgICAgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlICAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgNCkgdW5kZXIgUGF0ZW50IENsYWltcwotICAgICAgICAgIGluZnJpbmdlZCBieSBDb3ZlcmVkIENvZGUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5Ci0gICAgICAgICAgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0gICAgIDMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4KLSAgICAgVGhlIE1vZGlmaWNhdGlvbnMgd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUKLSAgICAgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICAgICBTZWN0aW9uIDIuMi4gVGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIG1heSBiZQotICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbgotICAgICBvZiB0aGlzIExpY2Vuc2UgcmVsZWFzZWQgdW5kZXIgU2VjdGlvbiA2LjEsIGFuZCBZb3UgbXVzdCBpbmNsdWRlIGEKLSAgICAgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBZb3UKLSAgICAgZGlzdHJpYnV0ZS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgU291cmNlIENvZGUKLSAgICAgdmVyc2lvbiB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzCi0gICAgIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIHJpZ2h0cyBoZXJldW5kZXIuIEhvd2V2ZXIsIFlvdSBtYXkgaW5jbHVkZQotICAgICBhbiBhZGRpdGlvbmFsIGRvY3VtZW50IG9mZmVyaW5nIHRoZSBhZGRpdGlvbmFsIHJpZ2h0cyBkZXNjcmliZWQgaW4KLSAgICAgU2VjdGlvbiAzLjUuCi0KLSAgICAgMy4yLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgIEFueSBNb2RpZmljYXRpb24gd2hpY2ggWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBtdXN0IGJlCi0gICAgIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICBlaXRoZXIgb24gdGhlIHNhbWUgbWVkaWEgYXMgYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHZpYSBhbiBhY2NlcHRlZAotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gdG8gYW55b25lIHRvIHdob20geW91IG1hZGUgYW4KLSAgICAgRXhlY3V0YWJsZSB2ZXJzaW9uIGF2YWlsYWJsZTsgYW5kIGlmIG1hZGUgYXZhaWxhYmxlIHZpYSBFbGVjdHJvbmljCi0gICAgIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20sIG11c3QgcmVtYWluIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3QgdHdlbHZlICgxMikKLSAgICAgbW9udGhzIGFmdGVyIHRoZSBkYXRlIGl0IGluaXRpYWxseSBiZWNhbWUgYXZhaWxhYmxlLCBvciBhdCBsZWFzdCBzaXgKLSAgICAgKDYpIG1vbnRocyBhZnRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGF0IHBhcnRpY3VsYXIgTW9kaWZpY2F0aW9uCi0gICAgIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHN1Y2ggcmVjaXBpZW50cy4gWW91IGFyZSByZXNwb25zaWJsZSBmb3IKLSAgICAgZW5zdXJpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiByZW1haW5zIGF2YWlsYWJsZSBldmVuIGlmIHRoZQotICAgICBFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20gaXMgbWFpbnRhaW5lZCBieSBhIHRoaXJkIHBhcnR5LgotCi0gICAgIDMuMy4gRGVzY3JpcHRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLSAgICAgWW91IG11c3QgY2F1c2UgYWxsIENvdmVyZWQgQ29kZSB0byB3aGljaCBZb3UgY29udHJpYnV0ZSB0byBjb250YWluIGEKLSAgICAgZmlsZSBkb2N1bWVudGluZyB0aGUgY2hhbmdlcyBZb3UgbWFkZSB0byBjcmVhdGUgdGhhdCBDb3ZlcmVkIENvZGUgYW5kCi0gICAgIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBwcm9taW5lbnQgc3RhdGVtZW50IHRoYXQKLSAgICAgdGhlIE1vZGlmaWNhdGlvbiBpcyBkZXJpdmVkLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBmcm9tIE9yaWdpbmFsCi0gICAgIENvZGUgcHJvdmlkZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlCi0gICAgIEluaXRpYWwgRGV2ZWxvcGVyIGluIChhKSB0aGUgU291cmNlIENvZGUsIGFuZCAoYikgaW4gYW55IG5vdGljZSBpbiBhbgotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gb3IgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGluIHdoaWNoIFlvdSBkZXNjcmliZSB0aGUKLSAgICAgb3JpZ2luIG9yIG93bmVyc2hpcCBvZiB0aGUgQ292ZXJlZCBDb2RlLgotCi0gICAgIDMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMKLSAgICAgICAgICAoYSkgVGhpcmQgUGFydHkgQ2xhaW1zLgotICAgICAgICAgIElmIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2UgdGhhdCBhIGxpY2Vuc2UgdW5kZXIgYSB0aGlyZCBwYXJ0eSdzCi0gICAgICAgICAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBpcyByZXF1aXJlZCB0byBleGVyY2lzZSB0aGUgcmlnaHRzCi0gICAgICAgICAgZ3JhbnRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIsCi0gICAgICAgICAgQ29udHJpYnV0b3IgbXVzdCBpbmNsdWRlIGEgdGV4dCBmaWxlIHdpdGggdGhlIFNvdXJjZSBDb2RlCi0gICAgICAgICAgZGlzdHJpYnV0aW9uIHRpdGxlZCAiTEVHQUwiIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZQotICAgICAgICAgIHBhcnR5IG1ha2luZyB0aGUgY2xhaW0gaW4gc3VmZmljaWVudCBkZXRhaWwgdGhhdCBhIHJlY2lwaWVudCB3aWxsCi0gICAgICAgICAga25vdyB3aG9tIHRvIGNvbnRhY3QuIElmIENvbnRyaWJ1dG9yIG9idGFpbnMgc3VjaCBrbm93bGVkZ2UgYWZ0ZXIKLSAgICAgICAgICB0aGUgTW9kaWZpY2F0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMiwKLSAgICAgICAgICBDb250cmlidXRvciBzaGFsbCBwcm9tcHRseSBtb2RpZnkgdGhlIExFR0FMIGZpbGUgaW4gYWxsIGNvcGllcwotICAgICAgICAgIENvbnRyaWJ1dG9yIG1ha2VzIGF2YWlsYWJsZSB0aGVyZWFmdGVyIGFuZCBzaGFsbCB0YWtlIG90aGVyIHN0ZXBzCi0gICAgICAgICAgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykKLSAgICAgICAgICByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHRob3NlIHdobyByZWNlaXZlZCB0aGUgQ292ZXJlZAotICAgICAgICAgIENvZGUgdGhhdCBuZXcga25vd2xlZGdlIGhhcyBiZWVuIG9idGFpbmVkLgotCi0gICAgICAgICAgKGIpIENvbnRyaWJ1dG9yIEFQSXMuCi0gICAgICAgICAgSWYgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGluY2x1ZGUgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAgICAgICAgICBpbnRlcmZhY2UgYW5kIENvbnRyaWJ1dG9yIGhhcyBrbm93bGVkZ2Ugb2YgcGF0ZW50IGxpY2Vuc2VzIHdoaWNoCi0gICAgICAgICAgYXJlIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGF0IEFQSSwgQ29udHJpYnV0b3IgbXVzdAotICAgICAgICAgIGFsc28gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBMRUdBTCBmaWxlLgotCi0gICAgICAgICAgICAgICAoYykgICAgUmVwcmVzZW50YXRpb25zLgotICAgICAgICAgIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0bwotICAgICAgICAgIFNlY3Rpb24gMy40KGEpIGFib3ZlLCBDb250cmlidXRvciBiZWxpZXZlcyB0aGF0IENvbnRyaWJ1dG9yJ3MKLSAgICAgICAgICBNb2RpZmljYXRpb25zIGFyZSBDb250cmlidXRvcidzIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vcgotICAgICAgICAgIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5Ci0gICAgICAgICAgdGhpcyBMaWNlbnNlLgotCi0gICAgIDMuNS4gUmVxdWlyZWQgTm90aWNlcy4KLSAgICAgWW91IG11c3QgZHVwbGljYXRlIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBIGluIGVhY2ggZmlsZSBvZiB0aGUgU291cmNlCi0gICAgIENvZGUuICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcHV0IHN1Y2ggbm90aWNlIGluIGEgcGFydGljdWxhciBTb3VyY2UKLSAgICAgQ29kZSBmaWxlIGR1ZSB0byBpdHMgc3RydWN0dXJlLCB0aGVuIFlvdSBtdXN0IGluY2x1ZGUgc3VjaCBub3RpY2UgaW4gYQotICAgICBsb2NhdGlvbiAoc3VjaCBhcyBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSB1c2VyIHdvdWxkIGJlIGxpa2VseQotICAgICB0byBsb29rIGZvciBzdWNoIGEgbm90aWNlLiAgSWYgWW91IGNyZWF0ZWQgb25lIG9yIG1vcmUgTW9kaWZpY2F0aW9uKHMpCi0gICAgIFlvdSBtYXkgYWRkIHlvdXIgbmFtZSBhcyBhIENvbnRyaWJ1dG9yIHRvIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQS4gIFlvdSBtdXN0IGFsc28gZHVwbGljYXRlIHRoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbgotICAgICBmb3IgdGhlIFNvdXJjZSBDb2RlIHdoZXJlIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgb3Igb3duZXJzaGlwCi0gICAgIHJpZ2h0cyByZWxhdGluZyB0byBDb3ZlcmVkIENvZGUuICBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvCi0gICAgIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5Ci0gICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBDb2RlLiBIb3dldmVyLCBZb3UKLSAgICAgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhbgotICAgICBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzCi0gICAgIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwKLSAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLSAgICAgMy42LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLSAgICAgWW91IG1heSBkaXN0cmlidXRlIENvdmVyZWQgQ29kZSBpbiBFeGVjdXRhYmxlIGZvcm0gb25seSBpZiB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIFNlY3Rpb24gMy4xLTMuNSBoYXZlIGJlZW4gbWV0IGZvciB0aGF0IENvdmVyZWQgQ29kZSwKLSAgICAgYW5kIGlmIFlvdSBpbmNsdWRlIGEgbm90aWNlIHN0YXRpbmcgdGhhdCB0aGUgU291cmNlIENvZGUgdmVyc2lvbiBvZgotICAgICB0aGUgQ292ZXJlZCBDb2RlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAotICAgICBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBvZiBob3cgYW5kIHdoZXJlIFlvdSBoYXZlIGZ1bGZpbGxlZCB0aGUKLSAgICAgb2JsaWdhdGlvbnMgb2YgU2VjdGlvbiAzLjIuIFRoZSBub3RpY2UgbXVzdCBiZSBjb25zcGljdW91c2x5IGluY2x1ZGVkCi0gICAgIGluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uLCByZWxhdGVkIGRvY3VtZW50YXRpb24gb3IKLSAgICAgY29sbGF0ZXJhbCBpbiB3aGljaCBZb3UgZGVzY3JpYmUgcmVjaXBpZW50cycgcmlnaHRzIHJlbGF0aW5nIHRvIHRoZQotICAgICBDb3ZlcmVkIENvZGUuIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIG9mIENvdmVyZWQKLSAgICAgQ29kZSBvciBvd25lcnNoaXAgcmlnaHRzIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5Ci0gICAgIGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4KLSAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZQotICAgICBFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MKLSAgICAgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcwotICAgICBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSB2ZXJzaW9uIHVuZGVyIGEgZGlmZmVyZW50Ci0gICAgIGxpY2Vuc2UgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlcgotICAgICBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUKLSAgICAgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5Ci0gICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoCi0gICAgIHRlcm1zIFlvdSBvZmZlci4KLQotICAgICAzLjcuIExhcmdlciBXb3Jrcy4KLSAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZQotICAgICBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCi0gICAgIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKLSAgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLgotCi00LiBJbmFiaWxpdHkgdG8gQ29tcGx5IER1ZSB0byBTdGF0dXRlIG9yIFJlZ3VsYXRpb24uCi0KLSAgICAgSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcwotICAgICBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byBzb21lIG9yIGFsbCBvZiB0aGUgQ292ZXJlZCBDb2RlIGR1ZSB0bwotICAgICBzdGF0dXRlLCBqdWRpY2lhbCBvcmRlciwgb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGgKLSAgICAgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCAoYikKLSAgICAgZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZCB0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbgotICAgICBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBMRUdBTCBmaWxlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuNCBhbmQgbXVzdAotICAgICBiZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UgQ29kZS4gRXhjZXB0IHRvIHRoZQotICAgICBleHRlbnQgcHJvaGliaXRlZCBieSBzdGF0dXRlIG9yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZQotICAgICBzdWZmaWNpZW50bHkgZGV0YWlsZWQgZm9yIGEgcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8KLSAgICAgdW5kZXJzdGFuZCBpdC4KLQotNS4gQXBwbGljYXRpb24gb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcwotICAgICBhdHRhY2hlZCB0aGUgbm90aWNlIGluIEV4aGliaXQgQSBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuCi0KLTYuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi0gICAgIDYuMS4gTmV3IFZlcnNpb25zLgotICAgICBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAoIk5ldHNjYXBlIikgbWF5IHB1Ymxpc2ggcmV2aXNlZAotICAgICBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZSBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24KLSAgICAgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgotCi0gICAgIDYuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLSAgICAgT25jZSBDb3ZlcmVkIENvZGUgaGFzIGJlZW4gcHVibGlzaGVkIHVuZGVyIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZQotICAgICBMaWNlbnNlLCBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoYXQKLSAgICAgdmVyc2lvbi4gWW91IG1heSBhbHNvIGNob29zZSB0byB1c2Ugc3VjaCBDb3ZlcmVkIENvZGUgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IE5ldHNjYXBlLiBObyBvbmUKLSAgICAgb3RoZXIgdGhhbiBOZXRzY2FwZSBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGUgdGVybXMgYXBwbGljYWJsZSB0bwotICAgICBDb3ZlcmVkIENvZGUgY3JlYXRlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgICAgNi4zLiBEZXJpdmF0aXZlIFdvcmtzLgotICAgICBJZiBZb3UgY3JlYXRlIG9yIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlICh3aGljaCB5b3UgbWF5Ci0gICAgIG9ubHkgZG8gaW4gb3JkZXIgdG8gYXBwbHkgaXQgdG8gY29kZSB3aGljaCBpcyBub3QgYWxyZWFkeSBDb3ZlcmVkIENvZGUKLSAgICAgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlKSwgWW91IG11c3QgKGEpIHJlbmFtZSBZb3VyIGxpY2Vuc2Ugc28gdGhhdAotICAgICB0aGUgcGhyYXNlcyAiTW96aWxsYSIsICJNT1pJTExBUEwiLCAiTU9aUEwiLCAiTmV0c2NhcGUiLAotICAgICAiTVBMIiwgIk5QTCIgb3IgYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91cgotICAgICBsaWNlbnNlIChleGNlcHQgdG8gbm90ZSB0aGF0IHlvdXIgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKQotICAgICBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgWW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlCi0gICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgICBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwKLSAgICAgRGV2ZWxvcGVyLCBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCi0gICAgIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZgotICAgICB0aGlzIExpY2Vuc2UuKQotCi03LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi0gICAgIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsCi0gICAgIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRgotICAgICBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuCi0gICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERQotICAgICBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULAotICAgICBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFCi0gICAgIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIKLSAgICAgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLSAgICAgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi04LiBURVJNSU5BVElPTi4KLQotICAgICA4LjEuICBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUKLSAgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQotICAgICBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBBbGwKLSAgICAgc3VibGljZW5zZXMgdG8gdGhlIENvdmVyZWQgQ29kZSB3aGljaCBhcmUgcHJvcGVybHkgZ3JhbnRlZCBzaGFsbAotICAgICBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyCi0gICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlCi0gICAgIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgOC4yLiAgSWYgWW91IGluaXRpYXRlIGxpdGlnYXRpb24gYnkgYXNzZXJ0aW5nIGEgcGF0ZW50IGluZnJpbmdlbWVudAotICAgICBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyCi0gICAgIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20KLSAgICAgWW91IGZpbGUgc3VjaCBhY3Rpb24gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgIGFsbGVnaW5nIHRoYXQ6Ci0KLSAgICAgKGEpICBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0gICAgIGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGJ5IHN1Y2gKLSAgICAgUGFydGljaXBhbnQgdG8gWW91IHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZQotICAgICBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5LAotICAgICB1bmxlc3MgaWYgd2l0aGluIDYwIGRheXMgYWZ0ZXIgcmVjZWlwdCBvZiBub3RpY2UgWW91IGVpdGhlcjogKGkpCi0gICAgIGFncmVlIGluIHdyaXRpbmcgdG8gcGF5IFBhcnRpY2lwYW50IGEgbXV0dWFsbHkgYWdyZWVhYmxlIHJlYXNvbmFibGUKLSAgICAgcm95YWx0eSBmb3IgWW91ciBwYXN0IGFuZCBmdXR1cmUgdXNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSBzdWNoCi0gICAgIFBhcnRpY2lwYW50LCBvciAoaWkpIHdpdGhkcmF3IFlvdXIgbGl0aWdhdGlvbiBjbGFpbSB3aXRoIHJlc3BlY3QgdG8KLSAgICAgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50LiAgSWYgd2l0aGluIDYwIGRheXMKLSAgICAgb2Ygbm90aWNlLCBhIHJlYXNvbmFibGUgcm95YWx0eSBhbmQgcGF5bWVudCBhcnJhbmdlbWVudCBhcmUgbm90Ci0gICAgIG11dHVhbGx5IGFncmVlZCB1cG9uIGluIHdyaXRpbmcgYnkgdGhlIHBhcnRpZXMgb3IgdGhlIGxpdGlnYXRpb24gY2xhaW0KLSAgICAgaXMgbm90IHdpdGhkcmF3biwgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IFBhcnRpY2lwYW50IHRvIFlvdSB1bmRlcgotICAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSBhdCB0aGUgZXhwaXJhdGlvbiBvZgotICAgICB0aGUgNjAgZGF5IG5vdGljZSBwZXJpb2Qgc3BlY2lmaWVkIGFib3ZlLgotCi0gICAgIChiKSAgYW55IHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgZGV2aWNlLCBvdGhlciB0aGFuIHN1Y2ggUGFydGljaXBhbnQncwotICAgICBDb250cmlidXRvciBWZXJzaW9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuCi0gICAgIGFueSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEoYikKLSAgICAgYW5kIDIuMihiKSBhcmUgcmV2b2tlZCBlZmZlY3RpdmUgYXMgb2YgdGhlIGRhdGUgWW91IGZpcnN0IG1hZGUsIHVzZWQsCi0gICAgIHNvbGQsIGRpc3RyaWJ1dGVkLCBvciBoYWQgbWFkZSwgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgUGFydGljaXBhbnQuCi0KLSAgICAgOC4zLiAgSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gYWdhaW5zdCBQYXJ0aWNpcGFudAotICAgICBhbGxlZ2luZyB0aGF0IHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yCi0gICAgIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQgd2hlcmUgc3VjaCBjbGFpbSBpcyByZXNvbHZlZCAoc3VjaCBhcwotICAgICBieSBsaWNlbnNlIG9yIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudAotICAgICBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwgdGhlbiB0aGUgcmVhc29uYWJsZSB2YWx1ZSBvZiB0aGUgbGljZW5zZXMKLSAgICAgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIgc2hhbGwgYmUgdGFrZW4KLSAgICAgaW50byBhY2NvdW50IGluIGRldGVybWluaW5nIHRoZSBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IKLSAgICAgbGljZW5zZS4KLQotICAgICA4LjQuICBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgOC4xIG9yIDguMiBhYm92ZSwKLSAgICAgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycyBhbmQgcmVzZWxsZXJzKQotICAgICB3aGljaCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyCi0gICAgIHByaW9yIHRvIHRlcm1pbmF0aW9uIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTkuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi0gICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCi0gICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwKLSAgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsCi0gICAgIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IKLSAgICAgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZCi0gICAgIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwKLSAgICAgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLSAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YKLSAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQotICAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCi0gICAgIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFCi0gICAgIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTwotICAgICBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotMTAuIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLSAgICAgVGhlIENvdmVyZWQgQ29kZSBpcyBhICJjb21tZXJjaWFsIGl0ZW0sIiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbgotICAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKLSAgICAgc29mdHdhcmUiIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLCIgYXMgc3VjaAotICAgICB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4Ci0gICAgIEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwKLSAgICAgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlCi0gICAgIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgotCi0xMS4gTUlTQ0VMTEFORU9VUy4KLQotICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAotICAgICBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCi0gICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudAotICAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5Ci0gICAgIENhbGlmb3JuaWEgbGF3IHByb3Zpc2lvbnMgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZgotICAgICBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCi0gICAgIFdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBpbiB3aGljaCBhdCBsZWFzdCBvbmUgcGFydHkgaXMgYSBjaXRpemVuIG9mLAotICAgICBvciBhbiBlbnRpdHkgY2hhcnRlcmVkIG9yIHJlZ2lzdGVyZWQgdG8gZG8gYnVzaW5lc3MgaW4gdGhlIFVuaXRlZAotICAgICBTdGF0ZXMgb2YgQW1lcmljYSwgYW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCi0gICAgIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuCi0gICAgIERpc3RyaWN0IG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LAotICAgICBDYWxpZm9ybmlhLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcKLSAgICAgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kCi0gICAgIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24KLSAgICAgQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4KLSAgICAgQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3QKLSAgICAgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMKLSAgICAgTGljZW5zZS4KLQotMTIuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLSAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCi0gICAgIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvCi0gICAgIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAotICAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCi0gICAgIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi0xMy4gTVVMVElQTEUtTElDRU5TRUQgQ09ERS4KLQotICAgICBJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMKLSAgICAgIk11bHRpcGxlLUxpY2Vuc2VkIi4gICJNdWx0aXBsZS1MaWNlbnNlZCIgbWVhbnMgdGhhdCB0aGUgSW5pdGlhbAotICAgICBEZXZlbG9wZXIgcGVybWl0cyB5b3UgdG8gdXRpbGl6ZSBwb3J0aW9ucyBvZiB0aGUgQ292ZXJlZCBDb2RlIHVuZGVyCi0gICAgIFlvdXIgY2hvaWNlIG9mIHRoZSBOUEwgb3IgdGhlIGFsdGVybmF0aXZlIGxpY2Vuc2VzLCBpZiBhbnksIHNwZWNpZmllZAotICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIGZpbGUgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4KLQotRVhISUJJVCBBIC1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlLgotCi0gICAgIGBgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotICAgICBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi0gICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi0gICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLSAgICAgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAgICAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi0gICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX18uCi0gICAgIFBvcnRpb25zIGNyZWF0ZWQgYnkgX19fX19fX19fX19fX19fX19fX19fXyBhcmUgQ29weXJpZ2h0IChDKSBfX19fX18KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX18uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICAgQ29udHJpYnV0b3Iocyk6IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgotCi0gICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi0gICAgIG9mIHRoZSBfX19fXyBsaWNlbnNlICh0aGUgICJbX19fXSBMaWNlbnNlIiksIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgIHByb3Zpc2lvbnMgb2YgW19fX19fX10gTGljZW5zZSBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlCi0gICAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQotICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtfX19fXSBMaWNlbnNlIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotICAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKLSAgICAgZGVsZXRpbmcgIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlICB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKLSAgICAgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgW19fX10gTGljZW5zZS4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0gICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSAgICAgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIFtfX19dIExpY2Vuc2UuIgotCi0gICAgIFtOT1RFOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZyb20gdGhlIHRleHQgb2YKLSAgICAgdGhlIG5vdGljZXMgaW4gdGhlIFNvdXJjZSBDb2RlIGZpbGVzIG9mIHRoZSBPcmlnaW5hbCBDb2RlLiBZb3Ugc2hvdWxkCi0gICAgIHVzZSB0aGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSByYXRoZXIgdGhhbiB0aGUgdGV4dCBmb3VuZCBpbiB0aGUKLSAgICAgT3JpZ2luYWwgQ29kZSBTb3VyY2UgQ29kZSBmb3IgWW91ciBNb2RpZmljYXRpb25zLl0KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jYXRhd2FtcHVzL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xvY2tzcGVlZC9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVtGcm9tIGh0dHA6Ly9jci55cC50by9kaXN0cmlidXRvcnMuaHRtbCBvbiAyMDE0LTA0LTA3XQotCi1ELiBKLiBCZXJuc3RlaW4KLQotRnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbnMgZnJvbSBkaXN0cmlidXRvcnMKLQotVGhpcyBwYWdlIGlzIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgbXkgc29mdHdhcmUgb3IKLWRlcml2YXRpdmUgd29ya3M6IGZvciBleGFtcGxlLCBhbiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgaW5jbHVkZXMgdGhlCi1zb2Z0d2FyZS4KLQotWW91IGRvbid0IG5lZWQgdG8gcmVhZCB0aGlzIHBhZ2UgaWYgeW91IHNpbXBseSB3YW50IHRvIHVzZSBteSBzb2Z0d2FyZS4gWW91Ci1hcmUgZnJlZSB0byBkb3dubG9hZCB0aGUgc29mdHdhcmUgZnJvbSBteSB3ZWIgc2VydmVyOyB5b3UgdGhlbiBvd24gdGhhdCBjb3B5Ci1vZiB0aGUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIGZyZWUgdG8gY29tcGlsZSBpdCBhbmQgcnVuIGl0LgotCi1Zb3UgYWxzbyBkb24ndCBuZWVkIHRvIHJlYWQgdGhpcyBwYWdlIGlmIHlvdSBzaW1wbHkgd2FudCB0byBzZXQgdXAgYSBtaXJyb3IKLW9mIG15IHdlYiBwYWdlcy4KLQotWy4uLl0KLVdoYXQgYXJlIHRoZSBkaXN0cmlidXRpb24gdGVybXMgZm9yIGNsb2Nrc3BlZWQ/Ci0KLTIwMTMuMDEuMDk6IEkgaGVyZWJ5IHBsYWNlIHRoZSBjbG9ja3NwZWVkIHBhY2thZ2UgKGluIHBhcnRpY3VsYXIsCi1jbG9ja3NwZWVkLTAuNjIudGFyLmd6LCB3aXRoIE1ENSBjaGVja3N1bSA0MjU2MTQxNzRmY2ZlMmFkNDJkMjJkM2QwMmUyZDU2NykKLWludG8gdGhlIHB1YmxpYyBkb21haW4uIFRoZSBwYWNrYWdlIGlzIG5vIGxvbmdlciBjb3B5cmlnaHRlZC4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZGFzaC9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMTk4OS0xOTk0Ci0JVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1Db3B5cmlnaHQgKGMpIDE5OTcgQ2hyaXN0b3MgWm91bGFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLUNvcHlyaWdodCAoYykgMTk5Ny0yMDA1Ci0JSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkgS2VubmV0aCBBbG1xdWlzdC4KLQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLTMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1GT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLU9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLUxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotCi1ta3NpZ25hbWVzLmM6Ci0KLVRoaXMgZmlsZSBpcyBub3QgZGlyZWN0bHkgbGlua2VkIHdpdGggZGFzaC4gIEhvd2V2ZXIsIGl0cyBvdXRwdXQgaXMuCi0KLUNvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCi0KLUJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi12ZXJzaW9uLgotCi1CYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2l0aAoteW91ciBEZWJpYW4gR05VL0xpbnV4IHN5c3RlbSwgaW4gL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvR1BMLCBvciB3aXRoIHRoZQotRGViaWFuIEdOVS9MaW51eCBoZWxsbyBzb3VyY2UgcGFja2FnZSBhcyB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExIFVTQS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZGhjcC9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKLSMgQ29weXJpZ2h0IChjKSAxOTk1LTIwMDMgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCi0jIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0jIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCi0jIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0jCi0jICAgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuCi0jICAgOTUwIENoYXJ0ZXIgU3RyZWV0Ci0jICAgUmVkd29vZCBDaXR5LCBDQSA5NDA2MwotIyAgIDxpbmZvQGlzYy5vcmc+Ci0jICAgaHR0cHM6Ly93d3cuaXNjLm9yZy8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZGhyeXN0b25lL1JFQURNRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogICAgICAgICAgICAgICAgICAgIkRIUllTVE9ORSIgQmVuY2htYXJrIFByb2dyYW0KLSAqICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogIFZlcnNpb246ICAgIEMsIFZlcnNpb24gMi4xCi0gKgotICogIEZpbGU6ICAgICAgIGRocnkuaCAocGFydCAxIG9mIDMpCi0gKgotICogIERhdGU6ICAgICAgIE1heSAyNSwgMTk4OAotICoKLSAqICBBdXRob3I6ICAgICBSZWluaG9sZCBQLiBXZWlja2VyCi0gKiAgICAgICAgICAgICAgICAgICAgICBTaWVtZW5zIEFHLCBBVVQgRSA1MQotICogICAgICAgICAgICAgICAgICAgICAgUG9zdGZhY2ggMzIyMAotICogICAgICAgICAgICAgICAgICAgICAgODUyMCBFcmxhbmdlbgotICogICAgICAgICAgICAgICAgICAgICAgR2VybWFueSAoV2VzdCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmU6ICBbKzQ5XS05MTMxLTctMjAzMzAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOC0xNyBDZW50cmFsIEV1cm9wZWFuIFRpbWUpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZW5ldDogLi4hbWNzdW4hdW5pZG8hZXN0ZXZheCF3ZWlja2VyCi0gKgotICogICAgICAgICAgICAgIE9yaWdpbmFsIFZlcnNpb24gKGluIEFkYSkgcHVibGlzaGVkIGluCi0gKiAgICAgICAgICAgICAgIkNvbW11bmljYXRpb25zIG9mIHRoZSBBQ00iIHZvbC4gMjcuLCBuby4gMTAgKE9jdC4gMTk4NCksCi0gKiAgICAgICAgICAgICAgcHAuIDEwMTMgLSAxMDMwLCB0b2dldGhlciB3aXRoIHRoZSBzdGF0aXN0aWNzCi0gKiAgICAgICAgICAgICAgb24gd2hpY2ggdGhlIGRpc3RyaWJ1dGlvbiBvZiBzdGF0ZW1lbnRzIGV0Yy4gaXMgYmFzZWQuCi0gKgotICogICAgICAgICAgICAgIEluIHRoaXMgQyB2ZXJzaW9uLCB0aGUgZm9sbG93aW5nIEMgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVzZWQ6Ci0gKiAgICAgICAgICAgICAgLSBzdHJjcHksIHN0cmNtcCAoaW5zaWRlIHRoZSBtZWFzdXJlbWVudCBsb29wKQotICogICAgICAgICAgICAgIC0gcHJpbnRmLCBzY2FuZiAob3V0c2lkZSB0aGUgbWVhc3VyZW1lbnQgbG9vcCkKLSAqICAgICAgICAgICAgICBJbiBhZGRpdGlvbiwgQmVya2VsZXkgVU5JWCBzeXN0ZW0gY2FsbHMgInRpbWVzICgpIiBvciAidGltZSAoKSIKLSAqICAgICAgICAgICAgICBhcmUgdXNlZCBmb3IgZXhlY3V0aW9uIHRpbWUgbWVhc3VyZW1lbnQuIEZvciBtZWFzdXJlbWVudHMKLSAqICAgICAgICAgICAgICBvbiBvdGhlciBzeXN0ZW1zLCB0aGVzZSBjYWxscyBoYXZlIHRvIGJlIGNoYW5nZWQuCi0gKgotICogIENvbGxlY3Rpb24gb2YgUmVzdWx0czoKLSAqICAgICAgICAgICAgICBSZWluaG9sZCBXZWlja2VyIChhZGRyZXNzIHNlZSBhYm92ZSkgYW5kCi0gKgotICogICAgICAgICAgICAgIFJpY2sgUmljaGFyZHNvbgotICogICAgICAgICAgICAgIFBDIFJlc2VhcmNoLiBJbmMuCi0gKiAgICAgICAgICAgICAgOTQgQXBwbGUgT3JjaGFyZCBEcml2ZQotICogICAgICAgICAgICAgIFRpbnRvbiBGYWxscywgTkogMDc3MjQKLSAqICAgICAgICAgICAgICAgICAgICAgIFBob25lOiAgKDIwMSkgMzg5LTg5NjMgKDktMTcgRVNUKQotICogICAgICAgICAgICAgICAgICAgICAgVXNlbmV0OiAuLi4hdXVuZXQhcGNyYXQhcmljawotICoKLSAqICAgICAgUGxlYXNlIHNlbmQgcmVzdWx0cyB0byBSaWNrIFJpY2hhcmRzb24gYW5kL29yIFJlaW5ob2xkIFdlaWNrZXIuCi0gKiAgICAgIENvbXBsZXRlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBnaXZlbiBvbiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgdXNlZC4KLSAqICAgICAgSGFyZHdhcmUgaW5mb3JtYXRpb24gaW5jbHVkZXM6IE1hY2hpbmUgdHlwZSwgQ1BVLCB0eXBlIGFuZCBzaXplCi0gKiAgICAgIG9mIGNhY2hlczsgZm9yIG1pY3JvcHJvY2Vzc29yczogY2xvY2sgZnJlcXVlbmN5LCBtZW1vcnkgc3BlZWQKLSAqICAgICAgKG51bWJlciBvZiB3YWl0IHN0YXRlcykuCi0gKiAgICAgIFNvZnR3YXJlIGluZm9ybWF0aW9uIGluY2x1ZGVzOiBDb21waWxlciAoYW5kIHJ1bnRpbWUgbGlicmFyeSkKLSAqICAgICAgbWFudWZhY3R1cmVyIGFuZCB2ZXJzaW9uLCBjb21waWxhdGlvbiBzd2l0Y2hlcywgT1MgdmVyc2lvbi4KLSAqICAgICAgVGhlIE9wZXJhdGluZyBTeXN0ZW0gdmVyc2lvbiBtYXkgZ2l2ZSBhbiBpbmRpY2F0aW9uIGFib3V0IHRoZQotICogICAgICBjb21waWxlcjsgRGhyeXN0b25lIGl0c2VsZiBwZXJmb3JtcyBubyBPUyBjYWxscyBpbiB0aGUgbWVhc3VyZW1lbnQgbG9vcC4KLSAqCi0gKiAgICAgIFRoZSBjb21wbGV0ZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtIHNob3VsZCBiZSBtYWlsZWQKLSAqICAgICAgc3VjaCB0aGF0IGF0IGxlYXN0IHNvbWUgY2hlY2tzIGZvciBjb3JyZWN0bmVzcyBjYW4gYmUgbWFkZS4KLSAqCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWRpcmVjdGZiL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCi0gYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKLSB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKLWNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKLXRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCi1zdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCi1ub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Ci15b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCi1mb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0Ci1pdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKLWl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwotdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWRpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKLXJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoteW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCi1saWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Ci10aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCi1tb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKLXRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAotYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCi1pbnRyb2R1Y2VkIGJ5IG90aGVycy4KLQotICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgotYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAotZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCi1yZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAotYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQotY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKLWlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCi10aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCi1saWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KLQotICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZwotYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCi1jb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCi1lbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKLXRoZSBsaWJyYXJ5LgotCi0gIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKLWRvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKLW9mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKLWFyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQotbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgotc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgotCi0gIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCi1lbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcwotYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQotYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQotbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCi1jYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKLXNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCi1wcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKLWZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KLW5vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQotb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKLXN5c3RlbS4KLQotICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQotdXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKLWxpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgotdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAotYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCi0KLQkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgotcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKLW90aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLXRoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KLUVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0KLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKLSAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQotICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAotICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQotICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKLSAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKLSAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KLQotICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcwotbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi1vcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCi1zYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCi0iY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKLQotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWRyb3BiZWFyL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRHJvcGJlYXIgY29udGFpbnMgYSBudW1iZXIgb2YgY29tcG9uZW50cyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzLCBoZW5jZSB0aGVyZQotYXJlIGEgZmV3IGxpY2Vuc2VzIGFuZCBhdXRob3JzIGludm9sdmVkLiBBbGwgbGljZW5zZXMgYXJlIGZhaXJseQotbm9uLXJlc3RyaWN0aXZlLgotCi0KLVRoZSBtYWpvcml0eSBvZiBjb2RlIGlzIHdyaXR0ZW4gYnkgTWF0dCBKb2huc3RvbiwgdW5kZXIgdGhlIGxpY2Vuc2UgYmVsb3cuCi0KLVBvcnRpb25zIG9mIHRoZSBjbGllbnQtbW9kZSB3b3JrIGFyZSAoYykgMjAwNCBNaWhuZWEgU3RvZW5lc2N1LCB1bmRlciB0aGUKLXNhbWUgbGljZW5zZToKLQotQ29weXJpZ2h0IChjKSAyMDAyLTIwMDggTWF0dCBKb2huc3RvbgotUG9ydGlvbnMgY29weXJpZ2h0IChjKSAyMDA0IE1paG5lYSBTdG9lbmVzY3UKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotCi09PT09PQotCi1MaWJUb21DcnlwdCBhbmQgTGliVG9tTWF0aCBhcmUgd3JpdHRlbiBieSBUb20gU3QgRGVuaXMsIGFuZCBhcmUgUHVibGljIERvbWFpbi4KLQotPT09PT0KLQotc3NocHR5LmMgaXMgdGFrZW4gZnJvbSBPcGVuU1NIIDMuNXAxLAotICBDb3B5cmlnaHQgKGMpIDE5OTUgVGF0dSBZbG9uZW4gPHlsb0Bjcy5odXQuZmk+LCBFc3BvbywgRmlubGFuZAotICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZAotICJBcyBmYXIgYXMgSSBhbSBjb25jZXJuZWQsIHRoZSBjb2RlIEkgaGF2ZSB3cml0dGVuIGZvciB0aGlzIHNvZnR3YXJlCi0gIGNhbiBiZSB1c2VkIGZyZWVseSBmb3IgYW55IHB1cnBvc2UuICBBbnkgZGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGlzCi0gIHNvZnR3YXJlIG11c3QgYmUgY2xlYXJseSBtYXJrZWQgYXMgc3VjaCwgYW5kIGlmIHRoZSBkZXJpdmVkIHdvcmsgaXMKLSAgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIHRoZSBSRkMgZmlsZSwgaXQgbXVzdCBiZQotICBjYWxsZWQgYnkgYSBuYW1lIG90aGVyIHRoYW4gInNzaCIgb3IgIlNlY3VyZSBTaGVsbCIuICIKLQotPT09PT0KLQotbG9naW5yZWMuYwotbG9naW5yZWMuaAotYXRvbWljaW8uaAotYXRvbWljaW8uYwotYW5kIHN0cmxjYXQoKSAoaW5jbHVkZWQgaW4gdXRpbC5jKSBhcmUgZnJvbSBPcGVuU1NIIDMuNi4xcDIsIGFuZCBhcmUgbGljZW5zZWQKLXVuZGVyIHRoZSAyIHBvaW50IEJTRCBsaWNlbnNlLgotCi1sb2dpbnJlYyBpcyB3cml0dGVuIHByaW1hcmlseSBieSBBbmRyZSBMdWNhcywgYXRvbWljaW8uYyBieSBUaGVvIGRlIFJhYWR0LgotCi1zdHJsY2F0KCkgaXMgKGMpIFRvZGQgQy4gTWlsbGVyCi0KLT09PT09Ci0KLUltcG9ydCBjb2RlIGluIGtleWltcG9ydC5jIGlzIG1vZGlmaWVkIGZyb20gUHVUVFkncyBpbXBvcnQuYywgbGljZW5zZWQgYXMKLWZvbGxvd3M6Ci0KLVB1VFRZIGlzIGNvcHlyaWdodCAxOTk3LTIwMDMgU2ltb24gVGF0aGFtLgotCi1Qb3J0aW9ucyBjb3B5cmlnaHQgUm9iZXJ0IGRlIEJhdGgsIEpvcmlzIHZhbiBSYW50d2lqaywgRGVsaWFuCi1EZWxjaGV2LCBBbmRyZWFzIFNjaHVsdHosIEplcm9lbiBNYXNzYXIsIFdleiBGdXJsb25nLCBOaWNvbGFzIEJhcnJ5LAotSnVzdGluIEJyYWRmb3JkLCBhbmQgQ09SRSBTREkgUy5BLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgotb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKLSh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCi1pbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAotcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKLWFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCi1zdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLWluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUKLUZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgotQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZTJmc3Byb2dzL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhpcyBwYWNrYWdlLCB0aGUgRVhUMiBmaWxlc3lzdGVtIHV0aWxpdGllcywgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyCi10aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBsaWIvZXh0MmZzCi1hbmQgbGliL2UycCBsaWJyYXJpZXMsIHdoaWNoIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCB0aGUgbGliL3V1aWQgbGlicmFyeSB3aGljaCBpcyBtYWRlCi1hdmFpbGFibGUgdW5kZXIgYSBCU0Qtc3R5bGUgbGljZW5zZSBhbmQgdGhlIGxpYi9ldCBhbmQgbGliL3NzCi1saWJyYXJpZXMgd2hpY2ggYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFuIE1JVC1zdHlsZSBsaWNlbnNlLiAgUGxlYXNlCi1zZWUgbGliL3V1aWQvQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzIGZvciB0aGUgbGljZW5zZSBmb3IgdGhlIGZpbGVzCi1jb21wcmlzaW5nIHRoZSBsaWJ1dWlkIGxpYnJhcnksIGFuZCB0aGUgc291cmNlIGZpbGUgaGVhZGVycyBvZiB0aGUKLWxpYmV0IGFuZCBsaWJzcyBsaWJyYXJpZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVRoZSBtb3N0IHJlY2VudCBvZmZpY2lhbGx5IGRpc3RyaWJ1dGVkIHZlcnNpb24gY2FuIGJlIGZvdW5kIGF0Ci1odHRwOi8vZTJmc3Byb2dzLnNvdXJjZWZvcmdlLm5ldC4gIElmIHlvdSBuZWVkIHRvIG1ha2UgYSBkaXN0cmlidXRpb24sCi10aGF0J3MgdGhlIG9uZSB5b3Ugc2hvdWxkIHVzZS4gIElmIHRoZXJlIGlzIHNvbWUgcmVhc29uIHdoeSB5b3UnZCBsaWtlCi1hIG1vcmUgcmVjZW50IHZlcnNpb24gdGhhdCBpcyBzdGlsbCBpbiBBTFBIQSB0ZXN0aW5nIChpLmUuLCBlaXRoZXIKLXVzaW5nIHRoZSAiV0lQIiB0ZXN0IGRpc3RyaWJ1dGlvbnMgb3Igb25lIGZyb20gdGhlIGhnIG9yIGdpdAotcmVwb3NpdG9yeSBmcm9tIHRoZSBkZXZlbG9wbWVudCBicmFuY2gsIHBsZWFzZSBjb250YWN0IG1lCi0odHl0c29AbWl0LmVkdSkgYmVmb3JlIHlvdSBzaGlwLiAgVGhlIHJlbGVhc2Ugc2NoZWR1bGVzIGZvciB0aGlzCi1wYWNrYWdlIGFyZSBmbGV4aWJsZSwgaWYgeW91IGdpdmUgbWUgZW5vdWdoIGxlYWQgdGltZS4KLQotCi0JCQkJCVRoZW9kb3JlIFRzJ28KLQkJCQkJMjMtSnVuZS0yMDA3Ci0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWVidGFibGVzL0NPUFlJTkcKLWV0aHRvb2wvTElDRU5TRQotbG1iZW5jaC9DT1BZSU5HCi1zeXNrbG9nZC9DT1BZSU5HCi1zeXNzdGF0L0NPUFlJTkcKLXZjb25maWcvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0JQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWV4cGF0L0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBDbGFyayBDb29wZXIKLUNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBFeHBhdCBtYWludGFpbmVycy4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi1pbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi1FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi1DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLVNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1maW8tZmlvL0NPUFlJTkcKLWh3ZGF0YS9DT1BZSU5HCi1sdm0yL0NPUFlJTkcKLW1vZHVsZS1pbml0LXRvb2xzL0NPUFlJTkcKLXVzYl9tb2Rlc3dpdGNoL0NPUFlJTkcKLXVzYnV0aWxzL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZvbnRjb25maWcvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kSWQkCi0KLUNvcHlyaWdodCDCqSAyMDAxLDIwMDMgS2VpdGggUGFja2FyZAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci10aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLWNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLWRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KLXJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAotaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLQotS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLUlOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLUVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1mcmVldHlwZS9GVEwuVFhUCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgVGhlIEZyZWVUeXBlIFByb2plY3QgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDA2LUphbi0yNwotCi0gICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk2LTIwMDIsIDIwMDYgYnkKLSAgICAgICAgICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcKLQotCi0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLSAgVGhlIEZyZWVUeXBlICBQcm9qZWN0IGlzIGRpc3RyaWJ1dGVkIGluICBzZXZlcmFsIGFyY2hpdmUgcGFja2FnZXM7Ci0gIHNvbWUgb2YgdGhlbSBtYXkgY29udGFpbiwgaW4gYWRkaXRpb24gdG8gdGhlIEZyZWVUeXBlIGZvbnQgZW5naW5lLAotICB2YXJpb3VzIHRvb2xzIGFuZCAgY29udHJpYnV0aW9ucyB3aGljaCByZWx5IG9uLCBvciAgcmVsYXRlIHRvLCB0aGUKLSAgRnJlZVR5cGUgUHJvamVjdC4KLQotICBUaGlzICBsaWNlbnNlIGFwcGxpZXMgIHRvIGFsbCAgZmlsZXMgZm91bmQgIGluIHN1Y2ggIHBhY2thZ2VzLCBhbmQKLSAgd2hpY2ggZG8gbm90ICBmYWxsIHVuZGVyIHRoZWlyIG93biBleHBsaWNpdCAgbGljZW5zZS4gIFRoZSBsaWNlbnNlCi0gIGFmZmVjdHMgIHRodXMgIHRoZSAgRnJlZVR5cGUgICBmb250ICBlbmdpbmUsICB0aGUgIHRlc3QgIHByb2dyYW1zLAotICBkb2N1bWVudGF0aW9uIGFuZCBtYWtlZmlsZXMsIGF0IHRoZSB2ZXJ5IGxlYXN0LgotCi0gIFRoaXMgIGxpY2Vuc2UgICB3YXMgIGluc3BpcmVkICBieSAgdGhlICBCU0QsICAgQXJ0aXN0aWMsICBhbmQgIElKRwotICAoSW5kZXBlbmRlbnQgSlBFRyAgR3JvdXApIGxpY2Vuc2VzLCB3aGljaCAgYWxsIGVuY291cmFnZSBpbmNsdXNpb24KLSAgYW5kICB1c2Ugb2YgIGZyZWUgIHNvZnR3YXJlIGluICBjb21tZXJjaWFsICBhbmQgZnJlZXdhcmUgIHByb2R1Y3RzCi0gIGFsaWtlLiAgQXMgYSBjb25zZXF1ZW5jZSwgaXRzIG1haW4gcG9pbnRzIGFyZSB0aGF0OgotCi0gICAgbyBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gSG93ZXZlciwgd2Ugd2lsbCBiZQotICAgICAgaW50ZXJlc3RlZCBpbiBhbnkga2luZCBvZiBidWcgcmVwb3J0cy4gKGBhcyBpcycgZGlzdHJpYnV0aW9uKQotCi0gICAgbyBZb3UgY2FuICB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91ICB3YW50LCBpbiBwYXJ0cyBvcgotICAgICAgZnVsbCBmb3JtLCB3aXRob3V0IGhhdmluZyB0byBwYXkgdXMuIChgcm95YWx0eS1mcmVlJyB1c2FnZSkKLQotICAgIG8gWW91IG1heSBub3QgcHJldGVuZCB0aGF0ICB5b3Ugd3JvdGUgdGhpcyBzb2Z0d2FyZS4gIElmIHlvdSB1c2UKLSAgICAgIGl0LCBvciAgb25seSBwYXJ0cyBvZiBpdCwgIGluIGEgcHJvZ3JhbSwgIHlvdSBtdXN0IGFja25vd2xlZGdlCi0gICAgICBzb21ld2hlcmUgIGluICB5b3VyICBkb2N1bWVudGF0aW9uICB0aGF0ICB5b3UgIGhhdmUgIHVzZWQgIHRoZQotICAgICAgRnJlZVR5cGUgY29kZS4gKGBjcmVkaXRzJykKLQotICBXZSAgc3BlY2lmaWNhbGx5ICBwZXJtaXQgIGFuZCAgZW5jb3VyYWdlICB0aGUgIGluY2x1c2lvbiAgb2YgIHRoaXMKLSAgc29mdHdhcmUsIHdpdGggIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgIGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuCi0gIFdlICBkaXNjbGFpbSAgYWxsIHdhcnJhbnRpZXMgIGNvdmVyaW5nICBUaGUgIEZyZWVUeXBlIFByb2plY3QgIGFuZAotICBhc3N1bWUgbm8gbGlhYmlsaXR5IHJlbGF0ZWQgdG8gVGhlIEZyZWVUeXBlIFByb2plY3QuCi0KLQotICBGaW5hbGx5LCAgbWFueSAgcGVvcGxlICBhc2tlZCAgdXMgIGZvciAgYSAgcHJlZmVycmVkICBmb3JtICBmb3IgIGEKLSAgY3JlZGl0L2Rpc2NsYWltZXIgdG8gdXNlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuICBXZSB0aHVzCi0gIGVuY291cmFnZSB5b3UgdG8gdXNlIHRoZSBmb2xsb3dpbmcgdGV4dDoKLQotICAgIiIiCi0gICAgUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgY29weXJpZ2h0IKkgPHllYXI+IFRoZSBGcmVlVHlwZQotICAgIFByb2plY3QgKHd3dy5mcmVldHlwZS5vcmcpLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICIiIgotCi0gIFBsZWFzZSByZXBsYWNlIDx5ZWFyPiB3aXRoIHRoZSB2YWx1ZSBmcm9tIHRoZSBGcmVlVHlwZSB2ZXJzaW9uIHlvdQotICBhY3R1YWxseSB1c2UuCi0KLQotTGVnYWwgVGVybXMKLT09PT09PT09PT09Ci0KLTAuIERlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLQotCi0gIFRocm91Z2hvdXQgdGhpcyBsaWNlbnNlLCAgdGhlIHRlcm1zIGBwYWNrYWdlJywgYEZyZWVUeXBlIFByb2plY3QnLAotICBhbmQgIGBGcmVlVHlwZSAgYXJjaGl2ZScgcmVmZXIgIHRvICB0aGUgIHNldCAgb2YgZmlsZXMgIG9yaWdpbmFsbHkKLSAgZGlzdHJpYnV0ZWQgIGJ5IHRoZSAgYXV0aG9ycyAgKERhdmlkIFR1cm5lciwgIFJvYmVydCBXaWxoZWxtLCAgYW5kCi0gIFdlcm5lciBMZW1iZXJnKSBhcyB0aGUgYEZyZWVUeXBlIFByb2plY3QnLCBiZSB0aGV5IG5hbWVkIGFzIGFscGhhLAotICBiZXRhIG9yIGZpbmFsIHJlbGVhc2UuCi0KLSAgYFlvdScgcmVmZXJzIHRvICB0aGUgbGljZW5zZWUsIG9yIHBlcnNvbiB1c2luZyAgdGhlIHByb2plY3QsIHdoZXJlCi0gIGB1c2luZycgaXMgYSBnZW5lcmljIHRlcm0gaW5jbHVkaW5nIGNvbXBpbGluZyB0aGUgcHJvamVjdCdzIHNvdXJjZQotICBjb2RlIGFzICB3ZWxsIGFzIGxpbmtpbmcgaXQgIHRvIGZvcm0gYSAgYHByb2dyYW0nIG9yIGBleGVjdXRhYmxlJy4KLSAgVGhpcyAgcHJvZ3JhbSBpcyAgcmVmZXJyZWQgdG8gIGFzICBgYSBwcm9ncmFtICB1c2luZyB0aGUgIEZyZWVUeXBlCi0gIGVuZ2luZScuCi0KLSAgVGhpcyAgbGljZW5zZSBhcHBsaWVzICB0byBhbGwgIGZpbGVzIGRpc3RyaWJ1dGVkICBpbiAgdGhlIG9yaWdpbmFsCi0gIEZyZWVUeXBlICBQcm9qZWN0LCAgIGluY2x1ZGluZyAgYWxsICBzb3VyY2UgICBjb2RlLCAgYmluYXJpZXMgIGFuZAotICBkb2N1bWVudGF0aW9uLCAgdW5sZXNzICBvdGhlcndpc2UgIHN0YXRlZCAgIGluICB0aGUgIGZpbGUgIGluICBpdHMKLSAgb3JpZ2luYWwsIHVubW9kaWZpZWQgZm9ybSBhcyAgZGlzdHJpYnV0ZWQgaW4gdGhlIG9yaWdpbmFsIGFyY2hpdmUuCi0gIElmIHlvdSBhcmUgIHVuc3VyZSB3aGV0aGVyIG9yIG5vdCBhIHBhcnRpY3VsYXIgIGZpbGUgaXMgY292ZXJlZCBieQotICB0aGlzIGxpY2Vuc2UsIHlvdSBtdXN0IGNvbnRhY3QgdXMgdG8gdmVyaWZ5IHRoaXMuCi0KLSAgVGhlIEZyZWVUeXBlICBQcm9qZWN0IGlzIGNvcHlyaWdodCAoQykgMTk5Ni0yMDAwICBieSBEYXZpZCBUdXJuZXIsCi0gIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICBBbGwgcmlnaHRzIHJlc2VydmVkIGV4Y2VwdCBhcwotICBzcGVjaWZpZWQgYmVsb3cuCi0KLTEuIE5vIFdhcnJhbnR5Ci0tLS0tLS0tLS0tLS0tLQotCi0gIFRIRSBGUkVFVFlQRSBQUk9KRUNUICBJUyBQUk9WSURFRCBgQVMgSVMnIFdJVEhPVVQgIFdBUlJBTlRZIE9GIEFOWQotICBLSU5ELCBFSVRIRVIgIEVYUFJFU1MgT1IgSU1QTElFRCwgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCBUTywKLSAgV0FSUkFOVElFUyAgT0YgIE1FUkNIQU5UQUJJTElUWSAgIEFORCAgRklUTkVTUyAgRk9SICBBICBQQVJUSUNVTEFSCi0gIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBXSUxMIEFOWSBPRiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUwotICBCRSBMSUFCTEUgIEZPUiBBTlkgREFNQUdFUyBDQVVTRUQgIEJZIFRIRSBVU0UgT1IgIFRIRSBJTkFCSUxJVFkgVE8KLSAgVVNFLCBPRiBUSEUgRlJFRVRZUEUgUFJPSkVDVC4KLQotMi4gUmVkaXN0cmlidXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhpcyAgbGljZW5zZSAgZ3JhbnRzICBhICB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSwgIHBlcnBldHVhbCAgYW5kCi0gIGlycmV2b2NhYmxlIHJpZ2h0ICBhbmQgbGljZW5zZSB0byB1c2UsICBleGVjdXRlLCBwZXJmb3JtLCBjb21waWxlLAotICBkaXNwbGF5LCAgY29weSwgICBjcmVhdGUgIGRlcml2YXRpdmUgIHdvcmtzICAgb2YsICBkaXN0cmlidXRlICBhbmQKLSAgc3VibGljZW5zZSB0aGUgIEZyZWVUeXBlIFByb2plY3QgKGluICBib3RoIHNvdXJjZSBhbmQgIG9iamVjdCBjb2RlCi0gIGZvcm1zKSAgYW5kICBkZXJpdmF0aXZlIHdvcmtzICB0aGVyZW9mICBmb3IgIGFueSAgcHVycG9zZTsgYW5kICB0bwotICBhdXRob3JpemUgb3RoZXJzICB0byBleGVyY2lzZSAgc29tZSBvciBhbGwgIG9mIHRoZSAgcmlnaHRzIGdyYW50ZWQKLSAgaGVyZWluLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgIG8gUmVkaXN0cmlidXRpb24gb2YgIHNvdXJjZSBjb2RlICBtdXN0IHJldGFpbiB0aGlzICBsaWNlbnNlIGZpbGUKLSAgICAgIChgRlRMLlRYVCcpIHVuYWx0ZXJlZDsgYW55ICBhZGRpdGlvbnMsIGRlbGV0aW9ucyBvciBjaGFuZ2VzIHRvCi0gICAgICB0aGUgb3JpZ2luYWwgIGZpbGVzIG11c3QgYmUgY2xlYXJseSAgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZwotICAgICAgZG9jdW1lbnRhdGlvbi4gICBUaGUgIGNvcHlyaWdodCAgIG5vdGljZXMgIG9mICB0aGUgIHVuYWx0ZXJlZCwKLSAgICAgIG9yaWdpbmFsICBmaWxlcyBtdXN0ICBiZSAgcHJlc2VydmVkIGluICBhbGwgIGNvcGllcyBvZiAgc291cmNlCi0gICAgICBmaWxlcy4KLQotICAgIG8gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0gbXVzdCBwcm92aWRlIGEgIGRpc2NsYWltZXIgIHRoYXQKLSAgICAgIHN0YXRlcyAgdGhhdCAgdGhlIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb2YgdGhlIHdvcmsgb2YgdGhlCi0gICAgICBGcmVlVHlwZSBUZWFtLCAgaW4gIHRoZSAgZGlzdHJpYnV0aW9uICBkb2N1bWVudGF0aW9uLiAgV2UgYWxzbwotICAgICAgZW5jb3VyYWdlIHlvdSB0byBwdXQgYW4gVVJMIHRvIHRoZSBGcmVlVHlwZSB3ZWIgcGFnZSAgaW4gIHlvdXIKLSAgICAgIGRvY3VtZW50YXRpb24sIHRob3VnaCB0aGlzIGlzbid0IG1hbmRhdG9yeS4KLQotICBUaGVzZSBjb25kaXRpb25zICBhcHBseSB0byBhbnkgIHNvZnR3YXJlIGRlcml2ZWQgZnJvbSBvciAgYmFzZWQgb24KLSAgdGhlIEZyZWVUeXBlIFByb2plY3QsICBub3QganVzdCB0aGUgdW5tb2RpZmllZCBmaWxlcy4gICBJZiB5b3UgdXNlCi0gIG91ciB3b3JrLCB5b3UgIG11c3QgYWNrbm93bGVkZ2UgdXMuICBIb3dldmVyLCBubyAgZmVlIG5lZWQgYmUgcGFpZAotICB0byB1cy4KLQotMy4gQWR2ZXJ0aXNpbmcKLS0tLS0tLS0tLS0tLS0tCi0KLSAgTmVpdGhlciB0aGUgIEZyZWVUeXBlIGF1dGhvcnMgYW5kICBjb250cmlidXRvcnMgbm9yIHlvdSAgc2hhbGwgdXNlCi0gIHRoZSBuYW1lIG9mIHRoZSAgb3RoZXIgZm9yIGNvbW1lcmNpYWwsIGFkdmVydGlzaW5nLCBvciBwcm9tb3Rpb25hbAotICBwdXJwb3NlcyB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotICBXZSBzdWdnZXN0LCAgYnV0IGRvIG5vdCByZXF1aXJlLCB0aGF0ICB5b3UgdXNlIG9uZSBvciAgbW9yZSBvZiB0aGUKLSAgZm9sbG93aW5nIHBocmFzZXMgdG8gcmVmZXIgIHRvIHRoaXMgc29mdHdhcmUgaW4geW91ciBkb2N1bWVudGF0aW9uCi0gIG9yIGFkdmVydGlzaW5nICBtYXRlcmlhbHM6IGBGcmVlVHlwZSBQcm9qZWN0JywgIGBGcmVlVHlwZSBFbmdpbmUnLAotICBgRnJlZVR5cGUgbGlicmFyeScsIG9yIGBGcmVlVHlwZSBEaXN0cmlidXRpb24nLgotCi0gIEFzICB5b3UgaGF2ZSAgbm90IHNpZ25lZCAgdGhpcyBsaWNlbnNlLCAgeW91IGFyZSAgbm90ICByZXF1aXJlZCB0bwotICBhY2NlcHQgIGl0LiAgIEhvd2V2ZXIsICBhcyAgdGhlIEZyZWVUeXBlICBQcm9qZWN0ICBpcyAgY29weXJpZ2h0ZWQKLSAgbWF0ZXJpYWwsIG9ubHkgIHRoaXMgbGljZW5zZSwgb3IgIGFub3RoZXIgb25lIGNvbnRyYWN0ZWQgIHdpdGggdGhlCi0gIGF1dGhvcnMsIGdyYW50cyB5b3UgIHRoZSByaWdodCB0byB1c2UsIGRpc3RyaWJ1dGUsICBhbmQgbW9kaWZ5IGl0LgotICBUaGVyZWZvcmUsICBieSAgdXNpbmcsICBkaXN0cmlidXRpbmcsICBvciBtb2RpZnlpbmcgIHRoZSAgRnJlZVR5cGUKLSAgUHJvamVjdCwgeW91IGluZGljYXRlIHRoYXQgeW91IHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBhbGwgdGhlIHRlcm1zCi0gIG9mIHRoaXMgbGljZW5zZS4KLQotNC4gQ29udGFjdHMKLS0tLS0tLS0tLS0tCi0KLSAgVGhlcmUgYXJlIHR3byBtYWlsaW5nIGxpc3RzIHJlbGF0ZWQgdG8gRnJlZVR5cGU6Ci0KLSAgICBvIGZyZWV0eXBlQG5vbmdudS5vcmcKLQotICAgICAgRGlzY3Vzc2VzIGdlbmVyYWwgdXNlIGFuZCBhcHBsaWNhdGlvbnMgb2YgRnJlZVR5cGUsIGFzIHdlbGwgYXMKLSAgICAgIGZ1dHVyZSBhbmQgIHdhbnRlZCBhZGRpdGlvbnMgdG8gdGhlICBsaWJyYXJ5IGFuZCBkaXN0cmlidXRpb24uCi0gICAgICBJZiAgeW91IGFyZSBsb29raW5nICBmb3Igc3VwcG9ydCwgIHN0YXJ0IGluICB0aGlzIGxpc3QgIGlmIHlvdQotICAgICAgaGF2ZW4ndCBmb3VuZCBhbnl0aGluZyB0byBoZWxwIHlvdSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLQotICAgIG8gZnJlZXR5cGUtZGV2ZWxAbm9uZ251Lm9yZwotCi0gICAgICBEaXNjdXNzZXMgYnVncywgIGFzIHdlbGwgIGFzIGVuZ2luZSBpbnRlcm5hbHMsICBkZXNpZ24gaXNzdWVzLAotICAgICAgc3BlY2lmaWMgbGljZW5zZXMsIHBvcnRpbmcsIGV0Yy4KLQotICBPdXIgaG9tZSBwYWdlIGNhbiBiZSBmb3VuZCBhdAotCi0gICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcKLQotCi0tLS0gZW5kIG9mIEZUTC5UWFQgLS0tCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZyZWV0eXBlL0dQTHYyLlRYVAotaXByb3V0ZTIvQ09QWUlORwotdmVyaXR5L0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZyZWV0eXBlL0xJQ0VOU0UuVFhUCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlICBGcmVlVHlwZSAyICBmb250ICBlbmdpbmUgaXMgIGNvcHlyaWdodGVkICB3b3JrIGFuZCAgY2Fubm90IGJlICB1c2VkCi1sZWdhbGx5ICB3aXRob3V0IGEgIHNvZnR3YXJlIGxpY2Vuc2UuICAgSW4gIG9yZGVyIHRvICBtYWtlIHRoaXMgIHByb2plY3QKLXVzYWJsZSAgdG8gYSB2YXN0ICBtYWpvcml0eSBvZiAgZGV2ZWxvcGVycywgd2UgIGRpc3RyaWJ1dGUgaXQgIHVuZGVyIHR3bwotbXV0dWFsbHkgZXhjbHVzaXZlIG9wZW4tc291cmNlIGxpY2Vuc2VzLgotCi1UaGlzIG1lYW5zICB0aGF0ICp5b3UqIG11c3QgY2hvb3NlICAqb25lKiBvZiB0aGUgIHR3byBsaWNlbnNlcyBkZXNjcmliZWQKLWJlbG93LCB0aGVuIG9iZXkgIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hlbiAgdXNpbmcgRnJlZVR5cGUgMiBpbgotYW55IG9mIHlvdXIgcHJvamVjdHMgb3IgcHJvZHVjdHMuCi0KLSAgLSBUaGUgRnJlZVR5cGUgTGljZW5zZSwgZm91bmQgaW4gIHRoZSBmaWxlIGBGVEwuVFhUJywgd2hpY2ggaXMgc2ltaWxhcgotICAgIHRvIHRoZSBvcmlnaW5hbCBCU0QgbGljZW5zZSAqd2l0aCogYW4gYWR2ZXJ0aXNpbmcgY2xhdXNlIHRoYXQgZm9yY2VzCi0gICAgeW91ICB0byAgZXhwbGljaXRseSBjaXRlICB0aGUgIEZyZWVUeXBlICBwcm9qZWN0ICBpbiB5b3VyICBwcm9kdWN0J3MKLSAgICBkb2N1bWVudGF0aW9uLiAgQWxsICBkZXRhaWxzIGFyZSBpbiB0aGUgbGljZW5zZSAgZmlsZS4gIFRoaXMgbGljZW5zZQotICAgIGlzICBzdWl0ZWQgIHRvIHByb2R1Y3RzICB3aGljaCAgZG9uJ3QgIHVzZSAgdGhlIEdOVSAgR2VuZXJhbCAgUHVibGljCi0gICAgTGljZW5zZS4KLQotICAgIE5vdGUgdGhhdCAgdGhpcyBsaWNlbnNlICBpcyAgY29tcGF0aWJsZSAgdG8gdGhlICBHTlUgR2VuZXJhbCAgUHVibGljCi0gICAgTGljZW5zZSB2ZXJzaW9uIDMsIGJ1dCBub3QgdmVyc2lvbiAyLgotCi0gIC0gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgZm91bmQgaW4gIGBHUEx2Mi5UWFQnIChhbnkKLSAgICBsYXRlciB2ZXJzaW9uIGNhbiBiZSB1c2VkICBhbHNvKSwgZm9yIHByb2dyYW1zIHdoaWNoIGFscmVhZHkgdXNlIHRoZQotICAgIEdQTC4gIE5vdGUgIHRoYXQgdGhlICBGVEwgaXMgIGluY29tcGF0aWJsZSAgd2l0aCAgR1BMdjIgZHVlICB0byAgaXRzCi0gICAgYWR2ZXJ0aXNlbWVudCBjbGF1c2UuCi0KLVRoZSBjb250cmlidXRlZCBCREYgYW5kIFBDRiBkcml2ZXJzIGNvbWUgd2l0aCBhIGxpY2Vuc2Ugc2ltaWxhciAgdG8gdGhhdAotb2YgdGhlIFggV2luZG93IFN5c3RlbS4gIEl0IGlzIGNvbXBhdGlibGUgdG8gdGhlIGFib3ZlIHR3byBsaWNlbnNlcyAoc2VlCi1maWxlIHNyYy9iZGYvUkVBRE1FIGFuZCBzcmMvcGNmL1JFQURNRSkuCi0KLVRoZSBnemlwIG1vZHVsZSB1c2VzIHRoZSB6bGliIGxpY2Vuc2UgKHNlZSBzcmMvZ3ppcC96bGliLmgpIHdoaWNoIHRvbyBpcwotY29tcGF0aWJsZSB0byB0aGUgYWJvdmUgdHdvIGxpY2Vuc2VzLgotCi0KLS0tLSBlbmQgb2YgTElDRU5TRS5UWFQgLS0tCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdkYi9DT1BZSU5HLkxJQgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAotcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCi1hZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gICAgTUEgMDIxMTAtMTMwMSwgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nZGIvQ09QWUlORzMKLWd6aXAvQ09QWUlORwotbGVzcy9DT1BZSU5HCi1tNC9DT1BZSU5HCi1uYW5vL0NPUFlJTkcKLXNhbWJhL0NPUFlJTkcKLXRhci9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKLQotIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKLXNvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKLXRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCi1zaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKLXNvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCi1hbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQotd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKLWZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQotdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCi1jZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKLXlvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQotZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKLW9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Ci1rbm93IHRoZWlyIHJpZ2h0cy4KLQotICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6Ci0oMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQotZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KLQotICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKLXRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKLWF1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKLWNoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bwotYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KLQotICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCi1tb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKLWNhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCi1wcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYwotcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KLXVzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQotaGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCi1wcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQotc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCi1vZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KLQotICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgotU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCi1zb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bwotYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCi1tYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAotcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAwLiBEZWZpbml0aW9ucy4KLQotICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgotd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KLQotICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKLUxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAotInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgotCi0gIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKLWluIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgotZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCi1lYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KLQotICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0uCi0KLSAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAotcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgotaW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCi1jb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAotZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKLXB1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KLQotICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCi1wYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKLWEgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCi0KLSAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCi10byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCi1mZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKLXRlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCi1leHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCi13b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgotdGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKLW1lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCi0KLSAgMS4gU291cmNlIENvZGUuCi0KLSAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKLWZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKLWZvcm0gb2YgYSB3b3JrLgotCi0gIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCi1zdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCi1pbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAotaXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCi0KLSAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKLXRoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCi1wYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCi1Db21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKLU1ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgotaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKLSJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAotKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQotKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KLXByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgotCi0gIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKLXRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKLXdvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KLWNvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncwotU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQotcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Ci13aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKLWluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCi10aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKLWxpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAotc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKLXN1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KLQotICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCi1jYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKLVNvdXJjZS4KLQotICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKLXNhbWUgd29yay4KLQotICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KLQotICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgotY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKLWNvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKLXBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCi1jb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKLWNvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCi1yaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KLQotICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Ci1jb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucwotaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQotb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Ci13aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCi10aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbwotbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcwotZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgotYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCi15b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgotCi0gIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCi10aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKLW1ha2VzIGl0IHVubmVjZXNzYXJ5LgotCi0gIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCi0KLSAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCi1tZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKLTExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgotc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAotbWVhc3VyZXMuCi0KLSAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAotY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCi1pcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCi10aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCi1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwotdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCi10ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgotCi0gIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCi0KLSAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91Ci1yZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAotYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwota2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Ci1ub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7Ci1rZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAotcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLSAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAotYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KLQotICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgotCi0gIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KLXByb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCi10ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAotICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KLQotICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCi0gICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCi0gICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bwotICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCi0KLSAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcwotICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcwotICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3Ci0gICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKLSAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubwotICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKLSAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgotCi0gICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKLSAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKLSAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgotICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgotCi0gIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKLXdvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCi1hbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAotaW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgotImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Ci11c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCi1iZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKLWluIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCi1wYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgotCi0gIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgotCi0gIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCi1vZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKLW1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKLWluIG9uZSBvZiB0aGVzZSB3YXlzOgotCi0gICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAotICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAotICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQotICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCi0gICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0Ci0gICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQotICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQotICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCi0gICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubwotICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcwotICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgotCi0gICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKLSAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcwotICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCi0gICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCi0gICAgd2l0aCBzdWJzZWN0aW9uIDZiLgotCi0gICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKLSAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubwotICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCi0gICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCi0gICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCi0gICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCi0gICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCi0gICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KLQotICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKLSAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZwotICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KLSAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KLQotICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKLWZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCi1pbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCi0KLSAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKLXRhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCi1vciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCi1pbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCi1kb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKLXByb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQotdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCi1vZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgotYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0Ci1pcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAotY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKLXRoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgotCi0gICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKLXByb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAotYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQotYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0Ci1zdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAotY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKLW1vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgotCi0gIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCi1zcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcwotcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCi1Vc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCi1maXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQotQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKLWJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQotaWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKLW1vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKLWJlZW4gaW5zdGFsbGVkIGluIFJPTSkuCi0KLSAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQotcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCi1mb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgotdGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQotbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKLWFkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAotcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KLQotICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKLWluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKLWRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCi1zb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKLXVucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgotCi0gIDcuIEFkZGl0aW9uYWwgVGVybXMuCi0KLSAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKLUxpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KLUFkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKLWJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKLXRoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCi1hcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Ci11bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Ci10aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCi0KLSAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgotcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCi1pdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCi1yZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKLWFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKLWZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KLQotICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKLWFkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKLXRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgotCi0gICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCi0gICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKLQotICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgotICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKLSAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgotCi0gICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgotICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCi0gICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgotCi0gICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgotICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgotCi0gICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQotICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgotCi0gICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAotICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCi0gICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgotICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KLSAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCi0KLSAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKLXJlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKLXJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCi1nb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKLXJlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKLWEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcwotTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCi1vZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcwotbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCi0KLSAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQotbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCi1hZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKLXdoZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCi0KLSAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKLWZvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Ci10aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCi0KLSAgOC4gVGVybWluYXRpb24uCi0KLSAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Ci1wcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCi1tb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKLXRoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKLXBhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KLQotICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgotbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCi1wcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCi1maW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Ci1ob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucwotcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgotCi0gIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcwotcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCi12aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCi1yZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKLWNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKLXlvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgotCi0gIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCi1saWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKLXJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKLW1hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCi0KLSAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCi0KLSAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCi1ydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCi1vY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgotdG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKLW5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgotbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KLW5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQotY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KLQotICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCi0KLSAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQotcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCi1wcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCi1mb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KLQotICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCi1vcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCi1vcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAotd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKLXRyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgotbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCi1naXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQotQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCi10aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCi0KLSAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCi1yaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQotbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCi1yaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCi0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAotYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCi1zYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCi0KLSAgMTEuIFBhdGVudHMuCi0KLSAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcwotTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKLXdvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgotCi0gIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcwotb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgotaGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCi1ieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCi1idXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQotY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKLXB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAotcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCi10aGlzIExpY2Vuc2UuCi0KLSAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bwotbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCi1wcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgotCi0gIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCi1hZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKLShzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KLXN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCi1wYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQotcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgotCi0gIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCi1hbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQotdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQotcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKLXRoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KLWF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKLXBhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCi1jb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50Ci1saWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKLWFjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQotY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yawotaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Ci1jb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgotCi0gIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKLWFycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKLWNvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcwotcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5Ci1vciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCi15b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAotd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCi10aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcwotY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCi1zcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCi13b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcwotaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAotdG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKLXRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQotcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5Ci1wYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCi1jb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQotZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKLWNvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKLW9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCi0KLSAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZwotYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKLW90aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KLQotICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KLQotICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQotY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQotbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Ci10byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKLXRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcwotTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgotCi0gIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKLXBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKLXVuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKLWNvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKLUxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAotYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gYXMgc3VjaC4KLQotICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLSAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKLVByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQotb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKLXZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKLXZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCi1wdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Ci10byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KLQotICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAotcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQotYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQotbGF0ZXIgdmVyc2lvbi4KLQotICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KLQotICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCi1BUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCi1IT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCi1JUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKLUFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCi0KLSAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCi1USEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKLUdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQotVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgotREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKLVBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAotRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotU1VDSCBEQU1BR0VTLgotCi0gIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCi0KLSAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCi1hYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKLXJldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcwotYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQotUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQotY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgotCi0gICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLXN0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Ci1ub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0gICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcwotbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgotCi0gIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCi1pZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKLTxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCi1pbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKLW1heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAotdGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKLTxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdkYi9DT1BZSU5HMy5MSUIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKLQotIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCi0gIFRoaXMgdmVyc2lvbiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlLCBzdXBwbGVtZW50ZWQgYnkgdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbGlzdGVkIGJlbG93LgotCi0gIDAuIEFkZGl0aW9uYWwgRGVmaW5pdGlvbnMuCi0KLSAgQXMgdXNlZCBoZXJlaW4sICJ0aGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgIkdOVSBHUEwiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotICAiVGhlIExpYnJhcnkiIHJlZmVycyB0byBhIGNvdmVyZWQgd29yayBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UsCi1vdGhlciB0aGFuIGFuIEFwcGxpY2F0aW9uIG9yIGEgQ29tYmluZWQgV29yayBhcyBkZWZpbmVkIGJlbG93LgotCi0gIEFuICJBcHBsaWNhdGlvbiIgaXMgYW55IHdvcmsgdGhhdCBtYWtlcyB1c2Ugb2YgYW4gaW50ZXJmYWNlIHByb3ZpZGVkCi1ieSB0aGUgTGlicmFyeSwgYnV0IHdoaWNoIGlzIG5vdCBvdGhlcndpc2UgYmFzZWQgb24gdGhlIExpYnJhcnkuCi1EZWZpbmluZyBhIHN1YmNsYXNzIG9mIGEgY2xhc3MgZGVmaW5lZCBieSB0aGUgTGlicmFyeSBpcyBkZWVtZWQgYSBtb2RlCi1vZiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIExpYnJhcnkuCi0KLSAgQSAiQ29tYmluZWQgV29yayIgaXMgYSB3b3JrIHByb2R1Y2VkIGJ5IGNvbWJpbmluZyBvciBsaW5raW5nIGFuCi1BcHBsaWNhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5LiAgVGhlIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgTGlicmFyeQotd2l0aCB3aGljaCB0aGUgQ29tYmluZWQgV29yayB3YXMgbWFkZSBpcyBhbHNvIGNhbGxlZCB0aGUgIkxpbmtlZAotVmVyc2lvbiIuCi0KLSAgVGhlICJNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSBDb21iaW5lZCBXb3JrIG1lYW5zIHRoZQotQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIHRoZSBDb21iaW5lZCBXb3JrLCBleGNsdWRpbmcgYW55IHNvdXJjZSBjb2RlCi1mb3IgcG9ydGlvbnMgb2YgdGhlIENvbWJpbmVkIFdvcmsgdGhhdCwgY29uc2lkZXJlZCBpbiBpc29sYXRpb24sIGFyZQotYmFzZWQgb24gdGhlIEFwcGxpY2F0aW9uLCBhbmQgbm90IG9uIHRoZSBMaW5rZWQgVmVyc2lvbi4KLQotICBUaGUgIkNvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSIgZm9yIGEgQ29tYmluZWQgV29yayBtZWFucyB0aGUKLW9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSBmb3IgdGhlIEFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgYW55IGRhdGEKLWFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IgcmVwcm9kdWNpbmcgdGhlIENvbWJpbmVkIFdvcmsgZnJvbSB0aGUKLUFwcGxpY2F0aW9uLCBidXQgZXhjbHVkaW5nIHRoZSBTeXN0ZW0gTGlicmFyaWVzIG9mIHRoZSBDb21iaW5lZCBXb3JrLgotCi0gIDEuIEV4Y2VwdGlvbiB0byBTZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuCi0KLSAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgdW5kZXIgc2VjdGlvbnMgMyBhbmQgNCBvZiB0aGlzIExpY2Vuc2UKLXdpdGhvdXQgYmVpbmcgYm91bmQgYnkgc2VjdGlvbiAzIG9mIHRoZSBHTlUgR1BMLgotCi0gIDIuIENvbnZleWluZyBNb2RpZmllZCBWZXJzaW9ucy4KLQotICBJZiB5b3UgbW9kaWZ5IGEgY29weSBvZiB0aGUgTGlicmFyeSwgYW5kLCBpbiB5b3VyIG1vZGlmaWNhdGlvbnMsIGEKLWZhY2lsaXR5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gQXBwbGljYXRpb24KLXRoYXQgdXNlcyB0aGUgZmFjaWxpdHkgKG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlCi1mYWNpbGl0eSBpcyBpbnZva2VkKSwgdGhlbiB5b3UgbWF5IGNvbnZleSBhIGNvcHkgb2YgdGhlIG1vZGlmaWVkCi12ZXJzaW9uOgotCi0gICBhKSB1bmRlciB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgeW91IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0bwotICAgZW5zdXJlIHRoYXQsIGluIHRoZSBldmVudCBhbiBBcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgdGhlCi0gICBmdW5jdGlvbiBvciBkYXRhLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcwotICAgd2hhdGV2ZXIgcGFydCBvZiBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwsIG9yCi0KLSAgIGIpIHVuZGVyIHRoZSBHTlUgR1BMLCB3aXRoIG5vbmUgb2YgdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb2YKLSAgIHRoaXMgTGljZW5zZSBhcHBsaWNhYmxlIHRvIHRoYXQgY29weS4KLQotICAzLiBPYmplY3QgQ29kZSBJbmNvcnBvcmF0aW5nIE1hdGVyaWFsIGZyb20gTGlicmFyeSBIZWFkZXIgRmlsZXMuCi0KLSAgVGhlIG9iamVjdCBjb2RlIGZvcm0gb2YgYW4gQXBwbGljYXRpb24gbWF5IGluY29ycG9yYXRlIG1hdGVyaWFsIGZyb20KLWEgaGVhZGVyIGZpbGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LiAgWW91IG1heSBjb252ZXkgc3VjaCBvYmplY3QKLWNvZGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQsIGlmIHRoZSBpbmNvcnBvcmF0ZWQKLW1hdGVyaWFsIGlzIG5vdCBsaW1pdGVkIHRvIG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhIHN0cnVjdHVyZQotbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBvciBzbWFsbCBtYWNyb3MsIGlubGluZSBmdW5jdGlvbnMgYW5kIHRlbXBsYXRlcwotKHRlbiBvciBmZXdlciBsaW5lcyBpbiBsZW5ndGgpLCB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOgotCi0gICBhKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIG9iamVjdCBjb2RlIHRoYXQgdGhlCi0gICBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCi0gICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgYikgQWNjb21wYW55IHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlCi0gICBkb2N1bWVudC4KLQotICA0LiBDb21iaW5lZCBXb3Jrcy4KLQotICBZb3UgbWF5IGNvbnZleSBhIENvbWJpbmVkIFdvcmsgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UgdGhhdCwKLXRha2VuIHRvZ2V0aGVyLCBlZmZlY3RpdmVseSBkbyBub3QgcmVzdHJpY3QgbW9kaWZpY2F0aW9uIG9mIHRoZQotcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkgY29udGFpbmVkIGluIHRoZSBDb21iaW5lZCBXb3JrIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucywgaWYgeW91IGFsc28gZG8gZWFjaCBvZgotdGhlIGZvbGxvd2luZzoKLQotICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQKLSAgIHRoZSBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCi0gICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgYikgQWNjb21wYW55IHRoZSBDb21iaW5lZCBXb3JrIHdpdGggYSBjb3B5IG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UKLSAgIGRvY3VtZW50LgotCi0gICBjKSBGb3IgYSBDb21iaW5lZCBXb3JrIHRoYXQgZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMgZHVyaW5nCi0gICBleGVjdXRpb24sIGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nCi0gICB0aGVzZSBub3RpY2VzLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIGRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUKLSAgIGNvcGllcyBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlIGRvY3VtZW50LgotCi0gICBkKSBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgIDApIENvbnZleSB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwotICAgICAgIExpY2Vuc2UsIGFuZCB0aGUgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbiBDb2RlIGluIGEgZm9ybQotICAgICAgIHN1aXRhYmxlIGZvciwgYW5kIHVuZGVyIHRlcm1zIHRoYXQgcGVybWl0LCB0aGUgdXNlciB0bwotICAgICAgIHJlY29tYmluZSBvciByZWxpbmsgdGhlIEFwcGxpY2F0aW9uIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mCi0gICAgICAgdGhlIExpbmtlZCBWZXJzaW9uIHRvIHByb2R1Y2UgYSBtb2RpZmllZCBDb21iaW5lZCBXb3JrLCBpbiB0aGUKLSAgICAgICBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTCBmb3IgY29udmV5aW5nCi0gICAgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuCi0KLSAgICAgICAxKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKLSAgICAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKGEpIHVzZXMgYXQgcnVuIHRpbWUKLSAgICAgICBhIGNvcHkgb2YgdGhlIExpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIKLSAgICAgICBzeXN0ZW0sIGFuZCAoYikgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCi0gICAgICAgb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSBMaW5rZWQKLSAgICAgICBWZXJzaW9uLgotCi0gICBlKSBQcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiwgYnV0IG9ubHkgaWYgeW91IHdvdWxkIG90aGVyd2lzZQotICAgYmUgcmVxdWlyZWQgdG8gcHJvdmlkZSBzdWNoIGluZm9ybWF0aW9uIHVuZGVyIHNlY3Rpb24gNiBvZiB0aGUKLSAgIEdOVSBHUEwsIGFuZCBvbmx5IHRvIHRoZSBleHRlbnQgdGhhdCBzdWNoIGluZm9ybWF0aW9uIGlzCi0gICBuZWNlc3NhcnkgdG8gaW5zdGFsbCBhbmQgZXhlY3V0ZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlCi0gICBDb21iaW5lZCBXb3JrIHByb2R1Y2VkIGJ5IHJlY29tYmluaW5nIG9yIHJlbGlua2luZyB0aGUKLSAgIEFwcGxpY2F0aW9uIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaW5rZWQgVmVyc2lvbi4gKElmCi0gICB5b3UgdXNlIG9wdGlvbiA0ZDAsIHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gbXVzdCBhY2NvbXBhbnkKLSAgIHRoZSBNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIGFuZCBDb3JyZXNwb25kaW5nIEFwcGxpY2F0aW9uCi0gICBDb2RlLiBJZiB5b3UgdXNlIG9wdGlvbiA0ZDEsIHlvdSBtdXN0IHByb3ZpZGUgdGhlIEluc3RhbGxhdGlvbgotICAgSW5mb3JtYXRpb24gaW4gdGhlIG1hbm5lciBzcGVjaWZpZWQgYnkgc2VjdGlvbiA2IG9mIHRoZSBHTlUgR1BMCi0gICBmb3IgY29udmV5aW5nIENvcnJlc3BvbmRpbmcgU291cmNlLikKLQotICA1LiBDb21iaW5lZCBMaWJyYXJpZXMuCi0KLSAgWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlIGJ5IHNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgdGhhdCBhcmUgbm90IEFwcGxpY2F0aW9ucyBhbmQgYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoaXMKLUxpY2Vuc2UsIGFuZCBjb252ZXkgc3VjaCBhIGNvbWJpbmVkIGxpYnJhcnkgdW5kZXIgdGVybXMgb2YgeW91cgotY2hvaWNlLCBpZiB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOgotCi0gICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yayBiYXNlZAotICAgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzLAotICAgY29udmV5ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgdGhhdCBwYXJ0IG9mIGl0Ci0gICBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nIHdoZXJlIHRvIGZpbmQgdGhlCi0gICBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgNi4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldwotdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5Ci1kaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi0gIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUKLUxpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uCi1vZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIKLWFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgcHVibGlzaGVkIHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24KLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgTGlicmFyeSBhcyB5b3UKLXJlY2VpdmVkIGl0IGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gb2YgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBJZiB0aGUgTGlicmFyeSBhcyB5b3UgcmVjZWl2ZWQgaXQgc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlCi13aGV0aGVyIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHNoYWxsCi1hcHBseSwgdGhhdCBwcm94eSdzIHB1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhbnkgdmVyc2lvbiBpcwotcGVybWFuZW50IGF1dGhvcml6YXRpb24gZm9yIHlvdSB0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUKLUxpYnJhcnkuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdldHRleHQvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxNywgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9kYXJ0X3ZtL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9mZm1wZWcvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Nb3N0IGZpbGVzIGluIEZGbXBlZyBhcmUgdW5kZXIgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMQotb3IgbGF0ZXIgKExHUEwgdjIuMSspLiBSZWFkIHRoZSBmaWxlIENPUFlJTkcuTEdQTCBmb3IgZGV0YWlscy4gU29tZSBvdGhlciBmaWxlcwotaGF2ZSBhIE1JVC9YMTEvQlNELXN0eWxlIGxpY2Vuc2UuIEluIGNvbWJpbmF0aW9uIHRoZSBMR1BMIHYyLjErIGFwcGxpZXMgdG8KLUZGbXBlZy4KLQotU29tZSBvcHRpb25hbCBwYXJ0cyBvZiBGRm1wZWcgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotdmVyc2lvbiAyIG9yIGxhdGVyIChHUEwgdjIrKS4gU2VlIHRoZSBmaWxlIENPUFlJTkcuR1BMIGZvciBkZXRhaWxzLiBOb25lIG9mCi10aGVzZSBwYXJ0cyBhcmUgdXNlZCBieSBkZWZhdWx0LCB5b3UgaGF2ZSB0byBleHBsaWNpdGx5IHBhc3MgLS1lbmFibGUtZ3BsIHRvCi1jb25maWd1cmUgdG8gYWN0aXZhdGUgdGhlbS4gSW4gdGhpcyBjYXNlLCBGRm1wZWcncyBsaWNlbnNlIGNoYW5nZXMgdG8gR1BMIHYyKy4KLQotU3BlY2lmaWNhbGx5LCB0aGUgR1BMIHBhcnRzIG9mIEZGbXBlZyBhcmUKLQotLSBsaWJwb3N0cHJvYwotLSBzb21lIHg4NiBhbmQgQWx0aVZlYyBvcHRpbWl6YXRpb25zIGluIGxpYnN3c2NhbGUKLS0gb3B0aW9uYWwgeDg2IG9wdGltaXphdGlvbnMgaW4gdGhlIGZpbGVzCi0gIGxpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9ja19zc2UyLmFzbQotICBsaWJhdmNvZGVjL3g4Ni9oMjY0X2lkY3Rfc3NlMi5hc20KLSAgbGliYXZjb2RlYy94ODYvaWRjdF9tbXguYwotLSB0aGUgQUMtMyBkZWNvZGVyIGluIGxpYmF2Y29kZWMvYWMzZGVjLmMKLS0gdGhlIFgxMSBncmFiYmVyIGluIGxpYmF2ZGV2aWNlL3gxMWdyYWIuYwotCi1Tb21lIGV4dGVybmFsIGxpYnJhcmllcywgZS5nLiBsaWJ4MjY0LCBhcmUgdW5kZXIgR1BMIGFuZCBjYW4gYmUgdXNlZCBpbgotY29uanVuY3Rpb24gd2l0aCBGRm1wZWcuIFRoZXkgcmVxdWlyZSAtLWVuYWJsZS1ncGwgdG8gYmUgcGFzc2VkIHRvIGNvbmZpZ3VyZQotYXMgd2VsbC4KLQotVGhlIG5vbmZyZWUgZXh0ZXJuYWwgbGlicmFyaWVzIGxpYmFtcm5iIGFuZCBsaWJhbXJ3YiBjYW4gYmUgaG9va2VkIHVwIGluIEZGbXBlZy4KLVlvdSBuZWVkIHRvIHBhc3MgLS1lbmFibGUtbm9uZnJlZSB0byBjb25maWd1cmUgdG8gZW5hYmxlIHRoZW0uIEVtcGxveSB0aGlzCi1vcHRpb24gd2l0aCBjYXJlIGFzIEZGbXBlZyB0aGVuIGJlY29tZXMgbm9uZnJlZSBhbmQgdW5yZWRpc3RyaWJ1dGFibGUuCi0KLVRoZXJlIGFyZSBhIGhhbmRmdWwgb2YgZmlsZXMgdW5kZXIgb3RoZXIgbGljZW5zaW5nIHRlcm1zLCBuYW1lbHk6Ci0KLSogVGhlIGZpbGVzIGxpYmF2Y29kZWMvamZkY3Rmc3QuYywgbGliYXZjb2RlYy9qZmRjdGludC5jLCBsaWJhdmNvZGVjL2pyZXZkY3QuYwotICBhcmUgdGFrZW4gZnJvbSBsaWJqcGVnLCBzZWUgdGhlIHRvcCBvZiB0aGUgZmlsZXMgZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgotCi0qIFRoZSBmaWxlIGxpYmF2Y29kZWMvZmRjdHJlZi5jIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBNUEVHIFNvZnR3YXJlIFNpbXVsYXRpb24KLSAgR3JvdXAgd2l0aCBhbGwgcmlnaHRzIHJlc2VydmVkLiBJdCBpcyBvbmx5IHVzZWQgdG8gY3JlYXRlIGEgRENUIHRlc3QgcHJvZ3JhbQotICBhbmQgbm90IGNvbXBpbGVkIGludG8gbGliYXZjb2RlYy4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX2hkaG9tZXJ1bl9wbHVnaW4vbGliaGRob21lcnVuL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCDCqSAyMDA2LTIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKgotICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKLSAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgotICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAotICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKLSAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKLSAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKgotICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KLSAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCi0gKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0gKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAqLwotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9pbWFnZWxvYWRqbmkvc3dzY2FsZS5jCi1nb29nbGVfc3dzY2FsZS9zd3NjYWxlLmMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICoKLSAqIHRoZSBDIGNvZGUgKG5vdCBhc3NlbWJseSwgbW14LCAuLi4pIG9mIHRoZSBzd3NjYWxlciB3aGljaCBoYXMgYmVlbiB3cml0dGVuCi0gKiBieSBNaWNoYWVsIE5pZWRlcm1heWVyIGNhbiBiZSB1c2VkIHVuZGVyIHRoZSBMR1BMIGxpY2Vuc2UgdG9vCi0gKi8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX2p0dXgvanR1eAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotCUNvcHlyaWdodCAyMDAzIGJ5IE1hcmMgSi4gUm9jaGtpbmQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JTWF5IGJlIGNvcGllZCBvbmx5IGZvciBwdXJwb3NlcyBhbmQgdW5kZXIgY29uZGl0aW9ucyBkZXNjcmliZWQKLQlvbiB0aGUgV2ViIHBhZ2Ugd3d3LmJhc2VwYXRoLmNvbS9hdXAvY29weXJpZ2h0Lmh0bS4KLQotCVRoZSBFeGFtcGxlIEZpbGVzIGFyZSBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IGFueSB3YXJyYW50eTsKLQl3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MKLQlmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIFRoZSBhdXRob3IgYW5kIGhpcyBwdWJsaXNoZXIgYXJlIG5vdAotCXJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlcywgZGlyZWN0IG9yIGluY2lkZW50YWwsIHJlc3VsdGluZwotCWZyb20gdGhlIHVzZSBvciBub24tdXNlIG9mIHRoZXNlIEV4YW1wbGUgRmlsZXMuCi0KLQlUaGUgRXhhbXBsZSBGaWxlcyBtYXkgY29udGFpbiBkZWZlY3RzLCBhbmQgc29tZSBjb250YWluIGRlbGliZXJhdGUKLQljb2RpbmcgbWlzdGFrZXMgdGhhdCB3ZXJlIGluY2x1ZGVkIGZvciBlZHVjYXRpb25hbCByZWFzb25zLgotCVlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIGFuZCBob3cgdGhlIEV4YW1wbGUgRmlsZXMKLQlhcmUgdG8gYmUgdXNlZC4KLQotKi8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX2p0dXgvanR1eC13ZWJzaXRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShEb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5iYXNlcGF0aC5jb20vYXVwL2NvcHlyaWdodC5odG0pCi0KLVRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBsaWVzIHRvIGV4YW1wbGUgc291cmNlIGNvZGUgZmlsZXMgcG9zdGVkIG9uIHRoaXMKLVdlYiBzaXRlIHRoYXQgYXJlIGZyb20gdGhlIGJvb2sgQWR2YW5jZWQgVU5JWCBQcm9ncmFtbWluZywgMm5kIEVkaXRpb24sIHRvCi1hc3NvY2lhdGVkIEMrKyAoVXgpIGFuZCBKYXZhIChKdHV4KSBiaW5kaW5ncywgYW5kIHRvIGFueSBvdGhlciBmaWxlcyB3aG9zZQotY29weXJpZ2h0IG5vdGljZSBvciBvdGhlciBkaXJlY3RpdmVzIHJlZmVyZW5jZSB0aGlzIHBhZ2UuIEl0J3MgYmFzZWQgb24gdGhlCi1CU0QgTGljZW5zZS4KLVRoaXMgc29mdHdhcmUgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gT1NJIENlcnRpZmllZCBpcyBhCi1jZXJ0aWZpY2F0aW9uIG1hcmsgb2YgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCi0KLUNvcHlyaWdodCAoYykgMTk4NS0yMDA1IGJ5IE1hcmMgSi4gUm9jaGtpbmQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0JUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQlSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQlUaGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciwgTWFyYyBKLiBSb2Noa2luZCwgbWF5IG5vdCBiZSB1c2VkCi10byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SCi1JTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTwotRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci1MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLU9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLVRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLVdBUk5JTkc6IFNvbWUgb2YgdGhlIEV4YW1wbGUgRmlsZXMgY29udGFpbiBlcnJvcnMgdGhhdCB3ZXJlIHB1dCBpbgotZGVsaWJlcmF0ZWx5IGZvciBlZHVjYXRpb25hbCBwdXJwb3NlcywgYXMgZXhwbGFpbmVkIGluIHRoZSBib29rLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nb29nbGVfcHVsbHJlYWRlci9SRUFETUUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGxpYmF2IGNvZGUgaXMgdXNlZCBpbiBvdXIgbWVkaWEgcGxheWVyIGZpcm13YXJlIGFzIGEgZGVtdWx0aXBsZXhlciBmb3IKLW5vbi1NUEVHIGNvbnRhaW5lciBmb3JtYXRzLiAgRHVlIHRvIHRoZSBpbnRlZ3JhdGlvbiB3aXRoIG91ciBsaWJQdWxsUmVhZGVyCi1saWJyYXJ5LCB0aGUgbGliUHVsbHJlYWRlciBjcmVhdGVkIGJ5IHVzIGlzIGFsc28gdW5kZXIgTEdQTCB2Mi4xLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nb29nbGVfc2FnZXNlcnZlci9BRVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUVTIGlzIHVzZWQgaW4gb3VyIG1lZGlhIHBsYXllciBmaXJtd2FyZSBmb3IgaGFuZGxpbmcgZGVjcnlwdGlvbiByZWxhdGVkIHRvCi1wbGFjZXNoaWZ0ZXIgYXV0aGVudGljYXRpb24gYW5kIGlzIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBsaWNlbnNlOgotCi1Db3B5cmlnaHQgwqkgMjAwMywgRHIgQnJpYW4gR2xhZG1hbiwgV29yY2VzdGVyLCBVSy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotTElDRU5TRSBURVJNUwotCi1UaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKLWZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6Ci0KLTEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKLQotMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi1saXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IKLW90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOwotCi0zLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cyBidWlsdCB1c2luZwotdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIHByb2R1Y3QKLW1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAotaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCi0KLURJU0NMQUlNRVIKLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQKLXdhcnJhbnRpZXMgaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sCi1jb3JyZWN0bmVzcyBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvQXBhY2hlLmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvYW50LmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvYXBhY2hlLmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvamV0dHktNi4xLjE5LmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvamV0dHktYWpwLTYuMS4xOS5qYXIKLWdvb2dsZV9zYWdlc2VydmVyL2pldHR5LXJld3JpdGUtaGFuZGxlci02LjEuMTkuamFyCi1nb29nbGVfc2FnZXNlcnZlci9qZXR0eS1zc2xlbmdpbmUtNi4xLjE5LmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvamV0dHktc3RhcnRlci5qYXIKLWdvb2dsZV9zYWdlc2VydmVyL2pldHR5LXV0aWwtNi4xLjE5LmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvanNwLTIuMS1qZXR0eS02LjEuMTkuamFyCi1nb29nbGVfc2FnZXNlcnZlci9qc3AtMi4xLmphcgotZ29vZ2xlX3NhZ2VzZXJ2ZXIvanNwLWFwaS0yLjEuamFyCi1nb29nbGVfc2FnZXNlcnZlci9sdWNlbmUtY29yZS0zLjYuMC5qYXIKLWdvb2dsZV9zYWdlc2VydmVyL3NlcnZsZXQtYXBpLTIuNS02LjEuMTkuamFyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotICoKLSAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0gKgotICogICAxLiBEZWZpbml0aW9ucy4KLSAqCi0gKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotICoKLSAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotICoKLSAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLSAqCi0gKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0gKgotICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotICoKLSAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLSAqCi0gKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0gKgotICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0gKgotICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0gKgotICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0gKgotICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0gKgotICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLSAqCi0gKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotICoKLSAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotICoKLSAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLSAqCi0gKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotICoKLSAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotICoKLSAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLSAqCi0gKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLSAqCi0gKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotICoKLSAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0gKgotICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0gKgotICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0gKgotICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLSAqCi0gKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9zYWdlc2VydmVyL0Jhc2U2NAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdXRob3I6IFJvYmVydCBIYXJkZXIKLQotSSBhbSBwbGFjaW5nIHRoaXMgY29kZSBpbiB0aGUgUHVibGljIERvbWFpbi4gRG8gd2l0aCBpdCBhcyB5b3Ugd2lsbC4KLVRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBubyBndWFyYW50ZWVzIG9yIHdhcnJhbnRpZXMgYnV0IHdpdGggcGxlbnR5Ci1vZiB3ZWxsLXdpc2hpbmcgaW5zdGVhZCEgIFBsZWFzZSB2aXNpdCBodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0Ci1wZXJpb2RpY2FsbHkgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb3IgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9zYWdlc2VydmVyL0RhbmNpbmdfU2NyaXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMCwgUGFibG8gSW1wYWxsYXJpICh3d3cuaW1wYWxsYXJpLmNvbXxpbXBhbGxhcmlAZ21haWwuY29tKSwKLUNvcHlyaWdodCAoYykgMjAxMCwgSWdpbm8gTWFyaW5pLiAod3d3LmlrZXJuLmNvbXxtYWlsQGlnaW5vbWFyaW5pLmNvbSksCi13aXRoIFJlc2VydmVkIEZvbnQgTmFtZSBEYW5jaW5nIFNjcmlwdC4KLVRoaXMgRm9udCBTb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlLCBWZXJzaW9uIDEuMS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvSGFuZGxlZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTEsIEpvZSBQcmluY2UsIFZpc3NvbCBMdGQuIChodHRwOi8vd3d3LnZpc3NvbC5jby51ay9tYXZlbnByby8pCi13aXRoIFJlc2VydmVkIEZvbnQgTmFtZSAiSGFuZGxlZSIuCi1UaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9zYWdlc2VydmVyL01hcmNlbGx1c19TQwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMTIsIEJyaWFuIEouIEJvbmlzbGF3c2t5IERCQSBBc3RpZ21hdGljIChBT0VUSSkgKGFzdGlnbWFAYXN0aWdtYXRpYy5jb20pLCB3aXRoIFJlc2VydmVkIEZvbnQgTmFtZXMgIk1hcmNlbGx1cyIKLVRoaXMgRm9udCBTb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlLCBWZXJzaW9uIDEuMS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvT0ZMCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TSUwgT1BFTiBGT05UIExJQ0VOU0UgVmVyc2lvbiAxLjEgLSAyNiBGZWJydWFyeSAyMDA3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QUkVBTUJMRQotVGhlIGdvYWxzIG9mIHRoZSBPcGVuIEZvbnQgTGljZW5zZSAoT0ZMKSBhcmUgdG8gc3RpbXVsYXRlIHdvcmxkd2lkZQotZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uCi1lZmZvcnRzIG9mIGFjYWRlbWljIGFuZCBsaW5ndWlzdGljIGNvbW11bml0aWVzLCBhbmQgdG8gcHJvdmlkZSBhIGZyZWUgYW5kCi1vcGVuIGZyYW1ld29yayBpbiB3aGljaCBmb250cyBtYXkgYmUgc2hhcmVkIGFuZCBpbXByb3ZlZCBpbiBwYXJ0bmVyc2hpcAotd2l0aCBvdGhlcnMuCi0KLVRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQKLXJlZGlzdHJpYnV0ZWQgZnJlZWx5IGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHNvbGQgYnkgdGhlbXNlbHZlcy4gVGhlCi1mb250cywgaW5jbHVkaW5nIGFueSBkZXJpdmF0aXZlIHdvcmtzLCBjYW4gYmUgYnVuZGxlZCwgZW1iZWRkZWQsCi1yZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkCi1uYW1lcyBhcmUgbm90IHVzZWQgYnkgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlIGZvbnRzIGFuZCBkZXJpdmF0aXZlcywKLWhvd2V2ZXIsIGNhbm5vdCBiZSByZWxlYXNlZCB1bmRlciBhbnkgb3RoZXIgdHlwZSBvZiBsaWNlbnNlLiBUaGUKLXJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5Ci10byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgZm9udHMgb3IgdGhlaXIgZGVyaXZhdGl2ZXMuCi0KLURFRklOSVRJT05TCi0iRm9udCBTb2Z0d2FyZSIgcmVmZXJzIHRvIHRoZSBzZXQgb2YgZmlsZXMgcmVsZWFzZWQgYnkgdGhlIENvcHlyaWdodAotSG9sZGVyKHMpIHVuZGVyIHRoaXMgbGljZW5zZSBhbmQgY2xlYXJseSBtYXJrZWQgYXMgc3VjaC4gVGhpcyBtYXkKLWluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLgotCi0iUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZQotY29weXJpZ2h0IHN0YXRlbWVudChzKS4KLQotIk9yaWdpbmFsIFZlcnNpb24iIHJlZmVycyB0byB0aGUgY29sbGVjdGlvbiBvZiBGb250IFNvZnR3YXJlIGNvbXBvbmVudHMgYXMKLWRpc3RyaWJ1dGVkIGJ5IHRoZSBDb3B5cmlnaHQgSG9sZGVyKHMpLgotCi0iTW9kaWZpZWQgVmVyc2lvbiIgcmVmZXJzIHRvIGFueSBkZXJpdmF0aXZlIG1hZGUgYnkgYWRkaW5nIHRvLCBkZWxldGluZywKLW9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUKLU9yaWdpbmFsIFZlcnNpb24sIGJ5IGNoYW5naW5nIGZvcm1hdHMgb3IgYnkgcG9ydGluZyB0aGUgRm9udCBTb2Z0d2FyZSB0byBhCi1uZXcgZW52aXJvbm1lbnQuCi0KLSJBdXRob3IiIHJlZmVycyB0byBhbnkgZGVzaWduZXIsIGVuZ2luZWVyLCBwcm9ncmFtbWVyLCB0ZWNobmljYWwKLXdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLgotCi1QRVJNSVNTSU9OICYgQ09ORElUSU9OUwotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi1hIGNvcHkgb2YgdGhlIEZvbnQgU29mdHdhcmUsIHRvIHVzZSwgc3R1ZHksIGNvcHksIG1lcmdlLCBlbWJlZCwgbW9kaWZ5LAotcmVkaXN0cmlidXRlLCBhbmQgc2VsbCBtb2RpZmllZCBhbmQgdW5tb2RpZmllZCBjb3BpZXMgb2YgdGhlIEZvbnQKLVNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsCi1pbiBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucywgbWF5IGJlIHNvbGQgYnkgaXRzZWxmLgotCi0yKSBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucyBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgYmUgYnVuZGxlZCwKLXJlZGlzdHJpYnV0ZWQgYW5kL29yIHNvbGQgd2l0aCBhbnkgc29mdHdhcmUsIHByb3ZpZGVkIHRoYXQgZWFjaCBjb3B5Ci1jb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUKLWluY2x1ZGVkIGVpdGhlciBhcyBzdGFuZC1hbG9uZSB0ZXh0IGZpbGVzLCBodW1hbi1yZWFkYWJsZSBoZWFkZXJzIG9yCi1pbiB0aGUgYXBwcm9wcmlhdGUgbWFjaGluZS1yZWFkYWJsZSBtZXRhZGF0YSBmaWVsZHMgd2l0aGluIHRleHQgb3IKLWJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4KLQotMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250Ci1OYW1lKHMpIHVubGVzcyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZwotQ29weXJpZ2h0IEhvbGRlci4gVGhpcyByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHByaW1hcnkgZm9udCBuYW1lIGFzCi1wcmVzZW50ZWQgdG8gdGhlIHVzZXJzLgotCi00KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250Ci1Tb2Z0d2FyZSBzaGFsbCBub3QgYmUgdXNlZCB0byBwcm9tb3RlLCBlbmRvcnNlIG9yIGFkdmVydGlzZSBhbnkKLU1vZGlmaWVkIFZlcnNpb24sIGV4Y2VwdCB0byBhY2tub3dsZWRnZSB0aGUgY29udHJpYnV0aW9uKHMpIG9mIHRoZQotQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4KLXBlcm1pc3Npb24uCi0KLTUpIFRoZSBGb250IFNvZnR3YXJlLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLCBpbiBwYXJ0IG9yIGluIHdob2xlLAotbXVzdCBiZSBkaXN0cmlidXRlZCBlbnRpcmVseSB1bmRlciB0aGlzIGxpY2Vuc2UsIGFuZCBtdXN0IG5vdCBiZQotZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8KLXJlbWFpbiB1bmRlciB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gYW55IGRvY3VtZW50IGNyZWF0ZWQKLXVzaW5nIHRoZSBGb250IFNvZnR3YXJlLgotCi1URVJNSU5BVElPTgotVGhpcyBsaWNlbnNlIGJlY29tZXMgbnVsbCBhbmQgdm9pZCBpZiBhbnkgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlCi1ub3QgbWV0LgotCi1ESVNDTEFJTUVSCi1USEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQKLU9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUNPUFlSSUdIVCBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi1GUk9NLCBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBGT05UIFNPRlRXQVJFIE9SIEZST00KLU9USEVSIERFQUxJTkdTIElOIFRIRSBGT05UIFNPRlRXQVJFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nb29nbGVfc2FnZXNlcnZlci9QVF9Nb25vCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMSwgUGFyYVR5cGUgTHRkLiAoaHR0cDovL3d3dy5wYXJhdHlwZS5jb20vcHVibGljKSwKLXdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lcyAiUFQgU2FucyIsICJQVCBTZXJpZiIsICJQVCBNb25vIiBhbmQgIlBhcmFUeXBlIi4KLVRoaXMgRm9udCBTb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlLCBWZXJzaW9uIDEuMS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvUFRfU2Fuc19DYXB0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAxMCwgUGFyYVR5cGUgTHRkLiAoaHR0cDovL3d3dy5wYXJhdHlwZS5jb20vcHVibGljKSwKLXdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lcyAiUFQgU2FucyIgYW5kICJQYXJhVHlwZSIuCi1UaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9zYWdlc2VydmVyL1BUX1NlcmlmX0NhcHRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLCBQYXJhVHlwZSBMdGQuIChodHRwOi8vd3d3LnBhcmF0eXBlLmNvbS9wdWJsaWMpLAotd2l0aCBSZXNlcnZlZCBGb250IE5hbWVzICJQVCBTYW5zIiwgIlBUIFNlcmlmIiBhbmQgIlBhcmFUeXBlIi4KLVRoaXMgRm9udCBTb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlLCBWZXJzaW9uIDEuMS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvUlNTKi5qYXZhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotKiBSU1MgUGFyc2VyLgotKgotKiA8YmxvY2txdW90ZT4KLSogPGVtPlRoaXMgbW9kdWxlLCBib3RoIHNvdXJjZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uLCBpcyBpbiB0aGUKLSogUHVibGljIERvbWFpbiwgYW5kIGNvbWVzIHdpdGggPHN0cm9uZz5OTyBXQVJSQU5UWTwvc3Ryb25nPi48L2VtPgotKiA8L2Jsb2NrcXVvdGU+Ci0qCi0qIEBzaW5jZSBSU1NMSUI0SiAwLjEKLSogQGF1dGhvciBGcmFuY2VzY28gYWthICdTdGVhbHRocCcgc3RlYWx0aHBbQF1zdGVhbHRocC5vcmcKLSogQHZlcnNpb24gMC4yCi0qLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nb29nbGVfc2FnZXNlcnZlci9jb3JlLTMuMS4xLmphci9hYm91dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BYm91dCBUaGlzIENvbnRlbnQKLQotRmVicnVhcnkgMjQsIDIwMDUKLQotTGljZW5zZQotCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZQotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5Ci1vZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gRm9yCi1wdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LgotCi1JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZQotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4KLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubwotc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQKLWJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4KLXRoZSBDb250ZW50LgotCi1EaXNhc3NlbWJsZXIKLQotVGhpcyBwbHVnLWluIGNvbnRhaW5zIGEgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyICgiRGlzYXNzZW1ibGVyIikgdGhhdCBjYW4gcHJvZHVjZQotYSBsaXN0aW5nIG9mIHRoZSBKYXZhIGFzc2VtYmxlciBtbmVtb25pY3MgKCJBc3NlbWJsZXIgTW5lbW9uaWNzIikgZm9yIGEgSmF2YQotbWV0aG9kLiBJZiB5b3UgdXNlIHRoZSBEaXNhc3NlbWJsZXIgdG8gdmlldyB0aGUgQXNzZW1ibGVyIE1uZW1vbmljcyBmb3IgYQotbWV0aG9kLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IGRvaW5nIHNvIHdpbGwgbm90IHZpb2xhdGUgdGhlIHRlcm1zIG9mIGFueQotbGljZW5zZXMgdGhhdCBhcHBseSB0byB5b3VyIHVzZSBvZiB0aGF0IG1ldGhvZCwgYXMgc3VjaCBsaWNlbnNlcyBtYXkgbm90IHBlcm1pdAoteW91IHRvIHJldmVyc2UgZW5naW5lZXIsIGRlY29tcGlsZSwgb3IgZGlzYXNzZW1ibGUgbWV0aG9kIGJ5dGVjb2Rlcy4KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1nb29nbGVfc2FnZXNlcnZlci9jb3JlLTMuMS4xLmphci9lcGwtdjEwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMAotCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMKLUxJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTQotQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KLQotMS4gREVGSU5JVElPTlMKLQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6Ci0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCi0KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKLQotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCi0KLWlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07Ci0KLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvCi10aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlCi1ub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUKLW5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuCi1jb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgotCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKLUFncmVlbWVudC4KLQotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwKLWluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgotCi0yLiBHUkFOVCBPRiBSSUdIVFMKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLAotZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kCi1zdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotCi1iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlcgotTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlCi10cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kCi1vYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKLUNvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlCi1Db250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlCi1jb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQotb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuCi0KLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0bwotaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55Ci1Db250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eQotdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZgotaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlCi1yaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCi1yZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuCi1Gb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdAotbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgotCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50Ci1jb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlCi1zZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCi0KLTMuIFJFUVVJUkVNRU5UUwotCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyCi1pdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgotCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLQotaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yCi1kYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbAotZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkKLXRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsCi1hbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZQotUHJvZ3JhbS4KLQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZgotYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUKLW9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aAotcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzCi1pbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobwotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyCi13aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmCi1hIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoCi1Db250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5Ci1ldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzCi1hbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsCi1hY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUKLWV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKLXBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdAotQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyCi1Db250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0Ci1yZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IKLUlNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2gKLVJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcKLWFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2UKLW9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZAotY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mCi1kYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkKLUNPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVAotUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLVNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkKLVdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKLUdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gR0VORVJBTAotCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlCi1sYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlCi10ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCi1wcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2gKLXByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLWNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCi0oZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQotaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQKLXVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bwotY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzCi1ub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mCi1zdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLAotUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzCi1yZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZQotYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluCi1vcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlCi1tb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0bwotcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLgotTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LgotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbgotbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKLXNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQotZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cwotYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcwotcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLAotQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykKLXVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKQotYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZgotYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCi1lc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyCi10aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzCi1BZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIKLWFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsCi1pbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvamNlLWpkazEzLTE0Ni5qYXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAxMiBUaGUgTGVnaW9uIE9mIFRoZSBCb3VuY3kgQ2FzdGxlCi0oaHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnKQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KLWRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCi1yaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLXNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi1GUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCi1JTiBUSEUgU09GVFdBUkUuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWdvb2dsZV9zYWdlc2VydmVyL3NydHAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQ2lzY28gU3lzdGVtcywgSW5jLgotCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi0tIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLS0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0tIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIENpc2NvIFN5c3RlbXMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCi1MSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi1JTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvdHJlbW9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwMiwgWGlwaC5vcmcgRm91bmRhdGlvbgotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0tIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBYaXBoLm9yZyBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJ0FTIElTJwotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi1TRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi1PVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZ29vZ2xlX3NhZ2VzZXJ2ZXIvdmVjbWF0aC5qYXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotW0FsbCBzb3VyY2UgZmlsZXMgZnJvbSB0aGlzIGxpYnJhcnkgdXNlZCBpbiBTYWdlVFYgYXJlIHN1YmplY3QgdG8gdGhlCi0gIkNsYXNzcGF0aCIgZXhjZXB0aW9uLCBkZXNjcmliZWQgYmVsb3cuXQotCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQotCi1WZXJzaW9uIDIsIEp1bmUgMTk5MQotCi1Db3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCi1kb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1QcmVhbWJsZQotCi1UaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUKLWFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1ndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZQotc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvCi1tb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UKLWF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzCi1jb3ZlcmVkIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLVdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuICBPdXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0bwotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwKLXRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZQotdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdQotY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gZGVueQoteW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zCi10cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzIG9yIGZvcgotYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gIFlvdSBtdXN0Ci1tYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QKLXNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi1XZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQotb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlCi1hbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdAotZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgSWYgdGhlCi1zb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0bwota25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQKLWJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KLQotRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4gIFdlCi13aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCi1pbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbSBwcm9wcmlldGFyeS4KLVRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvcgotZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi1UaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24KLWZvbGxvdy4KLQotVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLTAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UKLXBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtCi1vciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueQotZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUKLVByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vcgotdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkCi13aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcwotInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90IGNvdmVyZWQgYnkKLXRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mIHJ1bm5pbmcgdGhlIFByb2dyYW0gaXMKLW5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMKLWNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5Ci1ydW5uaW5nIHRoZSBQcm9ncmFtKS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0xLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMKLXlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAotYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlCi1hbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUKLVByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heQotYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLTIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMKLWZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMKLW9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZgotdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCi0gICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUgb3IKLSAgICBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZQotICAgIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZgotICAgIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiBydW4sCi0gICAgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoIGludGVyYWN0aXZlIHVzZSBpbiB0aGUKLSAgICBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuCi0gICAgYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IKLSAgICBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlCi0gICAgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5Ci0gICAgb2YgdGhpcyBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dCBkb2VzCi0gICAgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMKLSAgICBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZiBpZGVudGlmaWFibGUKLXNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwgYW5kIGNhbiBiZSByZWFzb25hYmx5Ci1jb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbiB0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kCi1pdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZSBzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUKLXdvcmtzLiAgQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEKLXdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zCi1vZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUKLXdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgeW91cgotcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUKLXJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24KLXRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtIHdpdGggdGhlCi1Qcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yCi1kaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSBzY29wZSBvZiB0aGlzCi1MaWNlbnNlLgotCi0zLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwgdW5kZXIKLVNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZAotMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UKLSAgICBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlCi0gICAgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMsIHRvCi0gICAgZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0IG9mIHBoeXNpY2FsbHkKLSAgICBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxCi0gICAgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIgdG8KLSAgICBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkKLSAgICBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluCi0gICAgb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGgKLSAgICBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIG1ha2luZwotbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbAotdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UKLWRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KLW9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlCi1kaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlcgotc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pCi1vZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlCi1jb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoCi10aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGV4Y2VwdCBhcwotZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksCi1zdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUKLXlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvcgotcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvCi1sb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi01LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3Qgc2lnbmVkIGl0LgotSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZSBwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90Ci1hY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvcgotYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0bwotZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwKLXRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3IgdG8KLWNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1Zb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUKLXJpZ2h0cyBncmFudGVkIGhlcmVpbi4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieQotdGhpcmQgcGFydGllcyB0byB0aGlzIExpY2Vuc2UuCi0KLTcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMKLWFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdAotY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IGV4Y3VzZSB5b3UgZnJvbSB0aGUKLWNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkKLXNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50Ci1vYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLgotRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24KLW9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoCi15b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQotcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5IGFuZAotdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55IHBhdGVudHMgb3IKLW90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueSBzdWNoIGNsYWltczsgdGhpcwotc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUKLWRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzIGltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkKLXBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8KLWRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdAotY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUgYQotY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi04LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluCi1jb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsCi1jb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gZXhwbGljaXQKLWdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0Ci1kaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4KLXN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5Ci1vZiB0aGlzIExpY2Vuc2UuCi0KLTkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbgotc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcwotb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55IGxhdGVyCi12ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZgotdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heQotY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLTEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUgcHJvZ3JhbXMKLXdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvcgotcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4KLU91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mCi1hbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2YKLXNvZnR3YXJlIGdlbmVyYWxseS4KLQotTk8gV0FSUkFOVFkKLQotMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUgotVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFCi1TVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUKLVBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCi1JTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKLVBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwKLVlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0xMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HIFdJTEwKLUFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SIFJFRElTVFJJQlVURSBUSEUKLVBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZCi1HRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SCi1JTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBCi1CRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUgotT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi1FTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLUlmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QgcG9zc2libGUKLXVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQgZnJlZSBzb2Z0d2FyZQotd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi1UbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdCB0byBhdHRhY2gKLXRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbgotb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEKLXBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgT25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuCi0KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gICAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICAgIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAgICBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0Ci1zdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvciBHbm9tb3Zpc2lvbiBjb21lcwotICAgIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSAnc2hvdyB3Jy4gIFRoaXMgaXMgZnJlZQotICAgIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7Ci0gICAgdHlwZSAnc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyAnc2hvdyB3JyBhbmQgJ3Nob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5IGJlCi1jYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gJ3Nob3cgdycgYW5kICdzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyIHNjaG9vbCwKLWlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuICBIZXJlCi1pcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICAgICdHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQotCi0gICAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgotCi0KLSJDTEFTU1BBVEgiIEVYQ0VQVElPTiBUTyBUSEUgR1BMCi0KLUNlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIGFyZSBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIGJ1dCBvbmx5IHdoZXJlCi1TdW4gaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlciB0aGUgd29yZHMKLSJTdW4gZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24KLWFzIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKLQotICAgIExpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZwotICAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgotCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQotICAgIHBlcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KLSAgICBleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZXNlIGluZGVwZW5kZW50IG1vZHVsZXMsCi0gICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKLSAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50IG1vZHVsZSwKLSAgICB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuICBBbiBpbmRlcGVuZGVudAotICAgIG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmCi0gICAgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZgotICAgIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi0gICAgc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhkcGFybS9MSUNFTlNFLlRYVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1CU0QtU3R5bGUgT3BlbiBTb3VyY2UgTGljZW5zZToKLQotWW91IG1heSBmcmVlbHkgdXNlLCBtb2RpZnksIGFuZCByZWRpc3RyaWJ1dGUgdGhlIGhkcGFybSBwcm9ncmFtLAotYXMgZWl0aGVyIGJpbmFyeSBvciBzb3VyY2UsIG9yIGJvdGguCi0KLVRoZSBvbmx5IGNvbmRpdGlvbiBpcyB0aGF0IG15IG5hbWUgYW5kIGNvcHlyaWdodCBub3RpY2UKLXJlbWFpbiBpbiB0aGUgc291cmNlIGNvZGUgYXMtaXMuCi0KLU1hcmsgTG9yZCAobWxvcmRAcG9ib3guY29tKQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1odW1heF9taXNjL0NPUFlSSUdIVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBIdW1heCBDby4sIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBIdW1heCBDby4sIEx0ZC4gKCJIdW1heCIpIGhlcmVieSBwcm92aWRlcyBwZXJtaXNzaW9uLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55Ci0gKiBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvdXJjZSBjb2RlLCB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb3VyY2UgY29kZSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqIHBlcm1pc3Npb24gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEhVTUFYICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywKLSAqIENVUlJFTkNZLCBBVkFJTEFCSUxJVFksIFRJVExFIE9SIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIEhVTUFYIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9uIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gYXJlCi0gKiB0aG9zZSBvZiB0aGUgYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwKLSAqIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIG9mIEh1bWF4LgotICoKLSAqIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lIHRoaXMKLSAqIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgSHVtYXjigJlzIHNvZnR3YXJlIHByb3ZpZGVkIHVuZGVyIGEgbGljZW5zZQotICogb3RoZXIgdGhhbiB0aGUgYWJvdmUgbGljZW5zZSwgd2l0aG91dCBIdW1heCdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbiBjb25zZW50LgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWh3ZGF0YS9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoaXMgZGF0YSBpcyBsaWNlbmNlZCB1bmRlciAyIGRpZmZlcmVudCBsaWNlbnNlcwotCi0xKSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIGxhdGVyCi0yKSBYRnJlZTg2IDEuMCBsaWNlbnNlCi0KLVRoaXMgZGF0YSBjYW4gYmUgdXNlZCBmcmVlbHkgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlnbXBwcm94eS9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlnbXBwcm94eSAtIElHTVAgcHJveHkgYmFzZWQgbXVsdGljYXN0IHJvdXRlcgotQ29weXJpZ2h0IChDKSAyMDA1IEpvaG5ueSBFZ2VsYW5kIDxqb2hubnlAcmxvLm9yZz4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotVGhpcyBzb2Z0d2FyZSBpcyBkZXJpdmVkIHdvcmsgZnJvbSB0aGUgZm9sbG93aW5nIHNvZnR3YXJlLiBUaGUgb3JpZ2luYWwKLXNvdXJjZSBjb2RlIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaXQncyBvcmlnaW5hbCBzdGF0ZSBieSB0aGUgYXV0aG9yCi1vZiBpZ21wcHJveHkuCi0KLXNtY3JvdXRlIDAuOTIgLSBDb3B5cmlnaHQgKEMpIDIwMDEgQ2Fyc3RlbiBTY2hpbGwgPGNhcnN0ZW5AY3NjaGlsbC5kZT4KLS0gTGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIKLQotbXJvdXRlZCAzLjktYmV0YTMgLSBDT1BZUklHSFQgMTk4OSBieSBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YKLUxlbGFuZCBTdGFuZm9yZCBKdW5pb3IgVW5pdmVyc2l0eS4KLS0gT3JpZ2luYWwgbGljZW5zZSBjYW4gYmUgZm91bmQgaW4gdGhlIFN0YW5mb3JkLnR4dCBmaWxlLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pZ21wcHJveHkvU3RhbmZvcmQudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG1yb3V0ZWQgcHJvZ3JhbSBpcyBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gIFVzZSBvZiB0aGUKLW1yb3V0ZWQgcHJvZ3JhbSByZXByZXNlbnRzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0KLTEuIFNUQU5GT1JEIGdyYW50cyB0byBMSUNFTlNFRSBhIG5vbmV4Y2x1c2l2ZSBhbmQgbm9udHJhbnNmZXJhYmxlIGxpY2Vuc2UKLXRvIHVzZSwgY29weSBhbmQgbW9kaWZ5IHRoZSBjb21wdXRlciBzb2Z0d2FyZSBgYG1yb3V0ZWQnJyAoaGVyZWluYWZ0ZXIKLWNhbGxlZCB0aGUgYGBQcm9ncmFtJycpLCB1cG9uIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBoZXJlaW5hZnRlciBzZXQKLW91dCBhbmQgdW50aWwgTGljZW5zZWUgZGlzY29udGludWVzIHVzZSBvZiB0aGUgTGljZW5zZWQgUHJvZ3JhbS4KLQotMi4gTElDRU5TRUUgYWNrbm93bGVkZ2VzIHRoYXQgdGhlIFByb2dyYW0gaXMgYSByZXNlYXJjaCB0b29sIHN0aWxsIGluCi10aGUgZGV2ZWxvcG1lbnQgc3RhdGUsIHRoYXQgaXQgaXMgYmVpbmcgc3VwcGxpZWQgYGBhcyBpcywnJyB3aXRob3V0IGFueQotYWNjb21wYW55aW5nIHNlcnZpY2VzIGZyb20gU1RBTkZPUkQsIGFuZCB0aGF0IHRoaXMgbGljZW5zZSBpcyBlbnRlcmVkCi1pbnRvIGluIG9yZGVyIHRvIGVuY291cmFnZSBzY2llbnRpZmljIGNvbGxhYm9yYXRpb24gYWltZWQgYXQgZnVydGhlcgotZGV2ZWxvcG1lbnQgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi0zLiBMSUNFTlNFRSBtYXkgY29weSB0aGUgUHJvZ3JhbSBhbmQgbWF5IHN1YmxpY2Vuc2Ugb3RoZXJzIHRvIHVzZSBvYmplY3QKLWNvZGUgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHZlcnNpb24gb2YgdGhlIFByb2dyYW0uCi1BbGwgY29waWVzIG11c3QgY29udGFpbiBhbGwgY29weXJpZ2h0IGFuZCBvdGhlciBwcm9wcmlldGFyeSBub3RpY2VzIGZvdW5kCi1pbiB0aGUgUHJvZ3JhbSBhcyBwcm92aWRlZCBieSBTVEFORk9SRC4gIFRpdGxlIHRvIGNvcHlyaWdodCB0byB0aGUKLVByb2dyYW0gcmVtYWlucyB3aXRoIFNUQU5GT1JELgotCi00LiBMSUNFTlNFRSBtYXkgY3JlYXRlIGRlcml2YXRpdmUgdmVyc2lvbnMgb2YgdGhlIFByb2dyYW0uICBMSUNFTlNFRQotaGVyZWJ5IGdyYW50cyBTVEFORk9SRCBhIHJveWFsdHktZnJlZSBsaWNlbnNlIHRvIHVzZSwgY29weSwgbW9kaWZ5LAotZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSBhbnkgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLiAgQXQgdGhlIHRpbWUKLUxJQ0VOU0VFIHByb3ZpZGVzIGEgY29weSBvZiBhIGRlcml2YXRpdmUgdmVyc2lvbiBvZiB0aGUgUHJvZ3JhbSB0byBhCi10aGlyZCBwYXJ0eSwgTElDRU5TRUUgc2hhbGwgcHJvdmlkZSBTVEFORk9SRCB3aXRoIG9uZSBjb3B5IG9mIHRoZSBzb3VyY2UKLWNvZGUgb2YgdGhlIGRlcml2YXRpdmUgdmVyc2lvbiBhdCBubyBjaGFyZ2UgdG8gU1RBTkZPUkQuCi0KLTUuIFNUQU5GT1JEIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQuCi1CeSB3YXkgb2YgZXhhbXBsZSwgYnV0IG5vdCBsaW1pdGF0aW9uLCBTVEFORk9SRCBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTgotT1IgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotVEhBVCBUSEUgVVNFIE9GIFRIRSBMSUNFTlNFRCBQUk9HUkFNIFdJTEwgTk9UIElORlJJTkdFIEFOWSBQQVRFTlRTLAotQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuIFNUQU5GT1JEIHNoYWxsIG5vdCBiZSBoZWxkIGxpYWJsZQotZm9yIGFueSBsaWFiaWxpdHkgbm9yIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKLXdpdGggcmVzcGVjdCB0byBhbnkgY2xhaW0gYnkgTElDRU5TRUUgb3IgYW55IHRoaXJkIHBhcnR5IG9uIGFjY291bnQgb2Ygb3IKLWFyaXNpbmcgZnJvbSB0aGlzIEFncmVlbWVudCBvciB1c2Ugb2YgdGhlIFByb2dyYW0uCi0KLTYuIFRoaXMgYWdyZWVtZW50IHNoYWxsIGJlIGNvbnN0cnVlZCwgaW50ZXJwcmV0ZWQgYW5kIGFwcGxpZWQgaW4KLWFjY29yZGFuY2Ugd2l0aCB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSBhbmQgYW55IGxlZ2FsIGFjdGlvbiBhcmlzaW5nCi1vdXQgb2YgdGhpcyBBZ3JlZW1lbnQgb3IgdXNlIG9mIHRoZSBQcm9ncmFtIHNoYWxsIGJlIGZpbGVkIGluIGEgY291cnQKLWluIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLgotCi03LiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBjb25mZXJyaW5nIHJpZ2h0cyB0bwotdXNlIGluIGFkdmVydGlzaW5nLCBwdWJsaWNpdHkgb3Igb3RoZXJ3aXNlIGFueSB0cmFkZW1hcmsgb3IgdGhlIG5hbWUKLW9mIGBgU3RhbmZvcmQnJy4KLQotVGhlIG1yb3V0ZWQgcHJvZ3JhbSBpcyBDT1BZUklHSFQgMTk4OSBieSBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YKLUxlbGFuZCBTdGFuZm9yZCBKdW5pb3IgVW5pdmVyc2l0eS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaXBlcmYvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDE5OTktMjAwNywgVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzCi1BbGwgUmlnaHRzIFJlc2VydmVkLgotCi1JcGVyZiBwZXJmb3JtYW5jZSB0ZXN0Ci1NYXJrIEdhdGVzCi1BamF5IFRpcnVtYWxhCi1KaW0gRmVyZ3Vzb24KLUpvbiBEdWdhbgotRmVuZyBRaW4KLUtldmluIEdpYmJzCi1Kb2huIEVzdGFicm9vawotTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoCi1OYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucwotVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduCi1odHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCi1yaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLXNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0KLVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgotCi1SZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLWxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IKLW90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLU5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQKLSJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QKLUxJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi1MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCi1DT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLVNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pcHV0aWxzL2FycGluZy5jCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBhcnBpbmcuYwotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KLSAqLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pcHV0aWxzL3BpbmcuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLSAqIE1pa2UgTXV1c3MuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pcHV0aWxzL3Bpbmc2LmMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqCi0gKglNb2RpZmllZCBmb3IgQUZfSU5FVDYgYnkgUGVkcm8gUm9xdWUKLSAqCi0gKgk8cm9xdWVAZGkuZmMudWwucHQ+Ci0gKgotICoJT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpbmNsdWRlZCBiZWxsb3cKLSAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLSAqIE1pa2UgTXV1c3MuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pcHV0aWxzL3JhcnBkLmMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIHJhcnBkLmMJUkFSUCBkYWVtb24uCi0gKgotICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlwdXRpbHMvcmRpc2MuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogUmRpc2MgKHRoaXMgcHJvZ3JhbSkgd2FzIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcwotICogcHJvdmlkZWQgZm9yIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbgotICogYWxsIHRhcGUgbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LgotICogVXNlcnMgbWF5IGNvcHkgb3IgbW9kaWZ5IFJkaXNjIHdpdGhvdXQgY2hhcmdlLCBhbmQgdGhleSBtYXkgZnJlZWx5Ci0gKiBkaXN0cmlidXRlIGl0LgotICoKLSAqIFJESVNDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCi0gKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KLSAqCi0gKiBSZGlzYyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCi0gKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCi0gKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCi0gKgotICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCi0gKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBSRElTQwotICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KLSAqCi0gKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCi0gKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKLSAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKgotICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogMjU1MCBHYXJjaWEgQXZlbnVlCi0gKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MwotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlwdXRpbHMvdGZ0cGQuYwotaXB1dGlscy90ZnRwc3Vicy5jCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlwdXRpbHMvdHJhY2VwYXRoLmMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIHRyYWNlcGF0aC5jCi0gKgotICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlwdXRpbHMvdHJhY2VwYXRoNi5jCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiB0cmFjZXBhdGg2LmMKLSAqCi0gKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+Ci0gKi8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaXB1dGlscy90cmFjZXJvdXRlNi5jCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiAgICAgIE1vZGlmaWVkIGZvciBOUkwgNC40QlNEIElQdjYgcmVsZWFzZS4KLSAqICAgICAgMDcvMzEvOTYgYmdwCi0gKgotICogICAgICBTZWFyY2ggZm9yICIjaWZkZWYgTlJMIiB0byBmaW5kIHRoZSBjaGFuZ2VzLgotICovCi0KLS8qCi0gKglNb2RpZmllZCBmb3IgTGludXggSVB2NiBieSBQZWRybyBSb3F1ZSA8cm9xdWVAZGkuZmMudWwucHQ+Ci0gKgkzMS8wNy8xOTk2Ci0gKgotICoJQXMgSUNNUCBlcnJvciBtZXNzYWdlcyBmb3IgSVB2NiBub3cgaW5jbHVkZSBtb3JlIHRoYW4gOCBieXRlcwotICoJVURQIGRhdGFncmFtcyBhcmUgbm93IHNlbnQgdmlhIGFuIFVEUCBzb2NrZXQgaW5zdGVhZCBvZiBtYWdpYwotICoJUkFXIHNvY2tldCB0cmlja3MuCi0gKgotICoJT3JpZ2luYWwgY29weXJpZ2h0IGFuZCBjb21tZW50cyBsZWZ0IGludGFjdC4gVGhleSBtaWdodCBub3QKLSAqCW1hdGNoIHRoZSBjb2RlIGFueW1vcmUuCi0gKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLSAqIFZhbiBKYWNvYnNvbi4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpwZWcvUkVBRE1FCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJFQURNRSBmb3IgcmVsZWFzZSA4ZCBvZiAxNS1KYW4tMjAxMgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHRoZSBlaWdodGggcHVibGljIHJlbGVhc2Ugb2YgdGhlIEluZGVwZW5kZW50IEpQRUcKLUdyb3VwJ3MgZnJlZSBKUEVHIHNvZnR3YXJlLiAgWW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotdG8gdXNlIGl0IGZvciBhbnkgcHVycG9zZSwgc3ViamVjdCB0byB0aGUgY29uZGl0aW9ucyB1bmRlciBMRUdBTCBJU1NVRVMsIGJlbG93LgotCi1UaGlzIHNvZnR3YXJlIGlzIHRoZSB3b3JrIG9mIFRvbSBMYW5lLCBHdWlkbyBWb2xsYmVkaW5nLCBQaGlsaXAgR2xhZHN0b25lLAotQmlsbCBBbGxvbWJlcnQsIEppbSBCb3VjaGVyLCBMZWUgQ3JvY2tlciwgQm9iIEZyaWVzZW5oYWhuLCBCZW4gSmFja3NvbiwKLUp1bGlhbiBNaW5ndWlsbG9uLCBMdWlzIE9ydGl6LCBHZW9yZ2UgUGhpbGxpcHMsIERhdmlkZSBSb3NzaSwgR2UnIFdlaWplcnMsCi1hbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cC4KLQotSUpHIGlzIG5vdCBhZmZpbGlhdGVkIHdpdGggdGhlIElTTy9JRUMgSlRDMS9TQzI5L1dHMSBzdGFuZGFyZHMgY29tbWl0dGVlCi0oYWxzbyBrbm93biBhcyBKUEVHLCB0b2dldGhlciB3aXRoIElUVS1UIFNHMTYpLgotCi0KLURPQ1VNRU5UQVRJT04gUk9BRE1BUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgotCi1PVkVSVklFVyAgICAgICAgICAgIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgSlBFRyBhbmQgdGhlIElKRyBzb2Z0d2FyZS4KLUxFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCi1SRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KLUFSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgotQUNLTk9XTEVER01FTlRTICAgICBTcGVjaWFsIHRoYW5rcy4KLUZJTEUgRk9STUFUIFdBUlMgICAgU29mdHdhcmUgKm5vdCogdG8gZ2V0LgotVE8gRE8gICAgICAgICAgICAgICBQbGFucyBmb3IgZnV0dXJlIElKRyByZWxlYXNlcy4KLQotT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZToKLQotVXNlciBkb2N1bWVudGF0aW9uOgotICBpbnN0YWxsLnR4dCAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuCi0gIHVzYWdlLnR4dCAgICAgICAgIFVzYWdlIGluc3RydWN0aW9ucyBmb3IgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwKLSAgICAgICAgICAgICAgICAgICAgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KLSAgKi4xICAgICAgICAgICAgICAgVW5peC1zdHlsZSBtYW4gcGFnZXMgZm9yIHByb2dyYW1zIChzYW1lIGluZm8gYXMgdXNhZ2UudHh0KS4KLSAgd2l6YXJkLnR4dCAgICAgICAgQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBKUEVHIHdpemFyZHMgb25seS4KLSAgY2hhbmdlLmxvZyAgICAgICAgVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgotUHJvZ3JhbW1lciBhbmQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbjoKLSAgbGlianBlZy50eHQgICAgICAgSG93IHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zLgotICBleGFtcGxlLmMgICAgICAgICBTYW1wbGUgY29kZSBmb3IgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgotICBzdHJ1Y3R1cmUudHh0ICAgICBPdmVydmlldyBvZiB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgc3RydWN0dXJlLgotICBmaWxlbGlzdC50eHQgICAgICBSb2FkIG1hcCBvZiBJSkcgZmlsZXMuCi0gIGNvZGVydWxlcy50eHQgICAgIENvZGluZyBzdHlsZSBydWxlcyAtLS0gcGxlYXNlIHJlYWQgaWYgeW91IGNvbnRyaWJ1dGUgY29kZS4KLQotUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwudHh0IGFuZCB1c2FnZS50eHQuICBTb21lIGluZm9ybWF0aW9uCi1jYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlLiAgU2VlCi1BUkNISVZFIExPQ0FUSU9OUyBiZWxvdyB0byBmaW5kIG91dCB3aGVyZSB0byBvYnRhaW4gdGhlIEZBUSBhcnRpY2xlLgotCi1JZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgSlBFRyBjb2RlIHdvcmtzLCB3ZSBzdWdnZXN0IHJlYWRpbmcgb25lIG9yCi1tb3JlIG9mIHRoZSBSRUZFUkVOQ0VTLCB0aGVuIGxvb2tpbmcgYXQgdGhlIGRvY3VtZW50YXRpb24gZmlsZXMgKGluIHJvdWdobHkKLXRoZSBvcmRlciBsaXN0ZWQpIGJlZm9yZSBkaXZpbmcgaW50byB0aGUgY29kZS4KLQotCi1PVkVSVklFVwotPT09PT09PT0KLQotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIEMgc29mdHdhcmUgdG8gaW1wbGVtZW50IEpQRUcgaW1hZ2UgZW5jb2RpbmcsIGRlY29kaW5nLAotYW5kIHRyYW5zY29kaW5nLiAgSlBFRyAocHJvbm91bmNlZCAiamF5LXBlZyIpIGlzIGEgc3RhbmRhcmRpemVkIGNvbXByZXNzaW9uCi1tZXRob2QgZm9yIGZ1bGwtY29sb3IgYW5kIGdyYXktc2NhbGUgaW1hZ2VzLgotCi1UaGlzIHNvZnR3YXJlIGltcGxlbWVudHMgSlBFRyBiYXNlbGluZSwgZXh0ZW5kZWQtc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlCi1jb21wcmVzc2lvbiBwcm9jZXNzZXMuICBQcm92aXNpb24gaXMgbWFkZSBmb3Igc3VwcG9ydGluZyBhbGwgdmFyaWFudHMgb2YgdGhlc2UKLXByb2Nlc3NlcywgYWx0aG91Z2ggc29tZSB1bmNvbW1vbiBwYXJhbWV0ZXIgc2V0dGluZ3MgYXJlbid0IGltcGxlbWVudGVkIHlldC4KLVdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcgdGhlIGhpZXJhcmNoaWNhbCBvciBsb3NzbGVzcwotcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgotCi1XZSBwcm92aWRlIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgSlBFRyBpbWFnZSBmaWxlcywKLXBsdXMgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgImNqcGVnIiBhbmQgImRqcGVnIiwgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvCi1wZXJmb3JtIGNvbnZlcnNpb24gYmV0d2VlbiBKUEVHIGFuZCBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZmlsZSBmb3JtYXRzLgotVGhlIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KLQotSW4gb3JkZXIgdG8gc3VwcG9ydCBmaWxlIGNvbnZlcnNpb24gYW5kIHZpZXdpbmcgc29mdHdhcmUsIHdlIGhhdmUgaW5jbHVkZWQKLWNvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGJleW9uZCB0aGUgYmFyZSBKUEVHIGNvZGluZy9kZWNvZGluZyBjYXBhYmlsaXR5OwotZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRwotZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKLWNvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCi1saWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLgotCi1XZSBoYXZlIGFsc28gaW5jbHVkZWQgImpwZWd0cmFuIiwgYSB1dGlsaXR5IGZvciBsb3NzbGVzcyB0cmFuc2NvZGluZyBiZXR3ZWVuCi1kaWZmZXJlbnQgSlBFRyBwcm9jZXNzZXMsIGFuZCAicmRqcGdjb20iIGFuZCAid3JqcGdjb20iLCB0d28gc2ltcGxlCi1hcHBsaWNhdGlvbnMgZm9yIGluc2VydGluZyBhbmQgZXh0cmFjdGluZyB0ZXh0dWFsIGNvbW1lbnRzIGluIEpGSUYgZmlsZXMuCi0KLVRoZSBlbXBoYXNpcyBpbiBkZXNpZ25pbmcgdGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBvbiBhY2hpZXZpbmcgcG9ydGFiaWxpdHkgYW5kCi1mbGV4aWJpbGl0eSwgd2hpbGUgYWxzbyBtYWtpbmcgaXQgZmFzdCBlbm91Z2ggdG8gYmUgdXNlZnVsLiAgSW4gcGFydGljdWxhciwKLXRoZSBzb2Z0d2FyZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVhZCBhcyBhIHR1dG9yaWFsIG9uIEpQRUcuICAoU2VlIHRoZQotUkVGRVJFTkNFUyBzZWN0aW9uIGZvciBpbnRyb2R1Y3RvcnkgbWF0ZXJpYWwuKSAgUmF0aGVyLCBpdCBpcyBpbnRlbmRlZCB0bwotYmUgcmVsaWFibGUsIHBvcnRhYmxlLCBpbmR1c3RyaWFsLXN0cmVuZ3RoIGNvZGUuICBXZSBkbyBub3QgY2xhaW0gdG8gaGF2ZQotYWNoaWV2ZWQgdGhhdCBnb2FsIGluIGV2ZXJ5IGFzcGVjdCBvZiB0aGUgc29mdHdhcmUsIGJ1dCB3ZSBzdHJpdmUgZm9yIGl0LgotCi1XZSB3ZWxjb21lIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyBhIGNvbXBvbmVudCBvZiBjb21tZXJjaWFsIHByb2R1Y3RzLgotTm8gcm95YWx0eSBpcyByZXF1aXJlZCwgYnV0IHdlIGRvIGFzayBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGluIHByb2R1Y3QKLWRvY3VtZW50YXRpb24sIGFzIGRlc2NyaWJlZCB1bmRlciBMRUdBTCBJU1NVRVMuCi0KLQotTEVHQUwgSVNTVUVTCi09PT09PT09PT09PT0KLQotSW4gcGxhaW4gRW5nbGlzaDoKLQotMS4gV2UgZG9uJ3QgcHJvbWlzZSB0aGF0IHRoaXMgc29mdHdhcmUgd29ya3MuICAoQnV0IGlmIHlvdSBmaW5kIGFueSBidWdzLAotICAgcGxlYXNlIGxldCB1cyBrbm93ISkKLTIuIFlvdSBjYW4gdXNlIHRoaXMgc29mdHdhcmUgZm9yIHdoYXRldmVyIHlvdSB3YW50LiAgWW91IGRvbid0IGhhdmUgdG8gcGF5IHVzLgotMy4gWW91IG1heSBub3QgcHJldGVuZCB0aGF0IHlvdSB3cm90ZSB0aGlzIHNvZnR3YXJlLiAgSWYgeW91IHVzZSBpdCBpbiBhCi0gICBwcm9ncmFtLCB5b3UgbXVzdCBhY2tub3dsZWRnZSBzb21ld2hlcmUgaW4geW91ciBkb2N1bWVudGF0aW9uIHRoYXQKLSAgIHlvdSd2ZSB1c2VkIHRoZSBJSkcgY29kZS4KLQotSW4gbGVnYWxlc2U6Ci0KLVRoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCi13aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKLWl0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KLQotVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMjAxMiwgVGhvbWFzIEcuIExhbmUsIEd1aWRvIFZvbGxiZWRpbmcuCi1BbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLXNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlCi1jb25kaXRpb25zOgotKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGlzCi1SRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eSBub3RpY2UKLXVuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMKLW11c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCi0oMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZwotZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZgotdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgotKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCi1mdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKLU5PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KLQotVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKLW5vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KLWFja25vd2xlZGdlIHVzLgotCi1QZXJtaXNzaW9uIGlzIE5PVCBncmFudGVkIGZvciB0aGUgdXNlIG9mIGFueSBJSkcgYXV0aG9yJ3MgbmFtZSBvciBjb21wYW55IG5hbWUKLWluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotaXQuICBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWZlcnJlZCB0byBvbmx5IGFzICJ0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCi1zb2Z0d2FyZSIuCi0KLVdlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzIG9mCi1jb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQotYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCi0KLQotYW5zaTJrbnIuYyBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBieSBwZXJtaXNzaW9uIG9mIEwuIFBldGVyIERldXRzY2gsCi1zb2xlIHByb3ByaWV0b3Igb2YgaXRzIGNvcHlyaWdodCBob2xkZXIsIEFsYWRkaW4gRW50ZXJwcmlzZXMgb2YgTWVubG8gUGFyaywgQ0EuCi1hbnNpMmtuci5jIGlzIE5PVCBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjb3B5cmlnaHQgYW5kIGNvbmRpdGlvbnMsIGJ1dCBpbnN0ZWFkCi1ieSB0aGUgdXN1YWwgZGlzdHJpYnV0aW9uIHRlcm1zIG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHByaW5jaXBhbGx5LAotdGhhdCB5b3UgbXVzdCBpbmNsdWRlIHNvdXJjZSBjb2RlIGlmIHlvdSByZWRpc3RyaWJ1dGUgaXQuICAoU2VlIHRoZSBmaWxlCi1hbnNpMmtuci5jIGZvciBmdWxsIGRldGFpbHMuKSAgSG93ZXZlciwgc2luY2UgYW5zaTJrbnIuYyBpcyBub3QgbmVlZGVkIGFzIHBhcnQKLW9mIGFueSBwcm9ncmFtIGdlbmVyYXRlZCBmcm9tIHRoZSBJSkcgY29kZSwgdGhpcyBkb2VzIG5vdCBsaW1pdCB5b3UgbW9yZSB0aGFuCi10aGUgZm9yZWdvaW5nIHBhcmFncmFwaHMgZG8uCi0KLVRoZSBVbml4IGNvbmZpZ3VyYXRpb24gc2NyaXB0ICJjb25maWd1cmUiIHdhcyBwcm9kdWNlZCB3aXRoIEdOVSBBdXRvY29uZi4KLUl0IGlzIGNvcHlyaWdodCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGJ1dCBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KLVRoZSBzYW1lIGhvbGRzIGZvciBpdHMgc3VwcG9ydGluZyBzY3JpcHRzIChjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsCi1sdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0IGJ5IFggQ29uc29ydGl1bQotYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCi0KLVRoZSBJSkcgZGlzdHJpYnV0aW9uIGZvcm1lcmx5IGluY2x1ZGVkIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgR0lGIGZpbGVzLgotVG8gYXZvaWQgZW50YW5nbGVtZW50IHdpdGggdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBHSUYgcmVhZGluZyBzdXBwb3J0IGhhcwotYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIsIGFuZCB0aGUgR0lGIHdyaXRlciBoYXMgYmVlbiBzaW1wbGlmaWVkIHRvIHByb2R1Y2UKLSJ1bmNvbXByZXNzZWQgR0lGcyIuICBUaGlzIHRlY2huaXF1ZSBkb2VzIG5vdCB1c2UgdGhlIExaVyBhbGdvcml0aG07IHRoZQotcmVzdWx0aW5nIEdJRiBmaWxlcyBhcmUgbGFyZ2VyIHRoYW4gdXN1YWwsIGJ1dCBhcmUgcmVhZGFibGUgYnkgYWxsIHN0YW5kYXJkCi1HSUYgZGVjb2RlcnMuCi0KLVdlIGFyZSByZXF1aXJlZCB0byBzdGF0ZSB0aGF0Ci0gICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgotICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiAgR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgotICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIKLQotCi1SRUZFUkVOQ0VTCi09PT09PT09PT09Ci0KLVdlIHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bwotdW5kZXJzdGFuZCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBzb2Z0d2FyZS4KLQotVGhlIGJlc3Qgc2hvcnQgdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMKLQlXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCi0JQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCBuby4gNCksIHBwLiAzMC00NC4KLShBZGphY2VudCBhcnRpY2xlcyBpbiB0aGF0IGlzc3VlIGRpc2N1c3MgTVBFRyBtb3Rpb24gcGljdHVyZSBjb21wcmVzc2lvbiwKLWFwcGxpY2F0aW9ucyBvZiBKUEVHLCBhbmQgcmVsYXRlZCB0b3BpY3MuKSAgSWYgeW91IGRvbid0IGhhdmUgdGhlIENBQ00gaXNzdWUKLWhhbmR5LCBhIFBvc3RTY3JpcHQgZmlsZSBjb250YWluaW5nIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIFdhbGxhY2UncyBhcnRpY2xlIGlzCi1hdmFpbGFibGUgYXQgaHR0cDovL3d3dy5pamcub3JnL2ZpbGVzL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKLWEgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKLW9taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCi1hbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKLWFuZCBpdCBtYXkgbm90IGJlIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuCi0KLUEgc29tZXdoYXQgbGVzcyB0ZWNobmljYWwsIG1vcmUgbGVpc3VyZWx5IGludHJvZHVjdGlvbiB0byBKUEVHIGNhbiBiZSBmb3VuZCBpbgotIlRoZSBEYXRhIENvbXByZXNzaW9uIEJvb2siIGJ5IE1hcmsgTmVsc29uIGFuZCBKZWFuLWxvdXAgR2FpbGx5LCBwdWJsaXNoZWQgYnkKLU0mVCBCb29rcyAoTmV3IFlvcmspLCAybmQgZWQuIDE5OTYsIElTQk4gMS01NTg1MS00MzQtMS4gIFRoaXMgYm9vayBwcm92aWRlcwotZ29vZCBleHBsYW5hdGlvbnMgYW5kIGV4YW1wbGUgQyBjb2RlIGZvciBhIG11bHRpdHVkZSBvZiBjb21wcmVzc2lvbiBtZXRob2RzCi1pbmNsdWRpbmcgSlBFRy4gIEl0IGlzIGFuIGV4Y2VsbGVudCBzb3VyY2UgaWYgeW91IGFyZSBjb21mb3J0YWJsZSByZWFkaW5nIEMKLWNvZGUgYnV0IGRvbid0IGtub3cgbXVjaCBhYm91dCBkYXRhIGNvbXByZXNzaW9uIGluIGdlbmVyYWwuICBUaGUgYm9vaydzIEpQRUcKLXNhbXBsZSBjb2RlIGlzIGZhciBmcm9tIGluZHVzdHJpYWwtc3RyZW5ndGgsIGJ1dCB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbG9vawotYXQgYSBmdWxsIGltcGxlbWVudGF0aW9uLCB5b3UndmUgZ290IG9uZSBoZXJlLi4uCi0KLVRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUgZGVzY3JpcHRpb24gb2YgSlBFRyBpcyB0aGUgdGV4dGJvb2sgIkpQRUcgU3RpbGwKLUltYWdlIERhdGEgQ29tcHJlc3Npb24gU3RhbmRhcmQiIGJ5IFdpbGxpYW0gQi4gUGVubmViYWtlciBhbmQgSm9hbiBMLgotTWl0Y2hlbGwsIHB1Ymxpc2hlZCBieSBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4KLVByaWNlIFVTJDU5Ljk1LCA2MzggcHAuICBUaGUgYm9vayBpbmNsdWRlcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgSVNPIEpQRUcKLXN0YW5kYXJkcyAoRElTIDEwOTE4LTEgYW5kIGRyYWZ0IERJUyAxMDkxOC0yKS4KLUFsdGhvdWdoIHRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGRldGFpbGVkIGFuZCBjb21wcmVoZW5zaXZlIGV4cG9zaXRpb24gb2YKLUpQRUcgcHVibGljbHkgYXZhaWxhYmxlLCB3ZSBwb2ludCBvdXQgdGhhdCBpdCBpcyBzdGlsbCBtaXNzaW5nIGFuIGV4cGxhbmF0aW9uCi1vZiB0aGUgbW9zdCBlc3NlbnRpYWwgcHJvcGVydGllcyBhbmQgYWxnb3JpdGhtcyBvZiB0aGUgdW5kZXJseWluZyBEQ1QKLXRlY2hub2xvZ3kuCi1JZiB5b3UgdGhpbmsgdGhhdCB5b3Uga25vdyBhYm91dCBEQ1QtYmFzZWQgSlBFRyBhZnRlciByZWFkaW5nIHRoaXMgYm9vaywKLXRoZW4geW91IGFyZSBpbiBkZWx1c2lvbi4gIFRoZSByZWFsIGZ1bmRhbWVudGFscyBhbmQgY29ycmVzcG9uZGluZyBwb3RlbnRpYWwKLW9mIERDVC1iYXNlZCBKUEVHIGFyZSBub3QgcHVibGljbHkga25vd24gc28gZmFyLCBhbmQgdGhhdCBpcyB0aGUgcmVhc29uIGZvcgotYWxsIHRoZSBtaXN0YWtlbiBkZXZlbG9wbWVudHMgdGFraW5nIHBsYWNlIGluIHRoZSBpbWFnZSBjb2RpbmcgZG9tYWluLgotCi1UaGUgb3JpZ2luYWwgSlBFRyBzdGFuZGFyZCBpcyBkaXZpZGVkIGludG8gdHdvIHBhcnRzLCBQYXJ0IDEgYmVpbmcgdGhlIGFjdHVhbAotc3BlY2lmaWNhdGlvbiwgd2hpbGUgUGFydCAyIGNvdmVycyBjb21wbGlhbmNlIHRlc3RpbmcgbWV0aG9kcy4gIFBhcnQgMSBpcwotdGl0bGVkICJEaWdpdGFsIENvbXByZXNzaW9uIGFuZCBDb2Rpbmcgb2YgQ29udGludW91cy10b25lIFN0aWxsIEltYWdlcywKLVBhcnQgMTogUmVxdWlyZW1lbnRzIGFuZCBndWlkZWxpbmVzIiBhbmQgaGFzIGRvY3VtZW50IG51bWJlcnMgSVNPL0lFQyBJUwotMTA5MTgtMSwgSVRVLVQgVC44MS4gIFBhcnQgMiBpcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZgotQ29udGludW91cy10b25lIFN0aWxsIEltYWdlcywgUGFydCAyOiBDb21wbGlhbmNlIHRlc3RpbmciIGFuZCBoYXMgZG9jdW1lbnQKLW51bWJlcnMgSVNPL0lFQyBJUyAxMDkxOC0yLCBJVFUtVCBULjgzLgotSUpHIEpQRUcgOCBpbnRyb2R1Y2VzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKUEVHIFNtYXJ0U2NhbGUgZXh0ZW5zaW9uCi13aGljaCBpcyBzcGVjaWZpZWQgaW4gdHdvIGRvY3VtZW50czogIEEgY29udHJpYnV0ZWQgZG9jdW1lbnQgYXQgSVRVIGFuZCBJU08KLXdpdGggdGl0bGUgIklUVS1UIEpQRUctUGx1cyBQcm9wb3NhbCBmb3IgRXh0ZW5kaW5nIElUVS1UIFQuODEgZm9yIEFkdmFuY2VkCi1JbWFnZSBDb2RpbmciLCBBcHJpbCAyMDA2LCBHZW5ldmEsIFN3aXR6ZXJsYW5kLiAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMKLWRvY3VtZW50IGlzIFJldmlzaW9uIDMuICBBbmQgYSBjb250cmlidXRlZCBkb2N1bWVudCBJU08vSUVDIEpUQzEvU0MyOS9XRzEgTgotNTc5OSB3aXRoIHRpdGxlICJFdm9sdXRpb24gb2YgSlBFRyIsIEp1bmUvSnVseSAyMDExLCBCZXJsaW4sIEdlcm1hbnkuCi0KLVRoZSBKUEVHIHN0YW5kYXJkIGRvZXMgbm90IHNwZWNpZnkgYWxsIGRldGFpbHMgb2YgYW4gaW50ZXJjaGFuZ2VhYmxlIGZpbGUKLWZvcm1hdC4gIEZvciB0aGUgb21pdHRlZCBkZXRhaWxzIHdlIGZvbGxvdyB0aGUgIkpGSUYiIGNvbnZlbnRpb25zLCByZXZpc2lvbgotMS4wMi4gIEpGSUYgMS4wMiBoYXMgYmVlbiBhZG9wdGVkIGFzIGFuIEVjbWEgSW50ZXJuYXRpb25hbCBUZWNobmljYWwgUmVwb3J0Ci1hbmQgdGh1cyByZWNlaXZlZCBhIGZvcm1hbCBwdWJsaWNhdGlvbiBzdGF0dXMuICBJdCBpcyBhdmFpbGFibGUgYXMgYSBmcmVlCi1kb3dubG9hZCBpbiBQREYgZm9ybWF0IGZyb20KLWh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvdGVjaHJlcG9ydHMvRS1UUi0wOTguaHRtLgotQSBQb3N0U2NyaXB0IHZlcnNpb24gb2YgdGhlIEpGSUYgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmlqZy5vcmcvZmlsZXMvamZpZi5wcy5nei4gIFRoZXJlIGlzIGFsc28gYSBwbGFpbiB0ZXh0IHZlcnNpb24gYXQKLWh0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qZmlmLnR4dC5neiwgYnV0IGl0IGlzIG1pc3NpbmcgdGhlIGZpZ3VyZXMuCi0KLVRoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQotZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCi1mb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCi1JSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KLUluc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgotKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20KLWh0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy8uICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBuZXh0IHJldmlzaW9uCi1vZiB0aGUgVElGRiBzcGVjIHdpbGwgcmVwbGFjZSB0aGUgNi4wIEpQRUcgZGVzaWduIHdpdGggdGhlIE5vdGUncyBkZXNpZ24uCi1BbHRob3VnaCBJSkcncyBvd24gY29kZSBkb2VzIG5vdCBzdXBwb3J0IFRJRkYvSlBFRywgdGhlIGZyZWUgbGlidGlmZiBsaWJyYXJ5Ci11c2VzIG91ciBsaWJyYXJ5IHRvIGltcGxlbWVudCBUSUZGL0pQRUcgcGVyIHRoZSBOb3RlLgotCi0KLUFSQ0hJVkUgTE9DQVRJT05TCi09PT09PT09PT09PT09PT09PQotCi1UaGUgIm9mZmljaWFsIiBhcmNoaXZlIHNpdGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgd3d3LmlqZy5vcmcuCi1UaGUgbW9zdCByZWNlbnQgcmVsZWFzZWQgdmVyc2lvbiBjYW4gYWx3YXlzIGJlIGZvdW5kIHRoZXJlIGluCi1kaXJlY3RvcnkgImZpbGVzIi4gIFRoaXMgcGFydGljdWxhciB2ZXJzaW9uIHdpbGwgYmUgYXJjaGl2ZWQgYXMKLWh0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qcGVnc3JjLnY4ZC50YXIuZ3osIGFuZCBpbiBXaW5kb3dzLWNvbXBhdGlibGUKLSJ6aXAiIGFyY2hpdmUgZm9ybWF0IGFzIGh0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qcGVnc3I4ZC56aXAuCi0KLVRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUgaXMgYSBzb3VyY2Ugb2Ygc29tZQotZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBKUEVHLgotSXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBXb3JsZCBXaWRlIFdlYiBhdCBodHRwOi8vd3d3LmZhcXMub3JnL2ZhcXMvanBlZy1mYXEvCi1hbmQgb3RoZXIgbmV3cy5hbnN3ZXJzIGFyY2hpdmUgc2l0ZXMsIGluY2x1ZGluZyB0aGUgb2ZmaWNpYWwgbmV3cy5hbnN3ZXJzCi1hcmNoaXZlIGF0IHJ0Zm0ubWl0LmVkdTogZnRwOi8vcnRmbS5taXQuZWR1L3B1Yi91c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxLy4KLUlmIHlvdSBkb24ndCBoYXZlIFdlYiBvciBGVFAgYWNjZXNzLCBzZW5kIGUtbWFpbCB0byBtYWlsLXNlcnZlckBydGZtLm1pdC5lZHUKLXdpdGggYm9keQotCXNlbmQgdXNlbmV0L25ld3MuYW5zd2Vycy9qcGVnLWZhcS9wYXJ0MQotCXNlbmQgdXNlbmV0L25ld3MuYW5zd2Vycy9qcGVnLWZhcS9wYXJ0MgotCi0KLUFDS05PV0xFREdNRU5UUwotPT09PT09PT09PT09PT09Ci0KLVRoYW5rIHRvIEp1ZXJnZW4gQnJ1ZGVyIGZvciBwcm92aWRpbmcgbWUgd2l0aCBhIGNvcHkgb2YgdGhlIGNvbW1vbiBEQ1QKLWFsZ29yaXRobSBhcnRpY2xlLCBvbmx5IHRvIGZpbmQgb3V0IHRoYXQgSSBoYWQgY29tZSB0byB0aGUgc2FtZSByZXN1bHQKLWluIGEgbW9yZSBkaXJlY3QgYW5kIGNvbXByZWhlbnNpYmxlIHdheSB3aXRoIGEgbW9yZSBnZW5lcmF0aXZlIGFwcHJvYWNoLgotCi1UaGFuayB0byBJc3R2YW4gU2ViZXN0eWVuIGFuZCBKb2FuIEwuIE1pdGNoZWxsIGZvciBpbnZpdGluZyBtZSB0byB0aGUKLUlUVSBKUEVHIChTdHVkeSBHcm91cCAxNikgbWVldGluZyBpbiBHZW5ldmEsIFN3aXR6ZXJsYW5kLgotCi1UaGFuayB0byBUaG9tYXMgV2llZ2FuZCBhbmQgR2FyeSBTdWxsaXZhbiBmb3IgaW52aXRpbmcgbWUgdG8gdGhlCi1Kb2ludCBWaWRlbyBUZWFtIChNUEVHICYgSVRVKSBtZWV0aW5nIGluIEdlbmV2YSwgU3dpdHplcmxhbmQuCi0KLVRoYW5rIHRvIFRob21hcyBSaWNodGVyIGFuZCBEYW5pZWwgTGVlIGZvciBpbnZpdGluZyBtZSB0byB0aGUKLUlTTy9JRUMgSlRDMS9TQzI5L1dHMSAoYWxzbyBrbm93biBhcyBKUEVHLCB0b2dldGhlciB3aXRoIElUVS1UIFNHMTYpCi1tZWV0aW5nIGluIEJlcmxpbiwgR2VybWFueS4KLQotVGhhbmsgdG8gSm9obiBLb3JlandhIGFuZCBNYXNzaW1vIEJhbGxlcmluaSBmb3IgaW52aXRpbmcgbWUgdG8KLWZydWl0ZnVsIGNvbnN1bHRhdGlvbnMgaW4gQm9zdG9uLCBNQSBhbmQgTWlsYW4sIEl0YWx5LgotCi1UaGFuayB0byBIZW5kcmlrIEVsc3RuZXIsIFJvbGFuZCBGYXNzYXVlciwgU2ltb25lIFp1Y2ssIEd1ZW50aGVyCi1NYWllci1HZXJiZXIsIFdhbHRlciBTdG9lYmVyLCBGcmVkIFNjaG1pdHosIGFuZCBOb3JiZXJ0IEJyYXVuYWdlbAotZm9yIGNvcnJlc3BvbmRpbmcgYnVzaW5lc3MgZGV2ZWxvcG1lbnQuCi0KLVRoYW5rIHRvIE5pY28gWnNjaGFjaCBhbmQgRGlyayBTdGVsbGluZyBvZiB0aGUgdGVjaG5pY2FsIHN1cHBvcnQgdGVhbQotYXQgdGhlIERpZ2l0YWwgSW1hZ2VzIGNvbXBhbnkgaW4gSGFsbGUgZm9yIHByb3ZpZGluZyBtZSB3aXRoIGV4dHJhCi1lcXVpcG1lbnQgZm9yIGNvbmZpZ3VyYXRpb24gdGVzdHMuCi0KLVRoYW5rIHRvIFJpY2hhcmQgRi4gTHlvbiAodGhlbiBvZiBGb3Zlb24gSW5jLikgZm9yIGZydWl0ZnVsCi1jb21tdW5pY2F0aW9uIGFib3V0IEpQRUcgY29uZmlndXJhdGlvbiBpbiBTaWdtYSBQaG90byBQcm8gc29mdHdhcmUuCi0KLVRoYW5rIHRvIEFuZHJldyBGaW5rZW5zdGFkdCBmb3IgaG9zdGluZyB0aGUgaWpnLm9yZyBzaXRlLgotCi1MYXN0IGJ1dCBub3QgbGVhc3Qgc3BlY2lhbCB0aGFuayB0byBUaG9tYXMgRy4gTGFuZSBmb3IgdGhlIG9yaWdpbmFsCi1kZXNpZ24gYW5kIGRldmVsb3BtZW50IG9mIHRoaXMgc2luZ3VsYXIgc29mdHdhcmUgcGFja2FnZS4KLQotCi1GSUxFIEZPUk1BVCBXQVJTCi09PT09PT09PT09PT09PT09Ci0KLVRoZSBJU08vSUVDIEpUQzEvU0MyOS9XRzEgc3RhbmRhcmRzIGNvbW1pdHRlZSAoYWxzbyBrbm93biBhcyBKUEVHLCB0b2dldGhlcgotd2l0aCBJVFUtVCBTRzE2KSBjdXJyZW50bHkgcHJvbW90ZXMgZGlmZmVyZW50IGZvcm1hdHMgY29udGFpbmluZyB0aGUgbmFtZQotIkpQRUciIHdoaWNoIGlzIG1pc2xlYWRpbmcgYmVjYXVzZSB0aGVzZSBmb3JtYXRzIGFyZSBpbmNvbXBhdGlibGUgd2l0aAotb3JpZ2luYWwgRENULWJhc2VkIEpQRUcgYW5kIGFyZSBiYXNlZCBvbiBmYXVsdHkgdGVjaG5vbG9naWVzLgotSUpHIHRoZXJlZm9yZSBkb2VzIG5vdCBhbmQgd2lsbCBub3Qgc3VwcG9ydCBzdWNoIG1vbWVudGFyeSBtaXN0YWtlcwotKHNlZSBSRUZFUkVOQ0VTKS4KLVRoZXJlIGV4aXN0IGFsc28gZGlzdHJpYnV0aW9ucyB1bmRlciB0aGUgbmFtZSAiT3BlbkpQRUciIHByb21vdGluZyBzdWNoCi1raW5kIG9mIGZvcm1hdHMgd2hpY2ggaXMgbWlzbGVhZGluZyBiZWNhdXNlIHRoZXkgZG9uJ3Qgc3VwcG9ydCBvcmlnaW5hbAotSlBFRyBpbWFnZXMuCi1XZSBoYXZlIG5vIHN5bXBhdGh5IGZvciB0aGUgcHJvbW90aW9uIG9mIGluZmVyaW9yIGZvcm1hdHMuICBJbmRlZWQsIG9uZSBvZgotdGhlIG9yaWdpbmFsIHJlYXNvbnMgZm9yIGRldmVsb3BpbmcgdGhpcyBmcmVlIHNvZnR3YXJlIHdhcyB0byBoZWxwIGZvcmNlCi1jb252ZXJnZW5jZSBvbiBjb21tb24sIGludGVyb3BlcmFibGUgZm9ybWF0IHN0YW5kYXJkcyBmb3IgSlBFRyBmaWxlcy4KLURvbid0IHVzZSBhbiBpbmNvbXBhdGlibGUgZmlsZSBmb3JtYXQhCi0oSW4gYW55IGNhc2UsIG91ciBkZWNvZGVyIHdpbGwgcmVtYWluIGNhcGFibGUgb2YgcmVhZGluZyBleGlzdGluZyBKUEVHCi1pbWFnZSBmaWxlcyBpbmRlZmluaXRlbHkuKQotCi1GdXJ0aGVybW9yZSwgdGhlIElTTyBjb21taXR0ZWUgcHJldGVuZHMgdG8gYmUgInJlc3BvbnNpYmxlIGZvciB0aGUgcG9wdWxhcgotSlBFRyIgaW4gdGhlaXIgcHVibGljIHJlcG9ydHMgd2hpY2ggaXMgbm90IHRydWUgYmVjYXVzZSB0aGV5IGRvbid0IHJlc3BvbmQgdG8KLWFjdHVhbCByZXF1aXJlbWVudHMgZm9yIHRoZSBtYWludGVuYW5jZSBvZiB0aGUgb3JpZ2luYWwgSlBFRyBzcGVjaWZpY2F0aW9uLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IGRpc3RyaWJ1dGlvbnMgaW4gY2lyY3VsYXRpb24gY29udGFpbmluZyB0aGUgbmFtZQotImxpYmpwZWciIHdoaWNoIGNsYWltIHRvIGJlIGEgImRlcml2YXRpdmUiIG9yICJmb3JrIiBvZiB0aGUgb3JpZ2luYWwKLWxpYmpwZWcsIGJ1dCBkb24ndCBoYXZlIHRoZSBmZWF0dXJlcyBhbmQgYXJlIGluY29tcGF0aWJsZSB3aXRoIGZvcm1hdHMKLXN1cHBvcnRlZCBieSBhY3R1YWwgSUpHIGxpYmpwZWcgZGlzdHJpYnV0aW9ucy4gIEZ1cnRoZXJtb3JlLCB0aGV5Ci12aW9sYXRlIHRoZSBsaWNlbnNlIGNvbmRpdGlvbnMgYXMgZGVzY3JpYmVkIHVuZGVyIExFR0FMIElTU1VFUyBhYm92ZS4KLVdlIGhhdmUgbm8gc3ltcGF0aHkgZm9yIHRoZSByZWxlYXNlIG9mIG1pc2xlYWRpbmcgYW5kIGlsbGVnYWwKLWRpc3RyaWJ1dGlvbnMgZGVyaXZlZCBmcm9tIG9ic29sZXRlIGNvZGUgYmFzZXMuCi1Eb24ndCB1c2UgYW4gb2Jzb2xldGUgY29kZSBiYXNlIQotCi0KLVRPIERPCi09PT09PQotCi1WZXJzaW9uIDggaXMgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgYSBuZXcgZ2VuZXJhdGlvbiBKUEVHIHN0YW5kYXJkCi10byBvdmVyY29tZSB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIEpQRUcgc3BlY2lmaWNhdGlvbi4KLU1vcmUgZmVhdHVyZXMgYXJlIGJlaW5nIHByZXBhcmVkIGZvciBjb21pbmcgcmVsZWFzZXMuLi4KLQotUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIG9mZmVycyBvZiBoZWxwLCBldGMuIHRvIGpwZWctaW5mb0BqcGVnY2x1Yi5vcmcuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpzb24tYy9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBNZXRhcGFyYWRpZ20gUHRlIEx0ZAotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLXRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLXRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi1Tb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbGliYWlvL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCi0gYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKLSB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKLWNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKLXRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCi1zdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucwotYmVsb3cuCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAotbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoteW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQotZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAotaXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCi1pdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KLXRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1kaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCi1yaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKLXlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQotbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Ci10aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKLWF1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQotaW50cm9kdWNlZCBieSBvdGhlcnMuCi1eTAotICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgotYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAotZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCi1yZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAotYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQotY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKLWlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCi10aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCi1saWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KLQotICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZwotYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCi1jb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCi1lbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKLXRoZSBsaWJyYXJ5LgotCi0gIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKLWRvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKLW9mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKLWFyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQotbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgotc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgotCi0gIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCi1lbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQKLWJlY29tZXMKLWEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKLWFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKLWxpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcwotY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCi1zb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQotcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCi1mcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCi1ub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKLW9wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCi1zeXN0ZW0uCi0KLSAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKLXVzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCi1saW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KLXRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKLWJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgotXkwKLSAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCi1wcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgotb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgotRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKLWNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLV5MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLV5MCi0gIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCi1saW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQotd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLXVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQotZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCi0KLSAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCi1MaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKLXRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKLWR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1jb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCi1kaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCi1vZiB0aGVzZSB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwotICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgotICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCi0gICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKLSAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKLSAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQotICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCi0gICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKLSAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKLSAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgotICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQotCi0gICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCi0gICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKLSAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKLSAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKLSAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCi0gICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCi0gICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCi0KLSAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKLW5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgotY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgotd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwotdGhlIGV4ZWN1dGFibGUuCi0KLSAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKLXJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKLWFjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKLXVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKLWRpc3RyaWJ1dGUuCi1eTAotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCi10aGlzIExpY2Vuc2UuCi1eTAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHksIGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UKLWNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1eTAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0gICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLV5MCi0gICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4KLUl0IGlzIHNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0Ci1lZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQKLWhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbAotbm90aWNlIGlzIGZvdW5kLgotCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0Ci1kb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyAgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlcgotbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yCi15b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzCi1SYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbGliY2FyZXMvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgMTk5OCBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neS4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKLXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKLW5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdAotdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KLU0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQotcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYmN1cmwvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFCi0KLUNvcHlyaWdodCAoYykgMTk5NiAtIDIwMTEsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPi4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UKLXdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4KLU5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi1PVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRQotT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBhIGNvcHlyaWdodCBob2xkZXIgc2hhbGwgbm90Ci1iZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKLWluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYmZmaS9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYmZmaSAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDA5ICBBbnRob255IEdyZWVuLCBSZWQgSGF0LCBJbmMgYW5kIG90aGVycy4KLVNlZSBzb3VyY2UgZmlsZXMgZm9yIGRldGFpbHMuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi1gYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi1pbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLUNMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi1UT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYmdsaWIyL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgCQkgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAotcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCi1hZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgICBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EuCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saWJsb2NrZmlsZS9DT1BZUklHSFQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JTGlibG9ja2ZpbGUgaXMgQ29weXJpZ2h0IChDKSBNaXF1ZWwgdmFuIFNtb29yZW5idXJnIDE5OTksMjAwMSwyMDAzCi0KLSAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBPbiBEZWJpYW4gR05VL0xpbnV4IHN5c3RlbXMsIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKLSAgIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSBmb3VuZCBpbiBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvTEdQTC0yJy4gWW91IGNhbgotICAgYWxzbyBmaW5kIGEgY29weSBvbiB0aGUgR05VIHdlYnNpdGUgYXQgaHR0cDovL3d3dy5nbnUub3JnLwotCi0JRG90bG9ja2ZpbGUgaXMgQ29weXJpZ2h0IChDKSBNaXF1ZWwgdmFuIFNtb29yZW5idXJnIDE5OTksMjAwMSwyMDAzCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIE9uIERlYmlhbiBHTlUvTGludXggc3lzdGVtcywgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIEdOVSBMaWJyYXJ5Ci0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSBmb3VuZCBpbiBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvTEdQTC0yJy4KLSAgIFlvdSBjYW4gYWxzbyBmaW5kIGEgY29weSBvbiB0aGUgR05VIHdlYnNpdGUgYXQgaHR0cDovL3d3dy5nbnUub3JnLwotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYm1uZy9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwotLyogKiBDT1BZUklHSFQgTk9USUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA3IEdlcmFyZCBKdXluIChnZXJhcmRAbGlibW5nLmNvbSkgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIFtZb3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgYWZ0ZXIgdGhpcyBzZW50ZW5jZSBpZiB5b3UgbW9kaWZ5ICAgKiAqLwotLyogKiAgdGhpcyBzb3VyY2VdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIgKiAqLwotLyogKiBpcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqICAgIEdlcmFyZCBKdXluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwotLyogKiAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIFRoZSBNTkcgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzICAgICAgICAgKiAqLwotLyogKiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCAgICAgICogKi8KLS8qICogbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZiBmaXRuZXNzIGZvciBhbnkgICAqICovCi0vKiAqIHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCAgICAgKiAqLwotLyogKiBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsICAgICogKi8KLS8qICogd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIE1ORyBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgICAqICovCi0vKiAqIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwotLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyAqICovCi0vKiAqIHNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgKiAqLwotLyogKiB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgICAgICAgICAgKiAqLwotLyogKiAgICB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIDIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZCBtdXN0IG5vdCBiZSAgICAgKiAqLwotLyogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgKiAqLwotLyogKiAgICBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0IGZlZSwgYW5kICAgICAgICAgKiAqLwotLyogKiBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvIHN1cHBvcnRpbmcgICAgICogKi8KLS8qICogdGhlIE1ORyBhbmQgSk5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMgICAqICovCi0vKiAqIHNvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgd291bGQgYmUgaGlnaGx5IGFwcHJlY2lhdGVkLiAgKiAqLwotLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwotLyogKiBQYXJ0cyBvZiB0aGlzIHNvZnR3YXJlIGhhdmUgYmVlbiBhZGFwdGVkIGZyb20gdGhlIGxpYnBuZyBwYWNrYWdlLiAgICAgICogKi8KLS8qICogQWx0aG91Z2ggdGhpcyBsaWJyYXJ5IHN1cHBvcnRzIGFsbCBmZWF0dXJlcyBmcm9tIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAqICovCi0vKiAqIChhcyBNTkcgZGVzY2VuZHMgZnJvbSBpdCkgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgbGlicG5nIHBhY2thZ2UuICAgICAgKiAqLwotLyogKiBJdCBkb2VzIHJlcXVpcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgb3B0aW9uYWxseSB0aGUgSUpHIGpwZWcgbGlicmFyeSwgICogKi8KLS8qICogYW5kL29yIHRoZSAibGl0dGxlLWNtcyIgbGlicmFyeSBieSBNYXJ0aSBNYXJpYSAoZGVwZW5kaW5nIG9uIHRoZSAgICAgICAqICovCi0vKiAqIGluY2x1c2lvbiBvZiBzdXBwb3J0IGZvciBKTkcgYW5kIEZ1bGwtQ29sb3ItTWFuYWdlbWVudCByZXNwZWN0aXZlbHkuICAgKiAqLwotLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogVGhpcyBsaWJyYXJ5J3MgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHRvIHJlYWQgYW5kIGRpc3BsYXkgTU5HICAgICAgICAgICAqICovCi0vKiAqIGFuaW1hdGlvbnMuIEl0IGlzIG5vdCBtZWFudCBhcyBhIGZ1bGwtZmVhdHVyZWQgaW1hZ2UtZWRpdGluZyAgICAgICAgICAgKiAqLwotLyogKiBjb21wb25lbnQhIEl0IGRvZXMgaG93ZXZlciBvZmZlciBjcmVhdGlvbiBhbmQgZWRpdGluZyBmdW5jdGlvbmFsaXR5ICAgICogKi8KLS8qICogYXQgdGhlIGNodW5rIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqIChmdXR1cmUgbW9kaWZpY2F0aW9ucyBtYXkgaW5jbHVkZSBzb21lIG1vcmUgc3VwcG9ydCBmb3IgY3JlYXRpb24gICAgICAgKiAqLwotLyogKiAgYW5kIG9yIGVkaXRpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLS8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saWJwY2FwL0xJQ0VOU0UKLXRjcGR1bXAvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MaWNlbnNlOiBCU0QKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLSAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgICBkaXN0cmlidXRpb24uCi0gIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbGlicG5nL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGNvcHkgb2YgdGhlIGxpYnBuZyBub3RpY2VzIGlzIHByb3ZpZGVkIGZvciB5b3VyIGNvbnZlbmllbmNlLiAgSW4gY2FzZSBvZgotYW55IGRpc2NyZXBhbmN5IGJldHdlZW4gdGhpcyBjb3B5IGFuZCB0aGUgbm90aWNlcyBpbiB0aGUgZmlsZSBwbmcuaCB0aGF0IGlzCi1pbmNsdWRlZCBpbiB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbiwgdGhlIGxhdHRlciBzaGFsbCBwcmV2YWlsLgotCi1DT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKLQotSWYgeW91IG1vZGlmeSBsaWJwbmcgeW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotdGhpcyBzZW50ZW5jZS4KLQotVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLQotbGlicG5nIHZlcnNpb25zIDEuMi42LCBBdWd1c3QgMTUsIDIwMDQsIHRocm91Z2ggMS40LjEyLCBKdWx5IDEwLCAyMDEyLCBhcmUKLUNvcHlyaWdodCAoYykgMjAwNCwgMjAwNi0yMDEwIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQotZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMi41Ci13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbCBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycwotCi0gICBDb3NtaW4gVHJ1dGEKLQotbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUgLSBPY3RvYmVyIDMsIDIwMDIsIGFyZQotQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCi1kaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycwotCi0gICBTaW1vbi1QaWVycmUgQ2FkaWV1eAotICAgRXJpYyBTLiBSYXltb25kCi0gICBHaWxsZXMgVm9sbGFudAotCi1hbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKLQotICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKLSAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgotICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcwotICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQotICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKLSAgIHRoZSB1c2VyLgotCi1saWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMC42LCBNYXJjaCAyMCwgMjAwMCwgYXJlCi1Db3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCi1kaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC45NiwKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKLQotICAgVG9tIExhbmUKLSAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgV2lsbGVtIHZhbiBTY2hhaWsKLQotbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCi1Db3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLURpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjg4LAotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotCi0gICBKb2huIEJvd2xlcgotICAgS2V2aW4gQnJhY2V5Ci0gICBTYW0gQnVzaGVsbAotICAgTWFnbnVzIEhvbG1ncmVuCi0gICBHcmVnIFJvZWxvZnMKLSAgIFRvbSBUYW5uZXIKLQotbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKLUNvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLQotRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgotaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKLQotICAgQW5kcmVhcyBEaWxnZXIKLSAgIERhdmUgTWFydGluZGFsZQotICAgR3V5IEVyaWMgU2NoYWxuYXQKLSAgIFBhdWwgU2NobWlkdAotICAgVGltIFdlZ25lcgotCi1UaGUgUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IGlzIHN1cHBsaWVkICJBUyBJUyIuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMKLWFuZCBHcm91cCA0MiwgSW5jLiBkaXNjbGFpbSBhbGwgd2FycmFudGllcywgZXhwcmVzc2VkIG9yIGltcGxpZWQsCi1pbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBvZgotZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuICBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuCi1hc3N1bWUgbm8gbGlhYmlsaXR5IGZvciBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCi1vciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSB0aGUgdXNlIG9mIHRoZSBQTkcKLVJlZmVyZW5jZSBMaWJyYXJ5LCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi1zb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Ci10byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLgotCi0yLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQgbXVzdCBub3QKLSAgIGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UuCi0KLTMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueQotICAgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0Ci1mZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvCi1zdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpcwotc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCBhY2tub3dsZWRnbWVudCBpcyBub3QgcmVxdWlyZWQgYnV0IHdvdWxkIGJlCi1hcHByZWNpYXRlZC4KLQotCi1BICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgotYm94ZXMgYW5kIHRoZSBsaWtlOgotCi0gICBwcmludGYoIiVzIixwbmdfZ2V0X2NvcHlyaWdodChOVUxMKSk7Ci0KLUFsc28sIHRoZSBQTkcgbG9nbyAoaW4gUE5HIGZvcm1hdCwgb2YgY291cnNlKSBpcyBzdXBwbGllZCBpbiB0aGUKLWZpbGVzICJwbmdiYXIucG5nIiBhbmQgInBuZ2Jhci5qcGcgKDg4eDMxKSBhbmQgInBuZ25vdy5wbmciICg5OHgzMSkuCi0KLUxpYnBuZyBpcyBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIFNvZnR3YXJlLiAgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBpcyBhCi1jZXJ0aWZpY2F0aW9uIG1hcmsgb2YgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCi0KLUdsZW5uIFJhbmRlcnMtUGVocnNvbgotZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLUp1bHkgMTAsIDIwMTIKLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbGlidW5naWYvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgR0lGTElCIGRpc3RyaWJ1dGlvbiBpcyBDb3B5cmlnaHQgKGMpIDE5OTcgIEVyaWMgUy4gUmF5bW9uZAotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYnVzYi1jb21wYXQvQ09QWUlORwotbGlidXNiL0NPUFlJTkcKLWx2bTIvQ09QWUlORy5MSUIKLXB5dGhvbi1nb2JqZWN0L0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKLSBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQotIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQotY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgotdGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKLXN0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKLW5vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKLXlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKLWZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKLWl0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgotaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCi10aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQotcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCi15b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKLW9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKLXlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKLWNvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKLWxpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCi1wZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KLQotICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKLXRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKLW1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwotdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCi1hdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKLWludHJvZHVjZWQgYnkgb3RoZXJzLgotCi0gIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCi1hbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90Ci1lZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKLXJlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0Ci1hbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCi1jb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAotaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKLXRoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKLWxpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgotCi0gIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCi1hIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKLWNvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKLWVudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAotdGhlIGxpYnJhcnkuCi0KLSAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAotZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcwotb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcwotYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55Ci1saWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCi1zcGVjaWFsIGNpcmN1bXN0YW5jZXMuCi0KLSAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KLWVuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCi1hIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCi1hbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCi1saWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKLWNhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQotc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKLXByb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgotZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgotbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCi1vcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZwotc3lzdGVtLgotCi0gIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCi11c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcwotbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCi10aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0Ci1iZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KLQotCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCi1wcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgotb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgotRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQotICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCi0gICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCi0gICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCi0gICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgotICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcwotICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgotCi0gICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKLSAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKLSAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCi0gICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgotCi0gICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLSAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKLSAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCi0KLSAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKLSAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KLQotICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKLUxpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCi1yZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKLXRoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCi1ub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKLXRoaXMgTGljZW5zZS4KLQotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KLVN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKLWJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCi0iYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCi1saWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKLQotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYnVzYi1jb21wYXQvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saWJ1c2IgaXMgY292ZXJlZCBieSB0aGUgTEdQTDoKLQotVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotLS0tLQotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgZmlsZXMgdXNiLmguaW4gYW5kL29yIHVzYi5oIG1heSBiZSBsaWNlbnNlZCB1bmRlciB0aGUKLUJTRCBsaWNlbnNlOgotCi1Db3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKb2hhbm5lcyBFcmRmZWx0IDxqb2hhbm5lc0BlcmRmZWx0LmNvbT4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLU9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLU5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi1USElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWxpYnhtbDIvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkIGluIHRoZSBzb3VyY2UgY29kZSAoZS5nLiB0aGUgZmlsZXMgaGFzaC5jLAotbGlzdC5jIGFuZCB0aGUgdHJpbyBmaWxlcywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgYSBzaW1pbGFyIGxpY2VuY2UgYnV0Ci13aXRoIGRpZmZlcmVudCBDb3B5cmlnaHQgbm90aWNlcykgYWxsIHRoZSBmaWxlcyBhcmU6Ci0KLSBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBEYW5pZWwgVmVpbGxhcmQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1ci0KLW5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVQtCi1ORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1EQU5JRUwgVkVJTExBUkQgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCi1JTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT04tCi1ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEYW5pZWwgVmVpbGxhcmQgc2hhbGwgbm90Ci1iZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLWluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIGhpbS4KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saWJ4c2x0L0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTGljZW5jZSBmb3IgbGlieHNsdCBleGNlcHQgbGliZXhzbHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBEYW5pZWwgVmVpbGxhcmQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1ci0KLW5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVQtCi1ORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1EQU5JRUwgVkVJTExBUkQgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCi1JTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT04tCi1ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEYW5pZWwgVmVpbGxhcmQgc2hhbGwgbm90Ci1iZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLWluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIGhpbS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MaWNlbmNlIGZvciBsaWJleHNsdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFRob21hcyBCcm95ZXIsIENoYXJsaWUgQm96ZW1hbiBhbmQgRGFuaWVsIFZlaWxsYXJkLgotIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVyLQotbmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVC0KLU5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCi1JTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT04tCi1ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBzaGFsbCBub3QKLWJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQotaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gaGltLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saW51eC9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgTk9URSEgVGhpcyBjb3B5cmlnaHQgZG9lcyAqbm90KiBjb3ZlciB1c2VyIHByb2dyYW1zIHRoYXQgdXNlIGtlcm5lbAotIHNlcnZpY2VzIGJ5IG5vcm1hbCBzeXN0ZW0gY2FsbHMgLSB0aGlzIGlzIG1lcmVseSBjb25zaWRlcmVkIG5vcm1hbCB1c2UKLSBvZiB0aGUga2VybmVsLCBhbmQgZG9lcyAqbm90KiBmYWxsIHVuZGVyIHRoZSBoZWFkaW5nIG9mICJkZXJpdmVkIHdvcmsiLgotIEFsc28gbm90ZSB0aGF0IHRoZSBHUEwgYmVsb3cgaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLSBGb3VuZGF0aW9uLCBidXQgdGhlIGluc3RhbmNlIG9mIGNvZGUgdGhhdCBpdCByZWZlcnMgdG8gKHRoZSBMaW51eAotIGtlcm5lbCkgaXMgY29weXJpZ2h0ZWQgYnkgbWUgYW5kIG90aGVycyB3aG8gYWN0dWFsbHkgd3JvdGUgaXQuCi0KLSBBbHNvIG5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoZSBrZXJuZWwKLSBpcyBjb25jZXJuZWQgaXMgX3RoaXNfIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSAoaWUgdjIsIG5vdAotIHYyLjIgb3IgdjMueCBvciB3aGF0ZXZlciksIHVubGVzcyBleHBsaWNpdGx5IG90aGVyd2lzZSBzdGF0ZWQuCi0KLQkJCUxpbnVzIFRvcnZhbGRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbG1iZW5jaC9DT1BZSU5HLTIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJU0lICVJJSAlRSUKLQotVGhlIHNldCBvZiBwcm9ncmFtcyBhbmQgZG9jdW1lbnRhdGlvbiBrbm93biBhcyAibG1iZW5jaCIgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aXRoIHRoZQotZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zICh3aGljaCBvdmVycmlkZSBhbnkgY29uZmxpY3RpbmcKLXJlc3RyaWN0aW9ucyBpbiB0aGUgR1BMKToKLQotMS4gWW91IG1heSBub3QgZGlzdHJpYnV0ZSByZXN1bHRzIGluIGFueSBwdWJsaWMgZm9ydW0sIGluIGFueSBwdWJsaWNhdGlvbiwKLSAgIG9yIGluIGFueSBvdGhlciB3YXkgaWYgeW91IGhhdmUgbW9kaWZpZWQgdGhlIGJlbmNobWFya3MuCi0KLTIuIFlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIHJlc3VsdHMgZm9yIGEgZmVlIG9mIGFueSBraW5kLiAgVGhpcyBpbmNsdWRlcwotICAgd2ViIHNpdGVzIHdoaWNoIGdlbmVyYXRlIHJldmVudWUgZnJvbSBhZHZlcnRpc2luZy4KLQotSWYgeW91IGhhdmUgbW9kaWZpY2F0aW9ucyBvciBlbmhhbmNlbWVudHMgdGhhdCB5b3Ugd2lzaCBpbmNsdWRlZCBpbgotZnV0dXJlIHZlcnNpb25zLCBwbGVhc2UgbWFpbCB0aG9zZSB0byBtZSwgTGFycnkgTWNWb3ksIGF0IGxtQGJpdG1vdmVyLmNvbS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1SYXRpb25hbGUgZm9yIHRoZSBwdWJsaWNhdGlvbiByZXN0cmljdGlvbnM6Ci0KLUluIHN1bW1hcnk6Ci0KLSAgICBhKSBMTWJlbmNoIGlzIGRlc2lnbmVkIHRvIG1lYXN1cmUgZW5vdWdoIG9mIGFuIE9TIHRoYXQgaWYgeW91IGRvIHdlbGwgaW4KLSAgICAgICBhbGwgY2F0YWdvcmllcywgeW91J3ZlIGNvdmVyZWQgbGF0ZW5jeSBhbmQgYmFuZHdpZHRoIGluIG5ldHdvcmtpbmcsCi0gICAgICAgZGlza3MsIGZpbGUgc3lzdGVtcywgVk0gc3lzdGVtcywgYW5kIG1lbW9yeSBzeXN0ZW1zLgotICAgIGIpIE11bHRpcGxlIHRpbWVzIGluIHRoZSBwYXN0IHBlb3BsZSBoYXZlIHdhbnRlZCB0byByZXBvcnQgcGFydGlhbCByZXN1bHRzLgotICAgICAgIFdpdGhvdXQgZXhjZXB0aW9uLCB0aGV5IHdlcmUgZG9pbmcgc28gdG8gc2hvdyBhIHNrZXdlZCB2aWV3IG9mIHdoYXRldmVyCi0gICAgICAgaXQgd2FzIHRoZXkgd2VyZSBtZWFzdXJpbmcgKGZvciBleGFtcGxlLCBvbmUgT1MgZml0IHNtYWxsIHByb2Nlc3NlcyBpbnRvCi0gICAgICAgc2VnbWVudHMgYW5kIHVzZWQgdGhlIHNlZ21lbnQgcmVnaXN0ZXIgdG8gc3dpdGNoIHRoZW0sIGdldHRpbmcgZ29vZAotICAgICAgIHJlc3VsdHMsIGJ1dCBkaWQgbm90IHdhbnQgdG8gcmVwb3J0IGxhcmdlIHByb2Nlc3MgY29udGV4dCBzd2l0Y2hlcwotICAgICAgIGJlY2F1c2UgdGhvc2UgZGlkbid0IGxvb2sgYXMgZ29vZCkuCi0gICAgYykgV2UgaW5zaXN0IHRoYXQgaWYgeW91IGZvcm1hbGx5IHJlcG9ydCBMTWJlbmNoIHJlc3VsdHMsIHlvdSBoYXZlIHRvCi0gICAgICAgcmVwb3J0IGFsbCBvZiB0aGVtIGFuZCBtYWtlIHRoZSByYXcgcmVzdWx0cyBmaWxlIGVhc2lseSBhdmFpbGFibGUuCi0gICAgICAgUmVwb3J0aW5nIGFsbCBvZiB0aGVtIG1lYW5zIGluIHRoYXQgc2FtZSBwdWJsaWNhdGlvbiwgYSBwb2ludGVyCi0gICAgICAgZG9lcyBub3QgY291bnQuICBGb3JtYWxseSwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBpbiBhIHBhcGVyLAotICAgICAgIG9uIGEgd2ViIHNpdGUsIGV0Yy4sIGJ1dCBkb2VzIG5vdCBtZWFuIHRoZSBleGNoYW5nZSBvZiByZXN1bHRzCi0gICAgICAgYmV0d2VlbiBPUyBkZXZlbG9wZXJzIHdobyBhcmUgdHVuaW5nIGEgcGFydGljdWxhciBzdWJzeXN0ZW0uCi0KLVdlIGhhdmUgYSBsb3Qgb2YgaGlzdG9yeSB3aXRoIGJlbmNobWFya2luZyBhbmQgZmVlbCBzdHJvbmdseSB0aGF0IHRoZXJlCi1pcyBsaXR0bGUgdG8gYmUgZ2FpbmVkIGFuZCBhIGxvdCB0byBiZSBsb3N0IGlmIHdlIGFsbG93ZWQgdGhlIHJlc3VsdHMKLXRvIGJlIHB1Ymxpc2hlZCBpbiBpc29sYXRpb24sIHdpdGhvdXQgdGhlIGNvbXBsZXRlIHN0b3J5IGJlaW5nIHRvbGQuCi0KLVRoZXJlIGhhcyBiZWVuIGEgbG90IG9mIGRpc2N1c3Npb24gYWJvdXQgdGhpcywgd2l0aCBwZW9wbGUgbm90IGxpa2luZyB0aGlzCi1yZXN0cmljdGlvbiwgbW9yZSBvciBsZXNzIG9uIHRoZSBmcmVlZG9tIHByaW5jaXBsZSBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KLVdlJ3JlIG5vdCBzd2F5ZWQgYnkgdGhhdCwgb3VyIHBvc2l0aW9uIGlzIHRoYXQgd2UgYXJlIGRvaW5nIHRoZSByaWdodAotdGhpbmcgZm9yIHRoZSBPUyBjb21tdW5pdHkgYW5kIHdpbGwgc3RpY2sgdG8gb3VyIGd1bnMgb24gdGhpcyBvbmUuCi0KLUl0IHdvdWxkIGJlIGEgZGlmZmVyZW50IG1hdHRlciBpZiB0aGVyZSB3ZXJlIDMgb3RoZXIgY29tcGV0aW5nCi1iZW5jaG1hcmtpbmcgc3lzdGVtcyBvdXQgdGhlcmUgdGhhdCBkaWQgd2hhdCBMTWJlbmNoIGRvZXMgYW5kIGRpZG4ndCBoYXZlCi10aGUgc2FtZSByZXBvcnRpbmcgcnVsZXMuICBUaGVyZSBhcmVuJ3QgYW5kIGFzIGxvbmcgYXMgdGhhdCBpcyB0aGUgY2FzZSwKLUkgc2VlIG5vIHJlYXNvbiB0byBjaGFuZ2UgbXkgbWluZCBhbmQgbG90cyBvZiByZWFzb25zIG5vdCB0byBkbyBzby4gIEknbQotc29ycnkgaWYgSSdtIGEgcGFpbiBpbiB0aGUgYXNzIG9uIHRoaXMgdG9waWMsIGJ1dCBJJ20gZG9pbmcgdGhlIHJpZ2h0Ci10aGluZyBmb3IgeW91IGFuZCB0aGUgc29vbmVyIHBlb3BsZSByZWFsaXplIHRoYXQgdGhlIHNvb25lciB3ZSBjYW4gZ2V0IG9uCi10byByZWFsIHdvcmsuCi0KLU9wZXJhdGluZyBzeXN0ZW0gZGVzaWduIGlzIGEgbGFyZ2VseSBhbiBhcnQgb2YgYmFsYW5jaW5nIHRyYWRlb2Zmcy4KLUluIG1hbnkgY2FzZXMgaW1wcm92aW5nIG9uZSBwYXJ0IG9mIHRoZSBzeXN0ZW0gaGFzIG5lZ2F0aXZlIGVmZmVjdHMKLW9uIG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0uICBUaGUgYXJ0IGlzIGNob29zaW5nIHdoaWNoIHBhcnRzIHRvCi1vcHRpbWl6ZSBhbmQgd2hpY2ggdG8gbm90IG9wdGltaXplLiAgSnVzdCBsaWtlIGluIGNvbXB1dGVyIGFyY2hpdGVjdHVyZSwKLXlvdSBjYW4gb3B0aW1pemUgdGhlIGNvbW1vbiBpbnN0cnVjdGlvbnMgKFJJU0MpIG9yIHRoZSB1bmNvbW1vbgotaW5zdHJ1Y3Rpb25zIChDSVNDKSwgYnV0IGluIGVpdGhlciBjYXNlIHRoZXJlIGlzIHVzdWFsbHkgYSBjb3N0IHRvCi1wYXkgKGluIFJJU0MgdW5jb21tb24gaW5zdHJ1Y3Rpb25zIGFyZSBtb3JlIGV4cGVuc2l2ZSB0aGFuIGNvbW1vbgotaW5zdHJ1Y3Rpb25zLCBhbmQgaW4gQ0lTQyBjb21tb24gaW5zdHJ1Y3Rpb25zIGFyZSBtb3JlIGV4cGVuc2l2ZQotdGhhbiByZXF1aXJlZCkuICBUaGUgYXJ0IGxpZXMgaW4ga25vd2luZyB3aGljaCBvcGVyYXRpb25zIGFyZQotaW1wb3J0YW50IGFuZCBvcHRtaXppbmcgdGhvc2Ugd2hpbGUgbWluaW1pemluZyB0aGUgaW1wYWN0IG9uIHRoZQotcmVzdCBvZiB0aGUgc3lzdGVtLgotCi1TaW5jZSBsbWJlbmNoIGdpdmVzIGEgZ29vZCBvdmVydmlldyBvZiBtYW55IGltcG9ydGFudCBzeXN0ZW0gZmVhdHVyZXMsCi11c2VycyBtYXkgc2VlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc3lzdGVtIGFzIGEgd2hvbGUsIGFuZCBjYW4KLXNlZSB3aGVyZSB0cmFkZW9mZnMgbWF5IGhhdmUgYmVlbiBtYWRlLiAgVGhpcyBpcyB0aGUgZHJpdmluZyBmb3JjZQotYmVoaW5kIHRoZSBwdWJsaWNhdGlvbiByZXN0cmljdGlvbjogYW55IGlkaW90IGNhbiBvcHRpbWl6ZSBjZXJ0YWluCi1zdWJzeXN0ZW1zIHdoaWxlIGNvbXBsZXRlbHkgZGVzdHJveWluZyBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZS4KLUlmIHNhaWQgaWRpb3QgcHVibGlzaGVzICpvbmx5KiB0aGUgbnVtYmVycyByZWxhdGluZyB0byB0aGUgb3B0aW1pemVkCi1zdWJzeXN0ZW0sIHRoZW4gdGhlIGNvc3RzIG9mIHRoZSBvcHRpbWl6YXRpb24gYXJlIGhpZGRlbiBhbmQgcmVhZGVycwotd2lsbCBtaXN0YWtlbmx5IGJlbGlldmUgdGhhdCB0aGUgb3B0aW1pemF0aW9uIGlzIGEgZ29vZCBpZGVhLiAgQnkKLWluY2x1ZGluZyB0aGUgcHVibGljYXRpb24gcmVzdHJpY3Rpb24gcmVhZGVycyB3b3VsZCBiZSBhYmxlIHRvCi1kZXRlY3QgdGhhdCB0aGUgb3B0aW1pemF0aW9uIGltcHJvdmVkIHRoZSBzdWJzeXN0ZW0gcGVyZm9ybWFuY2UKLXdoaWxlIGRhbWFnaW5nIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gcGVyZm9ybWFuY2UgYW5kIHdvdWxkIGJlIGFibGUKLXRvIG1ha2UgYW4gaW5mb3JtZWQgZGVjaXNpb24gYXMgdG8gdGhlIG1lcml0cyBvZiB0aGUgb3B0aW1pemF0aW9uLgotCi1Ob3RlIHRoYXQgdGhlc2UgcmVzdHJpY3Rpb25zIG9ubHkgYXBwbHkgdG8gKnB1YmxpY2F0aW9ucyouICBXZQotaW50ZW5kIGFuZCBlbmNvdXJhZ2UgbG1iZW5jaCdzIHVzZSBkdXJpbmcgZGVzaWduLCBkZXZlbG9wbWVudCwKLWFuZCB0d2Vha2luZyBvZiBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMuICBJZiB5b3UgYXJlIHR1bmluZyB0aGUKLWxpbnV4IG9yIEJTRCBUQ1Agc3RhY2ssIHRoZW4gYnkgYWxsIG1lYW5zLCB1c2UgdGhlIG5ldHdvcmtpbmcKLWJlbmNobWFya3MgdG8gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIGVmZmVjdHMgb2YgdmFyaW91cwotbW9kaWZpY2F0aW9uczsgU3dhcCByZXN1bHRzIHdpdGggb3RoZXIgZGV2ZWxvcGVyczsgdXNlIHRoZQotbmV0d29ya2luZyBudW1iZXJzIGluIGlzb2xhdGlvbi4gIFRoZSByZXN0cmljdGlvbnMgb25seSBraWNrCi1pbiB3aGVuIHlvdSBnbyB0byAqcHVibGlzaCogdGhlIHJlc3VsdHMuICBJZiB5b3Ugc3BlZCB1cCB0aGUKLVRDUCBzdGFjayBieSBhIGZhY3RvciBvZiAyIGFuZCB3YW50IHRvIHB1Ymxpc2ggYSBwYXBlciB3aXRoIHRoZQotdmFyaW91cyB0d2Vha3Mgb3IgYWxnb3JpdGhtcyB1c2VkIHRvIGFjY29tcGxpc2ggdGhpcyBnb2FsLCB0aGVuCi15b3UgY2FuIHB1Ymxpc2ggdGhlIG5ldHdvcmtpbmcgbnVtYmVycyB0byBzaG93IHRoZSBpbXByb3ZlbWVudC4KLUhvd2V2ZXIsIHRoZSBwYXBlciAqbXVzdCogYWxzbyBpbmNsdWRlIHRoZSByZXN0IG9mIHRoZSBzdGFuZGFyZAotbG1iZW5jaCBudW1iZXJzIHRvIHNob3cgaG93IHlvdXIgdHdlYWtzIG1heSAob3IgbWF5IG5vdCkgaGF2ZQotaW1wYWN0ZWQgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4gIFRoZSBmdWxsIHNldCBvZiBudW1iZXJzIG1heQotYmUgaW5jbHVkZWQgaW4gYW4gYXBwZW5kaXgsIGJ1dCB0aGV5ICptdXN0KiBiZSBpbmNsdWRlZCBpbiB0aGUKLXBhcGVyLgotCi1UaGlzIGhlbHBzIHByb3RlY3QgdGhlIGNvbW11bml0eSBmcm9tIGFkb3B0aW5nIGZsYXdlZCB0ZWNobm9sb2dpZXMKLWJhc2VkIG9uIGluY29tcGxldGUgZGF0YS4gIEl0IGFsc28gaGVscHMgcHJvdGVjdCB0aGUgY29tbXVuaXR5IGZyb20KLW1pc2xlYWRpbmcgbWFya2V0aW5nIHdoaWNoIHRyaWVzIHRvIHNlbGwgc3lzdGVtcyBiYXNlZCBvbiBwYXJ0aWFsCi0oc2tld2VkKSBsbWJlbmNoIHBlcmZvcm1hbmNlIHJlc3VsdHMuCi0KLVdlIGhhdmUgc2VlbiBtYW55IGNhc2VzIGluIHRoZSBwYXN0IHdoZXJlIHBhcnRpYWwgb3IgbWlzbGVhZGluZwotYmVuY2htYXJrIHJlc3VsdHMgaGF2ZSBjYXVzZWQgZ3JlYXQgaGFybSB0byB0aGUgY29tbXVuaXR5LCBhbmQKLXdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgb3VyIGJlbmNobWFyayBpcyBub3QgdXNlZCB0byBwZXJwZXRyYXRlCi1mdXJ0aGVyIGhhcm0gYW5kIHN1cHBvcnQgZmFsc2Ugb3IgbWlzbGVhZGluZyBjbGFpbXMuCi0KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1sdWEvQ09QWVJJR0hUCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUx1YSBMaWNlbnNlCi0tLS0tLS0tLS0tLQotCi1MdWEgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZSByZXByb2R1Y2VkIGJlbG93LgotVGhpcyBtZWFucyB0aGF0IEx1YSBpcyBmcmVlIHNvZnR3YXJlIGFuZCBjYW4gYmUgdXNlZCBmb3IgYm90aCBhY2FkZW1pYwotYW5kIGNvbW1lcmNpYWwgcHVycG9zZXMgYXQgYWJzb2x1dGVseSBubyBjb3N0LgotCi1Gb3IgZGV0YWlscyBhbmQgcmF0aW9uYWxlLCBzZWUgaHR0cDovL3d3dy5sdWEub3JnL2xpY2Vuc2UuaHRtbCAuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29weXJpZ2h0IChDKSAxOTk0LTIwMDggTHVhLm9yZywgUFVDLVJpby4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLShlbmQgb2YgQ09QWVJJR0hUKQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tZW1zdGF0L0NPUFlSSUdIVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogVGhpcyBzb2Z0d2FyZSBjb3B5cmlnaHQgMTk5NyBKb3NodWEgTS4gWWVsb24uCi0gKiBEZWJpYW4gTWFpbnRhaW5lciBhbmQgbmV3IEZlYXR1cmVzOgotICogICBjb3B5cmlnaHQgMTk5OSBCZXJuZCBFY2tlbmZlbHMsIEdlcm1hbnksIGVja2lAZGViaWFuLm9yZwotICogICAoc2VlIGRlYmlhbi9jaGFuZ2Vsb2cpCi0gKiAgIGNvcHlyaWdodCAyMDA4LTIwMDkgTWljaGFlbCBNZXNrZXMsIG1lc2tlc0BkZWJpYW4ub3JnCi0gKgotICogRGlzdHJpYnV0aW9uIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBHUEwuCi0gKgotICovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1pbmlzc2RwZC9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwNy0yMDA5LCBUaG9tYXMgQkVSTkFSRAotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi1BUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbWluaXVwbnBkL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTWluaVVQblBkCi1Db3B5cmlnaHQgKGMpIDIwMDYtMjAxMSwgVGhvbWFzIEJFUk5BUkQKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAqIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLUFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi1BUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLUxJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi1TVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLUlOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi1DT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5jdXJzZXMvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgIC0tCi0tLSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgIC0tCi0tLSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgIC0tCi0tLSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgIC0tCi0tLSBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIC0tCi0tLSBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgIC0tCi0tLSB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgIC0tCi0tLSBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgIC0tCi0tLSBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgIC0tCi0tLSBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIC0tCi0tLSBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgICAgIC0tCi0tLSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgIC0tCi0tLSBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIC0tCi0tLSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgIC0tCi0tLSBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgIC0tCi0tLSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgIC0tCi0tLSBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5ldHBlcmYvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTMgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICBBTEwgUklHSFRTIFJFU0VSVkVELgotCi0gIFRoZSBlbmNsb3NlZCBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlcyBjb3B5cmlnaHRlZCB3b3JrcwotICBvZiBIZXdsZXR0LVBhY2thcmQgQ28uIEZvciBhcyBsb25nIGFzIHlvdSBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nCi0gIGxpbWl0YXRpb25zLCB5b3UgYXJlIGhlcmVieSBhdXRob3JpemVkIHRvIChpKSB1c2UsIHJlcHJvZHVjZSwgYW5kCi0gIG1vZGlmeSB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24sIGFuZCB0byAoaWkpIGRpc3RyaWJ1dGUgdGhlCi0gIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgZm9yCi0gIG5vbi1jb21tZXJjaWFsIHB1cnBvc2VzIG9ubHkuCi0KLSAgMS4gIFRoZSBlbmNsb3NlZCBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBpcyBtYWRlIGF2YWlsYWJsZSBhdCBubwotICAgICAgY2hhcmdlIGluIG9yZGVyIHRvIGFkdmFuY2UgdGhlIGdlbmVyYWwgZGV2ZWxvcG1lbnQgb2YKLSAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgbmV0d29ya2luZyBwcm9kdWN0cy4KLQotICAyLiAgWW91IG1heSBub3QgZGVsZXRlIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgaW4gdGhlCi0gICAgICBzb2Z0d2FyZSBvciBkb2N1bWVudGF0aW9uLiBBbGwgaGFyZCBjb3BpZXMsIGFuZCBjb3BpZXMgaW4KLSAgICAgIHNvdXJjZSBjb2RlIG9yIG9iamVjdCBjb2RlIGZvcm0sIG9mIHRoZSBzb2Z0d2FyZSBvcgotICAgICAgZG9jdW1lbnRhdGlvbiAoaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMpIG11c3QgY29udGFpbiBhdCBsZWFzdAotICAgICAgb25lIG9mIHRoZSBjb3B5cmlnaHQgbm90aWNlcy4KLQotICAzLiAgVGhlIGVuY2xvc2VkIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGhhcyBub3QgYmVlbiBzdWJqZWN0ZWQKLSAgICAgIHRvIHRlc3RpbmcgYW5kIHF1YWxpdHkgY29udHJvbCBhbmQgaXMgbm90IGEgSGV3bGV0dC1QYWNrYXJkIENvLgotICAgICAgcHJvZHVjdC4gQXQgYSBmdXR1cmUgdGltZSwgSGV3bGV0dC1QYWNrYXJkIENvLiBtYXkgb3IgbWF5IG5vdAotICAgICAgb2ZmZXIgYSB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcyBhIHByb2R1Y3QuCi0KLSAgNC4gIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiLgotICAgICAgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgRE9FUyBOT1QgV0FSUkFOVCBUSEFUIFRIRSBVU0UsCi0gICAgICBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFNPRlRXQVJFIE9SCi0gICAgICBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEEgVEhJUkQgUEFSVFknUyBJTlRFTExFQ1RVQUwKLSAgICAgIFBST1BFUlRZIFJJR0hUUy4gSFAgRE9FUyBOT1QgV0FSUkFOVCBUSEFUIFRIRSBTT0ZUV0FSRSBPUgotICAgICAgRE9DVU1FTlRBVElPTiBJUyBFUlJPUiBGUkVFLiBIUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMsCi0gICAgICBFWFBSRVNTIEFORCBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTyBUSEUgU09GVFdBUkUgQU5EIFRIRQotICAgICAgRE9DVU1FTlRBVElPTi4gSFAgU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBPRgotICAgICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotICA1LiAgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgV0lMTCBOT1QgSU4gQU5ZIEVWRU5UIEJFIExJQUJMRSBGT1IgQU5ZCi0gICAgICBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICAgICAgKElOQ0xVRElORyBMT1NUIFBST0ZJVFMpIFJFTEFURUQgVE8gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OLAotICAgICAgTU9ESUZJQ0FUSU9OLCBPUiBESVNUUklCVVRJT04gT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCi0KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ubWFwL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDT1BZSU5HIC0tIERlc2NyaWJlcyB0aGUgdGVybXMgdW5kZXIgd2hpY2ggTm1hcCBpcyBkaXN0cmlidXRlZC4gIEEgY29weSAqCi0gKiBvZiB0aGUgR05VIEdQTCBpcyBhcHBlbmRlZCB0byB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKipJTVBPUlRBTlQgTk1BUCBMSUNFTlNFIFRFUk1TKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGUgTm1hcCBTZWN1cml0eSBTY2FubmVyIGlzIChDKSAxOTk2LTIwMTIgSW5zZWN1cmUuQ29tIExMQy4gTm1hcCBpcyAgICAqCi0gKiBhbHNvIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSW5zZWN1cmUuQ29tIExMQy4gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlICAqCi0gKiBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAqCi0gKiBGb3VuZGF0aW9uOyBWZXJzaW9uIDIgd2l0aCB0aGUgY2xhcmlmaWNhdGlvbnMgYW5kIGV4Y2VwdGlvbnMgZGVzY3JpYmVkICAqCi0gKiBiZWxvdy4gIFRoaXMgZ3VhcmFudGVlcyB5b3VyIHJpZ2h0IHRvIHVzZSwgbW9kaWZ5LCBhbmQgcmVkaXN0cmlidXRlICAgICAqCi0gKiB0aGlzIHNvZnR3YXJlIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gIElmIHlvdSB3aXNoIHRvIGVtYmVkIE5tYXAgICAgICAqCi0gKiB0ZWNobm9sb2d5IGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUsIHdlIHNlbGwgYWx0ZXJuYXRpdmUgbGljZW5zZXMgICAgICAqCi0gKiAoY29udGFjdCBzYWxlc0BpbnNlY3VyZS5jb20pLiAgRG96ZW5zIG9mIHNvZnR3YXJlIHZlbmRvcnMgYWxyZWFkeSAgICAgICAqCi0gKiBsaWNlbnNlIE5tYXAgdGVjaG5vbG9neSBzdWNoIGFzIGhvc3QgZGlzY292ZXJ5LCBwb3J0IHNjYW5uaW5nLCBPUyAgICAgICAqCi0gKiBkZXRlY3Rpb24sIHZlcnNpb24gZGV0ZWN0aW9uLCBhbmQgdGhlIE5tYXAgU2NyaXB0aW5nIEVuZ2luZS4gICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBOb3RlIHRoYXQgdGhlIEdQTCBwbGFjZXMgaW1wb3J0YW50IHJlc3RyaWN0aW9ucyBvbiAiZGVyaXZlZCB3b3JrcyIsIHlldCAqCi0gKiBpdCBkb2VzIG5vdCBwcm92aWRlIGEgZGV0YWlsZWQgZGVmaW5pdGlvbiBvZiB0aGF0IHRlcm0uICBUbyBhdm9pZCAgICAgICAqCi0gKiBtaXN1bmRlcnN0YW5kaW5ncywgd2UgaW50ZXJwcmV0IHRoYXQgdGVybSBhcyBicm9hZGx5IGFzIGNvcHlyaWdodCBsYXcgICAqCi0gKiBhbGxvd3MuICBGb3IgZXhhbXBsZSwgd2UgY29uc2lkZXIgYW4gYXBwbGljYXRpb24gdG8gY29uc3RpdHV0ZSBhICAgICAgICAqCi0gKiAiZGVyaXZhdGl2ZSB3b3JrIiBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBsaWNlbnNlIGlmIGl0IGRvZXMgYW55IG9mIHRoZSAqCi0gKiBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBvIEludGVncmF0ZXMgc291cmNlIGNvZGUgZnJvbSBObWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBvIFJlYWRzIG9yIGluY2x1ZGVzIE5tYXAgY29weXJpZ2h0ZWQgZGF0YSBmaWxlcywgc3VjaCBhcyAgICAgICAgICAgICAgICAqCi0gKiAgIG5tYXAtb3MtZGIgb3Igbm1hcC1zZXJ2aWNlLXByb2Jlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBvIEV4ZWN1dGVzIE5tYXAgYW5kIHBhcnNlcyB0aGUgcmVzdWx0cyAoYXMgb3Bwb3NlZCB0byB0eXBpY2FsIHNoZWxsIG9yICAqCi0gKiAgIGV4ZWN1dGlvbi1tZW51IGFwcHMsIHdoaWNoIHNpbXBseSBkaXNwbGF5IHJhdyBObWFwIG91dHB1dCBhbmQgc28gYXJlICAqCi0gKiAgIG5vdCBkZXJpdmF0aXZlIHdvcmtzLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBvIEludGVncmF0ZXMvaW5jbHVkZXMvYWdncmVnYXRlcyBObWFwIGludG8gYSBwcm9wcmlldGFyeSBleGVjdXRhYmxlICAgICAqCi0gKiAgIGluc3RhbGxlciwgc3VjaCBhcyB0aG9zZSBwcm9kdWNlZCBieSBJbnN0YWxsU2hpZWxkLiAgICAgICAgICAgICAgICAgICAqCi0gKiBvIExpbmtzIHRvIGEgbGlicmFyeSBvciBleGVjdXRlcyBhIHByb2dyYW0gdGhhdCBkb2VzIGFueSBvZiB0aGUgYWJvdmUgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGUgdGVybSAiTm1hcCIgc2hvdWxkIGJlIHRha2VuIHRvIGFsc28gaW5jbHVkZSBhbnkgcG9ydGlvbnMgb3IgZGVyaXZlZCAqCi0gKiB3b3JrcyBvZiBObWFwLCBhcyB3ZWxsIGFzIG90aGVyIHNvZnR3YXJlIHdlIGRpc3RyaWJ1dGUgdW5kZXIgdGhpcyAgICAgICAqCi0gKiBsaWNlbnNlIHN1Y2ggYXMgWmVubWFwLCBOY2F0LCBhbmQgTnBpbmcuICBUaGlzIGxpc3QgaXMgbm90IGV4Y2x1c2l2ZSwgICAqCi0gKiBidXQgaXMgbWVhbnQgdG8gY2xhcmlmeSBvdXIgaW50ZXJwcmV0YXRpb24gb2YgZGVyaXZlZCB3b3JrcyB3aXRoIHNvbWUgICAqCi0gKiBjb21tb24gZXhhbXBsZXMuICBPdXIgaW50ZXJwcmV0YXRpb24gYXBwbGllcyBvbmx5IHRvIE5tYXAtLXdlIGRvbid0ICAgICAqCi0gKiBzcGVhayBmb3Igb3RoZXIgcGVvcGxlJ3MgR1BMIHdvcmtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IHRoZSBHUEwgbGljZW5zaW5nIHJlc3RyaWN0aW9ucyBvbiB1c2luZyAqCi0gKiBObWFwIGluIG5vbi1HUEwgd29ya3MsIHdlIHdvdWxkIGJlIGhhcHB5IHRvIGhlbHAuICBBcyBtZW50aW9uZWQgYWJvdmUsICAqCi0gKiB3ZSBhbHNvIG9mZmVyIGFsdGVybmF0aXZlIGxpY2Vuc2UgdG8gaW50ZWdyYXRlIE5tYXAgaW50byBwcm9wcmlldGFyeSAgICAqCi0gKiBhcHBsaWNhdGlvbnMgYW5kIGFwcGxpYW5jZXMuICBUaGVzZSBjb250cmFjdHMgaGF2ZSBiZWVuIHNvbGQgdG8gZG96ZW5zICAqCi0gKiBvZiBzb2Z0d2FyZSB2ZW5kb3JzLCBhbmQgZ2VuZXJhbGx5IGluY2x1ZGUgYSBwZXJwZXR1YWwgbGljZW5zZSBhcyB3ZWxsICAqCi0gKiBhcyBwcm92aWRpbmcgZm9yIHByaW9yaXR5IHN1cHBvcnQgYW5kIHVwZGF0ZXMuICBUaGV5IGFsc28gZnVuZCB0aGUgICAgICAqCi0gKiBjb250aW51ZWQgZGV2ZWxvcG1lbnQgb2YgTm1hcC4gIFBsZWFzZSBlbWFpbCBzYWxlc0BpbnNlY3VyZS5jb20gZm9yICAgICAqCi0gKiBmdXJ0aGVyIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdGVybXMsIEluc2VjdXJlLkNvbSBMTEMgZ3JhbnRzICAgICAgICAqCi0gKiBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlIGNvZGUgb2YgdGhpcyBwcm9ncmFtIHdpdGggYW55IHZlcnNpb24gb2YgdGhlICAgICAqCi0gKiBPcGVuU1NMIGxpYnJhcnkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgYSBsaWNlbnNlIGlkZW50aWNhbCB0byB0aGF0ICAqCi0gKiBsaXN0ZWQgaW4gdGhlIGluY2x1ZGVkIGRvY3MvbGljZW5zZXMvT3BlblNTTC50eHQgZmlsZSwgYW5kIGRpc3RyaWJ1dGUgICAqCi0gKiBsaW5rZWQgY29tYmluYXRpb25zIGluY2x1ZGluZyB0aGUgdHdvLiBZb3UgbXVzdCBvYmV5IHRoZSBHTlUgR1BMIGluIGFsbCAqCi0gKiByZXNwZWN0cyBmb3IgYWxsIG9mIHRoZSBjb2RlIHVzZWQgb3RoZXIgdGhhbiBPcGVuU1NMLiAgSWYgeW91IG1vZGlmeSAgICAqCi0gKiB0aGlzIGZpbGUsIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUgZmlsZSwgICAqCi0gKiBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBJZiB5b3UgcmVjZWl2ZWQgdGhlc2UgZmlsZXMgd2l0aCBhIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgb3IgICAgICAgICAqCi0gKiBjb250cmFjdCBzdGF0aW5nIHRlcm1zIG90aGVyIHRoYW4gdGhlIHRlcm1zIGFib3ZlLCB0aGVuIHRoYXQgICAgICAgICAgICAqCi0gKiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFncmVlbWVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlc2UgY29tbWVudHMuICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBTb3VyY2UgaXMgcHJvdmlkZWQgdG8gdGhpcyBzb2Z0d2FyZSBiZWNhdXNlIHdlIGJlbGlldmUgdXNlcnMgaGF2ZSBhICAgICAqCi0gKiByaWdodCB0byBrbm93IGV4YWN0bHkgd2hhdCBhIHByb2dyYW0gaXMgZ29pbmcgdG8gZG8gYmVmb3JlIHRoZXkgcnVuIGl0LiAqCi0gKiBUaGlzIGFsc28gYWxsb3dzIHlvdSB0byBhdWRpdCB0aGUgc29mdHdhcmUgZm9yIHNlY3VyaXR5IGhvbGVzIChub25lICAgICAqCi0gKiBoYXZlIGJlZW4gZm91bmQgc28gZmFyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBTb3VyY2UgY29kZSBhbHNvIGFsbG93cyB5b3UgdG8gcG9ydCBObWFwIHRvIG5ldyBwbGF0Zm9ybXMsIGZpeCBidWdzLCAgICAqCi0gKiBhbmQgYWRkIG5ldyBmZWF0dXJlcy4gIFlvdSBhcmUgaGlnaGx5IGVuY291cmFnZWQgdG8gc2VuZCB5b3VyIGNoYW5nZXMgICAqCi0gKiB0byBubWFwLWRldkBpbnNlY3VyZS5vcmcgZm9yIHBvc3NpYmxlIGluY29ycG9yYXRpb24gaW50byB0aGUgbWFpbiAgICAgICAqCi0gKiBkaXN0cmlidXRpb24uICBCeSBzZW5kaW5nIHRoZXNlIGNoYW5nZXMgdG8gRnlvZG9yIG9yIG9uZSBvZiB0aGUgICAgICAgICAqCi0gKiBJbnNlY3VyZS5PcmcgZGV2ZWxvcG1lbnQgbWFpbGluZyBsaXN0cywgb3IgY2hlY2tpbmcgdGhlbSBpbnRvIHRoZSBObWFwICAqCi0gKiBzb3VyY2UgY29kZSByZXBvc2l0b3J5LCBpdCBpcyB1bmRlcnN0b29kICh1bmxlc3MgeW91IHNwZWNpZnkgb3RoZXJ3aXNlKSAqCi0gKiB0aGF0IHlvdSBhcmUgb2ZmZXJpbmcgdGhlIE5tYXAgUHJvamVjdCAoSW5zZWN1cmUuQ29tIExMQykgdGhlICAgICAgICAgICAqCi0gKiB1bmxpbWl0ZWQsIG5vbi1leGNsdXNpdmUgcmlnaHQgdG8gcmV1c2UsIG1vZGlmeSwgYW5kIHJlbGljZW5zZSB0aGUgICAgICAqCi0gKiBjb2RlLiAgTm1hcCB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUgT3BlbiBTb3VyY2UsIGJ1dCB0aGlzIGlzIGltcG9ydGFudCAqCi0gKiBiZWNhdXNlIHRoZSBpbmFiaWxpdHkgdG8gcmVsaWNlbnNlIGNvZGUgaGFzIGNhdXNlZCBkZXZhc3RhdGluZyBwcm9ibGVtcyAqCi0gKiBmb3Igb3RoZXIgRnJlZSBTb2Z0d2FyZSBwcm9qZWN0cyAoc3VjaCBhcyBLREUgYW5kIE5BU00pLiAgV2UgYWxzbyAgICAgICAqCi0gKiBvY2Nhc2lvbmFsbHkgcmVsaWNlbnNlIHRoZSBjb2RlIHRvIHRoaXJkIHBhcnRpZXMgYXMgZGlzY3Vzc2VkIGFib3ZlLiAgICAqCi0gKiBJZiB5b3Ugd2lzaCB0byBzcGVjaWZ5IHNwZWNpYWwgbGljZW5zZSBjb25kaXRpb25zIG9mIHlvdXIgICAgICAgICAgICAgICAqCi0gKiBjb250cmlidXRpb25zLCBqdXN0IHNheSBzbyB3aGVuIHlvdSBzZW5kIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0ICAgICAqCi0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAqCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgZm9yIG1vcmUgZGV0YWlscyBhdCAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sICwgb3IgaW4gdGhlIENPUFlJTkcgZmlsZSAgICAgICAqCi0gKiBpbmNsdWRlZCB3aXRoIE5tYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRhYmxlIG9mIENvbnRlbnRzCi0KLSAgICogR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgbyBQcmVhbWJsZQotICAgICAgICBvIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotICAgICAgICBvIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0KLVZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLUNvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVByZWFtYmxlCi0KLVRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0bwotc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZAotdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZQotdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzCi10byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0KLXdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLXNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdQotY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KLQotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20KLXRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3UKLXdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91Ci1jYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdAoteW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLVRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvCi1kZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UKLXJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzIG9yCi1mb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91Ci1tdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gQW5kIHlvdQotbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZCAoMikKLW9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZQotYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLUFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQKLWV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gSWYKLXRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMKLXJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvIHRoYXQgYW55Ci1wcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbCBhdXRob3JzJwotcmVwdXRhdGlvbnMuCi0KLUZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuIFdlCi13aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCi1pbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbQotcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlCi1saWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi1UaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24KLWZvbGxvdy4KLQotVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLTAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UKLXBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoCi1wcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0KLW9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yawotY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoCi1tb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLAotdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaAotbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdCBjb3ZlcmVkCi1ieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcgdGhlIFByb2dyYW0KLWlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMKLWNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbgotbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZQotUHJvZ3JhbSBkb2VzLgotCi0xLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUKLWFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAotYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcwotTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZgotdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91Ci1tYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLTIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsCi10aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoCi1tb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UKLWFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgKiBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwotICAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgKiBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQKLSAgICAgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMKLSAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgKiBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4KLSAgICAgcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlCi0gICAgIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nCi0gICAgIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkKLSAgICAgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heQotICAgICByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIKLSAgICAgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmCi0gICAgIGlzIGludGVyYWN0aXZlIGJ1dCBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91cgotICAgICB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYgaWRlbnRpZmlhYmxlCi1zZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUKLXJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbgotdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMKLWFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YKLXRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlcgotbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0Ci1yZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0IHlvdXIKLXJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UKLXRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvciBjb2xsZWN0aXZlIHdvcmtzCi1iYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoCi10aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZQotb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUgc2NvcGUgb2YgdGhpcwotTGljZW5zZS4KLQotMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyCi1TZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMQotYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgKiBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQotICAgICBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyCi0gICAgIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgKiBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywKLSAgICAgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0IG9mCi0gICAgIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUKLSAgICAgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0gICAgIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3IKLSAgICAgc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAqIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCi0gICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5Ci0gICAgIGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4KLSAgICAgb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGgKLSAgICAgU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcKLW1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbAotdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UKLWRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZAotaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlCi1jb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4KLWVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsCi1hbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0Ci1jb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0bwotY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQotc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwKLWV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGgKLXRoZSBvYmplY3QgY29kZS4KLQotNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGV4Y2VwdCBhcwotZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksCi1tb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5Ci10ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkCi1jb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90IHNpZ25lZAotaXQuIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiBUaGVzZSBhY3Rpb25zIGFyZSBwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UKLWRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YKLXRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsCi1kaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nIHRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi02LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbAotbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcwotYW5kIGNvbmRpdGlvbnMuIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlCi1yZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdCByZXNwb25zaWJsZQotZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgotCi03LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlIHNvCi1hcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkKLW90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdAotcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMKLWRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGgKLWl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLVByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQKLXRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzCi1vciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7Ci10aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlCi1zb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZQotcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZgotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50Ci1hcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3IKLXNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhCi1saWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUgYQotY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi04LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluCi1jb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsCi1jb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4KLWV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbwotdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLgotSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlCi1ib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKLXRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlCi1zaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0xMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlIHByb2dyYW1zCi13aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IKLXBlcm1pc3Npb24uIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UKLWV4Y2VwdGlvbnMgZm9yIHRoaXMuIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mCi1wcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mCi1wcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotTk8gV0FSUkFOVFkKLQotMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUgotVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8KLVRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNCi1QUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUgotQ09SUkVDVElPTi4KLQotMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUgotVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLUVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi1Ib3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZQotdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlCi13aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLVRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8KLWF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZQotZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSAiY29weXJpZ2h0IgotbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotb25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGFuIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgotQ29weXJpZ2h0IChDKSAxOXl5ICBuYW1lIG9mIGF1dGhvcgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLW9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcyB3aGVuCi1pdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi1Hbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzCi10eXBlIGBzaG93IHcnLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lCi10byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnCi1mb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKLWNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodAotaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0gYEdub21vdmlzaW9uJwotKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4KLWJ5IEphbWVzIEhhY2tlci4KLQotc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQotVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotb3Blbm50cGQvTElDRU5DRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGlzIGEgc3VtbWFyeSBvZiB0aGUgbGljZW5jZXMgZm9yIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgUG9ydGFibGUKLU9wZW5OVFBELgotCi1BcGFydCBmcm9tIHRoZSBleGNlcHRpb25zIGxpc3RlZCBiZWxvdywgYWxsIG9mIHRoZSBmaWxlcyBhcmUgdW5kZXIgYW4KLUlTQy1zdHlsZSBsaWNlbmNlIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgaG9sZGVycywgZmlyc3QgZm9yIHRoZQotZmlsZXMgZnJvbSBPcGVuQlNEJ3MgbnRwZDoKLQotSGVubmluZyBCcmF1ZXIKLUFsZXhhbmRlciBHdXkKLQotYW5kIHRoZSBwb3J0YWJpbGl0eSBsYXllcjoKLQotRGFycmVuIFR1Y2tlcgotRGFtaWVuIE1pbGxlcgotSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bQotVG9kZCBDLiBNaWxsZXIKLUFudGhvbnkgTy5aYWJlbGluCi0KLS8qCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIE1JTkQsIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCi0gKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi1TcGVjaWZpYyBwYXJ0cyBvZiB0aGUgcG9ydGFiaWxpdHkgbGF5ZXIgaGF2ZSB0aGUgZm9sbG93aW5nIGxpY2VuY2VzLgotCi1ic2Qtc25wcmludGYuYyBpcyBmcm9tIE9wZW5TU0ggYW5kIGhhcyB0aGUgZm9sbG93aW5nIGxpY2VuY2U6Ci0vKgotICogQ29weXJpZ2h0IFBhdHJpY2sgUG93ZWxsIDE5OTUKLSAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF0cmljayBQb3dlbGwKLSAqIChwYXBvd2VsbEBhc3RhcnQuY29tKSBJdCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UgYXMgbG9uZyBhcyB0aGlzCi0gKiBub3RpY2UgcmVtYWlucyBpbnRhY3Qgb24gYWxsIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqLwotCi1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBmcm9tIE9wZW5TU0ggb3IgT3BlbkJTRCBhbmQgYXJlIHVuZGVyIGEgMi10ZXJtCi1CU0QgbGljZW5zZSB3aXRoIHRoZSBub3RlZCBjb3B5cmlnaHQgaG9sZGVyczoKLQotYXRvbWljaW8uYzogVGhlbyBkZSBSYWFkdCwgQW5pbCBNYWRoYXZhcGVkZHkKLWF0b21pY2lvLmgsIGJzZC1wb2xsLmg6IFRoZW8gZGUgUmFhZHQKLQotLyoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBmcm9tIE9wZW5TU0ggYW5kIGFyZSB1bmRlciBhIDMtdGVybSBCU0QgbGljZW5zZQotd2l0aCB0aGUgbm90ZWQgY29weXJpZ2h0IGhvbGRlcnM6Ci0KLWZha2UtcmZjMjU1My5jLCBmYWtlLXJmYzI1NTMuaDogV0lERSBQcm9qZWN0LCBEYW1pZW4gTWlsbGVyLgotZGFlbW9uLmMsIHN5cy1xdWV1ZS5oOiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0KLS8qCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotJElkOiBMSUNFTkNFLHYgMS42IDIwMDUvMDcvMDMgMTQ6MDI6NDAgZHR1Y2tlciBFeHAgJAotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1vcGVuc3NsL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIExJQ0VOU0UgSVNTVUVTCi0gID09PT09PT09PT09PT09Ci0KLSAgVGhlIE9wZW5TU0wgdG9vbGtpdCBzdGF5cyB1bmRlciBhIGR1YWwgbGljZW5zZSwgaS5lLiBib3RoIHRoZSBjb25kaXRpb25zIG9mCi0gIHRoZSBPcGVuU1NMIExpY2Vuc2UgYW5kIHRoZSBvcmlnaW5hbCBTU0xlYXkgbGljZW5zZSBhcHBseSB0byB0aGUgdG9vbGtpdC4KLSAgU2VlIGJlbG93IGZvciB0aGUgYWN0dWFsIGxpY2Vuc2UgdGV4dHMuIEFjdHVhbGx5IGJvdGggbGljZW5zZXMgYXJlIEJTRC1zdHlsZQotICBPcGVuIFNvdXJjZSBsaWNlbnNlcy4gSW4gY2FzZSBvZiBhbnkgbGljZW5zZSBpc3N1ZXMgcmVsYXRlZCB0byBPcGVuU1NMCi0gIHBsZWFzZSBjb250YWN0IG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KLQotICBPcGVuU1NMIExpY2Vuc2UKLSAgLS0tLS0tLS0tLS0tLS0tCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKLSAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKLSAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZwotICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQotICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICovCi0KLSBPcmlnaW5hbCBTU0xlYXkgTGljZW5zZQotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KLSAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKLSAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgotICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcwotICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCi0gKgotICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KLSAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KLSAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KLSAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKLSAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQotICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKLSAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQotICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCi0gKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQotICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCi0gKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKLSAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKLSAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCi0gKi8KLQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wY3JlL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUENSRSBMSUNFTkNFCi0KLVBsZWFzZSBzZWUgdGhlIGZpbGUgTElDRU5DRSBpbiB0aGUgUENSRSBkaXN0cmlidXRpb24gZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgotCi1FbmQKLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGl4bWFuL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBpcyB0aGUgTUlUIGxpY2Vuc2UsIGFncmVlZCB1cG9uIGJ5IG1vc3QgY29udHJpYnV0b3JzLgotQ29weXJpZ2h0IGhvbGRlcnMgb2YgbmV3IGNvZGUgc2hvdWxkIHVzZSB0aGlzIGxpY2Vuc2Ugc3RhdGVtZW50IHdoZXJlCi1wb3NzaWJsZS4gVGhleSBtYXkgYWxzbyBhZGQgdGhlbXNlbHZlcyB0byB0aGUgbGlzdCBiZWxvdy4KLQotLyoKLSAqIENvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAotICogQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5ODkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAxOTk5LCAyMDA0LCAyMDA4IEtlaXRoIFBhY2thcmQKLSAqIENvcHlyaWdodCAyMDAwIFN1U0UsIEluYy4KLSAqIENvcHlyaWdodCAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBSZWQgSGF0LCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwNCBOaWNob2xhcyBNaWVsbAotICogQ29weXJpZ2h0IDIwMDUgTGFycyBLbm9sbCAmIFphY2sgUnVzaW4sIFRyb2xsdGVjaAotICogQ29weXJpZ2h0IDIwMDUgVHJvbGx0ZWNoIEFTCi0gKiBDb3B5cmlnaHQgMjAwNyBMdWNhIEJhcmJhdG8KLSAqIENvcHlyaWdodCAyMDA4IEFhcm9uIFBsYXR0bmVyLCBOVklESUEgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAyMDA4IFJvZHJpZ28gS3VtcGVyYQotICogQ29weXJpZ2h0IDIwMDggQW5kcsOpIFR1cGluYW1iw6EKLSAqIENvcHlyaWdodCAyMDA4IE1vemlsbGEgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAyMDA4IEZyZWRlcmljIFBsb3VyZGUKLSAqIENvcHlyaWdodCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IDIwMDksIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCi0gKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcG9wdC9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMTk5OCAgUmVkIEhhdCBTb2Z0d2FyZQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLVggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCi1DT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1FeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCi1pbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29ydGl1bS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHJvY3BzL0NPUFlJTkcuTElCCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgIAkJICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKLSBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQotc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55Ci1vdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCi15b3VyIGxpYnJhcmllcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCi15b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKLW9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKLXlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKLWNvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKLXRoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCi1wZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KLQotICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAotdmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgotdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAotY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKLXBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcwotYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0KLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQotcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAotYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCi1hbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKLXNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cwotZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKLXdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwotdmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KLVN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKLWJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCi0iYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCi1saWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcm90b2J1Zi9DT1BZSU5HLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLXRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLUNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgY29tcGlsZXIgaXMgb3duZWQgYnkgdGhlIG93bmVyCi1vZiB0aGUgaW5wdXQgZmlsZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBpdC4gIFRoaXMgY29kZSBpcyBub3QKLXN0YW5kYWxvbmUgYW5kIHJlcXVpcmVzIGEgc3VwcG9ydCBsaWJyYXJ5IHRvIGJlIGxpbmtlZCB3aXRoIGl0LiAgVGhpcwotc3VwcG9ydCBsaWJyYXJ5IGlzIGl0c2VsZiBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBsaWNlbnNlLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1weS1jdXJsL0NPUFlJTkcyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNPUFlSSUdIVCBBTkQgUEVSTUlTU0lPTiBOT1RJQ0UKLQotQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggYnkgS2pldGlsIEphY29ic2VuIDxramV0aWxqYSBhdCBnbWFpbC5jb20+Ci1Db3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBieSBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzIGF0IG9iZXJodW1lci5jb20+Ci0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlCi13aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOCi1OTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKLURBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgotT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UKLU9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdAotYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCi1pbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1weS1nZmxhZ3MvQ09QWUlORwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDYsIEdvb2dsZSBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLWluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLWRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLWNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi10aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1weS1odHRwbGliMi9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUh0dHBsaWIyIFNvZnR3YXJlIExpY2Vuc2UKLQotQ29weXJpZ2h0IChjKSAyMDA2IGJ5IEpvZSBHcmVnb3JpbwotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgotb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KLWZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCi1pbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAotcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKLWFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCi1zdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLWluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwotT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLU5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKLUJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgotQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KLUNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXB5LW9hdXRoMi9MSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgTUlUIExpY2Vuc2UKLQotQ29weXJpZ2h0IChjKSAyMDA3IExlYWggQ3VsdmVyCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHktdXJpLXRlbXBsYXRlcy9DT1BZUklHSFQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IDIwMTEtMjAxMiBKb2UgR3JlZ29yaW8KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci11c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQotb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLUxpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHl0aG9uLWNyeXB0by9DT1BZUklHSFQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgb2YgdGhlIFB5dGhvbiBDcnlwdG9ncmFwaHkgVG9vbGtpdCAoIlB5Q3J5cHRvIik6Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotUHJldmlvdXNseSwgdGhlIGNvcHlyaWdodCBhbmQvb3IgbGljZW5zaW5nIHN0YXR1cyBvZiB0aGUgUHl0aG9uCi1DcnlwdG9ncmFwaHkgVG9vbGtpdCAoIlB5Q3J5cHRvIikgaGFkIGJlZW4gc29tZXdoYXQgYW1iaWd1b3VzLiAgVGhlCi1vcmlnaW5hbCBpbnRlbnRpb24gb2YgQW5kcmV3IE0uIEt1Y2hsaW5nIGFuZCBvdGhlciBjb250cmlidXRvcnMgaGFzCi1iZWVuIHRvIGRlZGljYXRlIFB5Q3J5cHRvIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBidXQgdGhhdCBpbnRlbnRpb24gd2FzCi1ub3QgbmVjZXNzYXJpbHkgbWFkZSBjbGVhciBpbiB0aGUgb3JpZ2luYWwgZGlzY2xhaW1lciAoc2VlCi1MRUdBTC9jb3B5L0xJQ0VOU0Uub3JpZykuCi0KLUFkZGl0aW9uYWxseSwgc29tZSBmaWxlcyB3aXRoaW4gUHlDcnlwdG8gaGFkIHNwZWNpZmllZCB0aGVpciBvd24KLWxpY2Vuc2VzIHRoYXQgZGlmZmVyZWQgZnJvbSB0aGUgUHlDcnlwdG8gbGljZW5zZSBpdHNlbGYuICBGb3IgZXhhbXBsZSwKLXRoZSBvcmlnaW5hbCBSSVBFTUQuYyBtb2R1bGUgc2ltcGx5IGhhZCBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgYW5kCi13YXJyYW50eSBkaXNjbGFpbWVyLCB3aXRob3V0IGNsZWFybHkgc3BlY2lmeWluZyBhbnkgbGljZW5zZSB0ZXJtcy4KLShBbiB1cGRhdGVkIHZlcnNpb24gb24gdGhlIGF1dGhvcidzIHdlYnNpdGUgY2FtZSB3aXRoIGEgbGljZW5zZSB0aGF0Ci1jb250YWluZWQgYSBHUEwtaW5jb21wYXRpYmxlIGFkdmVydGlzaW5nIGNsYXVzZS4pCi0KLVRvIHJlY3RpZnkgdGhpcyBzaXR1YXRpb24gZm9yIFB5Q3J5cHRvIDIuMSwgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlCi1iZWVuIHRha2VuOgotCi0gMS4gT2J0YWluaW5nIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSB0aGUgb3JpZ2luYWwgY29udHJpYnV0b3JzIHRvCi0gICAgZGVkaWNhdGUgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGUgcHVibGljIGRvbWFpbiBpZiB0aGV5IGhhdmUgbm90Ci0gICAgYWxyZWFkeSBkb25lIHNvLiAgKFNlZSB0aGUgIkxFR0FML2NvcHkvc3RtdHMiIGRpcmVjdG9yeSBmb3IKLSAgICBjb250cmlidXRvcnMnIHN0YXRlbWVudHMuKQotCi0gMi4gUmVwbGFjaW5nIHNvbWUgbW9kdWxlcyB3aXRoIGNsZWFybHktbGljZW5zZWQgY29kZSBmcm9tIG90aGVyCi0gICAgc291cmNlcyAoZS5nLiB0aGUgREVTIGFuZCBERVMzIG1vZHVsZXMgd2VyZSByZXBsYWNlZCB3aXRoIG5ldyBvbmVzCi0gICAgYmFzZWQgb24gVG9tIFN0LiBEZW5pcydzIHB1YmxpYy1kb21haW4gTGliVG9tQ3J5cHQgbGlicmFyeS4pCi0KLSAzLiBSZXBsYWNpbmcgc29tZSBtb2R1bGVzIHdpdGggY29kZSB3cml0dGVuIGZyb20gc2NyYXRjaCAoZS5nLiB0aGUKLSAgICBSSVBFTUQgYW5kIEJsb3dmaXNoIG1vZHVsZXMgd2VyZSByZS1pbXBsZW1lbnRlZCBmcm9tIHRoZWlyCi0gICAgcmVzcGVjdGl2ZSBhbGdvcml0aG0gc3BlY2lmaWNhdGlvbnMgd2l0aG91dCByZWZlcmVuY2UgdG8gdGhlIG9sZAotICAgIGltcGxlbWVudGF0aW9ucykuCi0KLSA0LiBSZW1vdmluZyBzb21lIG1vZHVsZXMgYWx0b2dldGhlciB3aXRob3V0IHJlcGxhY2luZyB0aGVtLgotCi1UbyB0aGUgYmVzdCBvZiBvdXIga25vd2xlZGdlLCB3aXRoIHRoZSBleGNlcHRpb25zIG5vdGVkIGJlbG93IG9yCi13aXRoaW4gdGhlIGZpbGVzIHRoZW1zZWx2ZXMsIHRoZSBmaWxlcyB0aGF0IGNvbnN0aXR1dGUgUHlDcnlwdG8gYXJlIGluCi10aGUgcHVibGljIGRvbWFpbi4gIE1vc3QgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGZvbGxvd2luZyBub3RpY2U6Ci0KLSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgZGVkaWNhdGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluLiAgVG8KLSAgdGhlIGV4dGVudCB0aGF0IGRlZGljYXRpb24gdG8gdGhlIHB1YmxpYyBkb21haW4gaXMgbm90IGF2YWlsYWJsZSwKLSAgZXZlcnlvbmUgaXMgZ3JhbnRlZCBhIHdvcmxkd2lkZSwgcGVycGV0dWFsLCByb3lhbHR5LWZyZWUsCi0gIG5vbi1leGNsdXNpdmUgbGljZW5zZSB0byBleGVyY2lzZSBhbGwgcmlnaHRzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgY29udGVudHMgb2YgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSB3aGF0c29ldmVyLgotICBObyByaWdodHMgYXJlIHJlc2VydmVkLgotCi0gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLSAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUwotICBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KLSAgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KLSAgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotICBTT0ZUV0FSRS4KLQotRXhjZXB0aW9uOgotCi0gLSBQb3J0aW9ucyBvZiBITUFDLnB5IGFuZCBzZXR1cC5weSBhcmUgZGVyaXZlZCBmcm9tIFB5dGhvbiAyLjIsIGFuZAotICAgYXJlIHRoZXJlZm9yZSBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uIChBbGwgUmlnaHRzIFJlc2VydmVkKS4gIFRoZXkgYXJlIGxpY2Vuc2VkIGJ5IHRoZSBQU0YKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgUHl0aG9uIDIuMiBsaWNlbnNlLiAgKFNlZSB0aGUgZmlsZQotICAgTEVHQUwvY29weS9MSUNFTlNFLnB5dGhvbi0yLjIgZm9yIGRldGFpbHMuKQotCi1FWFBPUlQgUkVTVFJJQ1RJT05TOgotCi1Ob3RlIHRoYXQgdGhlIGV4cG9ydCBvciByZS1leHBvcnQgb2YgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSBhbmQvb3IKLXNvdXJjZSBjb2RlIG1heSBiZSBzdWJqZWN0IHRvIHJlZ3VsYXRpb24gaW4geW91ciBqdXJpc2RpY3Rpb24uCi0KLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHl0aG9uL0xJQ0VOU0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQS4gSElTVE9SWSBPRiBUSEUgU09GVFdBUkUKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVB5dGhvbiB3YXMgY3JlYXRlZCBpbiB0aGUgZWFybHkgMTk5MHMgYnkgR3VpZG8gdmFuIFJvc3N1bSBhdCBTdGljaHRpbmcKLU1hdGhlbWF0aXNjaCBDZW50cnVtIChDV0ksIHNlZSBodHRwOi8vd3d3LmN3aS5ubCkgaW4gdGhlIE5ldGhlcmxhbmRzCi1hcyBhIHN1Y2Nlc3NvciBvZiBhIGxhbmd1YWdlIGNhbGxlZCBBQkMuICBHdWlkbyByZW1haW5zIFB5dGhvbidzCi1wcmluY2lwYWwgYXV0aG9yLCBhbHRob3VnaCBpdCBpbmNsdWRlcyBtYW55IGNvbnRyaWJ1dGlvbnMgZnJvbSBvdGhlcnMuCi0KLUluIDE5OTUsIEd1aWRvIGNvbnRpbnVlZCBoaXMgd29yayBvbiBQeXRob24gYXQgdGhlIENvcnBvcmF0aW9uIGZvcgotTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMgKENOUkksIHNlZSBodHRwOi8vd3d3LmNucmkucmVzdG9uLnZhLnVzKQotaW4gUmVzdG9uLCBWaXJnaW5pYSB3aGVyZSBoZSByZWxlYXNlZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZQotc29mdHdhcmUuCi0KLUluIE1heSAyMDAwLCBHdWlkbyBhbmQgdGhlIFB5dGhvbiBjb3JlIGRldmVsb3BtZW50IHRlYW0gbW92ZWQgdG8KLUJlT3Blbi5jb20gdG8gZm9ybSB0aGUgQmVPcGVuIFB5dGhvbkxhYnMgdGVhbS4gIEluIE9jdG9iZXIgb2YgdGhlIHNhbWUKLXllYXIsIHRoZSBQeXRob25MYWJzIHRlYW0gbW92ZWQgdG8gRGlnaXRhbCBDcmVhdGlvbnMgKG5vdyBab3BlCi1Db3Jwb3JhdGlvbiwgc2VlIGh0dHA6Ly93d3cuem9wZS5jb20pLiAgSW4gMjAwMSwgdGhlIFB5dGhvbiBTb2Z0d2FyZQotRm91bmRhdGlvbiAoUFNGLCBzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BzZi8pIHdhcyBmb3JtZWQsIGEKLW5vbi1wcm9maXQgb3JnYW5pemF0aW9uIGNyZWF0ZWQgc3BlY2lmaWNhbGx5IHRvIG93biBQeXRob24tcmVsYXRlZAotSW50ZWxsZWN0dWFsIFByb3BlcnR5LiAgWm9wZSBDb3Jwb3JhdGlvbiBpcyBhIHNwb25zb3JpbmcgbWVtYmVyIG9mCi10aGUgUFNGLgotCi1BbGwgUHl0aG9uIHJlbGVhc2VzIGFyZSBPcGVuIFNvdXJjZSAoc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcgZm9yCi10aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbikuICBIaXN0b3JpY2FsbHksIG1vc3QsIGJ1dCBub3QgYWxsLCBQeXRob24KLXJlbGVhc2VzIGhhdmUgYWxzbyBiZWVuIEdQTC1jb21wYXRpYmxlOyB0aGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcwotdGhlIHZhcmlvdXMgcmVsZWFzZXMuCi0KLSAgICBSZWxlYXNlICAgICAgICAgRGVyaXZlZCAgICAgWWVhciAgICAgICAgT3duZXIgICAgICAgR1BMLQotICAgICAgICAgICAgICAgICAgICBmcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlPyAoMSkKLQotICAgIDAuOS4wIHRocnUgMS4yICAgICAgICAgICAgICAxOTkxLTE5OTUgICBDV0kgICAgICAgICB5ZXMKLSAgICAxLjMgdGhydSAxLjUuMiAgMS4yICAgICAgICAgMTk5NS0xOTk5ICAgQ05SSSAgICAgICAgeWVzCi0gICAgMS42ICAgICAgICAgICAgIDEuNS4yICAgICAgIDIwMDAgICAgICAgIENOUkkgICAgICAgIG5vCi0gICAgMi4wICAgICAgICAgICAgIDEuNiAgICAgICAgIDIwMDAgICAgICAgIEJlT3Blbi5jb20gIG5vCi0gICAgMS42LjEgICAgICAgICAgIDEuNiAgICAgICAgIDIwMDEgICAgICAgIENOUkkgICAgICAgIHllcyAoMikKLSAgICAyLjEgICAgICAgICAgICAgMi4wKzEuNi4xICAgMjAwMSAgICAgICAgUFNGICAgICAgICAgbm8KLSAgICAyLjAuMSAgICAgICAgICAgMi4wKzEuNi4xICAgMjAwMSAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4xLjEgICAgICAgICAgIDIuMSsyLjAuMSAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMiAgICAgICAgICAgICAyLjEuMSAgICAgICAyMDAxICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjEuMiAgICAgICAgICAgMi4xLjEgICAgICAgMjAwMiAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4xLjMgICAgICAgICAgIDIuMS4yICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMi4xICAgICAgICAgICAyLjIgICAgICAgICAyMDAyICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjIuMiAgICAgICAgICAgMi4yLjEgICAgICAgMjAwMiAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4yLjMgICAgICAgICAgIDIuMi4yICAgICAgIDIwMDMgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMyAgICAgICAgICAgICAyLjIuMiAgICAgICAyMDAyLTIwMDMgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjMuMSAgICAgICAgICAgMi4zICAgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4zLjIgICAgICAgICAgIDIuMy4xICAgICAgIDIwMDItMjAwMyAgIFBTRiAgICAgICAgIHllcwotICAgIDIuMy4zICAgICAgICAgICAyLjMuMiAgICAgICAyMDAyLTIwMDMgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjMuNCAgICAgICAgICAgMi4zLjMgICAgICAgMjAwNCAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi4zLjUgICAgICAgICAgIDIuMy40ICAgICAgIDIwMDUgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNCAgICAgICAgICAgICAyLjMgICAgICAgICAyMDA0ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjQuMSAgICAgICAgICAgMi40ICAgICAgICAgMjAwNSAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi40LjIgICAgICAgICAgIDIuNC4xICAgICAgIDIwMDUgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNC4zICAgICAgICAgICAyLjQuMiAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjQuNCAgICAgICAgICAgMi40LjMgICAgICAgMjAwNiAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi41ICAgICAgICAgICAgIDIuNCAgICAgICAgIDIwMDYgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNS4xICAgICAgICAgICAyLjUgICAgICAgICAyMDA3ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjUuMiAgICAgICAgICAgMi41LjEgICAgICAgMjAwOCAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi41LjMgICAgICAgICAgIDIuNS4yICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNiAgICAgICAgICAgICAyLjUgICAgICAgICAyMDA4ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjYuMSAgICAgICAgICAgMi42ICAgICAgICAgMjAwOCAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi42LjIgICAgICAgICAgIDIuNi4xICAgICAgIDIwMDkgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNi4zICAgICAgICAgICAyLjYuMiAgICAgICAyMDA5ICAgICAgICBQU0YgICAgICAgICB5ZXMKLSAgICAyLjYuNCAgICAgICAgICAgMi42LjMgICAgICAgMjAwOSAgICAgICAgUFNGICAgICAgICAgeWVzCi0gICAgMi42LjUgICAgICAgICAgIDIuNi40ICAgICAgIDIwMTAgICAgICAgIFBTRiAgICAgICAgIHllcwotICAgIDIuNyAgICAgICAgICAgICAyLjYgICAgICAgICAyMDEwICAgICAgICBQU0YgICAgICAgICB5ZXMKLQotRm9vdG5vdGVzOgotCi0oMSkgR1BMLWNvbXBhdGlibGUgZG9lc24ndCBtZWFuIHRoYXQgd2UncmUgZGlzdHJpYnV0aW5nIFB5dGhvbiB1bmRlcgotICAgIHRoZSBHUEwuICBBbGwgUHl0aG9uIGxpY2Vuc2VzLCB1bmxpa2UgdGhlIEdQTCwgbGV0IHlvdSBkaXN0cmlidXRlCi0gICAgYSBtb2RpZmllZCB2ZXJzaW9uIHdpdGhvdXQgbWFraW5nIHlvdXIgY2hhbmdlcyBvcGVuIHNvdXJjZS4gIFRoZQotICAgIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2VzIG1ha2UgaXQgcG9zc2libGUgdG8gY29tYmluZSBQeXRob24gd2l0aAotICAgIG90aGVyIHNvZnR3YXJlIHRoYXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTDsgdGhlIG90aGVycyBkb24ndC4KLQotKDIpIEFjY29yZGluZyB0byBSaWNoYXJkIFN0YWxsbWFuLCAxLjYuMSBpcyBub3QgR1BMLWNvbXBhdGlibGUsCi0gICAgYmVjYXVzZSBpdHMgbGljZW5zZSBoYXMgYSBjaG9pY2Ugb2YgbGF3IGNsYXVzZS4gIEFjY29yZGluZyB0bwotICAgIENOUkksIGhvd2V2ZXIsIFN0YWxsbWFuJ3MgbGF3eWVyIGhhcyB0b2xkIENOUkkncyBsYXd5ZXIgdGhhdCAxLjYuMQotICAgIGlzICJub3QgaW5jb21wYXRpYmxlIiB3aXRoIHRoZSBHUEwuCi0KLVRoYW5rcyB0byB0aGUgbWFueSBvdXRzaWRlIHZvbHVudGVlcnMgd2hvIGhhdmUgd29ya2VkIHVuZGVyIEd1aWRvJ3MKLWRpcmVjdGlvbiB0byBtYWtlIHRoZXNlIHJlbGVhc2VzIHBvc3NpYmxlLgotCi0KLUIuIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBBQ0NFU1NJTkcgT1IgT1RIRVJXSVNFIFVTSU5HIFBZVEhPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVBZVEhPTiBTT0ZUV0FSRSBGT1VOREFUSU9OIExJQ0VOU0UgVkVSU0lPTiAyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBUaGlzIExJQ0VOU0UgQUdSRUVNRU5UIGlzIGJldHdlZW4gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0oIlBTRiIpLCBhbmQgdGhlIEluZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uICgiTGljZW5zZWUiKSBhY2Nlc3NpbmcgYW5kCi1vdGhlcndpc2UgdXNpbmcgdGhpcyBzb2Z0d2FyZSAoIlB5dGhvbiIpIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQKLWl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCi0KLTIuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQsIFBTRiBoZXJlYnkKLWdyYW50cyBMaWNlbnNlZSBhIG5vbmV4Y2x1c2l2ZSwgcm95YWx0eS1mcmVlLCB3b3JsZC13aWRlIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLAotYW5hbHl6ZSwgdGVzdCwgcGVyZm9ybSBhbmQvb3IgZGlzcGxheSBwdWJsaWNseSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLAotZGlzdHJpYnV0ZSwgYW5kIG90aGVyd2lzZSB1c2UgUHl0aG9uIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sCi1wcm92aWRlZCwgaG93ZXZlciwgdGhhdCBQU0YncyBMaWNlbnNlIEFncmVlbWVudCBhbmQgUFNGJ3Mgbm90aWNlIG9mIGNvcHlyaWdodCwKLWkuZS4sICJDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKLVB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkIiBhcmUgcmV0YWluZWQgaW4gUHl0aG9uIGFsb25lIG9yCi1pbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uIHByZXBhcmVkIGJ5IExpY2Vuc2VlLgotCi0zLiBJbiB0aGUgZXZlbnQgTGljZW5zZWUgcHJlcGFyZXMgYSBkZXJpdmF0aXZlIHdvcmsgdGhhdCBpcyBiYXNlZCBvbgotb3IgaW5jb3Jwb3JhdGVzIFB5dGhvbiBvciBhbnkgcGFydCB0aGVyZW9mLCBhbmQgd2FudHMgdG8gbWFrZQotdGhlIGRlcml2YXRpdmUgd29yayBhdmFpbGFibGUgdG8gb3RoZXJzIGFzIHByb3ZpZGVkIGhlcmVpbiwgdGhlbgotTGljZW5zZWUgaGVyZWJ5IGFncmVlcyB0byBpbmNsdWRlIGluIGFueSBzdWNoIHdvcmsgYSBicmllZiBzdW1tYXJ5IG9mCi10aGUgY2hhbmdlcyBtYWRlIHRvIFB5dGhvbi4KLQotNC4gUFNGIGlzIG1ha2luZyBQeXRob24gYXZhaWxhYmxlIHRvIExpY2Vuc2VlIG9uIGFuICJBUyBJUyIKLWJhc2lzLiAgUFNGIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELiAgQlkgV0FZIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgUFNGIE1BS0VTIE5PIEFORAotRElTQ0xBSU1TIEFOWSBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUwotRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFBZVEhPTiBXSUxMIE5PVAotSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFJJR0hUUy4KLQotNS4gUFNGIFNIQUxMIE5PVCBCRSBMSUFCTEUgVE8gTElDRU5TRUUgT1IgQU5ZIE9USEVSIFVTRVJTIE9GIFBZVEhPTgotRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgTE9TUyBBUwotQSBSRVNVTFQgT0YgTU9ESUZZSU5HLCBESVNUUklCVVRJTkcsIE9SIE9USEVSV0lTRSBVU0lORyBQWVRIT04sCi1PUiBBTlkgREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCi0KLTYuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB1cG9uIGEgbWF0ZXJpYWwKLWJyZWFjaCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0KLTcuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBkZWVtZWQgdG8gY3JlYXRlIGFueQotcmVsYXRpb25zaGlwIG9mIGFnZW5jeSwgcGFydG5lcnNoaXAsIG9yIGpvaW50IHZlbnR1cmUgYmV0d2VlbiBQU0YgYW5kCi1MaWNlbnNlZS4gIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgUFNGCi10cmFkZW1hcmtzIG9yIHRyYWRlIG5hbWUgaW4gYSB0cmFkZW1hcmsgc2Vuc2UgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi1wcm9kdWN0cyBvciBzZXJ2aWNlcyBvZiBMaWNlbnNlZSwgb3IgYW55IHRoaXJkIHBhcnR5LgotCi04LiBCeSBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIG90aGVyd2lzZSB1c2luZyBQeXRob24sIExpY2Vuc2VlCi1hZ3JlZXMgdG8gYmUgYm91bmQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZQotQWdyZWVtZW50LgotCi0KLUJFT1BFTi5DT00gTElDRU5TRSBBR1JFRU1FTlQgRk9SIFBZVEhPTiAyLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQkVPUEVOIFBZVEhPTiBPUEVOIFNPVVJDRSBMSUNFTlNFIEFHUkVFTUVOVCBWRVJTSU9OIDEKLQotMS4gVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIEJlT3Blbi5jb20gKCJCZU9wZW4iKSwgaGF2aW5nIGFuCi1vZmZpY2UgYXQgMTYwIFNhcmF0b2dhIEF2ZW51ZSwgU2FudGEgQ2xhcmEsIENBIDk1MDUxLCBhbmQgdGhlCi1JbmRpdmlkdWFsIG9yIE9yZ2FuaXphdGlvbiAoIkxpY2Vuc2VlIikgYWNjZXNzaW5nIGFuZCBvdGhlcndpc2UgdXNpbmcKLXRoaXMgc29mdHdhcmUgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtIGFuZCBpdHMgYXNzb2NpYXRlZAotZG9jdW1lbnRhdGlvbiAoInRoZSBTb2Z0d2FyZSIpLgotCi0yLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEJlT3BlbiBQeXRob24gTGljZW5zZQotQWdyZWVtZW50LCBCZU9wZW4gaGVyZWJ5IGdyYW50cyBMaWNlbnNlZSBhIG5vbi1leGNsdXNpdmUsCi1yb3lhbHR5LWZyZWUsIHdvcmxkLXdpZGUgbGljZW5zZSB0byByZXByb2R1Y2UsIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0KLWFuZC9vciBkaXNwbGF5IHB1YmxpY2x5LCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MsIGRpc3RyaWJ1dGUsIGFuZAotb3RoZXJ3aXNlIHVzZSB0aGUgU29mdHdhcmUgYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiwKLXByb3ZpZGVkLCBob3dldmVyLCB0aGF0IHRoZSBCZU9wZW4gUHl0aG9uIExpY2Vuc2UgaXMgcmV0YWluZWQgaW4gdGhlCi1Tb2Z0d2FyZSwgYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4KLQotMy4gQmVPcGVuIGlzIG1ha2luZyB0aGUgU29mdHdhcmUgYXZhaWxhYmxlIHRvIExpY2Vuc2VlIG9uIGFuICJBUyBJUyIKLWJhc2lzLiAgQkVPUEVOIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELiAgQlkgV0FZIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgQkVPUEVOIE1BS0VTIE5PIEFORAotRElTQ0xBSU1TIEFOWSBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUwotRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBXSUxMIE5PVAotSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFJJR0hUUy4KLQotNC4gQkVPUEVOIFNIQUxMIE5PVCBCRSBMSUFCTEUgVE8gTElDRU5TRUUgT1IgQU5ZIE9USEVSIFVTRVJTIE9GIFRIRQotU09GVFdBUkUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgTE9TUwotQVMgQSBSRVNVTFQgT0YgVVNJTkcsIE1PRElGWUlORyBPUiBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFLCBPUiBBTlkKLURFUklWQVRJVkUgVEhFUkVPRiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBUSEVSRU9GLgotCi01LiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCi1icmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgotCi02LiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGdvdmVybmVkIGJ5IGFuZCBpbnRlcnByZXRlZCBpbiBhbGwKLXJlc3BlY3RzIGJ5IHRoZSBsYXcgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIGV4Y2x1ZGluZyBjb25mbGljdCBvZgotbGF3IHByb3Zpc2lvbnMuICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZGVlbWVkIHRvCi1jcmVhdGUgYW55IHJlbGF0aW9uc2hpcCBvZiBhZ2VuY3ksIHBhcnRuZXJzaGlwLCBvciBqb2ludCB2ZW50dXJlCi1iZXR3ZWVuIEJlT3BlbiBhbmQgTGljZW5zZWUuICBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGRvZXMgbm90IGdyYW50Ci1wZXJtaXNzaW9uIHRvIHVzZSBCZU9wZW4gdHJhZGVtYXJrcyBvciB0cmFkZSBuYW1lcyBpbiBhIHRyYWRlbWFyawotc2Vuc2UgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIG9yIHNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkKLXRoaXJkIHBhcnR5LiAgQXMgYW4gZXhjZXB0aW9uLCB0aGUgIkJlT3BlbiBQeXRob24iIGxvZ29zIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9sb2dvcy5odG1sIG1heSBiZSB1c2VkIGFjY29yZGluZyB0byB0aGUKLXBlcm1pc3Npb25zIGdyYW50ZWQgb24gdGhhdCB3ZWIgcGFnZS4KLQotNy4gQnkgY29weWluZywgaW5zdGFsbGluZyBvciBvdGhlcndpc2UgdXNpbmcgdGhlIHNvZnR3YXJlLCBMaWNlbnNlZQotYWdyZWVzIHRvIGJlIGJvdW5kIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UKLUFncmVlbWVudC4KLQotCi1DTlJJIExJQ0VOU0UgQUdSRUVNRU5UIEZPUiBQWVRIT04gMS42LjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBUaGlzIExJQ0VOU0UgQUdSRUVNRU5UIGlzIGJldHdlZW4gdGhlIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbAotUmVzZWFyY2ggSW5pdGlhdGl2ZXMsIGhhdmluZyBhbiBvZmZpY2UgYXQgMTg5NSBQcmVzdG9uIFdoaXRlIERyaXZlLAotUmVzdG9uLCBWQSAyMDE5MSAoIkNOUkkiKSwgYW5kIHRoZSBJbmRpdmlkdWFsIG9yIE9yZ2FuaXphdGlvbgotKCJMaWNlbnNlZSIpIGFjY2Vzc2luZyBhbmQgb3RoZXJ3aXNlIHVzaW5nIFB5dGhvbiAxLjYuMSBzb2Z0d2FyZSBpbgotc291cmNlIG9yIGJpbmFyeSBmb3JtIGFuZCBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLgotCi0yLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LCBDTlJJCi1oZXJlYnkgZ3JhbnRzIExpY2Vuc2VlIGEgbm9uZXhjbHVzaXZlLCByb3lhbHR5LWZyZWUsIHdvcmxkLXdpZGUKLWxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBhbmFseXplLCB0ZXN0LCBwZXJmb3JtIGFuZC9vciBkaXNwbGF5IHB1YmxpY2x5LAotcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIHVzZSBQeXRob24gMS42LjEKLWFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sIHByb3ZpZGVkLCBob3dldmVyLCB0aGF0IENOUkkncwotTGljZW5zZSBBZ3JlZW1lbnQgYW5kIENOUkkncyBub3RpY2Ugb2YgY29weXJpZ2h0LCBpLmUuLCAiQ29weXJpZ2h0IChjKQotMTk5NS0yMDAxIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlczsgQWxsIFJpZ2h0cwotUmVzZXJ2ZWQiIGFyZSByZXRhaW5lZCBpbiBQeXRob24gMS42LjEgYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUKLXZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWUuICBBbHRlcm5hdGVseSwgaW4gbGlldSBvZiBDTlJJJ3MgTGljZW5zZQotQWdyZWVtZW50LCBMaWNlbnNlZSBtYXkgc3Vic3RpdHV0ZSB0aGUgZm9sbG93aW5nIHRleHQgKG9taXR0aW5nIHRoZQotcXVvdGVzKTogIlB5dGhvbiAxLjYuMSBpcyBtYWRlIGF2YWlsYWJsZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgaW4gQ05SSSdzIExpY2Vuc2UgQWdyZWVtZW50LiAgVGhpcyBBZ3JlZW1lbnQgdG9nZXRoZXIgd2l0aAotUHl0aG9uIDEuNi4xIG1heSBiZSBsb2NhdGVkIG9uIHRoZSBJbnRlcm5ldCB1c2luZyB0aGUgZm9sbG93aW5nCi11bmlxdWUsIHBlcnNpc3RlbnQgaWRlbnRpZmllciAoa25vd24gYXMgYSBoYW5kbGUpOiAxODk1LjIyLzEwMTMuICBUaGlzCi1BZ3JlZW1lbnQgbWF5IGFsc28gYmUgb2J0YWluZWQgZnJvbSBhIHByb3h5IHNlcnZlciBvbiB0aGUgSW50ZXJuZXQKLXVzaW5nIHRoZSBmb2xsb3dpbmcgVVJMOiBodHRwOi8vaGRsLmhhbmRsZS5uZXQvMTg5NS4yMi8xMDEzIi4KLQotMy4gSW4gdGhlIGV2ZW50IExpY2Vuc2VlIHByZXBhcmVzIGEgZGVyaXZhdGl2ZSB3b3JrIHRoYXQgaXMgYmFzZWQgb24KLW9yIGluY29ycG9yYXRlcyBQeXRob24gMS42LjEgb3IgYW55IHBhcnQgdGhlcmVvZiwgYW5kIHdhbnRzIHRvIG1ha2UKLXRoZSBkZXJpdmF0aXZlIHdvcmsgYXZhaWxhYmxlIHRvIG90aGVycyBhcyBwcm92aWRlZCBoZXJlaW4sIHRoZW4KLUxpY2Vuc2VlIGhlcmVieSBhZ3JlZXMgdG8gaW5jbHVkZSBpbiBhbnkgc3VjaCB3b3JrIGEgYnJpZWYgc3VtbWFyeSBvZgotdGhlIGNoYW5nZXMgbWFkZSB0byBQeXRob24gMS42LjEuCi0KLTQuIENOUkkgaXMgbWFraW5nIFB5dGhvbiAxLjYuMSBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gIkFTIElTIgotYmFzaXMuICBDTlJJIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELiAgQlkgV0FZIE9GIEVYQU1QTEUsIEJVVCBOT1QgTElNSVRBVElPTiwgQ05SSSBNQUtFUyBOTyBBTkQKLURJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKLUZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBQWVRIT04gMS42LjEgV0lMTCBOT1QKLUlORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCi0KLTUuIENOUkkgU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBBTlkgT1RIRVIgVVNFUlMgT0YgUFlUSE9OCi0xLjYuMSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NTIEFTCi1BIFJFU1VMVCBPRiBNT0RJRllJTkcsIERJU1RSSUJVVElORywgT1IgT1RIRVJXSVNFIFVTSU5HIFBZVEhPTiAxLjYuMSwKLU9SIEFOWSBERVJJVkFUSVZFIFRIRVJFT0YsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRi4KLQotNi4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHVwb24gYSBtYXRlcmlhbAotYnJlYWNoIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLQotNy4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgZmVkZXJhbAotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhdyBvZiB0aGUgVW5pdGVkIFN0YXRlcywgaW5jbHVkaW5nIHdpdGhvdXQKLWxpbWl0YXRpb24gdGhlIGZlZGVyYWwgY29weXJpZ2h0IGxhdywgYW5kLCB0byB0aGUgZXh0ZW50IHN1Y2gKLVUuUy4gZmVkZXJhbCBsYXcgZG9lcyBub3QgYXBwbHksIGJ5IHRoZSBsYXcgb2YgdGhlIENvbW1vbndlYWx0aCBvZgotVmlyZ2luaWEsIGV4Y2x1ZGluZyBWaXJnaW5pYSdzIGNvbmZsaWN0IG9mIGxhdyBwcm92aXNpb25zLgotTm90d2l0aHN0YW5kaW5nIHRoZSBmb3JlZ29pbmcsIHdpdGggcmVnYXJkIHRvIGRlcml2YXRpdmUgd29ya3MgYmFzZWQKLW9uIFB5dGhvbiAxLjYuMSB0aGF0IGluY29ycG9yYXRlIG5vbi1zZXBhcmFibGUgbWF0ZXJpYWwgdGhhdCB3YXMKLXByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB0aGUKLWxhdyBvZiB0aGUgQ29tbW9ud2VhbHRoIG9mIFZpcmdpbmlhIHNoYWxsIGdvdmVybiB0aGlzIExpY2Vuc2UKLUFncmVlbWVudCBvbmx5IGFzIHRvIGlzc3VlcyBhcmlzaW5nIHVuZGVyIG9yIHdpdGggcmVzcGVjdCB0bwotUGFyYWdyYXBocyA0LCA1LCBhbmQgNyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgTm90aGluZyBpbiB0aGlzCi1MaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBkZWVtZWQgdG8gY3JlYXRlIGFueSByZWxhdGlvbnNoaXAgb2YKLWFnZW5jeSwgcGFydG5lcnNoaXAsIG9yIGpvaW50IHZlbnR1cmUgYmV0d2VlbiBDTlJJIGFuZCBMaWNlbnNlZS4gIFRoaXMKLUxpY2Vuc2UgQWdyZWVtZW50IGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIENOUkkgdHJhZGVtYXJrcyBvcgotdHJhZGUgbmFtZSBpbiBhIHRyYWRlbWFyayBzZW5zZSB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgb3IKLXNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkgdGhpcmQgcGFydHkuCi0KLTguIEJ5IGNsaWNraW5nIG9uIHRoZSAiQUNDRVBUIiBidXR0b24gd2hlcmUgaW5kaWNhdGVkLCBvciBieSBjb3B5aW5nLAotaW5zdGFsbGluZyBvciBvdGhlcndpc2UgdXNpbmcgUHl0aG9uIDEuNi4xLCBMaWNlbnNlZSBhZ3JlZXMgdG8gYmUKLWJvdW5kIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LgotCi0gICAgICAgIEFDQ0VQVAotCi0KLUNXSSBMSUNFTlNFIEFHUkVFTUVOVCBGT1IgUFlUSE9OIDAuOS4wIFRIUk9VR0ggMS4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgKGMpIDE5OTEgLSAxOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0gQW1zdGVyZGFtLAotVGhlIE5ldGhlcmxhbmRzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAotQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgotcGVybWlzc2lvbi4KLQotU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKLU9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNkcGFybS9DT1BZSU5HCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwNS0yMDEwIERvdWdsYXMgR2lsYmVydC4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLTMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLUFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1GT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLU9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLUxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zcWxpdGUvTElDRU5TRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TUUxpdGUgQ29weXJpZ2h0IChodHRwOi8vd3d3LnNxbGl0ZS5vcmcvY29weXJpZ2h0Lmh0bWwpCi0KLUFsbCBvZiB0aGUgZGVsaXZlcmFibGUgY29kZSBpbiBTUUxpdGUgaGFzIGJlZW4gZGVkaWNhdGVkIHRvIHRoZSBwdWJsaWMKLWRvbWFpbiBieSB0aGUgYXV0aG9ycy4gQWxsIGNvZGUgYXV0aG9ycywgYW5kIHJlcHJlc2VudGF0aXZlcyBvZiB0aGUKLWNvbXBhbmllcyB0aGV5IHdvcmsgZm9yLCBoYXZlIHNpZ25lZCBhZmZpZGF2aXRzIGRlZGljYXRpbmcgdGhlaXIKLWNvbnRyaWJ1dGlvbnMgdG8gdGhlIHB1YmxpYyBkb21haW4gYW5kIG9yaWdpbmFscyBvZiB0aG9zZSBzaWduZWQgYWZmaWRhdml0cwotYXJlIHN0b3JlZCBpbiBhIGZpcmVzYWZlIGF0IHRoZSBtYWluIG9mZmljZXMgb2YgSHdhY2kuIEFueW9uZSBpcyBmcmVlIHRvCi1jb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3IgZGlzdHJpYnV0ZSB0aGUgb3JpZ2luYWwgU1FMaXRlCi1jb2RlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkIGJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLAotY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueSBtZWFucy4KLQotVGhlIHByZXZpb3VzIHBhcmFncmFwaCBhcHBsaWVzIHRvIHRoZSBkZWxpdmVyYWJsZSBjb2RlIGluIFNRTGl0ZSAtIHRob3NlCi1wYXJ0cyBvZiB0aGUgU1FMaXRlIGxpYnJhcnkgdGhhdCB5b3UgYWN0dWFsbHkgYnVuZGxlIGFuZCBzaGlwIHdpdGggYSBsYXJnZXIKLWFwcGxpY2F0aW9uLiBQb3J0aW9ucyBvZiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgc29tZSBjb2RlIHVzZWQgYXMgcGFydCBvZiB0aGUKLWJ1aWxkIHByb2Nlc3MgbWlnaHQgZmFsbCB1bmRlciBvdGhlciBsaWNlbnNlcy4gVGhlIGRldGFpbHMgaGVyZSBhcmUgdW5jbGVhci4KLVdlIGRvIG5vdCB3b3JyeSBhYm91dCB0aGUgbGljZW5zaW5nIG9mIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBidWlsZCBjb2RlIHNvCi1tdWNoIGJlY2F1c2Ugbm9uZSBvZiB0aGVzZSB0aGluZ3MgYXJlIHBhcnQgb2YgdGhlIGNvcmUgZGVsaXZlcmFibGUgU1FMaXRlCi1saWJyYXJ5LgotCi1BbGwgb2YgdGhlIGRlbGl2ZXJhYmxlIGNvZGUgaW4gU1FMaXRlIGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoLiBObyBjb2RlCi1oYXMgYmVlbiB0YWtlbiBmcm9tIG90aGVyIHByb2plY3RzIG9yIGZyb20gdGhlIG9wZW4gaW50ZXJuZXQuIEV2ZXJ5IGxpbmUgb2YKLWNvZGUgY2FuIGJlIHRyYWNlZCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBhdXRob3IsIGFuZCBhbGwgb2YgdGhvc2UgYXV0aG9ycwotaGF2ZSBwdWJsaWMgZG9tYWluIGRlZGljYXRpb25zIG9uIGZpbGUuIFNvIHRoZSBTUUxpdGUgY29kZSBiYXNlIGlzIGNsZWFuIGFuZAotaXMgdW5jb250YW1pbmF0ZWQgd2l0aCBsaWNlbnNlZCBjb2RlIGZyb20gb3RoZXIgcHJvamVjdHMuCi0KLU9idGFpbmluZyBBbiBFeHBsaWNpdCBMaWNlbnNlIFRvIFVzZSBTUUxpdGUKLQotRXZlbiB0aG91Z2ggU1FMaXRlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgbGljZW5zZSwKLXNvbWUgdXNlcnMgd2FudCB0byBvYnRhaW4gYSBsaWNlbnNlIGFueXdheS4gU29tZSByZWFzb25zIGZvciBvYnRhaW5pbmcgYQotbGljZW5zZSBpbmNsdWRlOgotCi1Zb3UgYXJlIHVzaW5nIFNRTGl0ZSBpbiBhIGp1cmlzZGljdGlvbiB0aGF0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcHVibGljCi1kb21haW4uCi1Zb3UgYXJlIHVzaW5nIFNRTGl0ZSBpbiBhIGp1cmlzZGljdGlvbiB0aGF0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmlnaHQgb2YKLWFuIGF1dGhvciB0byBkZWRpY2F0ZSB0aGVpciB3b3JrIHRvIHRoZSBwdWJsaWMgZG9tYWluLgotWW91IHdhbnQgdG8gaG9sZCBhIHRhbmdpYmxlIGxlZ2FsIGRvY3VtZW50IGFzIGV2aWRlbmNlIHRoYXQgeW91IGhhdmUgdGhlCi1sZWdhbCByaWdodCB0byB1c2UgYW5kIGRpc3RyaWJ1dGUgU1FMaXRlLgotWW91ciBsZWdhbCBkZXBhcnRtZW50IHRlbGxzIHlvdSB0aGF0IHlvdSBoYXZlIHRvIHB1cmNoYXNlIGEgbGljZW5zZS4KLUlmIHlvdSBmZWVsIGxpa2UgeW91IHJlYWxseSBoYXZlIHRvIHB1cmNoYXNlIGEgbGljZW5zZSBmb3IgU1FMaXRlLCBId2FjaSwKLXRoZSBjb21wYW55IHRoYXQgZW1wbG95cyB0aGUgYXJjaGl0ZWN0IGFuZCBwcmluY2lwYWwgZGV2ZWxvcGVycyBvZiBTUUxpdGUsCi13aWxsIHNlbGwgeW91IG9uZS4KLQotQ29udHJpYnV0ZWQgQ29kZQotCi1JbiBvcmRlciB0byBrZWVwIFNRTGl0ZSBjb21wbGV0ZWx5IGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBieSBjb3B5cmlnaHQsIGFsbAotbmV3IGNvbnRyaWJ1dG9ycyB0byB0aGUgU1FMaXRlIGNvZGUgYmFzZSBhcmUgYXNrZWQgdG8gZGVkaWNhdGUgdGhlaXIKLWNvbnRyaWJ1dGlvbnMgdG8gdGhlIHB1YmxpYyBkb21haW4uIElmIHlvdSB3YW50IHRvIHNlbmQgYSBwYXRjaCBvcgotZW5oYW5jZW1lbnQgZm9yIHBvc3NpYmxlIGluY2x1c2lvbiBpbiB0aGUgU1FMaXRlIHNvdXJjZSB0cmVlLCBwbGVhc2UKLWFjY29tcGFueSB0aGUgcGF0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudDoKLQotVGhlIGF1dGhvciBvciBhdXRob3JzIG9mIHRoaXMgY29kZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QKLWluIHRoaXMgY29kZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0Ci1vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmQgc3VjY2Vzc29ycy4gV2UKLWludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mIHJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YKLWFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXMgY29kZSB1bmRlciBjb3B5cmlnaHQgbGF3LgotV2UgYXJlIG5vdCBhYmxlIHRvIGFjY2VwdCBwYXRjaGVzIG9yIGNoYW5nZXMgdG8gU1FMaXRlIHRoYXQgYXJlIG5vdAotYWNjb21wYW5pZWQgYnkgYSBzdGF0ZW1lbnQgc3VjaCBhcyB0aGUgYWJvdmUuIEluIGFkZGl0aW9uLCBpZiB5b3UgbWFrZQotY2hhbmdlcyBvciBlbmhhbmNlbWVudHMgYXMgYW4gZW1wbG95ZWUsIHRoZW4gYSBzaW1wbGUgc3RhdGVtZW50IHN1Y2ggYXMgdGhlCi1hYm92ZSBpcyBpbnN1ZmZpY2llbnQuIFlvdSBtdXN0IGFsc28gc2VuZCBieSBzdXJmYWNlIG1haWwgYSBjb3B5cmlnaHQKLXJlbGVhc2Ugc2lnbmVkIGJ5IGEgY29tcGFueSBvZmZpY2VyLiBBIHNpZ25lZCBvcmlnaW5hbCBvZiB0aGUgY29weXJpZ2h0Ci1yZWxlYXNlIHNob3VsZCBiZSBtYWlsZWQgdG86Ci0KLUh3YWNpCi02MjAwIE1hcGxlIENvdmUgTGFuZQotQ2hhcmxvdHRlLCBOQyAyODI2OQotVVNBCi1BIHRlbXBsYXRlIGNvcHlyaWdodCByZWxlYXNlIGlzIGF2YWlsYWJsZSBpbiBQREYgb3IgSFRNTC4gWW91IGNhbiB1c2UgdGhpcwotcmVsZWFzZSB0byBtYWtlIGZ1dHVyZSBjaGFuZ2VzLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdHJhY2UvQ09QWVJJR0hUCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMTk5MSwgMTk5MiBQYXVsIEtyYW5lbmJ1cmcgPHBrQGNzLmZldy5ldXIubmw+Ci1Db3B5cmlnaHQgKGMpIDE5OTMgQnJhbmtvIExhbmtlc3RlciA8YnJhbmtvQGhhY2t0aWMubmw+Ci1Db3B5cmlnaHQgKGMpIDE5OTMgVWxyaWNoIFBlZ2Vsb3cgPHBlZ2Vsb3dAbW9vcmVhLnVuaS1tdWVuc3Rlci5kZT4KLUNvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBNaWNoYWVsIEVsaXphYmV0aCBDaGFzdGFpbiA8bWVjQGR1cmFjZWYuc2hvdXQubmV0PgotQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+Ci1Db3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBXaWNoZXJ0IEFra2VybWFuIDx3YWtrZXJtYUBkZWVwaGFja21vZGUub3JnPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0zLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLVRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSRJZCQKLQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGlmZi9DT1BZUklHSFQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKLUNvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLWl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKLXRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLWFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgotU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgotcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgotcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi1FWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUlOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgotQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKLU9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKLVdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKLU9GIFRISVMgU09GVFdBUkUuCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRvb2xib3gvTk9USUNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IG5vciB0aGUgbmFtZXMKLSAgIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAgIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCi1CVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKLU9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAotQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi1PRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotCi0KLUNvcHlyaWdodCAoYykgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdC4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLSAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCBub3IgdGhlIG5hbWVzCi0gICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gICBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1DT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAotQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCi1PRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKLUFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLU9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi1TVUNIIERBTUFHRS4KLQotCi1Db3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Qgbm9yIHRoZSBuYW1lcwotICAgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICAgcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi1GT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKLUJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECi1BTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi1PUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLU9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotU1VDSCBEQU1BR0UuCi0KLQotQ29weXJpZ2h0IChjKSAxOTk4IFJvYmVydCBOb3JkaWVyCi1Db3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKLSAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLUtldmluIEZhbGwuCi1UaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5Ci1LZWl0aCBNdWxsZXIgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgU2FuIERpZWdvIGFuZCBMYW5jZQotVmlzc2VyIG9mIENvbnZleCBDb21wdXRlciBDb3Jwb3JhdGlvbi4KLVRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLU1pa2UgTXV1c3MuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi1BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi1BUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLUZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi1EQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotU1VDSCBEQU1BR0UuCi0KLQotIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MwotCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQotIEtldmluIEZhbGwuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0KLSBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQKLQlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKLSBLZWl0aCBNdWxsZXIgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgU2FuIERpZWdvIGFuZCBMYW5jZQotIFZpc3NlciBvZiBDb252ZXggQ29tcHV0ZXIgQ29ycG9yYXRpb24uCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIFNVQ0ggREFNQUdFLgotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRveWJveC9MSUNFTlNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoQykgMjAwNiwgMjAxMSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLXB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLUFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLU9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLShOb3RlOiBzb21lIGJ1aWxkIGluZnJhc3RydWN0dXJlIGluIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSBpcyBzdGlsbCBHUEwsCi1jbGVhbmluZyB0aGF0IG91dCBpcyBhIFRPRE8gaXRlbSwgYnV0IGl0IGRvZXNuJ3QgYWZmZWN0IHRoZSByZXN1bHRpbmcKLWJpbmFyeS4pCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRzbGliL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAotcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCi1hZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICBNQSAwMjExMS0xMzA3LCBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZlcml0eS9MSUNFTlNFLm1ha2VmaWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIFRoZSBDaHJvbWl1bSBPUyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13ZWJwL0NPUFlJTkcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgZGlzdHJpYnV0aW9uLgotCi0gICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQotICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1IT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXdoZXRzdG9uZS9DT1BZUklHSFQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIEMgQ29udmVydGVkIFdoZXRzdG9uZSBEb3VibGUgUHJlY2lzaW9uIEJlbmNobWFyawotICoJCVZlcnNpb24gMS4yCTIyIE1hcmNoIDE5OTgKLSAqCi0gKgkoYykgQ29weXJpZ2h0IDE5OTggUGFpbnRlciBFbmdpbmVlcmluZywgSW5jLgotICoJCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICoJCVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGR1cGxpY2F0ZSwgYW5kCi0gKgkJcHVibGlzaCB0aGlzIHRleHQgYW5kIHByb2dyYW0gYXMgbG9uZyBhcyBpdAotICoJCWluY2x1ZGVzIHRoaXMgZW50aXJlIGNvbW1lbnQgYmxvY2sgYW5kIGxpbWl0ZWQKLSAqCQlyaWdodHMgcmVmZXJlbmNlLgotICoKLSAqIENvbnZlcnRlZCBieSBSaWNoIFBhaW50ZXIsIFBhaW50ZXIgRW5naW5lZXJpbmcsIEluYy4gYmFzZWQgb24gdGhlCi0gKiB3d3cubmV0bGliLm9yZyBiZW5jaG1hcmsvd2hldHN0b25lZCB2ZXJzaW9uIG9idGFpbmVkIDE2IE1hcmNoIDE5OTguCi0gKgotICogQSBub3ZlbCBhcHByb2FjaCB3YXMgdXNlZCBoZXJlIHRvIGtlZXAgdGhlIGxvb2sgYW5kIGZlZWwgb2YgdGhlCi0gKiBGT1JUUkFOIHZlcnNpb24uICBBbHRlcmluZyB0aGUgRk9SVFJBTi1iYXNlZCBhcnJheSBpbmRpY2VzLAotICogc3RhcnRpbmcgYXQgZWxlbWVudCAxLCB0byBzdGFydCBhdCBlbGVtZW50IDAgZm9yIEMsIHdvdWxkIHJlcXVpcmUKLSAqIG51bWVyb3VzIGNoYW5nZXMsIGluY2x1ZGluZyBkZWNyZW1lbnRpbmcgdGhlIHZhcmlhYmxlIGluZGljZXMgYnkgMS4KLSAqIEluc3RlYWQsIHRoZSBhcnJheSBFMVtdIHdhcyBkZWNsYXJlZCAxIGVsZW1lbnQgbGFyZ2VyIGluIEMuICBUaGlzCi0gKiBhbGxvd3MgdGhlIEZPUlRSQU4gaW5kZXggcmFuZ2UgdG8gZnVuY3Rpb24gd2l0aG91dCBhbnkgbGl0ZXJhbCBvcgotICogdmFyaWFibGUgaW5kaWNlcyBjaGFuZ2VzLiAgVGhlIGFycmF5IGVsZW1lbnQgRTFbMF0gaXMgc2ltcGx5IG5ldmVyCi0gKiB1c2VkIGFuZCBkb2VzIG5vdCBhbHRlciB0aGUgYmVuY2htYXJrIHJlc3VsdHMuCi0gKgotICogVGhlIG1ham9yIEZPUlRSQU4gY29tbWVudCBibG9ja3Mgd2VyZSByZXRhaW5lZCB0byBtaW5pbWl6ZQotICogZGlmZmVyZW5jZXMgYmV0d2VlbiB2ZXJzaW9ucy4gIE1vZHVsZXMgTjUgYW5kIE4xMiwgbGlrZSBpbiB0aGUKLSAqIEZPUlRSQU4gdmVyc2lvbiwgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQgaGVyZS4KLSAqCi0gKiBBbiBvcHRpb25hbCBjb21tYW5kLWxpbmUgYXJndW1lbnQgaGFzIGJlZW4gcHJvdmlkZWQgWy1jXSB0bwotICogb2ZmZXIgY29udGludW91cyByZXBldGl0aW9uIG9mIHRoZSBlbnRpcmUgYmVuY2htYXJrLgotICogQW4gb3B0aW9uYWwgYXJndW1lbnQgZm9yIHNldHRpbmcgYW4gYWx0ZXJuYXRlIExPT1AgY291bnQgaXMgYWxzbwotICogcHJvdmlkZWQuICBEZWZpbmUgUFJJTlRPVVQgdG8gY2F1c2UgdGhlIFBPVVQoKSBmdW5jdGlvbiB0byBwcmludAotICogb3V0cHV0cyBhdCB2YXJpb3VzIHN0YWdlcy4gIEZpbmFsIHRpbWluZyBtZWFzdXJlbWVudHMgc2hvdWxkIGJlCi0gKiBtYWRlIHdpdGggdGhlIFBSSU5UT1VUIHVuZGVmaW5lZC4KLSAqCi0gKiBRdWVzdGlvbnMgYW5kIGNvbW1lbnRzIG1heSBiZSBkaXJlY3RlZCB0byB0aGUgYXV0aG9yIGF0Ci0gKgkJCXIucGFpbnRlckBpZWVlLm9yZwotICovCi0vKgotQyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUMgICAgIEJlbmNobWFyayAjMiAtLSBEb3VibGUgIFByZWNpc2lvbiBXaGV0c3RvbmUgKEEwMDEpCi1DCi1DICAgICBvCVRoaXMgaXMgYSBSRUFMKjggdmVyc2lvbiBvZgotQwl0aGUgV2hldHN0b25lIGJlbmNobWFyayBwcm9ncmFtLgotQwotQyAgICAgbwlETy1sb29wIHNlbWFudGljcyBhcmUgQU5TSS02NiBjb21wYXRpYmxlLgotQwotQyAgICAgbwlGaW5hbCBtZWFzdXJlbWVudHMgYXJlIHRvIGJlIG1hZGUgd2l0aCBhbGwKLUMJV1JJVEUgc3RhdGVtZW50cyBhbmQgRk9STUFUIHN0dGVtZW50cyByZW1vdmVkLgotQwotQyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXpsaWIvUkVBRE1FCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVpMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCi0KLXpsaWIgMS4yLjcgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCi10aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKLShSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcwotaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MCAoemxpYiBmb3JtYXQpLCByZmMxOTUxIChkZWZsYXRlIGZvcm1hdCkgYW5kCi1yZmMxOTUyIChnemlwIGZvcm1hdCkuCi0KLUFsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCi0odm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IHpsaWJAZ3ppcC5vcmcpLiAgQSB1c2FnZSBleGFtcGxlCi1vZiB0aGUgbGlicmFyeSBpcyBnaXZlbiBpbiB0aGUgZmlsZSB0ZXN0L2V4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQKLXRoZSBsaWJyYXJ5IGlzIHdvcmtpbmcgY29ycmVjdGx5LiAgQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlCi10ZXN0L21pbmlnemlwLmMuICBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBpdHNlbGYgaXMgY29tcG9zZWQgb2YgYWxsIHNvdXJjZQotZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgotCi1UbyBjb21waWxlIGFsbCBmaWxlcyBhbmQgcnVuIHRoZSB0ZXN0IHByb2dyYW0sIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGdpdmVuIGF0Ci10aGUgdG9wIG9mIE1ha2VmaWxlLmluLiAgSW4gc2hvcnQgIi4vY29uZmlndXJlOyBtYWtlIHRlc3QiLCBhbmQgaWYgdGhhdCBnb2VzCi13ZWxsLCAibWFrZSBpbnN0YWxsIiBzaG91bGQgd29yayBmb3IgbW9zdCBmbGF2b3JzIG9mIFVuaXguICBGb3IgV2luZG93cywgdXNlCi1vbmUgb2YgdGhlIHNwZWNpYWwgbWFrZWZpbGVzIGluIHdpbjMyLyBvciBjb250cmliL3ZzdHVkaW8vIC4gIEZvciBWTVMsIHVzZQotbWFrZV92bXMuY29tLgotCi1RdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0byA8emxpYkBnemlwLm9yZz4sIG9yIHRvIEdpbGxlcyBWb2xsYW50Ci08aW5mb0B3aW5pbWFnZS5jb20+IGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbi4gIFRoZSB6bGliIGhvbWUgcGFnZSBpcwotaHR0cDovL3psaWIubmV0LyAuICBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0bwotdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7IG90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdAotdmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3Igbm90LgotCi1QTEVBU0UgcmVhZCB0aGUgemxpYiBGQVEgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwgYmVmb3JlIGFza2luZyBmb3IgaGVscC4KLQotTWFyayBOZWxzb24gPG1hcmtuQGllZWUub3JnPiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uICAxOTk3Ci1pc3N1ZSBvZiBEci4gIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLyAuCi0KLVRoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuNyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCi0KLVVuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSBjb250cmliLyAuCi0KLXpsaWIgaXMgYXZhaWxhYmxlIGluIEphdmEgdXNpbmcgdGhlIGphdmEudXRpbC56aXAgcGFja2FnZSwgZG9jdW1lbnRlZCBhdAotaHR0cDovL2phdmEuc3VuLmNvbS9kZXZlbG9wZXIvdGVjaG5pY2FsQXJ0aWNsZXMvUHJvZ3JhbW1pbmcvY29tcHJlc3Npb24vIC4KLQotQSBQZXJsIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyA8cG1xc0BjcGFuLm9yZz4gaXMgYXZhaWxhYmxlCi1hdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcywgaW5jbHVkaW5nCi1odHRwOi8vc2VhcmNoLmNwYW4ub3JnL35wbXFzL0lPLUNvbXByZXNzLVpsaWIvIC4KLQotQSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAYW1rLmNhPiBpcwotYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zLCBzZWUKLWh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS96bGliLmh0bWwgLgotCi16bGliIGlzIGJ1aWx0IGludG8gdGNsOiBodHRwOi8vd2lraS50Y2wudGsvNDYxMCAuCi0KLUFuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LCB3cml0dGVuIG9uIHRvcAotb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcyBhdmFpbGFibGUgaW4gdGhlCi1jb250cmliL21pbml6aXAgZGlyZWN0b3J5IG9mIHpsaWIuCi0KLQotTm90ZXMgZm9yIHNvbWUgdGFyZ2V0czoKLQotLSBGb3IgV2luZG93cyBETEwgdmVyc2lvbnMsIHBsZWFzZSBzZWUgd2luMzIvRExMX0ZBUS50eHQKLQotLSBGb3IgNjQtYml0IElyaXgsIGRlZmxhdGUuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi4gV2l0aAotICAtTywgb25lIGxpYnBuZyB0ZXN0IGZhaWxzLiBUaGUgdGVzdCB3b3JrcyBpbiAzMiBiaXQgbW9kZSAod2l0aCB0aGUgLW4zMgotICBjb21waWxlciBmbGFnKS4gVGhlIGNvbXBpbGVyIGJ1ZyBoYXMgYmVlbiByZXBvcnRlZCB0byBTR0kuCi0KLS0gemxpYiBkb2Vzbid0IHdvcmsgd2l0aCBnY2MgMi42LjMgb24gYSBERUMgMzAwMC8zMDBMWCB1bmRlciBPU0YvMSAyLjEgaXQgd29ya3MKLSAgd2hlbiBjb21waWxlZCB3aXRoIGNjLgotCi0tIE9uIERpZ2l0YWwgVW5peCA0LjBEIChmb3JtZWx5IE9TRi8xKSBvbiBBbHBoYVNlcnZlciwgdGhlIGNjIG9wdGlvbiAtc3RkMSBpcwotICBuZWNlc3NhcnkgdG8gZ2V0IGd6cHJpbnRmIHdvcmtpbmcgY29ycmVjdGx5LiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJlLgotCi0tIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzIHdpdGgKLSAgb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KLQotLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TIG9yIEJFT1MuCi0KLS0gRm9yIFBhbG1Pcywgc2VlIGh0dHA6Ly9wYWxtemxpYi5zb3VyY2Vmb3JnZS5uZXQvCi0KLQotQWNrbm93bGVkZ21lbnRzOgotCi0gIFRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5IHpsaWIgd2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LiAgVGhlIGRlZmxhdGUgYW5kCi0gIHpsaWIgc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuICBQZXRlciBEZXV0c2NoLiAgVGhhbmtzIHRvIGFsbCB0aGUKLSAgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7IHRoZXkKLSAgYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCi0KLUNvcHlyaWdodCBub3RpY2U6Ci0KLSAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLUlmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIHdlIHdvdWxkIGFwcHJlY2lhdGUgKm5vdCogcmVjZWl2aW5nCi1sZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyB0byBzaWduLiAgVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkIGZvciBmcmVlIGJ1dCB3aXRob3V0Ci13YXJyYW50eSBvZiBhbnkga2luZC4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIGVudGlyZWx5IHdyaXR0ZW4gYnkgSmVhbi1sb3VwCi1HYWlsbHkgYW5kIE1hcmsgQWRsZXI7IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhpcmQtcGFydHkgY29kZS4KLQotSWYgeW91IHJlZGlzdHJpYnV0ZSBtb2RpZmllZCBzb3VyY2VzLCB3ZSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGluY2x1ZGUgaW4KLXRoZSBmaWxlIENoYW5nZUxvZyBoaXN0b3J5IGluZm9ybWF0aW9uIGRvY3VtZW50aW5nIHlvdXIgY2hhbmdlcy4gIFBsZWFzZSByZWFkCi10aGUgRkFRIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgc291cmNlIHZlcnNpb25zLgotCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi16c2gvTElDRU5DRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgWiBTaGVsbCBpcyBjb3B5cmlnaHQgKGMpIDE5OTItMjAwOSBQYXVsIEZhbHN0YWQsIFJpY2hhcmQgQ29sZW1hbiwKLVpvbHThbiBIaWR26WdpLCBBbmRyZXcgTWFpbiwgUGV0ZXIgU3RlcGhlbnNvbiwgU3ZlbiBXaXNjaG5vd3NreSwgYW5kCi1vdGhlcnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgSW5kaXZpZHVhbCBhdXRob3JzLCB3aGV0aGVyIG9yIG5vdAotc3BlY2lmaWNhbGx5IG5hbWVkLCByZXRhaW4gY29weXJpZ2h0IGluIGFsbCBjaGFuZ2VzOyBpbiB3aGF0IGZvbGxvd3MsIHRoZXkKLWFyZSByZWZlcnJlZCB0byBhcyBgdGhlIFpzaCBEZXZlbG9wbWVudCBHcm91cCcuICBUaGlzIGlzIGZvciBjb252ZW5pZW5jZQotb25seSBhbmQgdGhpcyBib2R5IGhhcyBubyBsZWdhbCBzdGF0dXMuICBUaGUgWiBzaGVsbCBpcyBkaXN0cmlidXRlZCB1bmRlcgotdGhlIGZvbGxvd2luZyBsaWNlbmNlOyBhbnkgcHJvdmlzaW9ucyBtYWRlIGluIGluZGl2aWR1YWwgZmlsZXMgdGFrZQotcHJlY2VkZW5jZS4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgd2l0aG91dCB3cml0dGVuIGFncmVlbWVudCBhbmQgd2l0aG91dAotbGljZW5jZSBvciByb3lhbHR5IGZlZXMsIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi1zb2Z0d2FyZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLXB1cnBvc2UsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcKLXR3byBwYXJhZ3JhcGhzIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoaXMgc29mdHdhcmUuCi0KLUluIG5vIGV2ZW50IHNoYWxsIHRoZSBac2ggRGV2ZWxvcG1lbnQgR3JvdXAgYmUgbGlhYmxlIHRvIGFueSBwYXJ0eSBmb3IKLWRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBhcmlzaW5nIG91dAotb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiwgZXZlbiBpZiB0aGUgWnNoCi1EZXZlbG9wbWVudCBHcm91cCBoYXZlIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLVRoZSBac2ggRGV2ZWxvcG1lbnQgR3JvdXAgc3BlY2lmaWNhbGx5IGRpc2NsYWltIGFueSB3YXJyYW50aWVzLCBpbmNsdWRpbmcsCi1idXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzCi1mb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGUgc29mdHdhcmUgcHJvdmlkZWQgaGVyZXVuZGVyIGlzIG9uIGFuICJhcyBpcyIKLWJhc2lzLCBhbmQgdGhlIFpzaCBEZXZlbG9wbWVudCBHcm91cCBoYXZlIG5vIG9ibGlnYXRpb24gdG8gcHJvdmlkZQotbWFpbnRlbmFuY2UsIHN1cHBvcnQsIHVwZGF0ZXMsIGVuaGFuY2VtZW50cywgb3IgbW9kaWZpY2F0aW9ucy4KLQpkaWZmIC0tZ2l0IGEvbGVnYWwvbGljZW5zZXMvZWxmdXRpbHMvQ09QWUlORyBiL2xlZ2FsL2xpY2Vuc2VzL2VsZnV0aWxzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xlZ2FsL2xpY2Vuc2VzL2VsZnV0aWxzL0NPUFlJTkcKQEAgLTAsMCArMSw2NzQgQEAKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKK3NvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQordGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKK3lvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6CisoMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQorZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KKworICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKK2NoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bworYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KKworICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCitwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYworcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQoraGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCitwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCitvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KKworICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bworYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCittYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAorcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAwLiBEZWZpbml0aW9ucy4KKworICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKworICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKK0xpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCisgIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKK2luIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgorZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCitlYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KKworICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0uCisKKyAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAorcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCitjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAorZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKK3B1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KKworICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKK2EgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCisKKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCit0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyAgMS4gU291cmNlIENvZGUuCisKKyAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKK2Zvcm0gb2YgYSB3b3JrLgorCisgIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKKyAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKK3RoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCitwYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCitDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKK01ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgoraW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKKyJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQorKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KK3Byb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgorCisgIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKK3RoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKK3dvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KK2NvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncworU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Cit3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKK2luY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKK2xpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAorc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCitjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKK1NvdXJjZS4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKK3NhbWUgd29yay4KKworICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KKworICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgorY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKK2NvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKK3Blcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKK2NvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCityaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KKworICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Citjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucworaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQorb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Cit3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbworbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcworZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgorYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCit5b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgorCisgIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCit0aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKK21ha2VzIGl0IHVubmVjZXNzYXJ5LgorCisgIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCittZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKKzExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAorbWVhc3VyZXMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCitpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwordXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisgIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCisKKyAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91CityZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Citub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAorcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKKyAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAorYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KKworICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgorCisgIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCit0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAorICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KKworICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCisgICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCisgICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bworICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCisKKyAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcworICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcworICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3CisgICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubworICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKKyAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgorCisgICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKKyAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgorICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgorCisgIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKK3dvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCithbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAoraW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgorImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Cit1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCitiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK2luIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCitwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgorCisgIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCitvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKK21hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKK2luIG9uZSBvZiB0aGVzZSB3YXlzOgorCisgICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorCisgICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorCisgICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCisgICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCisgICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKworICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KKyAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KKworICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKKyAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCitvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCitpbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCitkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKK3Byb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQordHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCitvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgorYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0CitpcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAorY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKK3RoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgorCisgICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAorYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0CitzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAorY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisgIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKK21vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKK2JlZW4gaW5zdGFsbGVkIGluIFJPTSkuCisKKyAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgordGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQorbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAorcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KKworICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisgIDcuIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KK0FkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKK2JlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCitpdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKK3RoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCisgICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKworICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgorICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgorCisgICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgorICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQorICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgorCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCisgICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KKyAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKK2EgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcworTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCitvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcworbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCisKKyAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Cit0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyAgOC4gVGVybWluYXRpb24uCisKKyAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Citwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKK3BhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KKworICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgorbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCitwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCitmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Citob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucworcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgorCisgIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcworcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCityZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKK2NvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCisgIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKK3JlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCisKKyAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCisKKyAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCitydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgordG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKK25vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KK25vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQorY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KKworICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCitvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAord29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgorbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCitnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCit0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCisKKyAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQorbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCisKKyAgMTEuIFBhdGVudHMuCisKKyAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcworTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgorCisgIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcworb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgoraGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCitieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQorY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKK3B1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCit0aGlzIExpY2Vuc2UuCisKKyAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bworbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgorCisgIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCithZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKKyhzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KK3N1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQorcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgorCisgIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCithbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQordG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQorcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKK3RoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KK2F2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKK3BhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCitjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50CitsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQorY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaworaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Citjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgorCisgIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKK2NvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcworcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5CitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCit5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAord29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCisKKyAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCit0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcworY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCitzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCit3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcworaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAordG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKK3RoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5CitwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCitjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKK2NvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKK29yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCisKKyAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Cit0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKK3RoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcworTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisgIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQorb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCitwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Cit0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCitJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisgIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKKyAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcworbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgorCisgIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCitpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKKzxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS9sZWdhbC9saWNlbnNlcy9saWJ1bndpbmQvTElDRU5TRSBiL2xlZ2FsL2xpY2Vuc2VzL2xpYnVud2luZC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjQ0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9sZWdhbC9saWNlbnNlcy9saWJ1bndpbmQvTElDRU5TRQpAQCAtMCwwICsxLDE4IEBACitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9saW51eC9saW51eC5tayBiL2xpbnV4L2xpbnV4Lm1rCmluZGV4IDEzMjBlOWEuLjg4YjgzZjIgMTAwNjQ0Ci0tLSBhL2xpbnV4L2xpbnV4Lm1rCisrKyBiL2xpbnV4L2xpbnV4Lm1rCkBAIC00NSwxMCArNDUsNiBAQAogCUlOU1RBTExfTU9EX1BBVEg9JChUQVJHRVRfRElSKSBcCiAJQ1JPU1NfQ09NUElMRT0iJChDQ0FDSEUpICQoVEFSR0VUX0NST1NTKSIgXAogCURFUE1PRD0kKEhPU1RfRElSKS91c3Ivc2Jpbi9kZXBtb2QKLQlpbml0cmFtZnM9dHJ1ZQotIyAoaW5pdHJhbWZzPXRydWUgcmVwbGFjZXMgdGhlICQoaW5pdHJhbWZzKSBidWlsZCBjb21tYW5kIHdpdGggJ3RydWUnLAotIyBlZmZlY3RpdmVseSBtYWtpbmcgdGhlIGtlcm5lbCBidWlsZCBzY3JpcHRzIG5ldmVyIHJlcGxhY2UgdGhlIGluaXRyYW1mcwotIyB3aXRoIGEgZGlmZmVyZW50IG9uZTsgbWFraW5nIHRoZSBpbml0cmFtZnMgaXMgb3VyIGpvYiBpbiBidWlsZHJvb3QuKQogCiAjIEdldCB0aGUgcmVhbCBMaW51eCB2ZXJzaW9uLCB3aGljaCB0ZWxscyB1cyB3aGVyZSBrZXJuZWwgbW9kdWxlcyBhcmUKICMgZ29pbmcgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSB0YXJnZXQgZmlsZXN5c3RlbS4KZGlmZiAtLWdpdCBhL3BhY2thZ2UvQ29uZmlnLmluIGIvcGFja2FnZS9Db25maWcuaW4KaW5kZXggNDJhZDI1My4uN2Q4NTlmZCAxMDA2NDQKLS0tIGEvcGFja2FnZS9Db25maWcuaW4KKysrIGIvcGFja2FnZS9Db25maWcuaW4KQEAgLTM3Nyw2ICszNzcsNyBAQAogc291cmNlICJwYWNrYWdlL2xpYmNnaS9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGliY2dpY2MvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL2xpYmN1cmwvQ29uZmlnLmluIgorc291cmNlICJwYWNrYWdlL2xpYmN1cmxfMzIvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL2xpYmRuZXQvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL2xpYmVzbXRwL0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9saWJlWG9zaXAyL0NvbmZpZy5pbiIKQEAgLTQwNiwxMiArNDA3LDEyIEBACiBzb3VyY2UgInBhY2thZ2UvbGliYXJndGFibGUyL0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9hcmdwLXN0YW5kYWxvbmUvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL2Jvb3N0L0NvbmZpZy5pbiIKK3NvdXJjZSAicGFja2FnZS9lbGZ1dGlscy9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvZ3JwYy9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvZ29vZ2xldGVzdC9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGliYXRvbWljX29wcy9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGliY2FwL0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9saWJkYWVtb24vQ29uZmlnLmluIgotc291cmNlICJwYWNrYWdlL2xpYmVsZi9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGliZXZlbnQvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL2xpYmV2L0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9saWJmZmkvQ29uZmlnLmluIgpAQCAtNDE5LDYgKzQyMCw3IEBACiBzb3VyY2UgInBhY2thZ2UvbGliaWNhbC9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGlibnNwci9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbGlic2lnYy9Db25maWcuaW4iCitzb3VyY2UgInBhY2thZ2UvbGlidW53aW5kL0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9saWJ1cmN1L0NvbmZpZy5pbiIKIHNvdXJjZSAicGFja2FnZS9sdHRuZy1saWJ1c3QvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL29yYy9Db25maWcuaW4iCkBAIC03MDMsNiArNzA1LDcgQEAKIHNvdXJjZSAicGFja2FnZS9tdl9waHlzZGsvQ29uZmlnLmluIgogc291cmNlICJwYWNrYWdlL212X2FwcC9Db25maWcuaW4iCiBzb3VyY2UgInBhY2thZ2UvbXZfY3Bzcy9Db25maWcuaW4iCitzb3VyY2UgInBhY2thZ2UvZGVrX3Rvb2xzL0NvbmZpZy5pbiIKIGVuZG1lbnUKIAogbWVudSAiUXVhbnRlbm5hIGN1c3RvbSBidWlsZCIKZGlmZiAtLWdpdCBhL3BhY2thZ2UvTWFrZWZpbGUuaW4gYi9wYWNrYWdlL01ha2VmaWxlLmluCmluZGV4IGU1ZjcwYzIuLjRiMTFmOTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvTWFrZWZpbGUuaW4KKysrIGIvcGFja2FnZS9NYWtlZmlsZS5pbgpAQCAtMTMxLDcgKzEzMSw3IEBACiBTVFJJUF9TVFJJUF9BTEw6PS0tc3RyaXAtYWxsCiBUQVJHRVRfU1RSSVA9JChUQVJHRVRfQ1JPU1Mpc3RyaXAKIFNUUklQQ01EPSQoVEFSR0VUX0NST1NTKXN0cmlwIC0tcmVtb3ZlLXNlY3Rpb249LmNvbW1lbnQgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZQotS1NUUklQQ01EPSQoU1RSSVBDTUQpICQoU1RSSVBfU1RSSVBfVU5ORUVERUQpCitLU1RSSVBDTUQ9JChTVFJJUENNRCkgLS1zdHJpcC1kZWJ1ZwogZW5kaWYKIGlmZXEgKCQoQlIyX1NUUklQX3NzdHJpcCkseSkKIFNUUklQX0RJU0NBUkRfQUxMOj0KZGlmZiAtLWdpdCBhL3BhY2thZ2UvYXJncC1zdGFuZGFsb25lL2FyZ3Atc3RhbmRhbG9uZS1maXhfYnVpbGRfd2l0aF9jOTlfY29tcGlsZXJzLnBhdGNoIGIvcGFja2FnZS9hcmdwLXN0YW5kYWxvbmUvYXJncC1zdGFuZGFsb25lLWZpeF9idWlsZF93aXRoX2M5OV9jb21waWxlcnMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMGJiNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvYXJncC1zdGFuZGFsb25lL2FyZ3Atc3RhbmRhbG9uZS1maXhfYnVpbGRfd2l0aF9jOTlfY29tcGlsZXJzLnBhdGNoCkBAIC0wLDAgKzEsODAgQEAKK0Zyb20gYjJkZmEwMTFhM2ZkY2I3ZDIyNzY0ZDE0MzUxN2QwZmJkMWMyYTIwMSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEVtbWFudWVsIERyZXlmdXMgPG1hbnVAbmV0YnNkLm9yZz4KK0RhdGU6IFdlZCwgMjIgSmFuIDIwMTQgMTQ6NDc6MjMgKzAxMDAKK1N1YmplY3Q6IFtQQVRDSF0gRml4IGJ1aWxkIHdpdGggYzk5IGNvbXBpbGVycworCitCVUc6IDc2NDY1NQorQ2hhbmdlLUlkOiBJZjVkZmRjOWM3NDI3YmQzZDM5ZDhkYThmNzllMzNhZTJkYTZhMzEzNworU2lnbmVkLW9mZi1ieTogRW1tYW51ZWwgRHJleWZ1cyA8bWFudUBuZXRic2Qub3JnPgorUmV2aWV3ZWQtb246IGh0dHA6Ly9yZXZpZXcuZ2x1c3Rlci5vcmcvNjAzNAorUmV2aWV3ZWQtYnk6IEhhcnNoYXZhcmRoYW5hIDxoYXJzaGFAaGFyc2hhdmFyZGhhbmEubmV0PgorVGVzdGVkLWJ5OiBHbHVzdGVyIEJ1aWxkIFN5c3RlbSA8amVua2luc0BidWlsZC5nbHVzdGVyLmNvbT4KKy0tLQorCitkaWZmIC0tZ2l0IGEvYXJncC1mbXRzdHJlYW0uYyBiL2FyZ3AtZm10c3RyZWFtLmMKK2luZGV4IDdmNzkyODUuLjQ5NGI2YjMgMTAwNjQ0CistLS0gYS9hcmdwLWZtdHN0cmVhbS5jCisrKysgYi9hcmdwLWZtdHN0cmVhbS5jCitAQCAtMzg5LDYgKzM4OSw3IEBACisgd2Vha19hbGlhcyAoX19hcmdwX2ZtdHN0cmVhbV9wcmludGYsIGFyZ3BfZm10c3RyZWFtX3ByaW50ZikKKyAjZW5kaWYKKyAKKysjaWYgX19TVERDX1ZFUlNJT05fXyAtIDE5OTkwMEwgPCAxCisgLyogRHVwbGljYXRlIHRoZSBpbmxpbmUgZGVmaW5pdGlvbnMgaW4gYXJncC1mbXRzdHJlYW0uaCwgZm9yIGNvbXBpbGVycworICAqIHRoYXQgZG9uJ3QgZG8gaW5saW5pbmcuICovCisgc2l6ZV90CitAQCAtNDcxLDUgKzQ3Miw2IEBACisgICAgIF9fYXJncF9mbXRzdHJlYW1fdXBkYXRlIChfX2ZzKTsKKyAgIHJldHVybiBfX2ZzLT5wb2ludF9jb2wgPj0gMCA/IF9fZnMtPnBvaW50X2NvbCA6IDA7CisgfQorKyNlbmRpZiAvKiBfX1NURENfVkVSU0lPTl9fIC0gMTk5OTAwTCA8IDEgKi8KKyAKKyAjZW5kaWYgLyogIUFSR1BfRk1UU1RSRUFNX1VTRV9MSU5FV1JBUCAqLworZGlmZiAtLWdpdCBhL2FyZ3AtZm10c3RyZWFtLmggYi9hcmdwLWZtdHN0cmVhbS5oCitpbmRleCBlNzk3YjExLi44MjhmNDM1IDEwMDY0NAorLS0tIGEvYXJncC1mbXRzdHJlYW0uaAorKysrIGIvYXJncC1mbXRzdHJlYW0uaAorQEAgLTE1Myw2ICsxNTMsNyBAQAorIAkJCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCisgICAgICBQUklOVEZfU1RZTEUoMiwzKTsKKyAKKysjaWYgX19TVERDX1ZFUlNJT05fXyAtIDE5OTkwMEwgPCAxCisgZXh0ZXJuIGludCBfX2FyZ3BfZm10c3RyZWFtX3B1dGMgKGFyZ3BfZm10c3RyZWFtX3QgX19mcywgaW50IF9fY2gpOworIGV4dGVybiBpbnQgYXJncF9mbXRzdHJlYW1fcHV0YyAoYXJncF9mbXRzdHJlYW1fdCBfX2ZzLCBpbnQgX19jaCk7CisgCitAQCAtMTYzLDYgKzE2NCw3IEBACisgCQkJCSAgICAgIF9fY29uc3QgY2hhciAqX19zdHIsIHNpemVfdCBfX2xlbik7CisgZXh0ZXJuIHNpemVfdCBhcmdwX2ZtdHN0cmVhbV93cml0ZSAoYXJncF9mbXRzdHJlYW1fdCBfX2ZzLAorIAkJCQkgICAgX19jb25zdCBjaGFyICpfX3N0ciwgc2l6ZV90IF9fbGVuKTsKKysjZW5kaWYgLyogX19TVERDX1ZFUlNJT05fXyAtIDE5OTkwMEwgPCAxICovCisgDAorIC8qIEFjY2VzcyBtYWNyb3MgZm9yIHZhcmlvdXMgYml0cyBvZiBzdGF0ZS4gICovCisgI2RlZmluZSBhcmdwX2ZtdHN0cmVhbV9sbWFyZ2luKF9fZnMpICgoX19mcyktPmxtYXJnaW4pCitAQCAtMTcyLDYgKzE3NCw3IEBACisgI2RlZmluZSBfX2FyZ3BfZm10c3RyZWFtX3JtYXJnaW4gYXJncF9mbXRzdHJlYW1fcm1hcmdpbgorICNkZWZpbmUgX19hcmdwX2ZtdHN0cmVhbV93bWFyZ2luIGFyZ3BfZm10c3RyZWFtX3dtYXJnaW4KKyAKKysjaWYgX19TVERDX1ZFUlNJT05fXyAtIDE5OTkwMEwgPCAxCisgLyogU2V0IF9fRlMncyBsZWZ0IG1hcmdpbiB0byBMTUFSR0lOIGFuZCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4gICovCisgZXh0ZXJuIHNpemVfdCBhcmdwX2ZtdHN0cmVhbV9zZXRfbG1hcmdpbiAoYXJncF9mbXRzdHJlYW1fdCBfX2ZzLAorIAkJCQkJICBzaXplX3QgX19sbWFyZ2luKTsKK0BAIC0xOTMsNiArMTk2LDcgQEAKKyAvKiBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IHBvaW50IGluIF9fRlMuICAqLworIGV4dGVybiBzaXplX3QgYXJncF9mbXRzdHJlYW1fcG9pbnQgKGFyZ3BfZm10c3RyZWFtX3QgX19mcyk7CisgZXh0ZXJuIHNpemVfdCBfX2FyZ3BfZm10c3RyZWFtX3BvaW50IChhcmdwX2ZtdHN0cmVhbV90IF9fZnMpOworKyNlbmRpZiAvKiBfX1NURENfVkVSU0lPTl9fIC0gMTk5OTAwTCA8IDEgKi8KKyAKKyAvKiBJbnRlcm5hbCByb3V0aW5lcy4gICovCisgZXh0ZXJuIHZvaWQgX2FyZ3BfZm10c3RyZWFtX3VwZGF0ZSAoYXJncF9mbXRzdHJlYW1fdCBfX2ZzKTsKK0BAIC0yMTYsNyArMjIwLDExIEBACisgI2VuZGlmCisgCisgI2lmbmRlZiBBUkdQX0ZTX0VJCisrI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fR05VQ19TVERDX0lOTElORV9fKQorICNkZWZpbmUgQVJHUF9GU19FSSBleHRlcm4gaW5saW5lCisrI2Vsc2UKKysjZGVmaW5lIEFSR1BfRlNfRUkgaW5saW5lCisrI2VuZGlmCisgI2VuZGlmCisgCisgQVJHUF9GU19FSSBzaXplX3QKZGlmZiAtLWdpdCBhL3BhY2thZ2UvYXJncC1zdGFuZGFsb25lL2FyZ3Atc3RhbmRhbG9uZS5tayBiL3BhY2thZ2UvYXJncC1zdGFuZGFsb25lL2FyZ3Atc3RhbmRhbG9uZS5tawppbmRleCBhYzA4OTBkLi4wZjNiZWE0IDEwMDY0NAotLS0gYS9wYWNrYWdlL2FyZ3Atc3RhbmRhbG9uZS9hcmdwLXN0YW5kYWxvbmUubWsKKysrIGIvcGFja2FnZS9hcmdwLXN0YW5kYWxvbmUvYXJncC1zdGFuZGFsb25lLm1rCkBAIC0xOCw0ICsxOCwxMCBAQAogCSQoSU5TVEFMTCkgLUQgJChARCkvYXJncC5oICQoVEFSR0VUX0RJUikvdXNyL2luY2x1ZGUvYXJncC5oCiBlbmRlZgogCitBUkdQX1NUQU5EQUxPTkVfQ0ZMQUdTID0gJChUQVJHRVRfQ0ZMQUdTKQorQVJHUF9TVEFOREFMT05FX0NGTEFHUyArPSAtZlBJQworCitBUkdQX1NUQU5EQUxPTkVfQ09ORl9FTlYgKz0gXAorCUNGTEFHUz0iJChBUkdQX1NUQU5EQUxPTkVfQ0ZMQUdTKSIKKwogJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2JjbV9jb21tb24vYmNtX2NvbW1vbi5tayBiL3BhY2thZ2UvYmNtX2NvbW1vbi9iY21fY29tbW9uLm1rCmluZGV4IGViNGUwMmEuLmM3MTA4ZmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvYmNtX2NvbW1vbi9iY21fY29tbW9uLm1rCisrKyBiL3BhY2thZ2UvYmNtX2NvbW1vbi9iY21fY29tbW9uLm1rCkBAIC02OSw3ICs2OSw4IEBACiBVUlNSX1RPUD0ke0JDTV9ORVhVU19ESVJ9Ly4uIFwKIENPTU1PTl9EUk1fVE9QPSR7QkNNX0JTRUFWX0RJUn0vbGliL3NlY3VyaXR5L2NvbW1vbl9kcm0gXAogU0FHRV9TVVBQT1JUPSR7R09PR19TQUdFX1NVUFBPUlR9IFwKLVNBR0VfU0VDVVJFX01PREU9NgorU0FHRV9TRUNVUkVfTU9ERT02IFwKK1dJVEhfREVGUkFHPTEKIAogaWZlcSAoJChmaW5kc3RyaW5nICQoUExBVF9OT1FVT1RFUyksIDk3NDI1IDk3NDI4KSwgJChQTEFUX05PUVVPVEVTKSkKIEJDTV9NQUtFX0VOViArPSBXVkNETV9WRVJTSU9OPTIuMQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9iY21fbmV4dXMvYmNtX25leHVzLm1rIGIvcGFja2FnZS9iY21fbmV4dXMvYmNtX25leHVzLm1rCmluZGV4IDU0ZjQyMzMuLjgzOWYxNDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvYmNtX25leHVzL2JjbV9uZXh1cy5taworKysgYi9wYWNrYWdlL2JjbV9uZXh1cy9iY21fbmV4dXMubWsKQEAgLTkyLDYgKzkyLDcgQEAKIAlzZWQgLWkiIiAtZSAic0AkKEBEKUAvJChCQ01fTkVYVVNfU1RBR0lOR19QQVRIKUBnIiAtZSAic0BzdGQ9Yzg5QHN0ZD1jOTlAZyIgJChARCkvYmluL25leHVzLnBjCiAJJChJTlNUQUxMKSAtRCAkKEBEKS9iaW4vbmV4dXMucGMgJChTVEFHSU5HX0RJUikvdXNyL2xpYi9wa2djb25maWcvbmV4dXMucGMKIAkkKGNhbGwgQkNNX05FWFVTX0lOU1RBTExfTElCUywkKFNUQUdJTkdfRElSKSkKKwkkKElOU1RBTEwpIC1EICQoQEQpLy4uL0JTRUFWL2xpYi9zZWN1cml0eS90aGlyZF9wYXJ0eS93aWRldmluZS9DRU5DMjEvb2VtY3J5cHRvL2xpYi8kKEJDTV9BUkNIKS9ub25zYWdlL2xpYm9lbWNyeXB0by5hICQoU1RBR0lOR19ESVIpL3Vzci9saWIvbGlib2VtY3J5cHRvLmEKIGVuZGVmCiAKIGRlZmluZSBCQ01fTkVYVVNfSU5TVEFMTF9UQVJHRVRfQ01EUwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9iY21fcm9ja2ZvcmQvYmNtX3JvY2tmb3JkLm1rIGIvcGFja2FnZS9iY21fcm9ja2ZvcmQvYmNtX3JvY2tmb3JkLm1rCmluZGV4IDI4MGMxNTYuLmQ3YzY2MDEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvYmNtX3JvY2tmb3JkL2JjbV9yb2NrZm9yZC5taworKysgYi9wYWNrYWdlL2JjbV9yb2NrZm9yZC9iY21fcm9ja2ZvcmQubWsKQEAgLTQ4LDcgKzQ4LDcgQEAKIGVuZGlmCiAKIGRlZmluZSBCQ01fUk9DS0ZPUkRfQlVJTERfQ01EUwotCSQoQkNNX01BS0VfRU5WKSAkKEJDTV9ST0NLRk9SRF9ERUJVRykgTkVYVVNfQ0xJRU5UX1NVUFBPUlQ9eSAkKE1BS0UpICQoQkNNX01BS0VGTEFHUykgLUMgJChARCkvbWlkZGxld2FyZS92M2QvZHJpdmVyIC1mIFYzRERyaXZlci5taworCSQoQkNNX01BS0VfRU5WKSAkKEJDTV9ST0NLRk9SRF9ERUJVRykgTkVYVVNfQ0xJRU5UX1NVUFBPUlQ9eSAkKE1BS0UpICQoQkNNX01BS0VGTEFHUykgLUMgJChARCkvbWlkZGxld2FyZS92M2QvZHJpdmVyIC1mIFYzRERyaXZlci5tayAKIAkkKEJDTV9NQUtFX0VOVikgJChCQ01fUk9DS0ZPUkRfREVCVUcpIE5FWFVTX0NMSUVOVF9TVVBQT1JUPXkgJChNQUtFKSAkKEJDTV9NQUtFRkxBR1MpIC1DICQoQEQpL21pZGRsZXdhcmUvdjNkL3BsYXRmb3JtL25leHVzIC1mIHBsYXRmb3JtX25leHVzLm1rCiAJJChCQ01fTUFLRV9FTlYpICQoQkNNX1JPQ0tGT1JEX0RFQlVHKSBORVhVU19DTElFTlRfU1VQUE9SVD15IE5FWFVTX01PREU9Y2xpZW50ICQoTUFLRSkgJChCQ01fTUFLRUZMQUdTKSAtQyAkKEBEKS9hcHBsaWNhdGlvbnMva2hyb25vcy92M2QvbmV4dXMvY3ViZQogCSQoQkNNX01BS0VfRU5WKSAkKE1BS0UpICQoQkNNX01BS0VGTEFHUykgLUMgJChARCkvbGliL3BzaXAKZGlmZiAtLWdpdCBhL3BhY2thZ2UvYmx1ZXpfdXRpbHMvUzU0Ymx1ZXogYi9wYWNrYWdlL2JsdWV6X3V0aWxzL1M1NGJsdWV6CmluZGV4IGMxZGY1YjMuLmE1MjBkODEgMTAwNzU1Ci0tLSBhL3BhY2thZ2UvYmx1ZXpfdXRpbHMvUzU0Ymx1ZXoKKysrIGIvcGFja2FnZS9ibHVlel91dGlscy9TNTRibHVlegpAQCAtODUsNyArODUsNyBAQAogICAgICAgZmkKIAogICAgICAgZWNobyAiJDA6IFN0YXJ0aW5nIGJ0bW9uIgotICAgICAgYmFieXNpdCAzMCBidG1vbiAtQSAtdCAyPiYxIHwgbG9nb3MgYnRtb24gJgorICAgICAgYmFieXNpdCAzMCBidG1vbiAtQSAtViAtdCAyPiYxIHwgbG9nb3MgYnRtb24gJgogICAgICAgc2xlZXAgMQogCiAgICAgICBlY2hvICIkMDogU3RhcnRpbmcgYmx1ZXRvb3RoZCIKZGlmZiAtLWdpdCBhL3BhY2thZ2UvY2F0YXdhbXB1cy9jYXRhd2FtcHVzLm1rIGIvcGFja2FnZS9jYXRhd2FtcHVzL2NhdGF3YW1wdXMubWsKaW5kZXggN2Y5NzM5Yi4uOWEyOTFjZSAxMDA2NDQKLS0tIGEvcGFja2FnZS9jYXRhd2FtcHVzL2NhdGF3YW1wdXMubWsKKysrIGIvcGFja2FnZS9jYXRhd2FtcHVzL2NhdGF3YW1wdXMubWsKQEAgLTU5LDggKzU5LDEwIEBACiAJJChJTlNUQUxMKSAtbSAwNzU1IC1EIHBhY2thZ2UvY2F0YXdhbXB1cy90cjY5X3JlYm9vdCAkKFRBUkdFVF9ESVIpL2JpbgogCSQoSU5TVEFMTCkgLW0gMDc1NSAtRCBwYWNrYWdlL2NhdGF3YW1wdXMvcG9sbF9ob3N0bmFtZXMgJChUQVJHRVRfRElSKS9iaW4KIAotCSMgU3RvcmUgY29tcHJlc3NlZCBjb3B5IGZvciB3ZWIgc2VydmVyIChsaWNlbmNldWkpCisJIyBBZGQgY29tcHJlc3NlZCBjb3B5IG9mIGFsbCBPU1MgbGljZW5zZSBpbmZvIChkaXNwbGF5ZWQgaW4gZGlhZ3VpKQorCSggY2QgbGVnYWwgJiYgcHl0aG9uIG1lcmdlLWxpY2Vuc2VzLnB5ID4kKFRBUkdFVF9ESVIpL3Vzci9zaGFyZS9MSUNFTlNFUyApCiAJemlwIC1qICQoVEFSR0VUX0RJUikvdXNyL3NoYXJlL0xJQ0VOU0VTLnppcCAkKFRBUkdFVF9ESVIpL3Vzci9zaGFyZS9MSUNFTlNFUworCXJtICQoVEFSR0VUX0RJUikvdXNyL3NoYXJlL0xJQ0VOU0VTCiBlbmRlZgogCiBkZWZpbmUgQ0FUQVdBTVBVU19URVNUX0NNRFMKZGlmZiAtLWdpdCBhL3BhY2thZ2UvY2F0YXdhbXB1cy90cjY5X3JlYm9vdCBiL3BhY2thZ2UvY2F0YXdhbXB1cy90cjY5X3JlYm9vdAppbmRleCA5M2E0YjQxLi42Y2JmNTZiIDEwMDc1NQotLS0gYS9wYWNrYWdlL2NhdGF3YW1wdXMvdHI2OV9yZWJvb3QKKysrIGIvcGFja2FnZS9jYXRhd2FtcHVzL3RyNjlfcmVib290CkBAIC0xLDkgKzEsMTAgQEAKICMhL2Jpbi9zaAogCi1zZXQgLWUKIAogIyBUT0RPIHBhdXNlIHVudGlsIHdlIHRoaW5rIHRoZSB1c2VyIGlzIG5vdCB3YXRjaGluZyBUVi4KIAogIyBUT0RPIHNpZ25hbCB0aGUgbWluaWNsaWVudCB0byBkaXNwbGF5IGEgbWVzc2FnZT8KIAorIyBJZiB3ZSd2ZSB1cGRhdGVkIHRoZSBpbWFnZSwgZG8gYSBoYXJkIHJlYm9vdC4KK1sgLWUgL3RtcC9naW5zdGFsbF9jb21wbGV0ZSBdICYmIGhhcmRfcmVib290CiAvc2Jpbi9yZWJvb3QKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZGVrX3Rvb2xzL0NvbmZpZy5pbiBiL3BhY2thZ2UvZGVrX3Rvb2xzL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGRjNTRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9kZWtfdG9vbHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsNCBAQAorY29uZmlnIEJSMl9QQUNLQUdFX0RFS19UT09MUworCWJvb2wgImRla190b29scyIKKwloZWxwCisJICBBZGRzIE1hcnZlbGwncyBEZXZpY2UgRW1iZWRkaW5nIEtpdCBhcHBsaWNhdGlvbnMKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZGVrX3Rvb2xzL2Rla190b29scy5tayBiL3BhY2thZ2UvZGVrX3Rvb2xzL2Rla190b29scy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc2NzRiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9kZWtfdG9vbHMvZGVrX3Rvb2xzLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0RFS19UT09MU19TSVRFPXJlcG86Ly92ZW5kb3IvbWFydmVsbC9kZWstdG9vbHMKKworZGVmaW5lIERFS19UT09MU19DTEVBTl9DTURTCisJJChUQVJHRVRfTUFLRV9FTlYpICQoTUFLRSkgVEFSR0VUPWJ1aWxkcm9vdCBDQz0kKFRBUkdFVF9DUk9TUylnY2MgXAorCUFSPSQoVEFSR0VUX0NST1NTKWFyIC1DICQoQEQpIGNsZWFuCitlbmRlZgorCitkZWZpbmUgREVLX1RPT0xTX0JVSUxEX0NNRFMKKwkkKFRBUkdFVF9NQUtFX0VOVikgJChNQUtFMSkgVEFSR0VUPWJ1aWxkcm9vdCBDQz0kKFRBUkdFVF9DUk9TUylnY2MgXAorCUFSPSQoVEFSR0VUX0NST1NTKWFyIC1DICQoQEQpCitlbmRlZgorCitkZWZpbmUgREVLX1RPT0xTX0lOU1RBTExfVEFSR0VUX0NNRFMKKwkkKElOU1RBTEwpIC1tIDA3NTUgLUQgJChARCkvYXBwcy8qICQoVEFSR0VUX0RJUikvdXNyL2Jpbi8KK2VuZGVmCisKKyQoZXZhbCAkKGNhbGwgR0VOVEFSR0VUUykpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2VsZnV0aWxzL0NvbmZpZy5pbiBiL3BhY2thZ2UvZWxmdXRpbHMvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTM3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL0NvbmZpZy5pbgpAQCAtMCwwICsxLDM1IEBACitjb21tZW50ICJlbGZ1dGlscyBuZWVkcyBhIHVDbGliYyBvciAoZSlnbGliYyB0b29sY2hhaW4gdy8gd2NoYXIsIGR5bmFtaWMgbGlicmFyeSIKKwlkZXBlbmRzIG9uICFCUjJfYmZpbgorCWRlcGVuZHMgb24gIUJSMl9VU0VfV0NIQVIgfHwgQlIyX1NUQVRJQ19MSUJTIFwKKwkJfHwgIShCUjJfVE9PTENIQUlOX1VTRVNfVUNMSUJDIHx8IEJSMl9UT09MQ0hBSU5fVVNFU19HTElCQykKKworY29uZmlnIEJSMl9QQUNLQUdFX0VMRlVUSUxTCisJYm9vbCAiZWxmdXRpbHMiCisJc2VsZWN0IEJSMl9QQUNLQUdFX0FSR1BfU1RBTkRBTE9ORSBpZiBCUjJfVE9PTENIQUlOX1VTRVNfVUNMSUJDCisJc2VsZWN0IEJSMl9QQUNLQUdFX0dFVFRFWFQgaWYgQlIyX05FRURTX0dFVFRFWFQKKwlkZXBlbmRzIG9uIEJSMl9VU0VfV0NIQVIKKwlkZXBlbmRzIG9uICFCUjJfU1RBVElDX0xJQlMKKwkjIE9ubHkgZ2xpYmMgYW5kIHVDbGliYyBpbXBsZW1lbnQgdGhlIG15cmlhZCBvZiByZXF1aXJlZCBHTlVpc21zCisJZGVwZW5kcyBvbiBCUjJfVE9PTENIQUlOX1VTRVNfVUNMSUJDIHx8IEJSMl9UT09MQ0hBSU5fVVNFU19HTElCQworCSMgYnVpbGQgaXNzdWUgY2F1c2VkIGJ5IHRoZSBfIHByZWZpeCB1c2VkIG9uIGJsYWNrZmluIGZvcgorCSMgYXNzZW1ibHkgc3ltYm9scworCWRlcGVuZHMgb24gIUJSMl9iZmluCisJaGVscAorCSAgTGlicmFyaWVzL3V0aWxpdGllcyB0byBoYW5kbGUgRUxGIG9iamVjdHMgKGRyb3AgaW4KKwkgIHJlcGxhY2VtZW50IGZvciBsaWJlbGYpLgorCisJICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gb25seSBpbnN0YWxscyB0aGUgbGlicmFyaWVzLCBhbmQgbm90CisJICB0aGUgcHJvZ3JhbXMuCisKKwkgIGh0dHBzOi8vZmVkb3JhaG9zdGVkLm9yZy9lbGZ1dGlscworCitpZiBCUjJfUEFDS0FHRV9FTEZVVElMUworCitjb25maWcgQlIyX1BBQ0tBR0VfRUxGVVRJTFNfUFJPR1MKKwlib29sICJJbnN0YWxsIHByb2dyYW1zIgorCWRlcGVuZHMgb24gQlIyX1RPT0xDSEFJTl9VU0VTX0dMSUJDCisJaGVscAorCSAgVGhpcyBvcHRpb24gdGVsbHMgZWxmdXRpbHMgdG8gbm90IG9ubHkgaW5zdGFsbCB0aGUgbGliZWxmCisJICBsaWJyYXJpZXMsIGJ1dCBhbHNvIHRoZSBlbGZ1dGlscyBwcm9ncmFtcy4KKworZW5kaWYKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwMS1hcmdwLXN1cHBvcnQucGF0Y2ggYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDEtYXJncC1zdXBwb3J0LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzRiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDEtYXJncC1zdXBwb3J0LnBhdGNoCkBAIC0wLDAgKzEsOTMgQEAKK0FsbG93IHRoZSB1c2FnZSBvZiBhbiBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXJncCBmdW5jdGlvbnMKKwordUNsaWJjIGxhY2sgdGhlIGFyZ3AgZmFtaWx5IG9mIGZ1bmN0aW9ucyB0aGF0IGdsaWJjIGhhcy4gVGhlcmVmb3JlLCB3ZQorYWRkIGEgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gc2VlIGlmIGFyZ3BfcGFyc2UgaXMgYXZhaWxhYmxlCitpbiB0aGUgQyBsaWJyYXJ5LiBJZiBub3QsIHdlIGxvb2sgaWYgaXQgaXMgYXZhaWxhYmxlIGluIHRoZSBhZGRpdGlvbmFsCisnYXJncCcgbGlicmFyeS4gSWYgc28sIHdlIGxpbmsgYWdhaW5zdCB0aGF0IGxpYnJhcnkuIElmIG5vdCwgd2UgZXJyb3IKK291dC4KKworVGhpcyBhbGxvd3MgdG8gYnVpbGQgZWxmdXRpbHMgYWdhaW5zdCB1Q2xpYmMgd2l0aCBhbiBleHRlcm5hbCBhcmdwCitsaWJyYXJ5LgorCitCYXNlZCBvbiB0aGUgZm9ybWVyIHBhdGNoIGJ5IFRob21hcyBQZXRhenpvbmkuCisKK1NpZ25lZC1vZmYtYnk6IFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorU2lnbmVkLW9mZi1ieTogVmljZW50ZSBPbGl2ZXJ0IFJpZXJhIDxWaW5jZW50LlJpZXJhQGltZ3RlYy5jb20+CisKK2RpZmYgLXJ1cCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYworLS0tIGEvY29uZmlndXJlLmFjCTIwMTUtMDEtMDYgMTE6MzA6MDIuMTcwMDUyODc1ICswMDAwCisrKysgYi9jb25maWd1cmUuYWMJMjAxNS0wMS0wNiAxMTozMToxMC4xMjIyMTk4MjYgKzAwMDAKK0BAIC0yNTMsNiArMjUzLDEzIEBAIEFDX1NVQlNUKFtMSUJFQkxfU1VCRElSXSkKKyBBQ19ERUZJTkVfVU5RVU9URUQoTElCRUJMX1NVQkRJUiwgIiRMSUJFQkxfU1VCRElSIikKKyBBSF9URU1QTEFURShbTElCRUJMX1NVQkRJUl0sIFskbGliZGlyIHN1YmRpcmVjdG9yeSBjb250YWluaW5nIGxpYmVibCBtb2R1bGVzLl0pCisgCisrQUNfQ0hFQ0tfRlVOQyhbYXJncF9wYXJzZV0pCisraWYgdGVzdCAiJGFjX2N2X2Z1bmNfYXJncF9wYXJzZSIgIT0geWVzOyB0aGVuCisrCUFDX0NIRUNLX0xJQihbYXJncF0sW2FyZ3BfcGFyc2VdLEFSR1BfTElCUz0tbGFyZ3AsCisrCQlBQ19NU0dfRVJST1IoW05vIGFyZ3BfcGFyc2UgZnVuY3Rpb24gYXZhaWxhYmxlLl0pKQorK2ZpCisrQUNfU1VCU1QoQVJHUF9MSUJTKQorKworIGRubCBUZXN0IGZvciB6bGliIGFuZCBiemxpYiwgZ2l2ZXMgWkxJQi9CWkxJQiAuYW0KKyBkbmwgY29uZGl0aW9uYWwgYW5kIGNvbmZpZy5oIFVTRV9aTElCL1VTRV9CWkxJQiAjZGVmaW5lLgorIHNhdmVfTElCUz0iJExJQlMiCitkaWZmIC1ydXAgYS9saWJkdy9NYWtlZmlsZS5hbSBiL2xpYmR3L01ha2VmaWxlLmFtCistLS0gYS9saWJkdy9NYWtlZmlsZS5hbQkyMDE0LTEyLTE5IDIwOjQzOjExLjAwMDAwMDAwMCArMDAwMAorKysrIGIvbGliZHcvTWFrZWZpbGUuYW0JMjAxNS0wMS0wNiAxMTozMjoyMS4wNzU0Mzg1MjQgKzAwMDAKK0BAIC0xMTIsNyArMTEyLDcgQEAgbGliZHcuc28kKEVYRUVYVCk6ICQoc3JjZGlyKS9saWJkdy5tYXAgbAorIAkJLVdsLC0tZW5hYmxlLW5ldy1kdGFncywtcnBhdGgsJChwa2dsaWJkaXIpIFwKKyAJCS1XbCwtLXZlcnNpb24tc2NyaXB0LCQ8LC0tbm8tdW5kZWZpbmVkIFwKKyAJCS1XbCwtLXdob2xlLWFyY2hpdmUgJChmaWx0ZXItb3V0ICQ8LCReKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlXAorLQkJLWxkbCAkKHppcF9MSUJTKQorKwkJLWxkbCAkKHppcF9MSUJTKSAkKEFSR1BfTElCUykKKyAJQCQodGV4dHJlbF9jaGVjaykKKyAJbG4gLWZzICRAICRALiQoVkVSU0lPTikKKyAKK2RpZmYgLXJ1cCBhL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy9NYWtlZmlsZS5hbQorLS0tIGEvc3JjL01ha2VmaWxlLmFtCTIwMTUtMDEtMDYgMTE6MzA6MDIuNDMwMDU3MzM5ICswMDAwCisrKysgYi9zcmMvTWFrZWZpbGUuYW0JMjAxNS0wMS0wNiAxMTozNDo1My4wNjEwNDk3NTIgKzAwMDAKK0BAIC05NCwyNyArOTQsMjkgQEAgcmVhZGVsZl9ub19XZXJyb3IgPSB5ZXMKKyBzdHJpbmdzX25vX1dlcnJvciA9IHllcworIGFkZHIybGluZV9ub19XZm9ybWF0ID0geWVzCisgCistcmVhZGVsZl9MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgLWxkbAorK3JlYWRlbGZfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgJChBUkdQX0xJQlMpCisgbm1fTERBREQgPSAkKGxpYmR3KSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgXAorLQkgICAkKGRlbWFuZ2xlbGliKQorLXNpemVfTERBREQgPSAkKGxpYmVsZikgJChsaWJldSkKKy1zdHJpcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgLWxkbAorLWxkX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmV1KSAtbGRsCisrCSAgICQoZGVtYW5nbGVsaWIpICQoQVJHUF9MSUJTKQorK3NpemVfTERBREQgPSAkKGxpYmVsZikgJChsaWJldSkgJChBUkdQX0xJQlMpCisrc3RyaXBfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgJChBUkdQX0xJQlMpCisrbGRfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgJChBUkdQX0xJQlMpCisgaWYgTkFUSVZFX0xECisgIyAtbGRsIGlzIGFsd2F5cyBuZWVkZWQgZm9yIGxpYmVibC4KKyBsZF9MREFERCArPSBsaWJsZF9lbGYuYQorIGVuZGlmCisgbGRfTERGTEFHUyA9IC1yZHluYW1pYworLWVsZmxpbnRfTERBREQgID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmV1KSAtbGRsCistZmluZHRleHRyZWxfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKKy1hZGRyMmxpbmVfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKKy1lbGZjbXBfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpIC1sZGwKKy1vYmpkdW1wX0xEQUREICA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwKKy1yYW5saWJfTERBREQgPSBsaWJhci5hICQobGliZWxmKSAkKGxpYmV1KQorLXN0cmluZ3NfTERBREQgPSAkKGxpYmVsZikgJChsaWJldSkKKy1hcl9MREFERCA9IGxpYmFyLmEgJChsaWJlbGYpICQobGliZXUpCistdW5zdHJpcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkgLWxkbAorLXN0YWNrX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmR3KSAkKGxpYmV1KSAtbGRsICQoZGVtYW5nbGVsaWIpCisrZWxmbGludF9MREFERCAgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgJChBUkdQX0xJQlMpCisrZmluZHRleHRyZWxfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChBUkdQX0xJQlMpCisrYWRkcjJsaW5lX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQoQVJHUF9MSUJTKQorK2VsZmNtcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgLWxkbCAkKEFSR1BfTElCUykKKytvYmpkdW1wX0xEQUREICA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpIC1sZGwgXAorKwkkKEFSR1BfTElCUykKKytyYW5saWJfTERBREQgPSBsaWJhci5hICQobGliZWxmKSAkKGxpYmV1KSAkKEFSR1BfTElCUykKKytzdHJpbmdzX0xEQUREID0gJChsaWJlbGYpICQobGliZXUpICQoQVJHUF9MSUJTKQorK2FyX0xEQUREID0gbGliYXIuYSAkKGxpYmVsZikgJChsaWJldSkgJChBUkdQX0xJQlMpCisrdW5zdHJpcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkgLWxkbCAkKEFSR1BfTElCUykKKytzdGFja19MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkgLWxkbCBcCisrCSQoZGVtYW5nbGVsaWIpICQoQVJHUF9MSUJTKQorIAorIGxkbGV4Lm86IGxkc2NyaXB0LmMKKyBsZGxleF9ub19XZXJyb3IgPSB5ZXMKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwMi1kaXNhYmxlLXByb2dzLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDAyLWRpc2FibGUtcHJvZ3MucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzN2JiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwMi1kaXNhYmxlLXByb2dzLnBhdGNoCkBAIC0wLDAgKzEsNDggQEAKK0FkZCBhIC0te2VuYWJsZSxkaXNhYmxlfS1wcm9ncyBjb25maWd1cmUgb3B0aW9uCisKK0FkZCBhIC0te2VuYWJsZSxkaXNhYmxlfS1wcm9ncyBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBlbGZ1dGlscy4gVGhpcworYWxsb3dzIHRvIHNlbGVjdGl2ZWx5IGRpc2FibGUgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBlbGZ1dGlscyBwcm9ncmFtcworKGluIHdoaWNoIGNhc2Ugb25seSB0aGUgbGlicmFyaWVzIGFyZSBidWlsdCBhbmQgaW5zdGFsbGVkKS4gVGhpcyBpcwordXNlZnVsIGJlY2F1c2UgdGhlIHByb2dyYW1zIGFyZSBvZnRlbiBub3QgbmVlZGVkLCBhbmQgYWxzbyBiZWNhdXNlCitidWlsZGluZyB0aGUgcHJvZ3JhbXMgYWdhaW5zdCB1Q2xpYmMgY2F1c2VzIHNldmVyYWwgaXNzdWVzIChsYWNrIG9mCitvYnN0YWNrX3ByaW50ZigpIGluIHVDbGliYyBmb3IgZXhhbXBsZSkuCisKK0Jhc2VkIG9uIHRoZSBmb3JtZXIgcGF0Y2ggYnkgVGhvbWFzIFBldGF6em9uaS4KKworU2lnbmVkLW9mZi1ieTogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CitTaWduZWQtb2ZmLWJ5OiBWaWNlbnRlIE9saXZlcnQgUmllcmEgPFZpbmNlbnQuUmllcmFAaW1ndGVjLmNvbT4KKworZGlmZiAtcnVwIGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCistLS0gYS9jb25maWd1cmUuYWMJMjAxNS0wMS0wNiAxMTozMToxMC4xMjIyMTk4MjYgKzAwMDAKKysrKyBiL2NvbmZpZ3VyZS5hYwkyMDE1LTAxLTA2IDExOjM3OjM4LjM5Nzg5MTQyNCArMDAwMAorQEAgLTI2MCw2ICsyNjAsMTIgQEAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfYXJncF9wYXJzZSIgIT0geWVzOworIGZpCisgQUNfU1VCU1QoQVJHUF9MSUJTKQorIAorK0FDX0FSR19FTkFCTEUoW3Byb2dzXSwKKysJQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXByb2dzXSwgW2VuYWJsZSBwcm9nc10pLAorKwllbmFibGVfcHJvZ3M9JGVuYWJsZXZhbCwKKysJZW5hYmxlX3Byb2dzPXllcykKKytBTV9DT05ESVRJT05BTChFTkFCTEVfUFJPR1MsIHRlc3QgIiRlbmFibGVfcHJvZ3MiID0geWVzKQorKworIGRubCBUZXN0IGZvciB6bGliIGFuZCBiemxpYiwgZ2l2ZXMgWkxJQi9CWkxJQiAuYW0KKyBkbmwgY29uZGl0aW9uYWwgYW5kIGNvbmZpZy5oIFVTRV9aTElCL1VTRV9CWkxJQiAjZGVmaW5lLgorIHNhdmVfTElCUz0iJExJQlMiCitkaWZmIC1ydXAgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCistLS0gYS9NYWtlZmlsZS5hbQkyMDE0LTA2LTE3IDE5OjUxOjA5LjAwMDAwMDAwMCArMDEwMAorKysrIGIvTWFrZWZpbGUuYW0JMjAxNS0wMS0wNiAxMTozODo0Mi44NDY5OTk0MTAgKzAwMDAKK0BAIC0yMiw5ICsyMiwxMyBAQCBBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorIAorIHBrZ2luY2x1ZGVfSEVBREVSUyA9IHZlcnNpb24uaAorIAorK2lmIEVOQUJMRV9QUk9HUworK1BST0dTX1NVQkRJUiA9IHNyYworK2VuZGlmCisrCisgIyBBZGQgZG9jIGJhY2sgd2hlbiB3ZSBoYXZlIHNvbWUgcmVhbCBjb250ZW50LgorIFNVQkRJUlMgPSBjb25maWcgbTQgbGliIGxpYmVsZiBsaWJlYmwgbGliZHdlbGYgbGliZHdmbCBsaWJkdyBsaWJjcHUgbGliYXNtIFwKKy0JICBiYWNrZW5kcyBzcmMgcG8gdGVzdHMKKysJICBiYWNrZW5kcyAkKFBST0dTX1NVQkRJUikgcG8gdGVzdHMKKyAKKyBFWFRSQV9ESVNUID0gZWxmdXRpbHMuc3BlYyBHUEctS0VZIE5PVEVTIENPTlRSSUJVVElORyBcCisgCSAgICAgQ09QWUlORyBDT1BZSU5HLUdQTFYyIENPUFlJTkctTEdQTFYzCmRpZmYgLS1naXQgYS9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDMtZnRzLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDAzLWZ0cy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU4Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDAzLWZ0cy5wYXRjaApAQCAtMCwwICsxLDEzMDUgQEAKK0FkZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZnRzXyooKSBmdW5jdGlvbnMKKworVGhlIGZ0c18qKCkgZnVuY3Rpb25zIGFyZSBvcHRpb25hbCBpbiB1Q2xpYmMsIGFuZCBub3QgY29tcGlsZWQgaW4gb3VyCitkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIFRoZSBiZXN0IG9wdGlvbiB3b3VsZCBiZSB0byBtaWdyYXRlIHRoaXMKK2VsZnV0aWxzIGNvZGUgdG8gdGhlIG5mdHcgZmFtaWx5IG9mIGZ1bmN0aW9ucywgYnV0IGl0IHJlcXVpcmVzIHF1aXRlCitzb21lIHdvcmsuCisKK1NvIHdlIGhhdmUgc2V2ZXJhbCBvcHRpb25zIGhlcmU6CisKKyAqKSBFbmFibGUgZnRzXyooKSBmdW5jdGlvbnMgaW4gb3VyIGRlZmF1bHQgdUNsaWJjIGNvbmZpZ3VyYXRpb24uIE5vdAorICAgIG5pY2Ugc2luY2Ugb25seSBvbmUgcGFja2FnZSBuZWVkcyB0aGVtICh0aGUgaGVscCB0ZXh0IG9mIHVDbGliYworICAgIGZvciBmdHNfKigpIGZ1bmN0aW9ucyBleHBsaWNpdGx5IG1lbnRpb24gdGhhdCB0aGV5IGhhdmUgYmVlbiBhZGRlZAorICAgIHRvIGJlIGFibGUgdG8gYnVpbGQgZWxmdXRpbHMpLgorCisgKikgVXNlIGdudWxpYiwgYnV0IGl0IGlzIHF1aXRlIGhlYXZ5IHRvIHNldHVwLCByZXF1aXJlcyBtb2RpZmljYXRpb25zCisgICAgdG8gY29uZmlndXJlLmFjLCBhbmQgb3RoZXIgdGhpbmdzLgorCisgKikgQ29weSB0aGUgZnRzIGZ1bmN0aW9uIGZyb20gdUNsaWJjIGludG8gZWxmdXRpbHMgc291cmNlIGNvZGUuIFRoaXMKKyAgICBpcyB0aGUgc29sdXRpb24gdXNlZCBiZWxvdy4gdUNsaWJjIGlzIExHUEwsIGFuZCBlbGZ1dGlscyBpcworICAgIExHUEwvR1BMLCBzbyB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBsaWNlbnNpbmcgaXNzdWUuCisKK09mIGNvdXJzZSwgdGhlIGZ0c18qKCkgZnVuY3Rpb25zIGFyZSBvbmx5IGJ1aWx0IGlmIHRoZXkgYXJlIG5vdAorYWxyZWFkeSBwcm92aWRlZCBieSB0aGUgQyBsaWJyYXJ5LgorCitCYXNlZCBvbiB0aGUgZm9ybWVyIHBhdGNoIGJ5IFRob21hcyBQZXRhenpvbmkuCisKK1NpZ25lZC1vZmYtYnk6IFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorU2lnbmVkLW9mZi1ieTogVmljZW50ZSBPbGl2ZXJ0IFJpZXJhIDxWaW5jZW50LlJpZXJhQGltZ3RlYy5jb20+CisKK2RpZmYgLU5ydXAgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKKy0tLSBhL2NvbmZpZ3VyZS5hYwkyMDE1LTAxLTA2IDExOjM3OjM4LjM5Nzg5MTQyNCArMDAwMAorKysrIGIvY29uZmlndXJlLmFjCTIwMTUtMDEtMDYgMTE6NDA6NTMuNTY4MjU4NzU5ICswMDAwCitAQCAtMjY2LDYgKzI2NiwxMCBAQCBBQ19BUkdfRU5BQkxFKFtwcm9nc10sCisgCWVuYWJsZV9wcm9ncz15ZXMpCisgQU1fQ09ORElUSU9OQUwoRU5BQkxFX1BST0dTLCB0ZXN0ICIkZW5hYmxlX3Byb2dzIiA9IHllcykKKyAKKytBQ19DSEVDS19IRUFERVIoW2Z0cy5oXSwKKysJQUNfREVGSU5FKFtIQVZFX0ZUU19IXSwgW10sIFtEZWZpbmUgaWYgPGZ0cy5oPiBpcyBhdmFpbGFibGUgaW4gQyBsaWJyYXJ5XSkpCisrQU1fQ09ORElUSU9OQUwoSEFWRV9GVFMsIHRlc3QgIiRhY19jdl9oZWFkZXJfZnRzX2giID0geWVzKQorKworIGRubCBUZXN0IGZvciB6bGliIGFuZCBiemxpYiwgZ2l2ZXMgWkxJQi9CWkxJQiAuYW0KKyBkbmwgY29uZGl0aW9uYWwgYW5kIGNvbmZpZy5oIFVTRV9aTElCL1VTRV9CWkxJQiAjZGVmaW5lLgorIHNhdmVfTElCUz0iJExJQlMiCitkaWZmIC1OcnVwIGEvbGliZHdmbC9mdHMuYyBiL2xpYmR3ZmwvZnRzLmMKKy0tLSBhL2xpYmR3ZmwvZnRzLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrKyBiL2xpYmR3ZmwvZnRzLmMJMjAxNS0wMS0wNiAxMTo0MjoxMy40ODE2NDAzMjIgKzAwMDAKK0BAIC0wLDAgKzEsMTA5NSBAQAorKy8qLQorKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MywgMTk5NAorKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKyAqCisrICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisrICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisrICogYXJlIG1ldDoKKysgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKysgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKysgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisrICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisrICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisrICoKKysgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisrICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisrICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKysgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisrICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKysgKiBTVUNIIERBTUFHRS4KKysgKi8KKysKKysjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisrI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisrI2luY2x1ZGUgPGZjbnRsLmg+CisrI2luY2x1ZGUgPGRpcmVudC5oPgorKyNpbmNsdWRlIDxlcnJuby5oPgorKyNpbmNsdWRlICJmdHNfLmgiCisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysjaW5jbHVkZSA8dW5pc3RkLmg+CisrCisrLyogTGFyZ2VzdCBhbGlnbm1lbnQgc2l6ZSBuZWVkZWQsIG1pbnVzIG9uZS4KKysgICBVc3VhbGx5IGxvbmcgZG91YmxlIGlzIHRoZSB3b3JzdCBjYXNlLiAgKi8KKysjaWZuZGVmIEFMSUdOQllURVMKKysjZGVmaW5lIEFMSUdOQllURVMJKF9fYWxpZ25vZl9fIChsb25nIGRvdWJsZSkgLSAxKQorKyNlbmRpZgorKy8qIEFsaWduIFAgdG8gdGhhdCBzaXplLiAgKi8KKysjaWZuZGVmIEFMSUdOCisrI2RlZmluZQlBTElHTihwKQkoKCh1bnNpZ25lZCBsb25nIGludCkgKHApICsgQUxJR05CWVRFUykgJiB+QUxJR05CWVRFUykKKysjZW5kaWYKKysKKysKKytzdGF0aWMgRlRTRU5UCSpmdHNfYWxsb2MgKEZUUyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cisrc3RhdGljIEZUU0VOVAkqZnRzX2J1aWxkIChGVFMgKiwgaW50KTsKKytzdGF0aWMgdm9pZAkgZnRzX2xmcmVlIChGVFNFTlQgKik7Cisrc3RhdGljIHZvaWQJIGZ0c19sb2FkIChGVFMgKiwgRlRTRU5UICopOworK3N0YXRpYyBzaXplX3QJIGZ0c19tYXhhcmdsZW4gKGNoYXIgKiBjb25zdCAqKTsKKytzdGF0aWMgdm9pZAkgZnRzX3BhZGp1c3QgKEZUUyAqLCBGVFNFTlQgKik7Cisrc3RhdGljIGludAkgZnRzX3BhbGxvYyAoRlRTICosIHNpemVfdCk7Cisrc3RhdGljIEZUU0VOVAkqZnRzX3NvcnQgKEZUUyAqLCBGVFNFTlQgKiwgaW50KTsKKytzdGF0aWMgdV9zaG9ydAkgZnRzX3N0YXQgKEZUUyAqLCBGVFNFTlQgKiwgaW50KTsKKytzdGF0aWMgaW50ICAgICAgZnRzX3NhZmVfY2hhbmdlZGlyIChGVFMgKiwgRlRTRU5UICosIGludCwgY29uc3QgY2hhciAqKTsKKysKKysjaWZuZGVmIE1BWAorKyNkZWZpbmUgTUFYKGEsIGIpCSh7IF9fdHlwZW9mX18gKGEpIF9hID0gKGEpOyBcCisrCQkJICAgX190eXBlb2ZfXyAoYikgX2IgPSAoYik7IFwKKysJCQkgICBfYSA+IF9iID8gX2EgOiBfYjsgfSkKKysjZW5kaWYKKysKKysjZGVmaW5lCUlTRE9UKGEpCShhWzBdID09ICcuJyAmJiAoIWFbMV0gfHwgKGFbMV0gPT0gJy4nICYmICFhWzJdKSkpCisrCisrI2RlZmluZSBDTFIob3B0KQkoc3AtPmZ0c19vcHRpb25zICY9IH4ob3B0KSkKKysjZGVmaW5lCUlTU0VUKG9wdCkJKHNwLT5mdHNfb3B0aW9ucyAmIChvcHQpKQorKyNkZWZpbmUJU0VUKG9wdCkJKHNwLT5mdHNfb3B0aW9ucyB8PSAob3B0KSkKKysKKysjZGVmaW5lCUZDSERJUihzcCwgZmQpCSghSVNTRVQoRlRTX05PQ0hESVIpICYmIGZjaGRpcihmZCkpCisrCisrLyogZnRzX2J1aWxkIGZsYWdzICovCisrI2RlZmluZQlCQ0hJTEQJCTEJCS8qIGZ0c19jaGlsZHJlbiAqLworKyNkZWZpbmUJQk5BTUVTCQkyCQkvKiBmdHNfY2hpbGRyZW4sIG5hbWVzIG9ubHkgKi8KKysjZGVmaW5lCUJSRUFECQkzCQkvKiBmdHNfcmVhZCAqLworKworK0ZUUyAqCisrZnRzX29wZW4oIGNoYXIgKiBjb25zdCAqYXJndiwgcmVnaXN0ZXIgaW50IG9wdGlvbnMsCisrCQlpbnQgKCpjb21wYXIpIChjb25zdCBGVFNFTlQgKiosIGNvbnN0IEZUU0VOVCAqKikpCisreworKwlyZWdpc3RlciBGVFMgKnNwOworKwlyZWdpc3RlciBGVFNFTlQgKnAsICpyb290OworKwlyZWdpc3RlciBpbnQgbml0ZW1zOworKwlGVFNFTlQgKnBhcmVudCA9IE5VTEw7CisrCUZUU0VOVCAqdG1wID0gTlVMTDsKKysKKysJLyogT3B0aW9ucyBjaGVjay4gKi8KKysJaWYgKG9wdGlvbnMgJiB+RlRTX09QVElPTk1BU0spIHsKKysJCWVycm5vID0gRUlOVkFMOworKwkJcmV0dXJuIChOVUxMKTsKKysJfQorKworKwkvKiBBbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBzdHJlYW0gKi8KKysJaWYgKChzcCA9IG1hbGxvYygodV9pbnQpc2l6ZW9mKEZUUykpKSA9PSBOVUxMKQorKwkJcmV0dXJuIChOVUxMKTsKKysJbWVtc2V0KHNwLCAwLCBzaXplb2YoRlRTKSk7CisrCXNwLT5mdHNfY29tcGFyID0gKGludCAoKikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgY29tcGFyOworKwlzcC0+ZnRzX29wdGlvbnMgPSBvcHRpb25zOworKworKwkvKiBMb2dpY2FsIHdhbGtzIHR1cm4gb24gTk9DSERJUjsgc3ltYm9saWMgbGlua3MgYXJlIHRvbyBoYXJkLiAqLworKwlpZiAoSVNTRVQoRlRTX0xPR0lDQUwpKQorKwkJU0VUKEZUU19OT0NIRElSKTsKKysKKysJLyoKKysJICogU3RhcnQgb3V0IHdpdGggMUsgb2YgcGF0aCBzcGFjZSwgYW5kIGVub3VnaCwgaW4gYW55IGNhc2UsCisrCSAqIHRvIGhvbGQgdGhlIHVzZXIncyBwYXRocy4KKysJICovCisrI2lmbmRlZiBNQVhQQVRITEVOCisrI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKKysjZW5kaWYKKysJc2l6ZV90IG1heGFyZ2xlbiA9IGZ0c19tYXhhcmdsZW4oYXJndik7CisrCWlmIChmdHNfcGFsbG9jKHNwLCBNQVgobWF4YXJnbGVuLCBNQVhQQVRITEVOKSkpCisrCQlnb3RvIG1lbTE7CisrCisrCS8qIEFsbG9jYXRlL2luaXRpYWxpemUgcm9vdCdzIHBhcmVudC4gKi8KKysJaWYgKCphcmd2ICE9IE5VTEwpIHsKKysJCWlmICgocGFyZW50ID0gZnRzX2FsbG9jKHNwLCAiIiwgMCkpID09IE5VTEwpCisrCQkJZ290byBtZW0yOworKwkJcGFyZW50LT5mdHNfbGV2ZWwgPSBGVFNfUk9PVFBBUkVOVExFVkVMOworKwkgIH0KKysKKysJLyogQWxsb2NhdGUvaW5pdGlhbGl6ZSByb290KHMpLiAqLworKwlmb3IgKHJvb3QgPSBOVUxMLCBuaXRlbXMgPSAwOyAqYXJndiAhPSBOVUxMOyArK2FyZ3YsICsrbml0ZW1zKSB7CisrCQkvKiBEb24ndCBhbGxvdyB6ZXJvLWxlbmd0aCBwYXRocy4gKi8KKysJCXNpemVfdCBsZW4gPSBzdHJsZW4oKmFyZ3YpOworKwkJaWYgKGxlbiA9PSAwKSB7CisrCQkJZXJybm8gPSBFTk9FTlQ7CisrCQkJZ290byBtZW0zOworKwkJfQorKworKwkJcCA9IGZ0c19hbGxvYyhzcCwgKmFyZ3YsIGxlbik7CisrCQlwLT5mdHNfbGV2ZWwgPSBGVFNfUk9PVExFVkVMOworKwkJcC0+ZnRzX3BhcmVudCA9IHBhcmVudDsKKysJCXAtPmZ0c19hY2NwYXRoID0gcC0+ZnRzX25hbWU7CisrCQlwLT5mdHNfaW5mbyA9IGZ0c19zdGF0KHNwLCBwLCBJU1NFVChGVFNfQ09NRk9MTE9XKSk7CisrCisrCQkvKiBDb21tYW5kLWxpbmUgIi4iIGFuZCAiLi4iIGFyZSByZWFsIGRpcmVjdG9yaWVzLiAqLworKwkJaWYgKHAtPmZ0c19pbmZvID09IEZUU19ET1QpCisrCQkJcC0+ZnRzX2luZm8gPSBGVFNfRDsKKysKKysJCS8qCisrCQkgKiBJZiBjb21wYXJpc29uIHJvdXRpbmUgc3VwcGxpZWQsIHRyYXZlcnNlIGluIHNvcnRlZAorKwkJICogb3JkZXI7IG90aGVyd2lzZSB0cmF2ZXJzZSBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorKwkJICovCisrCQlpZiAoY29tcGFyKSB7CisrCQkJcC0+ZnRzX2xpbmsgPSByb290OworKwkJCXJvb3QgPSBwOworKwkJfSBlbHNlIHsKKysJCQlwLT5mdHNfbGluayA9IE5VTEw7CisrCQkJaWYgKHJvb3QgPT0gTlVMTCkKKysJCQkJdG1wID0gcm9vdCA9IHA7CisrCQkJZWxzZSB7CisrCQkJCXRtcC0+ZnRzX2xpbmsgPSBwOworKwkJCQl0bXAgPSBwOworKwkJCX0KKysJCX0KKysJfQorKwlpZiAoY29tcGFyICYmIG5pdGVtcyA+IDEpCisrCQlyb290ID0gZnRzX3NvcnQoc3AsIHJvb3QsIG5pdGVtcyk7CisrCisrCS8qCisrCSAqIEFsbG9jYXRlIGEgZHVtbXkgcG9pbnRlciBhbmQgbWFrZSBmdHNfcmVhZCB0aGluayB0aGF0IHdlJ3ZlIGp1c3QKKysJICogZmluaXNoZWQgdGhlIG5vZGUgYmVmb3JlIHRoZSByb290KHMpOyBzZXQgcC0+ZnRzX2luZm8gdG8gRlRTX0lOSVQKKysJICogc28gdGhhdCBldmVyeXRoaW5nIGFib3V0IHRoZSAiY3VycmVudCIgbm9kZSBpcyBpZ25vcmVkLgorKwkgKi8KKysJaWYgKChzcC0+ZnRzX2N1ciA9IGZ0c19hbGxvYyhzcCwgIiIsIDApKSA9PSBOVUxMKQorKwkJZ290byBtZW0zOworKwlzcC0+ZnRzX2N1ci0+ZnRzX2xpbmsgPSByb290OworKwlzcC0+ZnRzX2N1ci0+ZnRzX2luZm8gPSBGVFNfSU5JVDsKKysKKysJLyoKKysJICogSWYgdXNpbmcgY2hkaXIoMiksIGdyYWIgYSBmaWxlIGRlc2NyaXB0b3IgcG9pbnRpbmcgdG8gZG90IHRvIGVuc3VyZQorKwkgKiB0aGF0IHdlIGNhbiBnZXQgYmFjayBoZXJlOyB0aGlzIGNvdWxkIGJlIGF2b2lkZWQgZm9yIHNvbWUgcGF0aHMsCisrCSAqIGJ1dCBhbG1vc3QgY2VydGFpbmx5IG5vdCB3b3J0aCB0aGUgZWZmb3J0LiAgU2xhc2hlcywgc3ltYm9saWMgbGlua3MsCisrCSAqIGFuZCAiLi4iIGFyZSBhbGwgZmFpcmx5IG5hc3R5IHByb2JsZW1zLiAgTm90ZSwgaWYgd2UgY2FuJ3QgZ2V0IHRoZQorKwkgKiBkZXNjcmlwdG9yIHdlIHJ1biBhbnl3YXksIGp1c3QgbW9yZSBzbG93bHkuCisrCSAqLworKwlpZiAoIUlTU0VUKEZUU19OT0NIRElSKQorKwkgICAgJiYgKHNwLT5mdHNfcmZkID0gb3BlbigiLiIsIE9fUkRPTkxZLCAwKSkgPCAwKQorKwkJU0VUKEZUU19OT0NIRElSKTsKKysKKysJcmV0dXJuIChzcCk7CisrCisrbWVtMzoJZnRzX2xmcmVlKHJvb3QpOworKwlmcmVlKHBhcmVudCk7CisrbWVtMjoJZnJlZShzcC0+ZnRzX3BhdGgpOworK21lbTE6CWZyZWUoc3ApOworKwlyZXR1cm4gKE5VTEwpOworK30KKysKKytzdGF0aWMgdm9pZAorK2Z0c19sb2FkKEZUUyAqc3AsIHJlZ2lzdGVyIEZUU0VOVCAqcCkKKyt7CisrCXJlZ2lzdGVyIGludCBsZW47CisrCXJlZ2lzdGVyIGNoYXIgKmNwOworKworKwkvKgorKwkgKiBMb2FkIHRoZSBzdHJlYW0gc3RydWN0dXJlIGZvciB0aGUgbmV4dCB0cmF2ZXJzYWwuICBTaW5jZSB3ZSBkb24ndAorKwkgKiBhY3R1YWxseSBlbnRlciB0aGUgZGlyZWN0b3J5IHVudGlsIGFmdGVyIHRoZSBwcmVvcmRlciB2aXNpdCwgc2V0CisrCSAqIHRoZSBmdHNfYWNjcGF0aCBmaWVsZCBzcGVjaWFsbHkgc28gdGhlIGNoZGlyIGdldHMgZG9uZSB0byB0aGUgcmlnaHQKKysJICogcGxhY2UgYW5kIHRoZSB1c2VyIGNhbiBhY2Nlc3MgdGhlIGZpcnN0IG5vZGUuICBGcm9tIGZ0c19vcGVuIGl0J3MKKysJICoga25vd24gdGhhdCB0aGUgcGF0aCB3aWxsIGZpdC4KKysJICovCisrCWxlbiA9IHAtPmZ0c19wYXRobGVuID0gcC0+ZnRzX25hbWVsZW47CisrCW1lbW1vdmUoc3AtPmZ0c19wYXRoLCBwLT5mdHNfbmFtZSwgbGVuICsgMSk7CisrCWlmICgoY3AgPSBzdHJyY2hyKHAtPmZ0c19uYW1lLCAnLycpKSAmJiAoY3AgIT0gcC0+ZnRzX25hbWUgfHwgY3BbMV0pKSB7CisrCQlsZW4gPSBzdHJsZW4oKytjcCk7CisrCQltZW1tb3ZlKHAtPmZ0c19uYW1lLCBjcCwgbGVuICsgMSk7CisrCQlwLT5mdHNfbmFtZWxlbiA9IGxlbjsKKysJfQorKwlwLT5mdHNfYWNjcGF0aCA9IHAtPmZ0c19wYXRoID0gc3AtPmZ0c19wYXRoOworKwlzcC0+ZnRzX2RldiA9IHAtPmZ0c19kZXY7CisrfQorKworK2ludAorK2Z0c19jbG9zZShGVFMgKnNwKQorK3sKKysJcmVnaXN0ZXIgRlRTRU5UICpmcmVlcCwgKnA7CisrCWludCBzYXZlZF9lcnJubzsKKysKKysJLyoKKysJICogVGhpcyBzdGlsbCB3b3JrcyBpZiB3ZSBoYXZlbid0IHJlYWQgYW55dGhpbmcgLS0gdGhlIGR1bW15IHN0cnVjdHVyZQorKwkgKiBwb2ludHMgdG8gdGhlIHJvb3QgbGlzdCwgc28gd2Ugc3RlcCB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIHJvb3QKKysJICogbGlzdCB3aGljaCBoYXMgYSB2YWxpZCBwYXJlbnQgcG9pbnRlci4KKysJICovCisrCWlmIChzcC0+ZnRzX2N1cikgeworKwkJZm9yIChwID0gc3AtPmZ0c19jdXI7IHAtPmZ0c19sZXZlbCA+PSBGVFNfUk9PVExFVkVMOykgeworKwkJCWZyZWVwID0gcDsKKysJCQlwID0gcC0+ZnRzX2xpbmsgIT0gTlVMTCA/IHAtPmZ0c19saW5rIDogcC0+ZnRzX3BhcmVudDsKKysJCQlmcmVlKGZyZWVwKTsKKysJCX0KKysJCWZyZWUocCk7CisrCX0KKysKKysJLyogRnJlZSB1cCBjaGlsZCBsaW5rZWQgbGlzdCwgc29ydCBhcnJheSwgcGF0aCBidWZmZXIuICovCisrCWlmIChzcC0+ZnRzX2NoaWxkKQorKwkJZnRzX2xmcmVlKHNwLT5mdHNfY2hpbGQpOworKwlmcmVlKHNwLT5mdHNfYXJyYXkpOworKwlmcmVlKHNwLT5mdHNfcGF0aCk7CisrCisrCS8qIFJldHVybiB0byBvcmlnaW5hbCBkaXJlY3RvcnksIHNhdmUgZXJybm8gaWYgbmVjZXNzYXJ5LiAqLworKwlpZiAoIUlTU0VUKEZUU19OT0NIRElSKSkgeworKwkJc2F2ZWRfZXJybm8gPSBmY2hkaXIoc3AtPmZ0c19yZmQpID8gZXJybm8gOiAwOworKwkJKHZvaWQpY2xvc2Uoc3AtPmZ0c19yZmQpOworKworKwkJLyogU2V0IGVycm5vIGFuZCByZXR1cm4uICovCisrCQlpZiAoc2F2ZWRfZXJybm8gIT0gMCkgeworKwkJCS8qIEZyZWUgdXAgdGhlIHN0cmVhbSBwb2ludGVyLiAqLworKwkJCWZyZWUoc3ApOworKwkJCWVycm5vID0gc2F2ZWRfZXJybm87CisrCQkJcmV0dXJuICgtMSk7CisrCQl9CisrCX0KKysKKysJLyogRnJlZSB1cCB0aGUgc3RyZWFtIHBvaW50ZXIuICovCisrCWZyZWUoc3ApOworKwlyZXR1cm4gKDApOworK30KKysKKysvKgorKyAqIFNwZWNpYWwgY2FzZSBvZiAiLyIgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBzbyB0aGF0IHNsYXNoZXMgYXJlbid0CisrICogYXBwZW5kZWQgd2hpY2ggd291bGQgY2F1c2UgcGF0aHMgdG8gYmUgd3JpdHRlbiBhcyAiLi4uLi8vZm9vIi4KKysgKi8KKysjZGVmaW5lCU5BUFBFTkQocCkJCQkJCQkJXAorKwkocC0+ZnRzX3BhdGhbcC0+ZnRzX3BhdGhsZW4gLSAxXSA9PSAnLycJCQkJXAorKwkgICAgPyBwLT5mdHNfcGF0aGxlbiAtIDEgOiBwLT5mdHNfcGF0aGxlbikKKysKKytGVFNFTlQgKgorK2Z0c19yZWFkKHJlZ2lzdGVyIEZUUyAqc3ApCisreworKwlyZWdpc3RlciBGVFNFTlQgKnAsICp0bXA7CisrCXJlZ2lzdGVyIGludCBpbnN0cjsKKysJcmVnaXN0ZXIgY2hhciAqdDsKKysJaW50IHNhdmVkX2Vycm5vOworKworKwkvKiBJZiBmaW5pc2hlZCBvciB1bnJlY292ZXJhYmxlIGVycm9yLCByZXR1cm4gTlVMTC4gKi8KKysJaWYgKHNwLT5mdHNfY3VyID09IE5VTEwgfHwgSVNTRVQoRlRTX1NUT1ApKQorKwkJcmV0dXJuIChOVUxMKTsKKysKKysJLyogU2V0IGN1cnJlbnQgbm9kZSBwb2ludGVyLiAqLworKwlwID0gc3AtPmZ0c19jdXI7CisrCisrCS8qIFNhdmUgYW5kIHplcm8gb3V0IHVzZXIgaW5zdHJ1Y3Rpb25zLiAqLworKwlpbnN0ciA9IHAtPmZ0c19pbnN0cjsKKysJcC0+ZnRzX2luc3RyID0gRlRTX05PSU5TVFI7CisrCisrCS8qIEFueSB0eXBlIG9mIGZpbGUgbWF5IGJlIHJlLXZpc2l0ZWQ7IHJlLXN0YXQgYW5kIHJlLXR1cm4uICovCisrCWlmIChpbnN0ciA9PSBGVFNfQUdBSU4pIHsKKysJCXAtPmZ0c19pbmZvID0gZnRzX3N0YXQoc3AsIHAsIDApOworKwkJcmV0dXJuIChwKTsKKysJfQorKworKwkvKgorKwkgKiBGb2xsb3dpbmcgYSBzeW1saW5rIC0tIFNMTk9ORSB0ZXN0IGFsbG93cyBhcHBsaWNhdGlvbiB0byBzZWUKKysJICogU0xOT05FIGFuZCByZWNvdmVyLiAgSWYgaW5kaXJlY3RpbmcgdGhyb3VnaCBhIHN5bWxpbmssIGhhdmUKKysJICoga2VlcCBhIHBvaW50ZXIgdG8gY3VycmVudCBsb2NhdGlvbi4gIElmIHVuYWJsZSB0byBnZXQgdGhhdAorKwkgKiBwb2ludGVyLCBmb2xsb3cgZmFpbHMuCisrCSAqLworKwlpZiAoaW5zdHIgPT0gRlRTX0ZPTExPVyAmJgorKwkgICAgKHAtPmZ0c19pbmZvID09IEZUU19TTCB8fCBwLT5mdHNfaW5mbyA9PSBGVFNfU0xOT05FKSkgeworKwkJcC0+ZnRzX2luZm8gPSBmdHNfc3RhdChzcCwgcCwgMSk7CisrCQlpZiAocC0+ZnRzX2luZm8gPT0gRlRTX0QgJiYgIUlTU0VUKEZUU19OT0NIRElSKSkgeworKwkJCWlmICgocC0+ZnRzX3N5bWZkID0gb3BlbigiLiIsIE9fUkRPTkxZLCAwKSkgPCAwKSB7CisrCQkJCXAtPmZ0c19lcnJubyA9IGVycm5vOworKwkJCQlwLT5mdHNfaW5mbyA9IEZUU19FUlI7CisrCQkJfSBlbHNlCisrCQkJCXAtPmZ0c19mbGFncyB8PSBGVFNfU1lNRk9MTE9XOworKwkJfQorKwkJcmV0dXJuIChwKTsKKysJfQorKworKwkvKiBEaXJlY3RvcnkgaW4gcHJlLW9yZGVyLiAqLworKwlpZiAocC0+ZnRzX2luZm8gPT0gRlRTX0QpIHsKKysJCS8qIElmIHNraXBwZWQgb3IgY3Jvc3NlZCBtb3VudCBwb2ludCwgZG8gcG9zdC1vcmRlciB2aXNpdC4gKi8KKysJCWlmIChpbnN0ciA9PSBGVFNfU0tJUCB8fAorKwkJICAgIChJU1NFVChGVFNfWERFVikgJiYgcC0+ZnRzX2RldiAhPSBzcC0+ZnRzX2RldikpIHsKKysJCQlpZiAocC0+ZnRzX2ZsYWdzICYgRlRTX1NZTUZPTExPVykKKysJCQkJKHZvaWQpY2xvc2UocC0+ZnRzX3N5bWZkKTsKKysJCQlpZiAoc3AtPmZ0c19jaGlsZCkgeworKwkJCQlmdHNfbGZyZWUoc3AtPmZ0c19jaGlsZCk7CisrCQkJCXNwLT5mdHNfY2hpbGQgPSBOVUxMOworKwkJCX0KKysJCQlwLT5mdHNfaW5mbyA9IEZUU19EUDsKKysJCQlyZXR1cm4gKHApOworKwkJfQorKworKwkJLyogUmVidWlsZCBpZiBvbmx5IHJlYWQgdGhlIG5hbWVzIGFuZCBub3cgdHJhdmVyc2luZy4gKi8KKysJCWlmIChzcC0+ZnRzX2NoaWxkICE9IE5VTEwgJiYgSVNTRVQoRlRTX05BTUVPTkxZKSkgeworKwkJCUNMUihGVFNfTkFNRU9OTFkpOworKwkJCWZ0c19sZnJlZShzcC0+ZnRzX2NoaWxkKTsKKysJCQlzcC0+ZnRzX2NoaWxkID0gTlVMTDsKKysJCX0KKysKKysJCS8qCisrCQkgKiBDZCB0byB0aGUgc3ViZGlyZWN0b3J5LgorKwkJICoKKysJCSAqIElmIGhhdmUgYWxyZWFkeSByZWFkIGFuZCBub3cgZmFpbCB0byBjaGRpciwgd2hhY2sgdGhlIGxpc3QKKysJCSAqIHRvIG1ha2UgdGhlIG5hbWVzIGNvbWUgb3V0IHJpZ2h0LCBhbmQgc2V0IHRoZSBwYXJlbnQgZXJybm8KKysJCSAqIHNvIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGV2ZW50dWFsbHkgZ2V0IGFuIGVycm9yIGNvbmRpdGlvbi4KKysJCSAqIFNldCB0aGUgRlRTX0RPTlRDSERJUiBmbGFnIHNvIHRoYXQgd2hlbiB3ZSBsb2dpY2FsbHkgY2hhbmdlCisrCQkgKiBkaXJlY3RvcmllcyBiYWNrIHRvIHRoZSBwYXJlbnQgd2UgZG9uJ3QgZG8gYSBjaGRpci4KKysJCSAqCisrCQkgKiBJZiBoYXZlbid0IHJlYWQgZG8gc28uICBJZiB0aGUgcmVhZCBmYWlscywgZnRzX2J1aWxkIHNldHMKKysJCSAqIEZUU19TVE9QIG9yIHRoZSBmdHNfaW5mbyBmaWVsZCBvZiB0aGUgbm9kZS4KKysJCSAqLworKwkJaWYgKHNwLT5mdHNfY2hpbGQgIT0gTlVMTCkgeworKwkJCWlmIChmdHNfc2FmZV9jaGFuZ2VkaXIoc3AsIHAsIC0xLCBwLT5mdHNfYWNjcGF0aCkpIHsKKysJCQkJcC0+ZnRzX2Vycm5vID0gZXJybm87CisrCQkJCXAtPmZ0c19mbGFncyB8PSBGVFNfRE9OVENIRElSOworKwkJCQlmb3IgKHAgPSBzcC0+ZnRzX2NoaWxkOyBwICE9IE5VTEw7CisrCQkJCSAgICAgcCA9IHAtPmZ0c19saW5rKQorKwkJCQkJcC0+ZnRzX2FjY3BhdGggPQorKwkJCQkJICAgIHAtPmZ0c19wYXJlbnQtPmZ0c19hY2NwYXRoOworKwkJCX0KKysJCX0gZWxzZSBpZiAoKHNwLT5mdHNfY2hpbGQgPSBmdHNfYnVpbGQoc3AsIEJSRUFEKSkgPT0gTlVMTCkgeworKwkJCWlmIChJU1NFVChGVFNfU1RPUCkpCisrCQkJCXJldHVybiAoTlVMTCk7CisrCQkJcmV0dXJuIChwKTsKKysJCX0KKysJCXAgPSBzcC0+ZnRzX2NoaWxkOworKwkJc3AtPmZ0c19jaGlsZCA9IE5VTEw7CisrCQlzcC0+ZnRzX2N1ciA9IHA7CisrCQlnb3RvIG5hbWU7CisrCX0KKysKKysJLyogTW92ZSB0byB0aGUgbmV4dCBub2RlIG9uIHRoaXMgbGV2ZWwuICovCisrbmV4dDoJdG1wID0gcDsKKysJaWYgKChwID0gcC0+ZnRzX2xpbmspICE9IE5VTEwpIHsKKysJCXNwLT5mdHNfY3VyID0gcDsKKysJCWZyZWUodG1wKTsKKysKKysJCS8qCisrCQkgKiBJZiByZWFjaGVkIHRoZSB0b3AsIHJldHVybiB0byB0aGUgb3JpZ2luYWwgZGlyZWN0b3J5IChvcgorKwkJICogdGhlIHJvb3Qgb2YgdGhlIHRyZWUpLCBhbmQgbG9hZCB0aGUgcGF0aHMgZm9yIHRoZSBuZXh0IHJvb3QuCisrCQkgKi8KKysJCWlmIChwLT5mdHNfbGV2ZWwgPT0gRlRTX1JPT1RMRVZFTCkgeworKwkJCWlmIChGQ0hESVIoc3AsIHNwLT5mdHNfcmZkKSkgeworKwkJCQlTRVQoRlRTX1NUT1ApOworKwkJCQlyZXR1cm4gKE5VTEwpOworKwkJCX0KKysJCQlmdHNfbG9hZChzcCwgcCk7CisrCQkJcmV0dXJuIHA7CisrCQl9CisrCisrCQkvKgorKwkJICogVXNlciBtYXkgaGF2ZSBjYWxsZWQgZnRzX3NldCBvbiB0aGUgbm9kZS4gIElmIHNraXBwZWQsCisrCQkgKiBpZ25vcmUuICBJZiBmb2xsb3dlZCwgZ2V0IGEgZmlsZSBkZXNjcmlwdG9yIHNvIHdlIGNhbgorKwkJICogZ2V0IGJhY2sgaWYgbmVjZXNzYXJ5LgorKwkJICovCisrCQlpZiAocC0+ZnRzX2luc3RyID09IEZUU19TS0lQKQorKwkJCWdvdG8gbmV4dDsKKysJCWlmIChwLT5mdHNfaW5zdHIgPT0gRlRTX0ZPTExPVykgeworKwkJCXAtPmZ0c19pbmZvID0gZnRzX3N0YXQoc3AsIHAsIDEpOworKwkJCWlmIChwLT5mdHNfaW5mbyA9PSBGVFNfRCAmJiAhSVNTRVQoRlRTX05PQ0hESVIpKSB7CisrCQkJCWlmICgocC0+ZnRzX3N5bWZkID0KKysJCQkJICAgIG9wZW4oIi4iLCBPX1JET05MWSwgMCkpIDwgMCkgeworKwkJCQkJcC0+ZnRzX2Vycm5vID0gZXJybm87CisrCQkJCQlwLT5mdHNfaW5mbyA9IEZUU19FUlI7CisrCQkJCX0gZWxzZQorKwkJCQkJcC0+ZnRzX2ZsYWdzIHw9IEZUU19TWU1GT0xMT1c7CisrCQkJfQorKwkJCXAtPmZ0c19pbnN0ciA9IEZUU19OT0lOU1RSOworKwkJfQorKworK25hbWU6CQl0ID0gc3AtPmZ0c19wYXRoICsgTkFQUEVORChwLT5mdHNfcGFyZW50KTsKKysJCSp0KysgPSAnLyc7CisrCQltZW1tb3ZlKHQsIHAtPmZ0c19uYW1lLCBwLT5mdHNfbmFtZWxlbiArIDEpOworKwkJcmV0dXJuIHA7CisrCX0KKysKKysJLyogTW92ZSB1cCB0byB0aGUgcGFyZW50IG5vZGUuICovCisrCXAgPSB0bXAtPmZ0c19wYXJlbnQ7CisrCXNwLT5mdHNfY3VyID0gcDsKKysJZnJlZSh0bXApOworKworKwlpZiAocC0+ZnRzX2xldmVsID09IEZUU19ST09UUEFSRU5UTEVWRUwpIHsKKysJCS8qCisrCQkgKiBEb25lOyBmcmVlIGV2ZXJ5dGhpbmcgdXAgYW5kIHNldCBlcnJubyB0byAwIHNvIHRoZSB1c2VyCisrCQkgKiBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlcnJvciBhbmQgRU9GLgorKwkJICovCisrCQlmcmVlKHApOworKwkJZXJybm8gPSAwOworKwkJcmV0dXJuIChzcC0+ZnRzX2N1ciA9IE5VTEwpOworKwl9CisrCisrCS8qIE5VTCB0ZXJtaW5hdGUgdGhlIHBhdGhuYW1lLiAqLworKwlzcC0+ZnRzX3BhdGhbcC0+ZnRzX3BhdGhsZW5dID0gJ1wwJzsKKysKKysJLyoKKysJICogUmV0dXJuIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAgSWYgYXQgYSByb290IG5vZGUgb3IgY2FtZSB0aHJvdWdoCisrCSAqIGEgc3ltbGluaywgZ28gYmFjayB0aHJvdWdoIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBPdGhlcndpc2UsIGNkIHVwCisrCSAqIG9uZSBkaXJlY3RvcnkuCisrCSAqLworKwlpZiAocC0+ZnRzX2xldmVsID09IEZUU19ST09UTEVWRUwpIHsKKysJCWlmIChGQ0hESVIoc3AsIHNwLT5mdHNfcmZkKSkgeworKwkJCVNFVChGVFNfU1RPUCk7CisrCQkJcmV0dXJuIChOVUxMKTsKKysJCX0KKysJfSBlbHNlIGlmIChwLT5mdHNfZmxhZ3MgJiBGVFNfU1lNRk9MTE9XKSB7CisrCQlpZiAoRkNIRElSKHNwLCBwLT5mdHNfc3ltZmQpKSB7CisrCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKysJCQkodm9pZCljbG9zZShwLT5mdHNfc3ltZmQpOworKwkJCWVycm5vID0gc2F2ZWRfZXJybm87CisrCQkJU0VUKEZUU19TVE9QKTsKKysJCQlyZXR1cm4gKE5VTEwpOworKwkJfQorKwkJKHZvaWQpY2xvc2UocC0+ZnRzX3N5bWZkKTsKKysJfSBlbHNlIGlmICghKHAtPmZ0c19mbGFncyAmIEZUU19ET05UQ0hESVIpICYmCisrCQkgICBmdHNfc2FmZV9jaGFuZ2VkaXIoc3AsIHAtPmZ0c19wYXJlbnQsIC0xLCAiLi4iKSkgeworKwkJU0VUKEZUU19TVE9QKTsKKysJCXJldHVybiAoTlVMTCk7CisrCX0KKysJcC0+ZnRzX2luZm8gPSBwLT5mdHNfZXJybm8gPyBGVFNfRVJSIDogRlRTX0RQOworKwlyZXR1cm4gcDsKKyt9CisrCisrLyoKKysgKiBGdHNfc2V0IHRha2VzIHRoZSBzdHJlYW0gYXMgYW4gYXJndW1lbnQgYWx0aG91Z2ggaXQncyBub3QgdXNlZCBpbiB0aGlzCisrICogaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSBpZiBhbnlvbmUgd2FudGVkIHRvIGFkZCBnbG9iYWwKKysgKiBzZW1hbnRpY3MgdG8gZnRzIHVzaW5nIGZ0c19zZXQuICBBbiBlcnJvciByZXR1cm4gaXMgYWxsb3dlZCBmb3Igc2ltaWxhcgorKyAqIHJlYXNvbnMuCisrICovCisrLyogQVJHU1VTRUQgKi8KKytpbnQKKytmdHNfc2V0KEZUUyAqc3AsIEZUU0VOVCAqcCwgaW50IGluc3RyKQorK3sKKysJaWYgKGluc3RyICE9IDAgJiYgaW5zdHIgIT0gRlRTX0FHQUlOICYmIGluc3RyICE9IEZUU19GT0xMT1cgJiYKKysJICAgIGluc3RyICE9IEZUU19OT0lOU1RSICYmIGluc3RyICE9IEZUU19TS0lQKSB7CisrCQllcnJubyA9IEVJTlZBTDsKKysJCXJldHVybiAoMSk7CisrCX0KKysJcC0+ZnRzX2luc3RyID0gaW5zdHI7CisrCXJldHVybiAoMCk7CisrfQorKworK0ZUU0VOVCAqCisrZnRzX2NoaWxkcmVuKHJlZ2lzdGVyIEZUUyAqc3AsIGludCBpbnN0cikKKyt7CisrCXJlZ2lzdGVyIEZUU0VOVCAqcDsKKysJaW50IGZkOworKworKwlpZiAoaW5zdHIgIT0gMCAmJiBpbnN0ciAhPSBGVFNfTkFNRU9OTFkpIHsKKysJCWVycm5vID0gRUlOVkFMOworKwkJcmV0dXJuIChOVUxMKTsKKysJfQorKworKwkvKiBTZXQgY3VycmVudCBub2RlIHBvaW50ZXIuICovCisrCXAgPSBzcC0+ZnRzX2N1cjsKKysKKysJLyoKKysJICogRXJybm8gc2V0IHRvIDAgc28gdXNlciBjYW4gZGlzdGluZ3Vpc2ggZW1wdHkgZGlyZWN0b3J5IGZyb20KKysJICogYW4gZXJyb3IuCisrCSAqLworKwllcnJubyA9IDA7CisrCisrCS8qIEZhdGFsIGVycm9ycyBzdG9wIGhlcmUuICovCisrCWlmIChJU1NFVChGVFNfU1RPUCkpCisrCQlyZXR1cm4gKE5VTEwpOworKworKwkvKiBSZXR1cm4gbG9naWNhbCBoaWVyYXJjaHkgb2YgdXNlcidzIGFyZ3VtZW50cy4gKi8KKysJaWYgKHAtPmZ0c19pbmZvID09IEZUU19JTklUKQorKwkJcmV0dXJuIChwLT5mdHNfbGluayk7CisrCisrCS8qCisrCSAqIElmIG5vdCBhIGRpcmVjdG9yeSBiZWluZyB2aXNpdGVkIGluIHByZS1vcmRlciwgc3RvcCBoZXJlLiAgQ291bGQKKysJICogYWxsb3cgRlRTX0ROUiwgYXNzdW1pbmcgdGhlIHVzZXIgaGFzIGZpeGVkIHRoZSBwcm9ibGVtLCBidXQgdGhlCisrCSAqIHNhbWUgZWZmZWN0IGlzIGF2YWlsYWJsZSB3aXRoIEZUU19BR0FJTi4KKysJICovCisrCWlmIChwLT5mdHNfaW5mbyAhPSBGVFNfRCAvKiAmJiBwLT5mdHNfaW5mbyAhPSBGVFNfRE5SICovKQorKwkJcmV0dXJuIChOVUxMKTsKKysKKysJLyogRnJlZSB1cCBhbnkgcHJldmlvdXMgY2hpbGQgbGlzdC4gKi8KKysJaWYgKHNwLT5mdHNfY2hpbGQgIT0gTlVMTCkKKysJCWZ0c19sZnJlZShzcC0+ZnRzX2NoaWxkKTsKKysKKysJaWYgKGluc3RyID09IEZUU19OQU1FT05MWSkgeworKwkJU0VUKEZUU19OQU1FT05MWSk7CisrCQlpbnN0ciA9IEJOQU1FUzsKKysJfSBlbHNlCisrCQlpbnN0ciA9IEJDSElMRDsKKysKKysJLyoKKysJICogSWYgdXNpbmcgY2hkaXIgb24gYSByZWxhdGl2ZSBwYXRoIGFuZCBjYWxsZWQgQkVGT1JFIGZ0c19yZWFkIGRvZXMKKysJICogaXRzIGNoZGlyIHRvIHRoZSByb290IG9mIGEgdHJhdmVyc2FsLCB3ZSBjYW4gbG9zZSAtLSB3ZSBuZWVkIHRvCisrCSAqIGNoZGlyIGludG8gdGhlIHN1YmRpcmVjdG9yeSwgYW5kIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGN1cnJlbnQKKysJICogZGlyZWN0b3J5IGlzLCBzbyB3ZSBjYW4ndCBnZXQgYmFjayBzbyB0aGF0IHRoZSB1cGNvbWluZyBjaGRpciBieQorKwkgKiBmdHNfcmVhZCB3aWxsIHdvcmsuCisrCSAqLworKwlpZiAocC0+ZnRzX2xldmVsICE9IEZUU19ST09UTEVWRUwgfHwgcC0+ZnRzX2FjY3BhdGhbMF0gPT0gJy8nIHx8CisrCSAgICBJU1NFVChGVFNfTk9DSERJUikpCisrCQlyZXR1cm4gKHNwLT5mdHNfY2hpbGQgPSBmdHNfYnVpbGQoc3AsIGluc3RyKSk7CisrCisrCWlmICgoZmQgPSBvcGVuKCIuIiwgT19SRE9OTFksIDApKSA8IDApCisrCQlyZXR1cm4gKE5VTEwpOworKwlzcC0+ZnRzX2NoaWxkID0gZnRzX2J1aWxkKHNwLCBpbnN0cik7CisrCWlmIChmY2hkaXIoZmQpKQorKwkJcmV0dXJuIChOVUxMKTsKKysJKHZvaWQpY2xvc2UoZmQpOworKwlyZXR1cm4gKHNwLT5mdHNfY2hpbGQpOworK30KKysKKysvKgorKyAqIFRoaXMgaXMgdGhlIHRyaWNreSBwYXJ0IC0tIGRvIG5vdCBjYXN1YWxseSBjaGFuZ2UgKmFueXRoaW5nKiBpbiBoZXJlLiAgVGhlCisrICogaWRlYSBpcyB0byBidWlsZCB0aGUgbGlua2VkIGxpc3Qgb2YgZW50cmllcyB0aGF0IGFyZSB1c2VkIGJ5IGZ0c19jaGlsZHJlbgorKyAqIGFuZCBmdHNfcmVhZC4gIFRoZXJlIGFyZSBsb3RzIG9mIHNwZWNpYWwgY2FzZXMuCisrICoKKysgKiBUaGUgcmVhbCBzbG93ZG93biBpbiB3YWxraW5nIHRoZSB0cmVlIGlzIHRoZSBzdGF0IGNhbGxzLiAgSWYgRlRTX05PU1RBVCBpcworKyAqIHNldCBhbmQgaXQncyBhIHBoeXNpY2FsIHdhbGsgKHNvIHRoYXQgc3ltYm9saWMgbGlua3MgY2FuJ3QgYmUgZGlyZWN0b3JpZXMpLAorKyAqIHdlIGNhbiBkbyB0aGluZ3MgcXVpY2tseS4gIEZpcnN0LCBpZiBpdCdzIGEgNC40QlNEIGZpbGUgc3lzdGVtLCB0aGUgdHlwZQorKyAqIG9mIHRoZSBmaWxlIGlzIGluIHRoZSBkaXJlY3RvcnkgZW50cnkuICBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZSBudW1iZXIKKysgKiBvZiBzdWJkaXJlY3RvcmllcyBpbiBhIG5vZGUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBsaW5rcyB0byB0aGUgcGFyZW50LgorKyAqIFRoZSBmb3JtZXIgc2tpcHMgYWxsIHN0YXQgY2FsbHMuICBUaGUgbGF0dGVyIHNraXBzIHN0YXQgY2FsbHMgaW4gYW55IGxlYWYKKysgKiBkaXJlY3RvcmllcyBhbmQgZm9yIGFueSBmaWxlcyBhZnRlciB0aGUgc3ViZGlyZWN0b3JpZXMgaW4gdGhlIGRpcmVjdG9yeSBoYXZlCisrICogYmVlbiBmb3VuZCwgY3V0dGluZyB0aGUgc3RhdCBjYWxscyBieSBhYm91dCAyLzMuCisrICovCisrc3RhdGljIEZUU0VOVCAqCisrZnRzX2J1aWxkKHJlZ2lzdGVyIEZUUyAqc3AsIGludCB0eXBlKQorK3sKKysJcmVnaXN0ZXIgc3RydWN0IGRpcmVudCAqZHA7CisrCXJlZ2lzdGVyIEZUU0VOVCAqcCwgKmhlYWQ7CisrCXJlZ2lzdGVyIGludCBuaXRlbXM7CisrCUZUU0VOVCAqY3VyLCAqdGFpbDsKKysJRElSICpkaXJwOworKwl2b2lkICpvbGRhZGRyOworKwlpbnQgY2RlcnJubywgZGVzY2VuZCwgbGVuLCBsZXZlbCwgbmxpbmtzLCBzYXZlZF9lcnJubywKKysJICAgIG5vc3RhdCwgZG9hZGp1c3Q7CisrCXNpemVfdCBtYXhsZW47CisrCWNoYXIgKmNwOworKworKwkvKiBTZXQgY3VycmVudCBub2RlIHBvaW50ZXIuICovCisrCWN1ciA9IHNwLT5mdHNfY3VyOworKworKwkvKgorKwkgKiBPcGVuIHRoZSBkaXJlY3RvcnkgZm9yIHJlYWRpbmcuICBJZiB0aGlzIGZhaWxzLCB3ZSdyZSBkb25lLgorKwkgKiBJZiBiZWluZyBjYWxsZWQgZnJvbSBmdHNfcmVhZCwgc2V0IHRoZSBmdHNfaW5mbyBmaWVsZC4KKysJICovCisrI2lmIGRlZmluZWQgRlRTX1dISVRFT1VUICYmIDAKKysJaWYgKElTU0VUKEZUU19XSElURU9VVCkpCisrCQlvZmxhZyA9IERURl9OT0RVUHxEVEZfUkVXSU5EOworKwllbHNlCisrCQlvZmxhZyA9IERURl9ISURFV3xEVEZfTk9EVVB8RFRGX1JFV0lORDsKKysjZWxzZQorKyMgZGVmaW5lIG9wZW5kaXIyKHBhdGgsIGZsYWcpIG9wZW5kaXIocGF0aCkKKysjZW5kaWYKKysgICAgICAgaWYgKChkaXJwID0gb3BlbmRpcjIoY3VyLT5mdHNfYWNjcGF0aCwgb2ZsYWcpKSA9PSBOVUxMKSB7CisrCQlpZiAodHlwZSA9PSBCUkVBRCkgeworKwkJCWN1ci0+ZnRzX2luZm8gPSBGVFNfRE5SOworKwkJCWN1ci0+ZnRzX2Vycm5vID0gZXJybm87CisrCQl9CisrCQlyZXR1cm4gKE5VTEwpOworKwl9CisrCisrCS8qCisrCSAqIE5saW5rcyBpcyB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGVudHJpZXMgb2YgdHlwZSBkaXJlY3RvcnkgaW4gdGhlCisrCSAqIGRpcmVjdG9yeSBpZiB3ZSdyZSBjaGVhdGluZyBvbiBzdGF0IGNhbGxzLCAwIGlmIHdlJ3JlIG5vdCBkb2luZworKwkgKiBhbnkgc3RhdCBjYWxscyBhdCBhbGwsIC0xIGlmIHdlJ3JlIGRvaW5nIHN0YXRzIG9uIGV2ZXJ5dGhpbmcuCisrCSAqLworKwlpZiAodHlwZSA9PSBCTkFNRVMpIHsKKysJCW5saW5rcyA9IDA7CisrCQkvKiBCZSBxdWlldCBhYm91dCBub3N0YXQsIEdDQy4gKi8KKysJCW5vc3RhdCA9IDA7CisrCX0gZWxzZSBpZiAoSVNTRVQoRlRTX05PU1RBVCkgJiYgSVNTRVQoRlRTX1BIWVNJQ0FMKSkgeworKwkJbmxpbmtzID0gY3VyLT5mdHNfbmxpbmsgLSAoSVNTRVQoRlRTX1NFRURPVCkgPyAwIDogMik7CisrCQlub3N0YXQgPSAxOworKwl9IGVsc2UgeworKwkJbmxpbmtzID0gLTE7CisrCQlub3N0YXQgPSAwOworKwl9CisrCisrI2lmZGVmIG5vdGRlZgorKwkodm9pZClwcmludGYoIm5saW5rcyA9PSAlZCAoY3VyOiAlZClcbiIsIG5saW5rcywgY3VyLT5mdHNfbmxpbmspOworKwkodm9pZClwcmludGYoIk5PU1RBVCAlZCBQSFlTSUNBTCAlZCBTRUVET1QgJWRcbiIsCisrCSAgICBJU1NFVChGVFNfTk9TVEFUKSwgSVNTRVQoRlRTX1BIWVNJQ0FMKSwgSVNTRVQoRlRTX1NFRURPVCkpOworKyNlbmRpZgorKwkvKgorKwkgKiBJZiB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIHN0YXQgYW55dGhpbmcgb3Igd2Ugd2FudCB0byBkZXNjZW5kCisrCSAqIGFuZCBzdGF5IGluIHRoZSBkaXJlY3RvcnksIGNoZGlyLiAgSWYgdGhpcyBmYWlscyB3ZSBrZWVwIGdvaW5nLAorKwkgKiBidXQgc2V0IGEgZmxhZyBzbyB3ZSBkb24ndCBjaGRpciBhZnRlciB0aGUgcG9zdC1vcmRlciB2aXNpdC4KKysJICogV2Ugd29uJ3QgYmUgYWJsZSB0byBzdGF0IGFueXRoaW5nLCBidXQgd2UgY2FuIHN0aWxsIHJldHVybiB0aGUKKysJICogbmFtZXMgdGhlbXNlbHZlcy4gIE5vdGUsIHRoYXQgc2luY2UgZnRzX3JlYWQgd29uJ3QgYmUgYWJsZSB0bworKwkgKiBjaGRpciBpbnRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgaGF2ZSB0byByZXR1cm4gZGlmZmVyZW50IHBhdGgKKysJICogbmFtZXMgdGhhbiBiZWZvcmUsIGkuZS4gImEvYiIgaW5zdGVhZCBvZiAiYiIuICBTaW5jZSB0aGUgbm9kZQorKwkgKiBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgaW4gcHJlLW9yZGVyLCBoYXZlIHRvIHdhaXQgdW50aWwgdGhlCisrCSAqIHBvc3Qtb3JkZXIgdmlzaXQgdG8gcmV0dXJuIHRoZSBlcnJvci4gIFRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlCisrCSAqIGhlcmUsIGlmIHRoZXJlIHdhcyBub3RoaW5nIHRvIHN0YXQgdGhlbiBpdCdzIG5vdCBhbiBlcnJvciB0bworKwkgKiBub3QgYmUgYWJsZSB0byBzdGF0LiAgVGhpcyBpcyBhbGwgZmFpcmx5IG5hc3R5LiAgSWYgYSBwcm9ncmFtCisrCSAqIG5lZWRlZCBzb3J0ZWQgZW50cmllcyBvciBzdGF0IGluZm9ybWF0aW9uLCB0aGV5IGhhZCBiZXR0ZXIgYmUKKysJICogY2hlY2tpbmcgRlRTX05TIG9uIHRoZSByZXR1cm5lZCBub2Rlcy4KKysJICovCisrCWNkZXJybm8gPSAwOworKwlpZiAobmxpbmtzIHx8IHR5cGUgPT0gQlJFQUQpIHsKKysJCWlmIChmdHNfc2FmZV9jaGFuZ2VkaXIoc3AsIGN1ciwgZGlyZmQoZGlycCksIE5VTEwpKSB7CisrCQkJaWYgKG5saW5rcyAmJiB0eXBlID09IEJSRUFEKQorKwkJCQljdXItPmZ0c19lcnJubyA9IGVycm5vOworKwkJCWN1ci0+ZnRzX2ZsYWdzIHw9IEZUU19ET05UQ0hESVI7CisrCQkJZGVzY2VuZCA9IDA7CisrCQkJY2RlcnJubyA9IGVycm5vOworKwkJCSh2b2lkKWNsb3NlZGlyKGRpcnApOworKwkJCWRpcnAgPSBOVUxMOworKwkJfSBlbHNlCisrCQkJZGVzY2VuZCA9IDE7CisrCX0gZWxzZQorKwkJZGVzY2VuZCA9IDA7CisrCisrCS8qCisrCSAqIEZpZ3VyZSBvdXQgdGhlIG1heCBmaWxlIG5hbWUgbGVuZ3RoIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUKKysJICogY3VycmVudCBwYXRoIC0tIHRoZSBpbm5lciBsb29wIGFsbG9jYXRlcyBtb3JlIHBhdGggYXMgbmVjZXNzYXJ5LgorKwkgKiBXZSByZWFsbHkgd291bGRuJ3QgaGF2ZSB0byBkbyB0aGUgbWF4bGVuIGNhbGN1bGF0aW9ucyBoZXJlLCB3ZQorKwkgKiBjb3VsZCBkbyB0aGVtIGluIGZ0c19yZWFkIGJlZm9yZSByZXR1cm5pbmcgdGhlIHBhdGgsIGJ1dCBpdCdzIGEKKysJICogbG90IGVhc2llciBoZXJlIHNpbmNlIHRoZSBsZW5ndGggaXMgcGFydCBvZiB0aGUgZGlyZW50IHN0cnVjdHVyZS4KKysJICoKKysJICogSWYgbm90IGNoYW5naW5nIGRpcmVjdG9yaWVzIHNldCBhIHBvaW50ZXIgc28gdGhhdCBjYW4ganVzdCBhcHBlbmQKKysJICogZWFjaCBuZXcgbmFtZSBpbnRvIHRoZSBwYXRoLgorKwkgKi8KKysJbGVuID0gTkFQUEVORChjdXIpOworKwlpZiAoSVNTRVQoRlRTX05PQ0hESVIpKSB7CisrCQljcCA9IHNwLT5mdHNfcGF0aCArIGxlbjsKKysJCSpjcCsrID0gJy8nOworKwl9IGVsc2UgeworKwkJLyogR0NDLCB5b3UncmUgdG9vIHZlcmJvc2UuICovCisrCQljcCA9IE5VTEw7CisrCX0KKysJbGVuKys7CisrCW1heGxlbiA9IHNwLT5mdHNfcGF0aGxlbiAtIGxlbjsKKysKKysJbGV2ZWwgPSBjdXItPmZ0c19sZXZlbCArIDE7CisrCisrCS8qIFJlYWQgdGhlIGRpcmVjdG9yeSwgYXR0YWNoaW5nIGVhY2ggZW50cnkgdG8gdGhlIGBsaW5rJyBwb2ludGVyLiAqLworKwlkb2FkanVzdCA9IDA7CisrCWZvciAoaGVhZCA9IHRhaWwgPSBOVUxMLCBuaXRlbXMgPSAwOyBkaXJwICYmIChkcCA9IHJlYWRkaXIoZGlycCkpOykgeworKwkJaWYgKCFJU1NFVChGVFNfU0VFRE9UKSAmJiBJU0RPVChkcC0+ZF9uYW1lKSkKKysJCQljb250aW51ZTsKKysKKysJCWlmICgocCA9IGZ0c19hbGxvYyhzcCwgZHAtPmRfbmFtZSwgX0RfRVhBQ1RfTkFNTEVOIChkcCkpKSA9PSBOVUxMKQorKwkJCWdvdG8gbWVtMTsKKysJCWlmIChfRF9FWEFDVF9OQU1MRU4gKGRwKSA+PSBtYXhsZW4pIHsvKiBpbmNsdWRlIHNwYWNlIGZvciBOVUwgKi8KKysJCQlvbGRhZGRyID0gc3AtPmZ0c19wYXRoOworKwkJCWlmIChmdHNfcGFsbG9jKHNwLCBfRF9FWEFDVF9OQU1MRU4gKGRwKSArIGxlbiArIDEpKSB7CisrCQkJCS8qCisrCQkJCSAqIE5vIG1vcmUgbWVtb3J5IGZvciBwYXRoIG9yIHN0cnVjdHVyZXMuICBTYXZlCisrCQkJCSAqIGVycm5vLCBmcmVlIHVwIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBhbmQgdGhlCisrCQkJCSAqIHN0cnVjdHVyZXMgYWxyZWFkeSBhbGxvY2F0ZWQuCisrCQkJCSAqLworK21lbTE6CQkJCXNhdmVkX2Vycm5vID0gZXJybm87CisrCQkJCWZyZWUocCk7CisrCQkJCWZ0c19sZnJlZShoZWFkKTsKKysJCQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7CisrCQkJCWN1ci0+ZnRzX2luZm8gPSBGVFNfRVJSOworKwkJCQlTRVQoRlRTX1NUT1ApOworKwkJCQllcnJubyA9IHNhdmVkX2Vycm5vOworKwkJCQlyZXR1cm4gKE5VTEwpOworKwkJCX0KKysJCQkvKiBEaWQgcmVhbGxvYygpIGNoYW5nZSB0aGUgcG9pbnRlcj8gKi8KKysJCQlpZiAob2xkYWRkciAhPSBzcC0+ZnRzX3BhdGgpIHsKKysJCQkJZG9hZGp1c3QgPSAxOworKwkJCQlpZiAoSVNTRVQoRlRTX05PQ0hESVIpKQorKwkJCQkJY3AgPSBzcC0+ZnRzX3BhdGggKyBsZW47CisrCQkJfQorKwkJCW1heGxlbiA9IHNwLT5mdHNfcGF0aGxlbiAtIGxlbjsKKysJCX0KKysKKysJCWlmIChsZW4gKyBfRF9FWEFDVF9OQU1MRU4gKGRwKSA+PSBVU0hSVF9NQVgpIHsKKysJCQkvKgorKwkJCSAqIEluIGFuIEZUU0VOVCwgZnRzX3BhdGhsZW4gaXMgYSB1X3Nob3J0IHNvIGl0IGlzCisrCQkJICogcG9zc2libGUgdG8gd3JhcGFyb3VuZCBoZXJlLiAgSWYgd2UgZG8sIGZyZWUgdXAKKysJCQkgKiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJ1Y3R1cmVzIGFscmVhZHkKKysJCQkgKiBhbGxvY2F0ZWQsIHRoZW4gZXJyb3Igb3V0IHdpdGggRU5BTUVUT09MT05HLgorKwkJCSAqLworKwkJCWZyZWUocCk7CisrCQkJZnRzX2xmcmVlKGhlYWQpOworKwkJCSh2b2lkKWNsb3NlZGlyKGRpcnApOworKwkJCWN1ci0+ZnRzX2luZm8gPSBGVFNfRVJSOworKwkJCVNFVChGVFNfU1RPUCk7CisrCQkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisrCQkJcmV0dXJuIChOVUxMKTsKKysJCX0KKysJCXAtPmZ0c19sZXZlbCA9IGxldmVsOworKwkJcC0+ZnRzX3BhcmVudCA9IHNwLT5mdHNfY3VyOworKwkJcC0+ZnRzX3BhdGhsZW4gPSBsZW4gKyBfRF9FWEFDVF9OQU1MRU4gKGRwKTsKKysKKysjaWYgZGVmaW5lZCBGVFNfV0hJVEVPVVQgJiYgMAorKwkJaWYgKGRwLT5kX3R5cGUgPT0gRFRfV0hUKQorKwkJCXAtPmZ0c19mbGFncyB8PSBGVFNfSVNXOworKyNlbmRpZgorKworKyNpZiAwCisrCQkvKiBVbnJlYWNoYWJsZSBjb2RlLiAgY2RlcnJubyBpcyBvbmx5IGV2ZXIgc2V0IHRvIGEgbm9ubnVsbAorKwkJICAgdmFsdWUgaWYgZGlycCBpcyBjbG9zZWQgYXQgdGhlIHNhbWUgdGltZS4gIEJ1dCB0aGVuIHdlCisrCQkgICBjYW5ub3QgZW50ZXIgdGhpcyBsb29wLiAgKi8KKysJCWlmIChjZGVycm5vKSB7CisrCQkJaWYgKG5saW5rcykgeworKwkJCQlwLT5mdHNfaW5mbyA9IEZUU19OUzsKKysJCQkJcC0+ZnRzX2Vycm5vID0gY2RlcnJubzsKKysJCQl9IGVsc2UKKysJCQkJcC0+ZnRzX2luZm8gPSBGVFNfTlNPSzsKKysJCQlwLT5mdHNfYWNjcGF0aCA9IGN1ci0+ZnRzX2FjY3BhdGg7CisrCQl9IGVsc2UKKysjZW5kaWYKKysJCWlmIChubGlua3MgPT0gMAorKyNpZiBkZWZpbmVkIERUX0RJUiAmJiBkZWZpbmVkIF9ESVJFTlRfSEFWRV9EX1RZUEUKKysJCQkgICB8fCAobm9zdGF0ICYmCisrCQkJICAgICAgIGRwLT5kX3R5cGUgIT0gRFRfRElSICYmIGRwLT5kX3R5cGUgIT0gRFRfVU5LTk9XTikKKysjZW5kaWYKKysJCSAgICApIHsKKysJCQlwLT5mdHNfYWNjcGF0aCA9CisrCQkJICAgIElTU0VUKEZUU19OT0NIRElSKSA/IHAtPmZ0c19wYXRoIDogcC0+ZnRzX25hbWU7CisrCQkJcC0+ZnRzX2luZm8gPSBGVFNfTlNPSzsKKysJCX0gZWxzZSB7CisrCQkJLyogQnVpbGQgYSBmaWxlIG5hbWUgZm9yIGZ0c19zdGF0IHRvIHN0YXQuICovCisrCQkJaWYgKElTU0VUKEZUU19OT0NIRElSKSkgeworKwkJCQlwLT5mdHNfYWNjcGF0aCA9IHAtPmZ0c19wYXRoOworKwkJCQltZW1tb3ZlKGNwLCBwLT5mdHNfbmFtZSwgcC0+ZnRzX25hbWVsZW4gKyAxKTsKKysJCQl9IGVsc2UKKysJCQkJcC0+ZnRzX2FjY3BhdGggPSBwLT5mdHNfbmFtZTsKKysJCQkvKiBTdGF0IGl0LiAqLworKwkJCXAtPmZ0c19pbmZvID0gZnRzX3N0YXQoc3AsIHAsIDApOworKworKwkJCS8qIERlY3JlbWVudCBsaW5rIGNvdW50IGlmIGFwcGxpY2FibGUuICovCisrCQkJaWYgKG5saW5rcyA+IDAgJiYgKHAtPmZ0c19pbmZvID09IEZUU19EIHx8CisrCQkJICAgIHAtPmZ0c19pbmZvID09IEZUU19EQyB8fCBwLT5mdHNfaW5mbyA9PSBGVFNfRE9UKSkKKysJCQkJLS1ubGlua3M7CisrCQl9CisrCisrCQkvKiBXZSB3YWxrIGluIGRpcmVjdG9yeSBvcmRlciBzbyAibHMgLWYiIGRvZXNuJ3QgZ2V0IHVwc2V0LiAqLworKwkJcC0+ZnRzX2xpbmsgPSBOVUxMOworKwkJaWYgKGhlYWQgPT0gTlVMTCkKKysJCQloZWFkID0gdGFpbCA9IHA7CisrCQllbHNlIHsKKysJCQl0YWlsLT5mdHNfbGluayA9IHA7CisrCQkJdGFpbCA9IHA7CisrCQl9CisrCQkrK25pdGVtczsKKysJfQorKwlpZiAoZGlycCkKKysJCSh2b2lkKWNsb3NlZGlyKGRpcnApOworKworKwkvKgorKwkgKiBJZiByZWFsbG9jKCkgY2hhbmdlZCB0aGUgYWRkcmVzcyBvZiB0aGUgcGF0aCwgYWRqdXN0IHRoZQorKwkgKiBhZGRyZXNzZXMgZm9yIHRoZSByZXN0IG9mIHRoZSB0cmVlIGFuZCB0aGUgZGlyIGxpc3QuCisrCSAqLworKwlpZiAoZG9hZGp1c3QpCisrCQlmdHNfcGFkanVzdChzcCwgaGVhZCk7CisrCisrCS8qCisrCSAqIElmIG5vdCBjaGFuZ2luZyBkaXJlY3RvcmllcywgcmVzZXQgdGhlIHBhdGggYmFjayB0byBvcmlnaW5hbAorKwkgKiBzdGF0ZS4KKysJICovCisrCWlmIChJU1NFVChGVFNfTk9DSERJUikpIHsKKysJCWlmIChsZW4gPT0gc3AtPmZ0c19wYXRobGVuIHx8IG5pdGVtcyA9PSAwKQorKwkJCS0tY3A7CisrCQkqY3AgPSAnXDAnOworKwl9CisrCisrCS8qCisrCSAqIElmIGRlc2NlbmRlZCBhZnRlciBjYWxsZWQgZnJvbSBmdHNfY2hpbGRyZW4gb3IgYWZ0ZXIgY2FsbGVkIGZyb20KKysJICogZnRzX3JlYWQgYW5kIG5vdGhpbmcgZm91bmQsIGdldCBiYWNrLiAgQXQgdGhlIHJvb3QgbGV2ZWwgd2UgdXNlCisrCSAqIHRoZSBzYXZlZCBmZDsgaWYgb25lIG9mIGZ0c19vcGVuKCkncyBhcmd1bWVudHMgaXMgYSByZWxhdGl2ZSBwYXRoCisrCSAqIHRvIGFuIGVtcHR5IGRpcmVjdG9yeSwgd2Ugd2luZCB1cCBoZXJlIHdpdGggbm8gb3RoZXIgd2F5IGJhY2suICBJZgorKwkgKiBjYW4ndCBnZXQgYmFjaywgd2UncmUgZG9uZS4KKysJICovCisrCWlmIChkZXNjZW5kICYmICh0eXBlID09IEJDSElMRCB8fCAhbml0ZW1zKSAmJgorKwkgICAgKGN1ci0+ZnRzX2xldmVsID09IEZUU19ST09UTEVWRUwgPworKwkgICAgIEZDSERJUihzcCwgc3AtPmZ0c19yZmQpIDoKKysJICAgICBmdHNfc2FmZV9jaGFuZ2VkaXIoc3AsIGN1ci0+ZnRzX3BhcmVudCwgLTEsICIuLiIpKSkgeworKwkJY3VyLT5mdHNfaW5mbyA9IEZUU19FUlI7CisrCQlTRVQoRlRTX1NUT1ApOworKwkJZnRzX2xmcmVlKGhlYWQpOworKwkJcmV0dXJuIChOVUxMKTsKKysJfQorKworKwkvKiBJZiBkaWRuJ3QgZmluZCBhbnl0aGluZywgcmV0dXJuIE5VTEwuICovCisrCWlmICghbml0ZW1zKSB7CisrCQlpZiAodHlwZSA9PSBCUkVBRCkKKysJCQljdXItPmZ0c19pbmZvID0gRlRTX0RQOworKwkJZnRzX2xmcmVlKGhlYWQpOworKwkJcmV0dXJuIChOVUxMKTsKKysJfQorKworKwkvKiBTb3J0IHRoZSBlbnRyaWVzLiAqLworKwlpZiAoc3AtPmZ0c19jb21wYXIgJiYgbml0ZW1zID4gMSkKKysJCWhlYWQgPSBmdHNfc29ydChzcCwgaGVhZCwgbml0ZW1zKTsKKysJcmV0dXJuIChoZWFkKTsKKyt9CisrCisrc3RhdGljIHVfc2hvcnQKKytmdHNfc3RhdChGVFMgKnNwLCByZWdpc3RlciBGVFNFTlQgKnAsIGludCBmb2xsb3cpCisreworKwlyZWdpc3RlciBGVFNFTlQgKnQ7CisrCXJlZ2lzdGVyIGRldl90IGRldjsKKysJcmVnaXN0ZXIgaW5vX3QgaW5vOworKwlzdHJ1Y3Qgc3RhdCAqc2JwLCBzYjsKKysJaW50IHNhdmVkX2Vycm5vOworKworKwkvKiBJZiB1c2VyIG5lZWRzIHN0YXQgaW5mbywgc3RhdCBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQuICovCisrCXNicCA9IElTU0VUKEZUU19OT1NUQVQpID8gJnNiIDogcC0+ZnRzX3N0YXRwOworKworKyNpZiBkZWZpbmVkIEZUU19XSElURU9VVCAmJiAwCisrCS8qIGNoZWNrIGZvciB3aGl0ZW91dCAqLworKwlpZiAocC0+ZnRzX2ZsYWdzICYgRlRTX0lTVykgeworKwkJaWYgKHNicCAhPSAmc2IpIHsKKysJCQltZW1zZXQoc2JwLCAnXDAnLCBzaXplb2YgKCpzYnApKTsKKysJCQlzYnAtPnN0X21vZGUgPSBTX0lGV0hUOworKwkJfQorKwkJcmV0dXJuIChGVFNfVyk7CisrICAgICAgIH0KKysjZW5kaWYKKysKKysJLyoKKysJICogSWYgZG9pbmcgYSBsb2dpY2FsIHdhbGssIG9yIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBGVFNfRk9MTE9XLCBkbworKwkgKiBhIHN0YXQoMikuICBJZiB0aGF0IGZhaWxzLCBjaGVjayBmb3IgYSBub24tZXhpc3RlbnQgc3ltbGluay4gIElmCisrCSAqIGZhaWwsIHNldCB0aGUgZXJybm8gZnJvbSB0aGUgc3RhdCBjYWxsLgorKwkgKi8KKysJaWYgKElTU0VUKEZUU19MT0dJQ0FMKSB8fCBmb2xsb3cpIHsKKysJCWlmIChzdGF0KHAtPmZ0c19hY2NwYXRoLCBzYnApKSB7CisrCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKysJCQlpZiAoIWxzdGF0KHAtPmZ0c19hY2NwYXRoLCBzYnApKSB7CisrCQkJCWVycm5vID0gMDsKKysJCQkJcmV0dXJuIChGVFNfU0xOT05FKTsKKysJCQl9CisrCQkJcC0+ZnRzX2Vycm5vID0gc2F2ZWRfZXJybm87CisrCQkJZ290byBlcnI7CisrCQl9CisrCX0gZWxzZSBpZiAobHN0YXQocC0+ZnRzX2FjY3BhdGgsIHNicCkpIHsKKysJCXAtPmZ0c19lcnJubyA9IGVycm5vOworK2VycjoJCW1lbXNldChzYnAsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdCkpOworKwkJcmV0dXJuIChGVFNfTlMpOworKwl9CisrCisrCWlmIChTX0lTRElSKHNicC0+c3RfbW9kZSkpIHsKKysJCS8qCisrCQkgKiBTZXQgdGhlIGRldmljZS9pbm9kZS4gIFVzZWQgdG8gZmluZCBjeWNsZXMgYW5kIGNoZWNrIGZvcgorKwkJICogY3Jvc3NpbmcgbW91bnQgcG9pbnRzLiAgQWxzbyByZW1lbWJlciB0aGUgbGluayBjb3VudCwgdXNlZAorKwkJICogaW4gZnRzX2J1aWxkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3RhdCBjYWxscy4gIEl0IGlzCisrCQkgKiB1bmRlcnN0b29kIHRoYXQgdGhlc2UgZmllbGRzIGFyZSBvbmx5IHJlZmVyZW5jZWQgaWYgZnRzX2luZm8KKysJCSAqIGlzIHNldCB0byBGVFNfRC4KKysJCSAqLworKwkJZGV2ID0gcC0+ZnRzX2RldiA9IHNicC0+c3RfZGV2OworKwkJaW5vID0gcC0+ZnRzX2lubyA9IHNicC0+c3RfaW5vOworKwkJcC0+ZnRzX25saW5rID0gc2JwLT5zdF9ubGluazsKKysKKysJCWlmIChJU0RPVChwLT5mdHNfbmFtZSkpCisrCQkJcmV0dXJuIChGVFNfRE9UKTsKKysKKysJCS8qCisrCQkgKiBDeWNsZSBkZXRlY3Rpb24gaXMgZG9uZSBieSBicnV0ZSBmb3JjZSB3aGVuIHRoZSBkaXJlY3RvcnkKKysJCSAqIGlzIGZpcnN0IGVuY291bnRlcmVkLiAgSWYgdGhlIHRyZWUgZ2V0cyBkZWVwIGVub3VnaCBvciB0aGUKKysJCSAqIG51bWJlciBvZiBzeW1ib2xpYyBsaW5rcyB0byBkaXJlY3RvcmllcyBpcyBoaWdoIGVub3VnaCwKKysJCSAqIHNvbWV0aGluZyBmYXN0ZXIgbWlnaHQgYmUgd29ydGh3aGlsZS4KKysJCSAqLworKwkJZm9yICh0ID0gcC0+ZnRzX3BhcmVudDsKKysJCSAgICB0LT5mdHNfbGV2ZWwgPj0gRlRTX1JPT1RMRVZFTDsgdCA9IHQtPmZ0c19wYXJlbnQpCisrCQkJaWYgKGlubyA9PSB0LT5mdHNfaW5vICYmIGRldiA9PSB0LT5mdHNfZGV2KSB7CisrCQkJCXAtPmZ0c19jeWNsZSA9IHQ7CisrCQkJCXJldHVybiAoRlRTX0RDKTsKKysJCQl9CisrCQlyZXR1cm4gKEZUU19EKTsKKysJfQorKwlpZiAoU19JU0xOSyhzYnAtPnN0X21vZGUpKQorKwkJcmV0dXJuIChGVFNfU0wpOworKwlpZiAoU19JU1JFRyhzYnAtPnN0X21vZGUpKQorKwkJcmV0dXJuIChGVFNfRik7CisrCXJldHVybiAoRlRTX0RFRkFVTFQpOworK30KKysKKytzdGF0aWMgRlRTRU5UICoKKytmdHNfc29ydChGVFMgKnNwLCBGVFNFTlQgKmhlYWQsIHJlZ2lzdGVyIGludCBuaXRlbXMpCisreworKwlyZWdpc3RlciBGVFNFTlQgKiphcCwgKnA7CisrCisrCS8qCisrCSAqIENvbnN0cnVjdCBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgc3RydWN0dXJlcyBhbmQgY2FsbCBxc29ydCgzKS4KKysJICogUmVhc3NlbWJsZSB0aGUgYXJyYXkgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHFzb3J0LiAgSWYgdW5hYmxlIHRvCisrCSAqIHNvcnQgZm9yIG1lbW9yeSByZWFzb25zLCByZXR1cm4gdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoZWlyCisrCSAqIGN1cnJlbnQgb3JkZXIuICBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBjdXJyZW50IG5lZWRzIHBsdXMKKysJICogNDAgc28gZG9uJ3QgcmVhbGxvYyBvbmUgZW50cnkgYXQgYSB0aW1lLgorKwkgKi8KKysJaWYgKG5pdGVtcyA+IHNwLT5mdHNfbml0ZW1zKSB7CisrCQlzdHJ1Y3QgX2Z0c2VudCAqKmE7CisrCisrCQlzcC0+ZnRzX25pdGVtcyA9IG5pdGVtcyArIDQwOworKwkJaWYgKChhID0gcmVhbGxvYyhzcC0+ZnRzX2FycmF5LAorKyAJCSAgICAoc2l6ZV90KShzcC0+ZnRzX25pdGVtcyAqIHNpemVvZihGVFNFTlQgKikpKSkgPT0gTlVMTCkgeworKwkJCWZyZWUoc3AtPmZ0c19hcnJheSk7CisrCQkJc3AtPmZ0c19hcnJheSA9IE5VTEw7CisrCQkJc3AtPmZ0c19uaXRlbXMgPSAwOworKwkJCXJldHVybiAoaGVhZCk7CisrCQl9CisrCQlzcC0+ZnRzX2FycmF5ID0gYTsKKysJfQorKwlmb3IgKGFwID0gc3AtPmZ0c19hcnJheSwgcCA9IGhlYWQ7IHA7IHAgPSBwLT5mdHNfbGluaykKKysJCSphcCsrID0gcDsKKysJcXNvcnQoKHZvaWQgKilzcC0+ZnRzX2FycmF5LCBuaXRlbXMsIHNpemVvZihGVFNFTlQgKiksIHNwLT5mdHNfY29tcGFyKTsKKysJZm9yIChoZWFkID0gKihhcCA9IHNwLT5mdHNfYXJyYXkpOyAtLW5pdGVtczsgKythcCkKKysJCWFwWzBdLT5mdHNfbGluayA9IGFwWzFdOworKwlhcFswXS0+ZnRzX2xpbmsgPSBOVUxMOworKwlyZXR1cm4gKGhlYWQpOworK30KKysKKytzdGF0aWMgRlRTRU5UICoKKytmdHNfYWxsb2MoRlRTICpzcCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4pCisreworKwlyZWdpc3RlciBGVFNFTlQgKnA7CisrCXNpemVfdCBsZW47CisrCisrCS8qCisrCSAqIFRoZSBmaWxlIG5hbWUgaXMgYSB2YXJpYWJsZSBsZW5ndGggYXJyYXkgYW5kIG5vIHN0YXQgc3RydWN0dXJlIGlzCisrCSAqIG5lY2Vzc2FyeSBpZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBub3N0YXQgYml0LiAgQWxsb2NhdGUgdGhlIEZUU0VOVAorKwkgKiBzdHJ1Y3R1cmUsIHRoZSBmaWxlIG5hbWUgYW5kIHRoZSBzdGF0IHN0cnVjdHVyZSBpbiBvbmUgY2h1bmssIGJ1dAorKwkgKiBiZSBjYXJlZnVsIHRoYXQgdGhlIHN0YXQgc3RydWN0dXJlIGlzIHJlYXNvbmFibHkgYWxpZ25lZC4gIFNpbmNlIHRoZQorKwkgKiBmdHNfbmFtZSBmaWVsZCBpcyBkZWNsYXJlZCB0byBiZSBvZiBzaXplIDEsIHRoZSBmdHNfbmFtZSBwb2ludGVyIGlzCisrCSAqIG5hbWVsZW4gKyAyIGJlZm9yZSB0aGUgZmlyc3QgcG9zc2libGUgYWRkcmVzcyBvZiB0aGUgc3RhdCBzdHJ1Y3R1cmUuCisrCSAqLworKwlsZW4gPSBzaXplb2YoRlRTRU5UKSArIG5hbWVsZW47CisrCWlmICghSVNTRVQoRlRTX05PU1RBVCkpCisrCQlsZW4gKz0gc2l6ZW9mKHN0cnVjdCBzdGF0KSArIEFMSUdOQllURVM7CisrCWlmICgocCA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKQorKwkJcmV0dXJuIChOVUxMKTsKKysKKysJLyogQ29weSB0aGUgbmFtZSBhbmQgZ3VhcmFudGVlIE5VTCB0ZXJtaW5hdGlvbi4gKi8KKysJbWVtbW92ZShwLT5mdHNfbmFtZSwgbmFtZSwgbmFtZWxlbik7CisrCXAtPmZ0c19uYW1lW25hbWVsZW5dID0gJ1wwJzsKKysKKysJaWYgKCFJU1NFVChGVFNfTk9TVEFUKSkKKysJCXAtPmZ0c19zdGF0cCA9IChzdHJ1Y3Qgc3RhdCAqKUFMSUdOKHAtPmZ0c19uYW1lICsgbmFtZWxlbiArIDIpOworKwlwLT5mdHNfbmFtZWxlbiA9IG5hbWVsZW47CisrCXAtPmZ0c19wYXRoID0gc3AtPmZ0c19wYXRoOworKwlwLT5mdHNfZXJybm8gPSAwOworKwlwLT5mdHNfZmxhZ3MgPSAwOworKwlwLT5mdHNfaW5zdHIgPSBGVFNfTk9JTlNUUjsKKysJcC0+ZnRzX251bWJlciA9IDA7CisrCXAtPmZ0c19wb2ludGVyID0gTlVMTDsKKysJcmV0dXJuIChwKTsKKyt9CisrCisrc3RhdGljIHZvaWQKKytmdHNfbGZyZWUocmVnaXN0ZXIgRlRTRU5UICpoZWFkKQorK3sKKysJcmVnaXN0ZXIgRlRTRU5UICpwOworKworKwkvKiBGcmVlIGEgbGlua2VkIGxpc3Qgb2Ygc3RydWN0dXJlcy4gKi8KKysJd2hpbGUgKChwID0gaGVhZCkpIHsKKysJCWhlYWQgPSBoZWFkLT5mdHNfbGluazsKKysJCWZyZWUocCk7CisrCX0KKyt9CisrCisrLyoKKysgKiBBbGxvdyBlc3NlbnRpYWxseSB1bmxpbWl0ZWQgcGF0aHM7IGZpbmQsIHJtLCBscyBzaG91bGQgYWxsIHdvcmsgb24gYW55IHRyZWUuCisrICogTW9zdCBzeXN0ZW1zIHdpbGwgYWxsb3cgY3JlYXRpb24gb2YgcGF0aHMgbXVjaCBsb25nZXIgdGhhbiBNQVhQQVRITEVOLCBldmVuCisrICogdGhvdWdoIHRoZSBrZXJuZWwgd29uJ3QgcmVzb2x2ZSB0aGVtLiAgQWRkIHRoZSBzaXplIChub3QganVzdCB3aGF0J3MgbmVlZGVkKQorKyAqIHBsdXMgMjU2IGJ5dGVzIHNvIGRvbid0IHJlYWxsb2MgdGhlIHBhdGggMiBieXRlcyBhdCBhIHRpbWUuCisrICovCisrc3RhdGljIGludAorK2Z0c19wYWxsb2MoRlRTICpzcCwgc2l6ZV90IG1vcmUpCisreworKwljaGFyICpwOworKworKwlzcC0+ZnRzX3BhdGhsZW4gKz0gbW9yZSArIDI1NjsKKysJLyoKKysJICogQ2hlY2sgZm9yIHBvc3NpYmxlIHdyYXBhcm91bmQuICBJbiBhbiBGVFMsIGZ0c19wYXRobGVuIGlzCisrCSAqIGEgc2lnbmVkIGludCBidXQgaW4gYW4gRlRTRU5UIGl0IGlzIGFuIHVuc2lnbmVkIHNob3J0LgorKwkgKiBXZSBsaW1pdCBmdHNfcGF0aGxlbiB0byBVU0hSVF9NQVggdG8gYmUgc2FmZSBpbiBib3RoIGNhc2VzLgorKwkgKi8KKysJaWYgKHNwLT5mdHNfcGF0aGxlbiA8IDAgfHwgc3AtPmZ0c19wYXRobGVuID49IFVTSFJUX01BWCkgeworKwkJZnJlZShzcC0+ZnRzX3BhdGgpOworKwkJc3AtPmZ0c19wYXRoID0gTlVMTDsKKysJCWVycm5vID0gRU5BTUVUT09MT05HOworKwkJcmV0dXJuICgxKTsKKysJfQorKwlwID0gcmVhbGxvYyhzcC0+ZnRzX3BhdGgsIHNwLT5mdHNfcGF0aGxlbik7CisrCWlmIChwID09IE5VTEwpIHsKKysJCWZyZWUoc3AtPmZ0c19wYXRoKTsKKysJCXNwLT5mdHNfcGF0aCA9IE5VTEw7CisrCQlyZXR1cm4gMTsKKysJfQorKwlzcC0+ZnRzX3BhdGggPSBwOworKwlyZXR1cm4gMDsKKyt9CisrCisrLyoKKysgKiBXaGVuIHRoZSBwYXRoIGlzIHJlYWxsb2MnZCwgaGF2ZSB0byBmaXggYWxsIG9mIHRoZSBwb2ludGVycyBpbiBzdHJ1Y3R1cmVzCisrICogYWxyZWFkeSByZXR1cm5lZC4KKysgKi8KKytzdGF0aWMgdm9pZAorK2Z0c19wYWRqdXN0KEZUUyAqc3AsIEZUU0VOVCAqaGVhZCkKKyt7CisrCUZUU0VOVCAqcDsKKysJY2hhciAqYWRkciA9IHNwLT5mdHNfcGF0aDsKKysKKysjZGVmaW5lCUFESlVTVChwKSBkbyB7CQkJCQkJCVwKKysJaWYgKChwKS0+ZnRzX2FjY3BhdGggIT0gKHApLT5mdHNfbmFtZSkgewkJCVwKKysJCShwKS0+ZnRzX2FjY3BhdGggPQkJCQkJXAorKwkJICAgIChjaGFyICopYWRkciArICgocCktPmZ0c19hY2NwYXRoIC0gKHApLT5mdHNfcGF0aCk7CVwKKysJfQkJCQkJCQkJXAorKwkocCktPmZ0c19wYXRoID0gYWRkcjsJCQkJCQlcCisrfSB3aGlsZSAoMCkKKysJLyogQWRqdXN0IHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4gKi8KKysJZm9yIChwID0gc3AtPmZ0c19jaGlsZDsgcDsgcCA9IHAtPmZ0c19saW5rKQorKwkJQURKVVNUKHApOworKworKwkvKiBBZGp1c3QgdGhlIHJlc3Qgb2YgdGhlIHRyZWUsIGluY2x1ZGluZyB0aGUgY3VycmVudCBsZXZlbC4gKi8KKysJZm9yIChwID0gaGVhZDsgcC0+ZnRzX2xldmVsID49IEZUU19ST09UTEVWRUw7KSB7CisrCQlBREpVU1QocCk7CisrCQlwID0gcC0+ZnRzX2xpbmsgPyBwLT5mdHNfbGluayA6IHAtPmZ0c19wYXJlbnQ7CisrCX0KKyt9CisrCisrc3RhdGljIHNpemVfdAorK2Z0c19tYXhhcmdsZW4oY2hhciAqIGNvbnN0ICphcmd2KQorK3sKKysJc2l6ZV90IGxlbiwgbWF4OworKworKwlmb3IgKG1heCA9IDA7ICphcmd2OyArK2FyZ3YpCisrCQlpZiAoKGxlbiA9IHN0cmxlbigqYXJndikpID4gbWF4KQorKwkJCW1heCA9IGxlbjsKKysJcmV0dXJuIChtYXggKyAxKTsKKyt9CisrCisrLyoKKysgKiBDaGFuZ2UgdG8gZGlyIHNwZWNpZmllZCBieSBmZCBvciBwLT5mdHNfYWNjcGF0aCB3aXRob3V0IGdldHRpbmcKKysgKiB0cmlja2VkIGJ5IHNvbWVvbmUgY2hhbmdpbmcgdGhlIHdvcmxkIG91dCBmcm9tIHVuZGVybmVhdGggdXMuCisrICogQXNzdW1lcyBwLT5mdHNfZGV2IGFuZCBwLT5mdHNfaW5vIGFyZSBmaWxsZWQgaW4uCisrICovCisrc3RhdGljIGludAorK2Z0c19zYWZlX2NoYW5nZWRpcihGVFMgKnNwLCBGVFNFTlQgKnAsIGludCBmZCwgY29uc3QgY2hhciAqcGF0aCkKKyt7CisrCWludCByZXQsIG9lcnJubywgbmV3ZmQ7CisrCXN0cnVjdCBzdGF0NjQgc2I7CisrCisrCW5ld2ZkID0gZmQ7CisrCWlmIChJU1NFVChGVFNfTk9DSERJUikpCisrCQlyZXR1cm4gKDApOworKwlpZiAoZmQgPCAwICYmIChuZXdmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFksIDApKSA8IDApCisrCQlyZXR1cm4gKC0xKTsKKysJaWYgKGZzdGF0NjQobmV3ZmQsICZzYikpIHsKKysJCXJldCA9IC0xOworKwkJZ290byBiYWlsOworKwl9CisrCWlmIChwLT5mdHNfZGV2ICE9IHNiLnN0X2RldiB8fCBwLT5mdHNfaW5vICE9IHNiLnN0X2lubykgeworKwkJZXJybm8gPSBFTk9FTlQ7CQkvKiBkaXNpbmZvcm1hdGlvbiAqLworKwkJcmV0ID0gLTE7CisrCQlnb3RvIGJhaWw7CisrCX0KKysJcmV0ID0gZmNoZGlyKG5ld2ZkKTsKKytiYWlsOgorKwlvZXJybm8gPSBlcnJubzsKKysJaWYgKGZkIDwgMCkKKysJCSh2b2lkKWNsb3NlKG5ld2ZkKTsKKysJZXJybm8gPSBvZXJybm87CisrCXJldHVybiAocmV0KTsKKyt9CitkaWZmIC1OcnVwIGEvbGliZHdmbC9mdHNfLmggYi9saWJkd2ZsL2Z0c18uaAorLS0tIGEvbGliZHdmbC9mdHNfLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrKyBiL2xpYmR3ZmwvZnRzXy5oCTIwMTUtMDEtMDYgMTE6NDI6MTMuNDgxNjQwMzIyICswMDAwCitAQCAtMCwwICsxLDEzMSBAQAorKy8qCisrICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisrICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisrICoKKysgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKysgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKysgKiBhcmUgbWV0OgorKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisrICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisrICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisrICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKysgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKysgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKysgKgorKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisrICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisrICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKysgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKysgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisrICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisrICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKysgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisrICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorKyAqIFNVQ0ggREFNQUdFLgorKyAqCisrICoJQCgjKWZ0cy5oCTguMyAoQmVya2VsZXkpIDgvMTQvOTQKKysgKi8KKysKKysjaWZuZGVmCV9GVFNfSAorKyNkZWZpbmUJX0ZUU19IIDEKKysKKysjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrLyogVGhlIGZ0cyBpbnRlcmZhY2UgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIExGUyBpbnRlcmZhY2Ugd2hpY2gKKysgICB0cmFuc3BhcmVudGx5IHVzZXMgdGhlIDY0LWJpdCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMuICAqLworKyNpZmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisrIyBlcnJvciAiPGZ0cy5oPiBjYW5ub3QgYmUgdXNlZCB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9PTY0IgorKyNlbmRpZgorKworKworK3R5cGVkZWYgc3RydWN0IHsKKysJc3RydWN0IF9mdHNlbnQgKmZ0c19jdXI7CS8qIGN1cnJlbnQgbm9kZSAqLworKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2NoaWxkOwkvKiBsaW5rZWQgbGlzdCBvZiBjaGlsZHJlbiAqLworKwlzdHJ1Y3QgX2Z0c2VudCAqKmZ0c19hcnJheTsJLyogc29ydCBhcnJheSAqLworKwlkZXZfdCBmdHNfZGV2OwkJCS8qIHN0YXJ0aW5nIGRldmljZSAjICovCisrCWNoYXIgKmZ0c19wYXRoOwkJCS8qIHBhdGggZm9yIHRoaXMgZGVzY2VudCAqLworKwlpbnQgZnRzX3JmZDsJCQkvKiBmZCBmb3Igcm9vdCAqLworKwlpbnQgZnRzX3BhdGhsZW47CQkvKiBzaXplb2YocGF0aCkgKi8KKysJaW50IGZ0c19uaXRlbXM7CQkJLyogZWxlbWVudHMgaW4gdGhlIHNvcnQgYXJyYXkgKi8KKysJaW50ICgqZnRzX2NvbXBhcikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsgLyogY29tcGFyZSBmbiAqLworKworKyNkZWZpbmUJRlRTX0NPTUZPTExPVwkweDAwMDEJCS8qIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MgKi8KKysjZGVmaW5lCUZUU19MT0dJQ0FMCTB4MDAwMgkJLyogbG9naWNhbCB3YWxrICovCisrI2RlZmluZQlGVFNfTk9DSERJUgkweDAwMDQJCS8qIGRvbid0IGNoYW5nZSBkaXJlY3RvcmllcyAqLworKyNkZWZpbmUJRlRTX05PU1RBVAkweDAwMDgJCS8qIGRvbid0IGdldCBzdGF0IGluZm8gKi8KKysjZGVmaW5lCUZUU19QSFlTSUNBTAkweDAwMTAJCS8qIHBoeXNpY2FsIHdhbGsgKi8KKysjZGVmaW5lCUZUU19TRUVET1QJMHgwMDIwCQkvKiByZXR1cm4gZG90IGFuZCBkb3QtZG90ICovCisrI2RlZmluZQlGVFNfWERFVgkweDAwNDAJCS8qIGRvbid0IGNyb3NzIGRldmljZXMgKi8KKysjZGVmaW5lIEZUU19XSElURU9VVAkweDAwODAJCS8qIHJldHVybiB3aGl0ZW91dCBpbmZvcm1hdGlvbiAqLworKyNkZWZpbmUJRlRTX09QVElPTk1BU0sJMHgwMGZmCQkvKiB2YWxpZCB1c2VyIG9wdGlvbiBtYXNrICovCisrCisrI2RlZmluZQlGVFNfTkFNRU9OTFkJMHgwMTAwCQkvKiAocHJpdmF0ZSkgY2hpbGQgbmFtZXMgb25seSAqLworKyNkZWZpbmUJRlRTX1NUT1AJMHgwMjAwCQkvKiAocHJpdmF0ZSkgdW5yZWNvdmVyYWJsZSBlcnJvciAqLworKwlpbnQgZnRzX29wdGlvbnM7CQkvKiBmdHNfb3BlbiBvcHRpb25zLCBnbG9iYWwgZmxhZ3MgKi8KKyt9IEZUUzsKKysKKyt0eXBlZGVmIHN0cnVjdCBfZnRzZW50IHsKKysJc3RydWN0IF9mdHNlbnQgKmZ0c19jeWNsZTsJLyogY3ljbGUgbm9kZSAqLworKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX3BhcmVudDsJLyogcGFyZW50IGRpcmVjdG9yeSAqLworKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2xpbms7CS8qIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgKi8KKysJbG9uZyBmdHNfbnVtYmVyOwkgICAgICAgIC8qIGxvY2FsIG51bWVyaWMgdmFsdWUgKi8KKysJdm9pZCAqZnRzX3BvaW50ZXI7CSAgICAgICAgLyogbG9jYWwgYWRkcmVzcyB2YWx1ZSAqLworKwljaGFyICpmdHNfYWNjcGF0aDsJCS8qIGFjY2VzcyBwYXRoICovCisrCWNoYXIgKmZ0c19wYXRoOwkJCS8qIHJvb3QgcGF0aCAqLworKwlpbnQgZnRzX2Vycm5vOwkJCS8qIGVycm5vIGZvciB0aGlzIG5vZGUgKi8KKysJaW50IGZ0c19zeW1mZDsJCQkvKiBmZCBmb3Igc3ltbGluayAqLworKwl1X3Nob3J0IGZ0c19wYXRobGVuOwkJLyogc3RybGVuKGZ0c19wYXRoKSAqLworKwl1X3Nob3J0IGZ0c19uYW1lbGVuOwkJLyogc3RybGVuKGZ0c19uYW1lKSAqLworKworKwlpbm9fdCBmdHNfaW5vOwkJCS8qIGlub2RlICovCisrCWRldl90IGZ0c19kZXY7CQkJLyogZGV2aWNlICovCisrCW5saW5rX3QgZnRzX25saW5rOwkJLyogbGluayBjb3VudCAqLworKworKyNkZWZpbmUJRlRTX1JPT1RQQVJFTlRMRVZFTAktMQorKyNkZWZpbmUJRlRTX1JPT1RMRVZFTAkJIDAKKysJc2hvcnQgZnRzX2xldmVsOwkJLyogZGVwdGggKC0xIHRvIE4pICovCisrCisrI2RlZmluZQlGVFNfRAkJIDEJCS8qIHByZW9yZGVyIGRpcmVjdG9yeSAqLworKyNkZWZpbmUJRlRTX0RDCQkgMgkJLyogZGlyZWN0b3J5IHRoYXQgY2F1c2VzIGN5Y2xlcyAqLworKyNkZWZpbmUJRlRTX0RFRkFVTFQJIDMJCS8qIG5vbmUgb2YgdGhlIGFib3ZlICovCisrI2RlZmluZQlGVFNfRE5SCQkgNAkJLyogdW5yZWFkYWJsZSBkaXJlY3RvcnkgKi8KKysjZGVmaW5lCUZUU19ET1QJCSA1CQkvKiBkb3Qgb3IgZG90LWRvdCAqLworKyNkZWZpbmUJRlRTX0RQCQkgNgkJLyogcG9zdG9yZGVyIGRpcmVjdG9yeSAqLworKyNkZWZpbmUJRlRTX0VSUgkJIDcJCS8qIGVycm9yOyBlcnJubyBpcyBzZXQgKi8KKysjZGVmaW5lCUZUU19GCQkgOAkJLyogcmVndWxhciBmaWxlICovCisrI2RlZmluZQlGVFNfSU5JVAkgOQkJLyogaW5pdGlhbGl6ZWQgb25seSAqLworKyNkZWZpbmUJRlRTX05TCQkxMAkJLyogc3RhdCgyKSBmYWlsZWQgKi8KKysjZGVmaW5lCUZUU19OU09LCTExCQkvKiBubyBzdGF0KDIpIHJlcXVlc3RlZCAqLworKyNkZWZpbmUJRlRTX1NMCQkxMgkJLyogc3ltYm9saWMgbGluayAqLworKyNkZWZpbmUJRlRTX1NMTk9ORQkxMwkJLyogc3ltYm9saWMgbGluayB3aXRob3V0IHRhcmdldCAqLworKyNkZWZpbmUgRlRTX1cJCTE0CQkvKiB3aGl0ZW91dCBvYmplY3QgKi8KKysJdV9zaG9ydCBmdHNfaW5mbzsJCS8qIHVzZXIgZmxhZ3MgZm9yIEZUU0VOVCBzdHJ1Y3R1cmUgKi8KKysKKysjZGVmaW5lCUZUU19ET05UQ0hESVIJIDB4MDEJCS8qIGRvbid0IGNoZGlyIC4uIHRvIHRoZSBwYXJlbnQgKi8KKysjZGVmaW5lCUZUU19TWU1GT0xMT1cJIDB4MDIJCS8qIGZvbGxvd2VkIGEgc3ltbGluayB0byBnZXQgaGVyZSAqLworKwl1X3Nob3J0IGZ0c19mbGFnczsJCS8qIHByaXZhdGUgZmxhZ3MgZm9yIEZUU0VOVCBzdHJ1Y3R1cmUgKi8KKysKKysjZGVmaW5lCUZUU19BR0FJTgkgMQkJLyogcmVhZCBub2RlIGFnYWluICovCisrI2RlZmluZQlGVFNfRk9MTE9XCSAyCQkvKiBmb2xsb3cgc3ltYm9saWMgbGluayAqLworKyNkZWZpbmUJRlRTX05PSU5TVFIJIDMJCS8qIG5vIGluc3RydWN0aW9ucyAqLworKyNkZWZpbmUJRlRTX1NLSVAJIDQJCS8qIGRpc2NhcmQgbm9kZSAqLworKwl1X3Nob3J0IGZ0c19pbnN0cjsJCS8qIGZ0c19zZXQoKSBpbnN0cnVjdGlvbnMgKi8KKysKKysJc3RydWN0IHN0YXQgKmZ0c19zdGF0cDsJCS8qIHN0YXQoMikgaW5mb3JtYXRpb24gKi8KKysJY2hhciBmdHNfbmFtZVsxXTsJCS8qIGZpbGUgbmFtZSAqLworK30gRlRTRU5UOworKworK19fQkVHSU5fREVDTFMKKytGVFNFTlQJKmZ0c19jaGlsZHJlbiAoRlRTICosIGludCk7CisraW50CSBmdHNfY2xvc2UgKEZUUyAqKTsKKytGVFMJKmZ0c19vcGVuIChjaGFyICogY29uc3QgKiwgaW50LAorKwkJICAgaW50ICgqKShjb25zdCBGVFNFTlQgKiosIGNvbnN0IEZUU0VOVCAqKikpOworK0ZUU0VOVAkqZnRzX3JlYWQgKEZUUyAqKTsKKytpbnQJIGZ0c19zZXQgKEZUUyAqLCBGVFNFTlQgKiwgaW50KSBfX1RIUk9XOworK19fRU5EX0RFQ0xTCisrCisrI2VuZGlmIC8qIGZ0cy5oICovCitkaWZmIC1OcnVwIGEvbGliZHdmbC9saW51eC1rZXJuZWwtbW9kdWxlcy5jIGIvbGliZHdmbC9saW51eC1rZXJuZWwtbW9kdWxlcy5jCistLS0gYS9saWJkd2ZsL2xpbnV4LWtlcm5lbC1tb2R1bGVzLmMJMjAxNC0xMS0yMiAyMjo0Mzo1Mi4wMDAwMDAwMDAgKzAwMDAKKysrKyBiL2xpYmR3ZmwvbGludXgta2VybmVsLW1vZHVsZXMuYwkyMDE1LTAxLTA2IDExOjQ0OjI1LjYxMDkyNDgwNSArMDAwMAorQEAgLTI5LDcgKzI5LDExIEBACisgLyogV2UgaW5jbHVkZSB0aGlzIGJlZm9yZSBjb25maWcuaCBiZWNhdXNlIGl0IGNhbid0IGhhbmRsZSBfRklMRV9PRkZTRVRfQklUUy4KKyAgICBFdmVyeXRoaW5nIHdlIG5lZWQgaGVyZSBpcyBmaW5lIGlmIGl0cyBkZWNsYXJhdGlvbnMganVzdCBjb21lIGZpcnN0LiAgKi8KKyAKKysjaWZkZWYgSEFWRV9GVFNfSAorICNpbmNsdWRlIDxmdHMuaD4KKysjZWxzZQorKyNpbmNsdWRlIDxmdHNfLmg+CisrI2VuZGlmCisgCisgI2luY2x1ZGUgPGNvbmZpZy5oPgorIAorZGlmZiAtTnJ1cCBhL2xpYmR3ZmwvTWFrZWZpbGUuYW0gYi9saWJkd2ZsL01ha2VmaWxlLmFtCistLS0gYS9saWJkd2ZsL01ha2VmaWxlLmFtCTIwMTQtMDYtMTcgMTk6NTE6MDkuMDAwMDAwMDAwICswMTAwCisrKysgYi9saWJkd2ZsL01ha2VmaWxlLmFtCTIwMTUtMDEtMDYgMTE6NDU6MjUuNDQyOTU5MzY5ICswMDAwCitAQCAtNzksNiArNzksOSBAQCBlbmRpZgorIGlmIExaTUEKKyBsaWJkd2ZsX2FfU09VUkNFUyArPSBsem1hLmMKKyBlbmRpZgorK2lmICFIQVZFX0ZUUworK2xpYmR3ZmxfYV9TT1VSQ0VTICs9IGZ0cy5jCisrZW5kaWYKKyAKKyBsaWJkd2ZsID0gJChsaWJkdykKKyBsaWJkdyA9IC4uL2xpYmR3L2xpYmR3LnNvCmRpZmYgLS1naXQgYS9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDQtZGlzYWJsZS1wby5wYXRjaCBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNC1kaXNhYmxlLXBvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWM1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDQtZGlzYWJsZS1wby5wYXRjaApAQCAtMCwwICsxLDI0IEBACitEaXNhYmxlIHRoZSBidWlsZCBvZiB0aGUgcG8vIGRpcmVjdG9yeQorCitCdWlsZGluZyB0aGUgcG8vIGRpcmVjdG9yeSBjb21wbGFpbnMgdGhhdCB0aGUgc2NyaXB0cyBpbiB0aGVyZSBoYXZlCitiZWVuIGdlbmVyYXRlZCB3aXRoIGdldHRleHQgMC4xNywgd2hpbGUgd2UgdXNlIGdldHRleHQgMC4xOCBpbgorQnVpbGRyb290LiBTaW5jZSB3ZSBkb24ndCBjYXJlIHRoYXQgbXVjaCBhYm91dCBwbyBmaWxlcyBhbnl3YXksIGp1c3QKK2Rpc2FibGUgdGhlIGJ1aWxkIG9mIHRoaXMgZGlyZWN0b3J5LgorCitCYXNlZCBvbiB0aGUgZm9ybWVyIHBhdGNoIGJ5IFRob21hcyBQZXRhenpvbmkuCisKK1NpZ25lZC1vZmYtYnk6IFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorU2lnbmVkLW9mZi1ieTogVmljZW50ZSBPbGl2ZXJ0IFJpZXJhIDxWaW5jZW50LlJpZXJhQGltZ3RlYy5jb20+CisKK2RpZmYgLXJ1cCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KKy0tLSBhL01ha2VmaWxlLmFtCTIwMTQtMTEtMDcgMTU6MTQ6MzkuMDE4MDYwODg0ICswMDAwCisrKysgYi9NYWtlZmlsZS5hbQkyMDE0LTExLTA3IDE1OjMwOjAyLjg2NDkxODIyOSArMDAwMAorQEAgLTI4LDcgKzI4LDcgQEAgZW5kaWYKKworICMgQWRkIGRvYyBiYWNrIHdoZW4gd2UgaGF2ZSBzb21lIHJlYWwgY29udGVudC4KKyBTVUJESVJTID0gY29uZmlnIG00IGxpYiBsaWJlbGYgbGliZWJsIGxpYmR3ZWxmIGxpYmR3ZmwgbGliZHcgbGliY3B1IGxpYmFzbSBcCistCSAgYmFja2VuZHMgJChQUk9HU19TVUJESVIpIHBvIHRlc3RzCisrCSAgYmFja2VuZHMgJChQUk9HU19TVUJESVIpIHRlc3RzCisKKyBFWFRSQV9ESVNUID0gZWxmdXRpbHMuc3BlYyBHUEctS0VZIE5PVEVTIENPTlRSSUJVVElORyBcCisJICAgICBDT1BZSU5HIENPUFlJTkctR1BMVjIgQ09QWUlORy1MR1BMVjMKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNS1yZWFsbHktbWFrZS13ZXJyb3ItY29uZGl0aW9uYWwtdG8tYnVpbGQtd2Vycm9yLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDA1LXJlYWxseS1tYWtlLXdlcnJvci1jb25kaXRpb25hbC10by1idWlsZC13ZXJyb3IucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhYWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNS1yZWFsbHktbWFrZS13ZXJyb3ItY29uZGl0aW9uYWwtdG8tYnVpbGQtd2Vycm9yLnBhdGNoCkBAIC0wLDAgKzEsMjQgQEAKK1JlYWxseSBtYWtlIC1XZXJyb3IgY29uZGl0aW9uYWwgdG8gQlVJTERfV0VSUk9SCisKK090aGVyd2lzZSBpdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGxpa2UgdGhpcyBvbmU6CisKK2VsZl9nZXRhcnN5bS5jOjI5MDo5OiBlcnJvcjogJ24nIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcworZnVuY3Rpb24gWy1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZF0KKyAgICBhcnN5bVtuXS5hc19uYW1lID0gTlVMTDsKKwkgXgorY2MxOiBhbGwgd2FybmluZ3MgYmVpbmcgdHJlYXRlZCBhcyBlcnJvcnMKKworU2lnbmVkLW9mZi1ieTogIllhbm4gRS4gTU9SSU4iIDx5YW5uLm1vcmluLjE5OThAZnJlZS5mcj4KK1NpZ25lZC1vZmYtYnk6IFZpY2VudGUgT2xpdmVydCBSaWVyYSA8VmluY2VudC5SaWVyYUBpbWd0ZWMuY29tPgorCitkaWZmIC1ydXAgYS9jb25maWcvZXUuYW0gYi9jb25maWcvZXUuYW0KKy0tLSBhL2NvbmZpZy9ldS5hbQkyMDE0LTExLTEwIDE2OjE5OjE0LjM1NjAzMTQ3OSArMDAwMAorKysrIGIvY29uZmlnL2V1LmFtCTIwMTQtMTEtMTAgMTY6MjE6MTEuNzAyMDcyMDExICswMDAwCitAQCAtMzUsNyArMzUsNiBAQCBMRF9BU19ORUVERUQgPSBATERfQVNfTkVFREVEQAorIERFRlMgPSAtRF9HTlVfU09VUkNFIC1ESEFWRV9DT05GSUdfSCAtRExPQ0FMRURJUj0nIiR7bG9jYWxlZGlyfSInCisgQU1fQ1BQRkxBR1MgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9zcmNkaXIpL2xpYiAtSS4uCisgQU1fQ0ZMQUdTID0gLXN0ZD1nbnU5OSAtV2FsbCAtV3NoYWRvdyBcCistCSAgICAkKGlmICQoJCgqRilfbm9fV2Vycm9yKSwsLVdlcnJvcikgXAorIAkgICAgJChpZiAkKCQoKkYpX25vX1d1bnVzZWQpLCwtV3VudXNlZCAkKFdFWFRSQSkpIFwKKyAJICAgICQoaWYgJCgkKCpGKV9ub19XZm9ybWF0KSwtV25vLWZvcm1hdCwtV2Zvcm1hdD0yKSBcCisgCSAgICAkKCQoKkYpX0NGTEFHUykKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNi1tZW1jcHktZGVmLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDA2LW1lbWNweS1kZWYucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5NDgyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNi1tZW1jcHktZGVmLnBhdGNoCkBAIC0wLDAgKzEsMjYgQEAKK1Byb3ZpZGUgYSBjb21wYXRpYmlsaXR5IGFsaWFzIF9fbWVtY3B5CisKK0ZvciBzb21lIHJlYXNvbiwgbGliZWxmIHVzZXMgdGhlIGludGVybmFsIGdsaWJjIGFsaWFzIF9fbWVtY3B5LCB3aGljaAorZG9lc24ndCBleGlzdCBpbiB1Q2xpYmMuIEFkZCBhIG1hbnVhbCBhbGlhcyBzbyB0aGF0IHRoZSBidWlsZCBjYW4KK3Byb2NlZWQgd2l0aCB1Q2xpYmMuCisKK0Jhc2VkIG9uIHRoZSBmb3JtZXIgcGF0Y2ggYnkgVGhvbWFzIFBldGF6em9uaS4KKworU2lnbmVkLW9mZi1ieTogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CitTaWduZWQtb2ZmLWJ5OiBWaWNlbnRlIE9saXZlcnQgUmllcmEgPFZpbmNlbnQuUmllcmFAaW1ndGVjLmNvbT4KKworZGlmZiAtcnVwIGEvbGliZWxmL2xpYmVsZi5oIGIvbGliZWxmL2xpYmVsZi5oCistLS0gYS9saWJlbGYvbGliZWxmLmgJMjAxNC0wOC0yNyAxMDoyNToxNy4wMDAwMDAwMDAgKzAxMDAKKysrKyBiL2xpYmVsZi9saWJlbGYuaAkyMDE0LTExLTA3IDE1OjEzOjA4Ljc0MzUwODIyMSArMDAwMAorQEAgLTM0LDYgKzM0LDExIEBACisgLyogR2V0IHRoZSBFTEYgdHlwZXMuICAqLworICNpbmNsdWRlIDxlbGYuaD4KKworKyNpZm5kZWYgX0xJQkMKKysjaWZuZGVmIF9fbWVtcGNweQorKyNkZWZpbmUgX19tZW1wY3B5IG1lbXBjcHkKKysjZW5kaWYKKysjZW5kaWYKKworIC8qIEtub3duIHRyYW5zbGF0aW9uIHR5cGVzLiAgKi8KKyB0eXBlZGVmIGVudW0KZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwNy1BbGxvdy1kaXNhYmxpbmctc3ltYm9sLXZlcnNpb25pbmctYXQtY29uZmlndXJlLXRpbWUucGF0Y2ggYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDctQWxsb3ctZGlzYWJsaW5nLXN5bWJvbC12ZXJzaW9uaW5nLWF0LWNvbmZpZ3VyZS10aW1lLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzhmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDctQWxsb3ctZGlzYWJsaW5nLXN5bWJvbC12ZXJzaW9uaW5nLWF0LWNvbmZpZ3VyZS10aW1lLnBhdGNoCkBAIC0wLDAgKzEsMTM5IEBACitGcm9tIGJhZmFjYWNhZjc2NTlhNDkzMzYwNDY2MmRhYmEyNmE0ODBiMjlhOGQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4KK0RhdGU6IFRodSwgMjMgQXByIDIwMTUgMjA6NDY6NTkgKzAyMDAKK1N1YmplY3Q6IFtQQVRDSF0gQWxsb3cgZGlzYWJsaW5nIHN5bWJvbCB2ZXJzaW9uaW5nIGF0IGNvbmZpZ3VyZSB0aW1lCisKK0R1ZSB0byBtaXNzaW5nIHN5bWJvbCB2ZXJzaW9uaW5nIHN1cHBvcnQgaW4gdUNsaWJjIGNhbGxzIHRvIHZlcnNpb25lZAorZnVuY3Rpb25zIHRoYXQgaW50ZXJuYWxseSBjYWxsIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZW1zZWx2ZXMgcmVzdWx0cworaW4gaW5maW5pdGUgcmVjdXJzaW9uLgorCitJbnRyb2R1Y2UgbWFjcm8gU1lNQk9MX1ZFUlNJT05JTkcgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIHBsYWluIFNIQVJFRCB0bworZGVjaWRlIHdoZXRoZXIgc3ltYm9sIHZlcnNpb25pbmcgaXMgbmVlZGVkLiBDb250cm9sIHRoaXMgbWFjcm8KK2RlZmluaXRpb24gd2l0aCBuZXcgY29uZmlndXJlIG9wdGlvbiAtLWRpc2FibGUtc3ltYm9sLXZlcnNpb25pbmcuCisKK1NpZ25lZC1vZmYtYnk6IE1heCBGaWxpcHBvdiA8amNtdmJrYmNAZ21haWwuY29tPgorU2lnbmVkLW9mZi1ieTogTWFyayBXaWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+CistLS0KK0JhY2twb3J0ZWQgZnJvbTogYmFmYWNhY2FmNzY1OWE0OTMzNjA0NjYyZGFiYTI2YTQ4MGIyOWE4ZAorQ2hhbmdlcyB0byBDaGFuZ2VMb2dzIGFyZSBkcm9wcGVkLgorCisgY29uZmlnL2V1LmFtICAgICAgICAgICAgICAgICAgIHwgMTAgKysrKysrKystLQorIGNvbmZpZ3VyZS5hYyAgICAgICAgICAgICAgICAgICB8ICA3ICsrKysrKysKKyBsaWIvZXUtY29uZmlnLmggICAgICAgICAgICAgICAgfCAgNiArKystLS0KKyBsaWJkd2ZsL2NvcmUtZmlsZS5jICAgICAgICAgICAgfCAgMiArLQorIGxpYmR3ZmwvZHdmbF9tb2R1bGVfYnVpbGRfaWQuYyB8ICAyICstCisgbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYyAgICAgIHwgIDIgKy0KKworZGlmZiAtLWdpdCBhL2NvbmZpZy9ldS5hbSBiL2NvbmZpZy9ldS5hbQoraW5kZXggZmFmOGFkZC4uNjEwM2EzZSAxMDA2NDQKKy0tLSBhL2NvbmZpZy9ldS5hbQorKysrIGIvY29uZmlnL2V1LmFtCitAQCAtMzgsMTYgKzM4LDIyIEBAIEFNX0NGTEFHUyA9IC1zdGQ9Z251OTkgLVdhbGwgLVdzaGFkb3cgLVdmb3JtYXQ9MiBcCisgCisgQ09NUElMRS5vcyA9ICQoZmlsdGVyLW91dCAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UsICQoQ09NUElMRSkpCisgCisrREVGUy5vcyA9IC1EUElDIC1EU0hBUkVECisraWYgU1lNQk9MX1ZFUlNJT05JTkcKKytERUZTLm9zICs9IC1EU1lNQk9MX1ZFUlNJT05JTkcKKytlbHNlCisrZW5kaWYKKysKKyAlLm9zOiAlLmMgJS5vCisgaWYgQU1ERVAKKy0JaWYgJChDT01QSUxFLm9zKSAtYyAtbyAkQCAtZnBpYyAtRFBJQyAtRFNIQVJFRCAtTVQgJEAgLU1EIC1NUCBcCisrCWlmICQoQ09NUElMRS5vcykgLWMgLW8gJEAgLWZwaWMgJChERUZTLm9zKSAtTVQgJEAgLU1EIC1NUCBcCisgCSAgLU1GICIkKERFUERJUikvJCouVHBvIiBgdGVzdCAtZiAnJDwnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8OyBcCisgCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorIAkgICAgIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgXAorIAllbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBcCisgCWZpCisgZWxzZQorLQkkKENPTVBJTEUub3MpIC1jIC1vICRAIC1mcGljIC1EUElDIC1EU0hBUkVEICQ8CisrCSQoQ09NUElMRS5vcykgLWMgLW8gJEAgLWZwaWMgJChERUZTLm9zKSAkPAorIGVuZGlmCisgCisgQ0xFQU5GSUxFUyA9ICouZ2NubyAqLmdjZGEKK2RpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKK2luZGV4IGVkMmM5NjQuLmJlMDE1NzMgMTAwNjQ0CistLS0gYS9jb25maWd1cmUuYWMKKysrKyBiL2NvbmZpZ3VyZS5hYworQEAgLTI0MSw2ICsyNDEsMTMgQEAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS10ZXh0cmVsY2hlY2tdLAorICAgICAgICAgICAgICAgIFtEaXNhYmxlIHRleHRyZWxjaGVjayBiZWluZyBhIGZhdGFsIGVycm9yXSkpCisgQU1fQ09ORElUSU9OQUwoRkFUQUxfVEVYVFJFTCwgW3Rlc3QgIngkZW5hYmxlX3RleHRyZWxjaGVjayIgIT0gInhubyJdKQorIAorK0FDX0FSR19FTkFCTEUoW3N5bWJvbC12ZXJzaW9uaW5nXSwKKytBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXN5bWJvbC12ZXJzaW9uaW5nXSwKKysgICAgICAgICAgICAgICBbRGlzYWJsZSBzeW1ib2wgdmVyc2lvbmluZyBpbiBzaGFyZWQgb2JqZWN0c10pKQorK0FNX0NPTkRJVElPTkFMKFNZTUJPTF9WRVJTSU9OSU5HLCBbdGVzdCAieCRlbmFibGVfc3ltYm9sX3ZlcnNpb25pbmciICE9ICJ4bm8iXSkKKytBU19JRihbdGVzdCAieCRlbmFibGVfc3ltYm9sX3ZlcnNpb25pbmciID0gInhubyJdLAorKyAgICAgIFtBQ19NU0dfV0FSTihbRGlzYWJsaW5nIHN5bWJvbCB2ZXJzaW9uaW5nIGJyZWFrcyBBQkkgY29tcGF0aWJpbGl0eS5dKV0pCisrCisgZG5sIFRoZSBkaXJlY3RvcmllcyB3aXRoIGNvbnRlbnQuCisgCisgZG5sIERvY3VtZW50YXRpb24uCitkaWZmIC0tZ2l0IGEvbGliL2V1LWNvbmZpZy5oIGIvbGliL2V1LWNvbmZpZy5oCitpbmRleCAzYWZmZjI2Li41YmIyMWMxIDEwMDY0NAorLS0tIGEvbGliL2V1LWNvbmZpZy5oCisrKysgYi9saWIvZXUtY29uZmlnLmgKK0BAIC0xNjMsNyArMTYzLDcgQEAgYXNtICgiLnNlY3Rpb24gcHJlZGljdF9kYXRhLCBcImF3XCI7IC5wcmV2aW91c1xuIgorICNkZWZpbmUgRUxGVVRJTFNfSEVBREVSKG5hbWUpIDxsaWIjI25hbWUuaD4KKyAKKyAKKy0jaWZkZWYgU0hBUkVECisrI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HCisgIyBkZWZpbmUgT0xEX1ZFUlNJT04obmFtZSwgdmVyc2lvbikgXAorICAgYXNtICgiLmdsb2JsIF9jb21wYXQuIiAjdmVyc2lvbiAiLiIgI25hbWUgIlxuIiBcCisgICAgICAgICJfY29tcGF0LiIgI3ZlcnNpb24gIi4iICNuYW1lICIgPSAiICNuYW1lICJcbiIgXAorQEAgLTE4MSw4ICsxODEsOCBAQCBhc20gKCIuc2VjdGlvbiBwcmVkaWN0X2RhdGEsIFwiYXdcIjsgLnByZXZpb3VzXG4iCisgIyBkZWZpbmUgT0xEX1ZFUlNJT04obmFtZSwgdmVyc2lvbikgLyogTm90aGluZyBmb3Igc3RhdGljIGxpbmtpbmcuICAqLworICMgZGVmaW5lIE5FV19WRVJTSU9OKG5hbWUsIHZlcnNpb24pIC8qIE5vdGhpbmcgZm9yIHN0YXRpYyBsaW5raW5nLiAgKi8KKyAjIGRlZmluZSBDT01QQVRfVkVSU0lPTl9ORVdQUk9UTyhuYW1lLCB2ZXJzaW9uLCBwcmVmaXgpIFwKKy0gIGVycm9yICJzaG91bGQgdXNlICNpZmRlZiBTSEFSRUQiCistIyBkZWZpbmUgQ09NUEFUX1ZFUlNJT04obmFtZSwgdmVyc2lvbiwgcHJlZml4KSBlcnJvciAic2hvdWxkIHVzZSAjaWZkZWYgU0hBUkVEIgorKyAgZXJyb3IgInNob3VsZCB1c2UgI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HIgorKyMgZGVmaW5lIENPTVBBVF9WRVJTSU9OKG5hbWUsIHZlcnNpb24sIHByZWZpeCkgZXJyb3IgInNob3VsZCB1c2UgI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HIgorICNlbmRpZgorIAorIAorZGlmZiAtLWdpdCBhL2xpYmR3ZmwvY29yZS1maWxlLmMgYi9saWJkd2ZsL2NvcmUtZmlsZS5jCitpbmRleCAzMjRlOWQyLi5iYmUwODk5IDEwMDY0NAorLS0tIGEvbGliZHdmbC9jb3JlLWZpbGUuYworKysrIGIvbGliZHdmbC9jb3JlLWZpbGUuYworQEAgLTU4OCw3ICs1ODgsNyBAQCBkd2ZsX2NvcmVfZmlsZV9yZXBvcnQgKER3ZmwgKmR3ZmwsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpleGVjdXRhYmxlKQorIElOVERFRiAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KQorIE5FV19WRVJTSU9OIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQsIEVMRlVUSUxTXzAuMTU4KQorIAorLSNpZmRlZiBTSEFSRUQKKysjaWZkZWYgU1lNQk9MX1ZFUlNJT05JTkcKKyBpbnQgX2NvbXBhdF93aXRob3V0X2V4ZWN1dGFibGVfZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IChEd2ZsICpkd2ZsLCBFbGYgKmVsZik7CisgQ09NUEFUX1ZFUlNJT05fTkVXUFJPVE8gKGR3ZmxfY29yZV9maWxlX3JlcG9ydCwgRUxGVVRJTFNfMC4xNDYsCisgCQkJIHdpdGhvdXRfZXhlY3V0YWJsZSkKK2RpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2J1aWxkX2lkLmMKK2luZGV4IDM1MGJiZjguLmM5YTQyY2EgMTAwNjQ0CistLS0gYS9saWJkd2ZsL2R3ZmxfbW9kdWxlX2J1aWxkX2lkLmMKKysrKyBiL2xpYmR3ZmwvZHdmbF9tb2R1bGVfYnVpbGRfaWQuYworQEAgLTEwMSw3ICsxMDEsNyBAQCBkd2ZsX21vZHVsZV9idWlsZF9pZCAoRHdmbF9Nb2R1bGUgKm1vZCwKKyBJTlRERUYgKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKQorIE5FV19WRVJTSU9OIChkd2ZsX21vZHVsZV9idWlsZF9pZCwgRUxGVVRJTFNfMC4xMzgpCisgCistI2lmZGVmIFNIQVJFRAorKyNpZmRlZiBTWU1CT0xfVkVSU0lPTklORworIENPTVBBVF9WRVJTSU9OIChkd2ZsX21vZHVsZV9idWlsZF9pZCwgRUxGVVRJTFNfMC4xMzAsIHZhZGRyX2F0X2VuZCkKKyAKKyBpbnQKK2RpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfcmVwb3J0X2VsZi5jIGIvbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYworaW5kZXggM2E0YWUyZS4uNjI0Mjg0YyAxMDA2NDQKKy0tLSBhL2xpYmR3ZmwvZHdmbF9yZXBvcnRfZWxmLmMKKysrKyBiL2xpYmR3ZmwvZHdmbF9yZXBvcnRfZWxmLmMKK0BAIC0zMjEsNyArMzIxLDcgQEAgZHdmbF9yZXBvcnRfZWxmIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwKKyBJTlRERUYgKGR3ZmxfcmVwb3J0X2VsZikKKyBORVdfVkVSU0lPTiAoZHdmbF9yZXBvcnRfZWxmLCBFTEZVVElMU18wLjE1NikKKyAKKy0jaWZkZWYgU0hBUkVECisrI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HCisgRHdmbF9Nb2R1bGUgKgorICAgX2NvbXBhdF93aXRob3V0X2FkZF9wX3ZhZGRyX2R3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKKyAJCQkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwKKy0tIAorMS44LjEuNAorCmRpZmYgLS1naXQgYS9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDgtbWNoZWNrLXVjbGliYy5wYXRjaCBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAwOC1tY2hlY2stdWNsaWJjLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OWMzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDgtbWNoZWNrLXVjbGliYy5wYXRjaApAQCAtMCwwICsxLDIxNCBAQAorZGlmZiAtTmF1ciBlbGZ1dGlscy0wLjE1NS5vcmcvc3JjL25tLmMgZWxmdXRpbHMtMC4xNTUvc3JjL25tLmMKKy0tLSBlbGZ1dGlscy0wLjE1NS5vcmcvc3JjL25tLmMJMjAxMi0xMi0xOCAwMToxMjozNy4yOTI4NTkzMTEgKzAyMDAKKysrKyBlbGZ1dGlscy0wLjE1NS9zcmMvbm0uYwkyMDEyLTEyLTE4IDAxOjEzOjA4Ljk2NTg4NDc4NyArMDIwMAorQEAgLTMzLDcgKzMzLDkgQEAKKyAjaW5jbHVkZSA8bGliZHcuaD4KKyAjaW5jbHVkZSA8bGliaW50bC5oPgorICNpbmNsdWRlIDxsb2NhbGUuaD4KKysjaWZuZGVmCV9fVUNMSUJDX18KKyAjaW5jbHVkZSA8bWNoZWNrLmg+CisrI2VuZGlmCisgI2luY2x1ZGUgPG9ic3RhY2suaD4KKyAjaW5jbHVkZSA8c2VhcmNoLmg+CisgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KK2RpZmYgLU5hdXIgZWxmdXRpbHMtMC4xNTUub3JnL3NyYy9ubS5jIGVsZnV0aWxzLTAuMTU1L3NyYy9ubS5jCistLS0gZWxmdXRpbHMtMC4xNTUub3JnL3NyYy9ubS5jCTIwMTItMTItMTggMDE6MTY6MDkuNTQ1ODM1NTkyICswMjAwCisrKysgZWxmdXRpbHMtMC4xNTUvc3JjL25tLmMJMjAxMi0xMi0xOCAwMToxNjo1Mi40NTQyODkwMTMgKzAyMDAKK0BAIC0yMTksOCArMjE5LDEwIEBACisgICBpbnQgcmVtYWluaW5nOworICAgaW50IHJlc3VsdCA9IDA7CisgCisrI2lmbmRlZglfX1VDTElCQ19fCisgICAvKiBNYWtlIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBwb3NzaWJsZS4gICovCisgICBtdHJhY2UgKCk7CisrI2VuZGlmCisgCisgICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCisgICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKK2RpZmYgLU5hdXIgZWxmdXRpbHMtMC4xNTUub3JnL3NyYy9zaXplLmMgZWxmdXRpbHMtMC4xNTUvc3JjL3NpemUuYworLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvc2l6ZS5jCTIwMTItMTItMTggMDE6MzQ6MzQuNTQ4Mjc1Njk5ICswMjAwCisrKysgZWxmdXRpbHMtMC4xNTUvc3JjL3NpemUuYwkyMDEyLTEyLTE4IDAxOjM1OjE2LjYwNjYyMTA5MiArMDIwMAorQEAgLTI4LDcgKzI4LDkgQEAKKyAjaW5jbHVkZSA8bGliZWxmLmg+CisgI2luY2x1ZGUgPGxpYmludGwuaD4KKyAjaW5jbHVkZSA8bG9jYWxlLmg+CisrI2lmbmRlZglfX1VDTElCQ19fCisgI2luY2x1ZGUgPG1jaGVjay5oPgorKyNlbmRpZgorICNpbmNsdWRlIDxzdGRib29sLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorQEAgLTE2MCw4ICsxNjIsMTAgQEAKKyAgIGludCByZW1haW5pbmc7CisgICBpbnQgcmVzdWx0ID0gMDsKKyAKKysjaWZuZGVmCV9fVUNMSUJDX18KKyAgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgIG10cmFjZSAoKTsKKysjZW5kaWYKKyAKKyAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CitkaWZmIC1OYXVyIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvc3RyaXAuYyBlbGZ1dGlscy0wLjE1NS9zcmMvc3RyaXAuYworLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvc3RyaXAuYwkyMDEyLTEyLTE4IDAxOjQ1OjQ0Ljc5MDQ2MDAzNCArMDIwMAorKysrIGVsZnV0aWxzLTAuMTU1L3NyYy9zdHJpcC5jCTIwMTItMTItMTggMDE6NDY6MzIuMTE4NDc1MTc4ICswMjAwCitAQCAtMzAsNyArMzAsOSBAQAorICNpbmNsdWRlIDxsaWJlbGYuaD4KKyAjaW5jbHVkZSA8bGliaW50bC5oPgorICNpbmNsdWRlIDxsb2NhbGUuaD4KKysjaWZuZGVmCV9fVUNMSUJDX18KKyAjaW5jbHVkZSA8bWNoZWNrLmg+CisrI2VuZGlmCisgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAjaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CitAQCAtMTYxLDggKzE2MywxMCBAQAorICAgaW50IHJlbWFpbmluZzsKKyAgIGludCByZXN1bHQgPSAwOworIAorKyNpZm5kZWYJX19VQ0xJQkNfXworICAgLyogTWFrZSBtZW1vcnkgbGVhayBkZXRlY3Rpb24gcG9zc2libGUuICAqLworICAgbXRyYWNlICgpOworKyNlbmRpZgorIAorICAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLworICAgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKK2RpZmYgLU5hdXIgZWxmdXRpbHMtMC4xNTUub3JnL3NyYy9sZC5jIGVsZnV0aWxzLTAuMTU1L3NyYy9sZC5jCistLS0gZWxmdXRpbHMtMC4xNTUub3JnL3NyYy9sZC5jCTIwMTItMTItMTggMDE6NTc6MzAuMzgzMTM3MjM1ICswMjAwCisrKysgZWxmdXRpbHMtMC4xNTUvc3JjL2xkLmMJMjAxMi0xMi0xOCAwMTo1ODoxMy40Mjg2MDgwODggKzAyMDAKK0BAIC0yNiw3ICsyNiw5IEBACisgI2luY2x1ZGUgPGxpYmVsZi5oPgorICNpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2luY2x1ZGUgPGxvY2FsZS5oPgorKyNpZm5kZWYJX19VQ0xJQkNfXworICNpbmNsdWRlIDxtY2hlY2suaD4KKysjZW5kaWYKKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAjaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisgI2luY2x1ZGUgPHN0ZGxpYi5oPgorQEAgLTI3Nyw3ICsyNzksNyBAQAorICAgaW50IHJlbWFpbmluZzsKKyAgIGludCBlcnI7CisgCistI2lmbmRlZiBOREVCVUcKKysjaWYgIWRlZmluZWQoTkRFQlVHKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKQorICAgLyogRW5hYmxlIG1lbW9yeSBkZWJ1Z2dpbmcuICAqLworICAgbXRyYWNlICgpOworICNlbmRpZgorLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvYWRkcjJsaW5lLmMJMjAxMi0xMi0xOCAwMTo1NzozMC4zODgxMzc4NzIgKzAyMDAKKysrKyBlbGZ1dGlscy0wLjE1NS9zcmMvYWRkcjJsaW5lLmMJMjAxMi0xMi0xOCAwMjoxMTo1NC43MzI3NzIyMTEgKzAyMDAKK0BAIC0zMCw3ICszMCw5IEBACisgI2luY2x1ZGUgPGR3YXJmLmg+CisgI2luY2x1ZGUgPGxpYmludGwuaD4KKyAjaW5jbHVkZSA8bG9jYWxlLmg+CisrI2lmbmRlZglfX1VDTElCQ19fCisgI2luY2x1ZGUgPG1jaGVjay5oPgorKyNlbmRpZgorICNpbmNsdWRlIDxzdGRib29sLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorQEAgLTEyMSw4ICsxMjMsMTAgQEAKKyAgIGludCByZW1haW5pbmc7CisgICBpbnQgcmVzdWx0ID0gMDsKKyAKKysjaWZuZGVmCV9fVUNMSUJDX18KKyAgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgIG10cmFjZSAoKTsKKysjZW5kaWYKKyAKKyAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKy0tLSBlbGZ1dGlscy0wLjE1NS5vcmcvc3JjL29iamR1bXAuYwkyMDEyLTEyLTE4IDAxOjU3OjMwLjM5MDEzODEyNiArMDIwMAorKysrIGVsZnV0aWxzLTAuMTU1L3NyYy9vYmpkdW1wLmMJMjAxMi0xMi0xOCAwMjoxNTozMy40MDg4MjA0MjIgKzAyMDAKK0BAIC0yNiw3ICsyNiw5IEBACisgI2luY2x1ZGUgPGludHR5cGVzLmg+CisgI2luY2x1ZGUgPGxpYmludGwuaD4KKyAjaW5jbHVkZSA8bG9jYWxlLmg+CisrI2lmbmRlZglfX1VDTElCQ19fCisgI2luY2x1ZGUgPG1jaGVjay5oPgorKyNlbmRpZgorICNpbmNsdWRlIDxzdGRib29sLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorQEAgLTEzMSw4ICsxMzMsMTAgQEAKKyBpbnQKKyBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQorIHsKKysjaWZuZGVmCV9fVUNMSUJDX18KKyAgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgIG10cmFjZSAoKTsKKysjZW5kaWYKKyAKKyAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvcmFubGliLmMJMjAxMi0xMi0xOCAwMTo1NzozMC4zODgxMzc4NzIgKzAyMDAKKysrKyBlbGZ1dGlscy0wLjE1NS9zcmMvcmFubGliLmMJMjAxMi0xMi0xOCAwMjoxNzoxMy44Njg3ODA0ODYgKzAyMDAKK0BAIC0yOSw3ICsyOSw5IEBACisgI2luY2x1ZGUgPGdlbGYuaD4KKyAjaW5jbHVkZSA8bGliaW50bC5oPgorICNpbmNsdWRlIDxsb2NhbGUuaD4KKysjaWZuZGVmCV9fVUNMSUJDX18KKyAjaW5jbHVkZSA8bWNoZWNrLmg+CisrI2VuZGlmCisgI2luY2x1ZGUgPG9ic3RhY2suaD4KKyAjaW5jbHVkZSA8c3RkbGliLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CitAQCAtNzgsOCArODAsMTAgQEAKKyBpbnQKKyBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQorIHsKKysjaWZuZGVmCV9fVUNMSUJDX18KKyAgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgIG10cmFjZSAoKTsKKysjZW5kaWYKKyAKKyAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvYXIuYwkyMDEyLTEyLTE4IDAxOjU3OjMwLjM4OTEzNzk5OSArMDIwMAorKysrIGVsZnV0aWxzLTAuMTU1L3NyYy9hci5jCTIwMTItMTItMTggMDI6MjM6MDIuNzUzNDMyNzczICswMjAwCitAQCAtMjgsNyArMjgsOSBAQAorICNpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2luY2x1ZGUgPGxpbWl0cy5oPgorICNpbmNsdWRlIDxsb2NhbGUuaD4KKysjaWZuZGVmCV9fVUNMSUJDX18KKyAjaW5jbHVkZSA8bWNoZWNrLmg+CisrI2VuZGlmCisgI2luY2x1ZGUgPHNlYXJjaC5oPgorICNpbmNsdWRlIDxzdGRib29sLmg+CisgI2luY2x1ZGUgPHN0ZGxpYi5oPgorQEAgLTE0MSw5ICsxNDMsMTAgQEAKKyBpbnQKKyBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQorIHsKKysjaWZuZGVmCV9fVUNMSUJDX18KKyAgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgIG10cmFjZSAoKTsKKy0KKysjZW5kaWYKKyAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworICAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworLS0tIGVsZnV0aWxzLTAuMTU1Lm9yZy9zcmMvdW5zdHJpcC5jCTIwMTItMTItMTggMDE6NTc6MzAuMzg0MTM3MzYzICswMjAwCisrKysgZWxmdXRpbHMtMC4xNTUvc3JjL3Vuc3RyaXAuYwkyMDEyLTEyLTE4IDAyOjI1OjM0LjUxOTU0NzMzMSArMDIwMAorQEAgLTM2LDcgKzM2LDkgQEAKKyAjaW5jbHVkZSA8Zm5tYXRjaC5oPgorICNpbmNsdWRlIDxsaWJpbnRsLmg+CisgI2luY2x1ZGUgPGxvY2FsZS5oPgorKyNpZm5kZWYJX19VQ0xJQkNfXworICNpbmNsdWRlIDxtY2hlY2suaD4KKysjZW5kaWYKKyAjaW5jbHVkZSA8c3RkYm9vbC5oPgorICNpbmNsdWRlIDxzdGRpby5oPgorICNpbmNsdWRlIDxzdGRpb19leHQuaD4KK0BAIC0yMjE1LDkgKzIyMTcsMTAgQEAKKyBpbnQKKyBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgeworKyNpZm5kZWYJX19VQ0xJQkNfXworICAgLyogTWFrZSBtZW1vcnkgbGVhayBkZXRlY3Rpb24gcG9zc2libGUuICAqLworICAgbXRyYWNlICgpOworLQorKyNlbmRpZgorICAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLworICAgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyAgIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDA5LWxkLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDA5LWxkLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmY4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMDktbGQucGF0Y2gKQEAgLTAsMCArMSwxNDQgQEAKKy0tLSBlbGZ1dGlscy0wLjE1NS5vcmcvc3JjL2xkLmgJMjAxMi0xMC0wMyAyMzoyMjoyNS40MDM3ODU4ODIgKzAzMDAKKysrKyBlbGZ1dGlscy0wLjE1NV9iYWNrdXAvc3JjL2xkLmgJMjAxMi0xMi0wNCAxODo1NjoxOC44NzI1NjY1NzggKzAyMDAKK0BAIC0yOTEsNyArMjkxLDcgQEAKKyAgIGNvbnN0IGNoYXIgKiooKmxpYl9leHRlbnNpb25zKSAoc3RydWN0IGxkX3N0YXRlICopCisgICAgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyAjZGVmaW5lIExJQl9FWFRFTlNJT04oc3RhdGUpIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MubGliX2V4dGVuc2lvbnMsIChzdGF0ZSkpCisrICAoc3RhdGUpLT5jYWxsYmFja3MubGliX2V4dGVuc2lvbnMoc3RhdGUpCisgCisgICAvKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlLiAgSWYgdGhlIGZpbGUgaXMgbm90IHlldCBvcGVuLCBvcGVuIGl0LgorICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgd2hpY2ggY2FuCitAQCAtMzAyLDEyICszMDIsMTIgQEAKKyAgIGludCAoKmZpbGVfcHJvY2VzcykgKGludCBmZCwgc3RydWN0IHVzZWRmaWxlcyAqLCBzdHJ1Y3QgbGRfc3RhdGUgKiwKKyAJCSAgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICoqKTsKKyAjZGVmaW5lIEZJTEVfUFJPQ0VTUyhmZCwgZmlsZSwgc3RhdGUsIG5leHRwKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbGVfcHJvY2VzcywgKGZkLCBmaWxlLCBzdGF0ZSwgbmV4dHApKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbGVfcHJvY2VzcyhmZCwgZmlsZSwgc3RhdGUsIG5leHRwKQorIAorICAgLyogQ2xvc2UgdGhlIGdpdmVuIGZpbGUuICAqLworICAgaW50ICgqZmlsZV9jbG9zZSkgKHN0cnVjdCB1c2VkZmlsZXMgKiwgc3RydWN0IGxkX3N0YXRlICopOworICNkZWZpbmUgRklMRV9DTE9TRShmaWxlLCBzdGF0ZSkgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5maWxlX2Nsb3NlLCAoZmlsZSwgc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbGVfY2xvc2UoZmlsZSwgc3RhdGUpCisgCisgICAvKiBDcmVhdGUgdGhlIG91dHB1dCBzZWN0aW9ucyBub3cuICBUaGlzIHJlcXVpcmVzIGtub3dsZWRnZSBhYm91dAorICAgICAgYWxsIHRoZSBzZWN0aW9ucyB3ZSB3aWxsIG5lZWQuICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHNvcnQgdGhlCitAQCAtMzE5LDk5ICszMTksOTcgQEAKKyAgICAgIG91dHB1dCByb3V0aW5lcy4gICovCisgICB2b2lkICgqY3JlYXRlX3NlY3Rpb25zKSAoc3RydWN0IGxkX3N0YXRlICopOworICNkZWZpbmUgQ1JFQVRFX1NFQ1RJT05TKHN0YXRlKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNyZWF0ZV9zZWN0aW9ucywgKHN0YXRlKSkKKysgIChzdGF0ZSktPmNhbGxiYWNrcy5jcmVhdGVfc2VjdGlvbnMoc3RhdGUpCisgCisgICAvKiBEZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGFueSBub24td2VhayB1bnJlc29sdmVkIHJlZmVyZW5jZXMgbGVmdC4gICovCisgICBpbnQgKCpmbGFnX3VucmVzb2x2ZWQpIChzdHJ1Y3QgbGRfc3RhdGUgKik7CisgI2RlZmluZSBGTEFHX1VOUkVTT0xWRUQoc3RhdGUpIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZmxhZ191bnJlc29sdmVkLCAoc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmZsYWdfdW5yZXNvbHZlZChzdGF0ZSkKKyAKKyAgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIGFuZCBhcmUgbm90CisgICAgICBwcmVzZW50IGluIHRoZSBpbnB1dCBmaWxlLiAgKi8KKyAgIHZvaWQgKCpnZW5lcmF0ZV9zZWN0aW9ucykgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyAjZGVmaW5lIEdFTkVSQVRFX1NFQ1RJT05TKHN0YXRlKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmdlbmVyYXRlX3NlY3Rpb25zLCAoc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmdlbmVyYXRlX3NlY3Rpb25zKHN0YXRlKQorIAorICAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgZmlsZSBuYW1lIGlzIGdpdmVuIG9yICJhLm91dCIuICBXZQorICAgICAgY3JlYXRlIGFzIG11Y2ggb2YgdGhlIEVMRiBzdHJ1Y3R1cmUgYXMgcG9zc2libGUuICAqLworICAgaW50ICgqb3Blbl9vdXRmaWxlKSAoc3RydWN0IGxkX3N0YXRlICosIGludCwgaW50LCBpbnQpOworICNkZWZpbmUgT1BFTl9PVVRGSUxFKHN0YXRlLCBtYWNoaW5lLCBjbGFzcywgZGF0YSkgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5vcGVuX291dGZpbGUsIChzdGF0ZSwgbWFjaGluZSwgY2xhc3MsIGRhdGEpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLm9wZW5fb3V0ZmlsZShzdGF0ZSwgbWFjaGluZSwgY2xhc3MsIGRhdGEpCisgCisgICAvKiBDcmVhdGUgdGhlIGRhdGEgZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICBpbnQgKCpjcmVhdGVfb3V0ZmlsZSkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyAjZGVmaW5lIENSRUFURV9PVVRGSUxFKHN0YXRlKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNyZWF0ZV9vdXRmaWxlLCAoc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmNyZWF0ZV9vdXRmaWxlKHN0YXRlKQorIAorICAgLyogUHJvY2VzcyBhIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCisgICB2b2lkICgqcmVsb2NhdGVfc2VjdGlvbikgKHN0cnVjdCBsZF9zdGF0ZSAqLCBFbGZfU2NuICosIHN0cnVjdCBzY25pbmZvICosCisgCQkJICAgIGNvbnN0IEVsZjMyX1dvcmQgKik7CisgI2RlZmluZSBSRUxPQ0FURV9TRUNUSU9OKHN0YXRlLCBvdXRzY24sIGZpcnN0LCBkYmxpbmRpcmVjdCkgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5yZWxvY2F0ZV9zZWN0aW9uLCAoc3RhdGUsIG91dHNjbiwgZmlyc3QsICAgIFwKKy0JCQkJCQkgICAgIGRibGluZGlyZWN0KSkKKysgIChzdGF0ZSktPmNhbGxiYWNrcy5yZWxvY2F0ZV9zZWN0aW9uKHN0YXRlLCBvdXRzY24sIGZpcnN0LCBkYmxpbmRpcmVjdCkKKyAKKyAgIC8qIEFsbG9jYXRlIGEgZGF0YSBidWZmZXIgZm9yIHRoZSByZWxvY2F0aW9ucyBvZiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICBzZWN0aW9uLiAgKi8KKyAgIHZvaWQgKCpjb3VudF9yZWxvY2F0aW9ucykgKHN0cnVjdCBsZF9zdGF0ZSAqLCBzdHJ1Y3Qgc2NuaW5mbyAqKTsKKyAjZGVmaW5lIENPVU5UX1JFTE9DQVRJT05TKHN0YXRlLCBzY25pbmZvKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNvdW50X3JlbG9jYXRpb25zLCAoc3RhdGUsIHNjbmluZm8pKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmNvdW50X3JlbG9jYXRpb25zKHN0YXRlLCBzY25pbmZvKQorIAorICAgLyogQ3JlYXRlIHJlbG9jYXRpb25zIGZvciBleGVjdXRhYmxlIG9yIERTTy4gICovCisgICB2b2lkICgqY3JlYXRlX3JlbG9jYXRpb25zKSAoc3RydWN0IGxkX3N0YXRlICosIGNvbnN0IEVsZjMyX1dvcmQgKik7CisgI2RlZmluZSBDUkVBVEVfUkVMT0NBVElPTlMoc3RhdGUsIGRsYmluZGlyZWN0KSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNyZWF0ZV9yZWxvY2F0aW9ucywgKHN0YXRlLCBkYmxpbmRpcmVjdCkpCisrICAoc3RhdGUpLT5jYWxsYmFja3MuY3JlYXRlX3JlbG9jYXRpb25zKHN0YXRlLCBkYmxpbmRpcmVjdCkKKyAKKyAgIC8qIEZpbmFsaXplIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICBpbnQgKCpmaW5hbGl6ZSkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyAjZGVmaW5lIEZJTkFMSVpFKHN0YXRlKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbmFsaXplLCAoc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbmFsaXplKHN0YXRlKQorIAorICAgLyogQ2hlY2sgd2hldGhlciBzcGVjaWFsIHNlY3Rpb24gbnVtYmVyIGlzIGtub3duLiAgKi8KKyAgIGJvb2wgKCpzcGVjaWFsX3NlY3Rpb25fbnVtYmVyX3ApIChzdHJ1Y3QgbGRfc3RhdGUgKiwgc2l6ZV90KTsKKyAjZGVmaW5lIFNQRUNJQUxfU0VDVElPTl9OVU1CRVJfUChzdGF0ZSwgbnVtYmVyKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLnNwZWNpYWxfc2VjdGlvbl9udW1iZXJfcCwgKHN0YXRlLCBudW1iZXIpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLnNwZWNpYWxfc2VjdGlvbl9udW1iZXJfcChzdGF0ZSwgbnVtYmVyKQorIAorICAgLyogQ2hlY2sgd2hldGhlciBzZWN0aW9uIHR5cGUgaXMga25vd24uICAqLworICAgYm9vbCAoKnNlY3Rpb25fdHlwZV9wKSAoc3RydWN0IGxkX3N0YXRlICosIFhFbGZfV29yZCk7CisgI2RlZmluZSBTRUNUSU9OX1RZUEVfUChzdGF0ZSwgdHlwZSkgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5zZWN0aW9uX3R5cGVfcCwgKHN0YXRlLCB0eXBlKSkKKysgIChzdGF0ZSktPmNhbGxiYWNrcy5zZWN0aW9uX3R5cGVfcChzdGF0ZSwgdHlwZSkKKyAKKyAgIC8qIFJldHVybiBzZWN0aW9uIGZsYWdzIGZvciAuZHluYW1pYyBzZWN0aW9uLiAgKi8KKyAgIFhFbGZfWHdvcmQgKCpkeW5hbWljX3NlY3Rpb25fZmxhZ3MpIChzdHJ1Y3QgbGRfc3RhdGUgKik7CisgI2RlZmluZSBEWU5BTUlDX1NFQ1RJT05fRkxBR1Moc3RhdGUpIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZHluYW1pY19zZWN0aW9uX2ZsYWdzLCAoc3RhdGUpKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmR5bmFtaWNfc2VjdGlvbl9mbGFncyhzdGF0ZSkKKyAKKyAgIC8qIENyZWF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgLnBsdCBzZWN0aW9uIGFuZCBpbml0aWFsaXplIGl0LiAgKi8KKyAgIHZvaWQgKCppbml0aWFsaXplX3BsdCkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBFbGZfU2NuICpzY24pOworICNkZWZpbmUgSU5JVElBTElaRV9QTFQoc3RhdGUsIHNjbikgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5pbml0aWFsaXplX3BsdCwgKHN0YXRlLCBzY24pKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmluaXRpYWxpemVfcGx0KHN0YXRlLCBzY24pCisgCisgICAvKiBDcmVhdGUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIC5yZWwucGx0IHNlY3Rpb24gYW5kIGluaXRpYWxpemUgaXQuICAqLworICAgdm9pZCAoKmluaXRpYWxpemVfcGx0cmVsKSAoc3RydWN0IGxkX3N0YXRlICosIEVsZl9TY24gKnNjbik7CisgI2RlZmluZSBJTklUSUFMSVpFX1BMVFJFTChzdGF0ZSwgc2NuKSBcCistICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmluaXRpYWxpemVfcGx0cmVsLCAoc3RhdGUsIHNjbikpCisrICAoc3RhdGUpLT5jYWxsYmFja3MuaW5pdGlhbGl6ZV9wbHRyZWwoc3RhdGUsIHNjbikKKyAKKyAgIC8qIEZpbmFsaXplIHRoZSAucGx0IHNlY3Rpb24gdGhlIHdoYXQgYmVsb25ncyB0byB0aGVtLiAgKi8KKyAgIHZvaWQgKCpmaW5hbGl6ZV9wbHQpIChzdHJ1Y3QgbGRfc3RhdGUgKiwgc2l6ZV90LCBzaXplX3QsIHN0cnVjdCBzeW1ib2wgKiopOworICNkZWZpbmUgRklOQUxJWkVfUExUKHN0YXRlLCBuc3ltLCBuc3ltX2R5biwgbmR4dG9zeW0pIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZmluYWxpemVfcGx0LCAoc3RhdGUsIG5zeW0sIG5zeW1fZHluLCBcCistCQkJCQkJIG5keHRvc3ltKSkKKysgIChzdGF0ZSktPmNhbGxiYWNrcy5maW5hbGl6ZV9wbHQoc3RhdGUsIG5zeW0sIG5zeW1fZHluLCAgbmR4dG9zeW0pCisgCisgICAvKiBDcmVhdGUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIC5nb3Qgc2VjdGlvbiBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCisgICB2b2lkICgqaW5pdGlhbGl6ZV9nb3QpIChzdHJ1Y3QgbGRfc3RhdGUgKiwgRWxmX1NjbiAqc2NuKTsKKyAjZGVmaW5lIElOSVRJQUxJWkVfR09UKHN0YXRlLCBzY24pIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuaW5pdGlhbGl6ZV9nb3QsIChzdGF0ZSwgc2NuKSkKKysgIChzdGF0ZSktPmNhbGxiYWNrcy5pbml0aWFsaXplX2dvdChzdGF0ZSwgc2NuKQorIAorICAgLyogQ3JlYXRlIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSAuZ290LnBsdCBzZWN0aW9uIGFuZCBpbml0aWFsaXplIGl0LiAgKi8KKyAgIHZvaWQgKCppbml0aWFsaXplX2dvdHBsdCkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBFbGZfU2NuICpzY24pOworICNkZWZpbmUgSU5JVElBTElaRV9HT1RQTFQoc3RhdGUsIHNjbikgXAorLSAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5pbml0aWFsaXplX2dvdHBsdCwgKHN0YXRlLCBzY24pKQorKyAgKHN0YXRlKS0+Y2FsbGJhY2tzLmluaXRpYWxpemVfZ290cGx0KHN0YXRlLCBzY24pCisgCisgICAvKiBSZXR1cm4gdGhlIHRhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmUgcmVsb2NhdGlvbiB0eXBlIGZvcgorICAgICAgdGhlIHBsYXRmb3JtLiAgKi8KKyAgIGludCAoKnJlbF90eXBlKSAoc3RydWN0IGxkX3N0YXRlICopOworICNkZWZpbmUgUkVMX1RZUEUoc3RhdGUpIFwKKy0gIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MucmVsX3R5cGUsIChzdGF0ZSkpCisrICAoc3RhdGUpLT5jYWxsYmFja3MucmVsX3R5cGUoc3RhdGUpCisgfTsKKyAKKyAKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAxMC1wcm9ncmFtX2ludm9jYXRpb25fdWNsaWJjLnBhdGNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDEwLXByb2dyYW1faW52b2NhdGlvbl91Y2xpYmMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1ZGU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAxMC1wcm9ncmFtX2ludm9jYXRpb25fdWNsaWJjLnBhdGNoCkBAIC0wLDAgKzEsMTI5IEBACitkaWZmIC1OYXVyIGVsZnV0aWxzLTAuMTYxLW9yaS9saWIvY29sb3IuYyBlbGZ1dGlscy0wLjE2MS9saWIvY29sb3IuYworLS0tIGVsZnV0aWxzLTAuMTYxLW9yaS9saWIvY29sb3IuYwkyMDE0LTExLTA3IDEyOjQ3OjQ3LjAwMDAwMDAwMCAtMDUwMAorKysrIGVsZnV0aWxzLTAuMTYxL2xpYi9jb2xvci5jCTIwMTYtMTAtMDUgMTQ6MjY6MjMuMTE0NjYzODcxIC0wNDAwCitAQCAtMTMwLDkgKzEzMCw5IEBACisgICAtICdhbHdheXMnLCAneWVzJywgJ2ZvcmNlJ1xuXAorICAgLSAnbmV2ZXInLCAnbm8nLCAnbm9uZSdcblwKKyAgIC0gJ2F1dG8nLCAndHR5JywgJ2lmLXR0eSdcbiIpLAorLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSwgYXJnKTsKKysJCSAgICAgKGNoYXIqKXByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lLCBhcmcpOworIAkgICAgICBhcmdwX2hlbHAgKCZjb2xvcl9hcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCistCQkJIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysJCQkgKGNoYXIqKXByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKyAJICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAJICAgIH0KKyAJfQorZGlmZiAtTmF1ciBlbGZ1dGlscy0wLjE2MS1vcmkvc3JjL2FyLmMgZWxmdXRpbHMtMC4xNjEvc3JjL2FyLmMKKy0tLSBlbGZ1dGlscy0wLjE2MS1vcmkvc3JjL2FyLmMJMjAxNC0wNS0yMCAxMDoyNDoyNi4wMDAwMDAwMDAgLTA0MDAKKysrKyBlbGZ1dGlscy0wLjE2MS9zcmMvYXIuYwkyMDE2LTEwLTA1IDE0OjI3OjUxLjcwNjE3MDg3NCAtMDQwMAorQEAgLTE5MCw3ICsxOTAsNyBAQAorIAkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAorIE1FTUJFUiBwYXJhbWV0ZXIgcmVxdWlyZWQgZm9yICdhJywgJ2InLCBhbmQgJ2knIG1vZGlmaWVycyIpKTsKKyAJICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9VU0FHRSB8IEFSR1BfSEVMUF9TRUUsCistCQkgICAgIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysJCSAgICAgKGNoYXIqKXByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKyAJICBleGl0IChFWElUX0ZBSUxVUkUpOworIAl9CisgCitAQCAtMjEwLDcgKzIxMCw3IEBACisgCXsKKyAJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIkNPVU5UIHBhcmFtZXRlciByZXF1aXJlZCIpKTsKKyAJICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCistCQkgICAgIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysJCSAgICAgKGNoYXIqKXByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKyAJICBleGl0IChFWElUX0ZBSUxVUkUpOworIAl9CisgCitAQCAtMjM0LDcgKzIzNCw3IEBACisgICBpZiAocmVtYWluaW5nID09IGFyZ2MpCisgICAgIHsKKyAgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImFyY2hpdmUgbmFtZSByZXF1aXJlZCIpKTsKKy0gICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysgICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICAgfQorIAorQEAgLTI0OCw3ICsyNDgsNyBAQAorICAgICBjYXNlIG9wZXJfbm9uZToKKyAgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNvbW1hbmQgb3B0aW9uIHJlcXVpcmVkIikpOworICAgICAgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NURF9FUlIsCistCQkgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworKwkJIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICBicmVhazsKKyAKK0BAIC0zMTMsNyArMzEzLDcgQEAKKyAJeworIAkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiTW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gc3BlY2lmaWVkIikpOworIAkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKKy0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworKwkJICAgICAoY2hhciopcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworIAkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgCX0KKyAKK2RpZmYgLU5hdXIgZWxmdXRpbHMtMC4xNjEtb3JpL3NyYy9lbGZjbXAuYyBlbGZ1dGlscy0wLjE2MS9zcmMvZWxmY21wLmMKKy0tLSBlbGZ1dGlscy0wLjE2MS1vcmkvc3JjL2VsZmNtcC5jCTIwMTQtMTItMTcgMTY6MzQ6NDYuMDAwMDAwMDAwIC0wNTAwCisrKysgZWxmdXRpbHMtMC4xNjEvc3JjL2VsZmNtcC5jCTIwMTYtMTAtMDUgMTQ6Mjc6MDguNjAyNDEwNzU0IC0wNDAwCitAQCAtMTQxLDcgKzE0MSw3IEBACisgICBpZiAodW5saWtlbHkgKHJlbWFpbmluZyArIDIgIT0gYXJnYykpCisgICAgIHsKKyAgICAgICBmcHV0cyAoZ2V0dGV4dCAoIkludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMuXG4iKSwgc3RkZXJyKTsKKy0gICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysgICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgICAgZXhpdCAoMSk7CisgICAgIH0KKyAKK0BAIC02OTUsNyArNjk1LDcgQEAKKyAJCSAgIGdldHRleHQgKCJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIiksCisgCQkgICBhcmcpOworIAkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKKy0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworKwkJICAgICAoY2hhciopcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworIAkgIGV4aXQgKDEpOworIAl9CisgICAgICAgYnJlYWs7CitkaWZmIC1OYXVyIGVsZnV0aWxzLTAuMTYxLW9yaS9zcmMvZWxmbGludC5jIGVsZnV0aWxzLTAuMTYxL3NyYy9lbGZsaW50LmMKKy0tLSBlbGZ1dGlscy0wLjE2MS1vcmkvc3JjL2VsZmxpbnQuYwkyMDE0LTEyLTE3IDE2OjM0OjQ2LjAwMDAwMDAwMCAtMDUwMAorKysrIGVsZnV0aWxzLTAuMTYxL3NyYy9lbGZsaW50LmMJMjAxNi0xMC0wNSAxNDoyNjozNy4yMTQ1ODU0MTUgLTA0MDAKK0BAIC0yMTcsNyArMjE3LDcgQEAKKyAKKyAgICAgY2FzZSBBUkdQX0tFWV9OT19BUkdTOgorICAgICAgIGZwdXRzIChnZXR0ZXh0ICgiTWlzc2luZyBmaWxlIG5hbWUuXG4iKSwgc3RkZXJyKTsKKy0gICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKysgICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAKKyAgICAgZGVmYXVsdDoKK2RpZmYgLU5hdXIgZWxmdXRpbHMtMC4xNjEtb3JpL3NyYy9vYmpkdW1wLmMgZWxmdXRpbHMtMC4xNjEvc3JjL29iamR1bXAuYworLS0tIGVsZnV0aWxzLTAuMTYxLW9yaS9zcmMvb2JqZHVtcC5jCTIwMTQtMTItMTYgMDY6NTc6MDMuMDAwMDAwMDAwIC0wNTAwCisrKysgZWxmdXRpbHMtMC4xNjEvc3JjL29iamR1bXAuYwkyMDE2LTEwLTA1IDE0OjI2OjUyLjQzNDUwMDcyMyAtMDQwMAorQEAgLTIzNSw3ICsyMzUsNyBAQAorIAl7CisgCSAgZnB1dHMgKGdldHRleHQgKCJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIiksIHN0ZGVycik7CisgCSAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLAorLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisrCQkgICAgIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAJfQorIAorZGlmZiAtTmF1ciBlbGZ1dGlscy0wLjE2MS1vcmkvc3JjL3JlYWRlbGYuYyBlbGZ1dGlscy0wLjE2MS9zcmMvcmVhZGVsZi5jCistLS0gZWxmdXRpbHMtMC4xNjEtb3JpL3NyYy9yZWFkZWxmLmMJMjAxNC0xMi0xOSAxMjowNjowNC4wMDAwMDAwMDAgLTA1MDAKKysrKyBlbGZ1dGlscy0wLjE2MS9zcmMvcmVhZGVsZi5jCTIwMTYtMTAtMDUgMTQ6Mjc6MjQuMjE0MzIzODc0IC0wNDAwCitAQCAtNDQxLDcgKzQ0MSw3IEBACisgCSAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiVW5rbm93biBEV0FSRiBkZWJ1ZyBzZWN0aW9uIGAlcycuXG4iKSwKKyAJCSAgIGFyZyk7CisgCSAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLAorLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisrCQkgICAgIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgCSAgZXhpdCAoMSk7CisgCX0KKyAgICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOworQEAgLTQ3Myw3ICs0NzMsNyBAQAorIAkgIGZwdXRzIChnZXR0ZXh0ICgiTm8gb3BlcmF0aW9uIHNwZWNpZmllZC5cbiIpLCBzdGRlcnIpOworIAlkb19hcmdwX2hlbHA6CisgCSAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLAorLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisrCQkgICAgIChjaGFyKilwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAJfQorICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDExLWdjYy11bnVzZWQucGF0Y2ggYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLTAwMTEtZ2NjLXVudXNlZC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM3YTZmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDExLWdjYy11bnVzZWQucGF0Y2gKQEAgLTAsMCArMSwzNCBAQAorLS0tIGVsZnV0aWxzLTAuMTYxLW9yaS9saWJkd2ZsL2Z0cy5jCTIwMTYtMTAtMDUgMTQ6MzI6NDQuNTg4NTQwMjA3IC0wNDAwCisrKysgZWxmdXRpbHMtMC4xNjEvbGliZHdmbC9mdHMuYwkyMDE2LTEwLTA1IDE0OjMzOjUxLjA4MDE2OTgzNiAtMDQwMAorQEAgLTQ2OCw2ICs0NjgsNyBAQAorIGludAorIGZ0c19zZXQoRlRTICpzcCwgRlRTRU5UICpwLCBpbnQgaW5zdHIpCisgeworKyAgICAgICAgKHZvaWQpc3A7IC8qIFVudXNlZCAqLworIAlpZiAoaW5zdHIgIT0gMCAmJiBpbnN0ciAhPSBGVFNfQUdBSU4gJiYgaW5zdHIgIT0gRlRTX0ZPTExPVyAmJgorIAkgICAgaW5zdHIgIT0gRlRTX05PSU5TVFIgJiYgaW5zdHIgIT0gRlRTX1NLSVApIHsKKyAJCWVycm5vID0gRUlOVkFMOworQEAgLTU2Niw3ICs1NjcsNyBAQAorIAlGVFNFTlQgKmN1ciwgKnRhaWw7CisgCURJUiAqZGlycDsKKyAJdm9pZCAqb2xkYWRkcjsKKy0JaW50IGNkZXJybm8sIGRlc2NlbmQsIGxlbiwgbGV2ZWwsIG5saW5rcywgc2F2ZWRfZXJybm8sCisrCWludCBkZXNjZW5kLCBsZW4sIGxldmVsLCBubGlua3MsIHNhdmVkX2Vycm5vLAorIAkgICAgbm9zdGF0LCBkb2FkanVzdDsKKyAJc2l6ZV90IG1heGxlbjsKKyAJY2hhciAqY3A7CitAQCAtNjMxLDE0ICs2MzIsMTIgQEAKKyAJICogbmVlZGVkIHNvcnRlZCBlbnRyaWVzIG9yIHN0YXQgaW5mb3JtYXRpb24sIHRoZXkgaGFkIGJldHRlciBiZQorIAkgKiBjaGVja2luZyBGVFNfTlMgb24gdGhlIHJldHVybmVkIG5vZGVzLgorIAkgKi8KKy0JY2RlcnJubyA9IDA7CisgCWlmIChubGlua3MgfHwgdHlwZSA9PSBCUkVBRCkgeworIAkJaWYgKGZ0c19zYWZlX2NoYW5nZWRpcihzcCwgY3VyLCBkaXJmZChkaXJwKSwgTlVMTCkpIHsKKyAJCQlpZiAobmxpbmtzICYmIHR5cGUgPT0gQlJFQUQpCisgCQkJCWN1ci0+ZnRzX2Vycm5vID0gZXJybm87CisgCQkJY3VyLT5mdHNfZmxhZ3MgfD0gRlRTX0RPTlRDSERJUjsKKyAJCQlkZXNjZW5kID0gMDsKKy0JCQljZGVycm5vID0gZXJybm87CisgCQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7CisgCQkJZGlycCA9IE5VTEw7CisgCQl9IGVsc2UKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAxMi1mdXRpbWVzLXVjbGliYy5wYXRjaCBiL3BhY2thZ2UvZWxmdXRpbHMvZWxmdXRpbHMtMDAxMi1mdXRpbWVzLXVjbGliYy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjM5MjRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy0wMDEyLWZ1dGltZXMtdWNsaWJjLnBhdGNoCkBAIC0wLDAgKzEsMjQgQEAKKy0tLSBlbGZ1dGlscy0wLjE2MS9zcmMvYXIuYy5vcmlnCTIwMTYtMTAtMDUgMTQ6Mzk6MzguODc0MjQ3NzkzIC0wNDAwCisrKysgZWxmdXRpbHMtMC4xNjEvc3JjL2FyLmMJMjAxNi0xMC0wNSAxNToxMzo0MS45ODMwMTkxMzggLTA0MDAKK0BAIC00Nyw2ICs0NywxMSBAQAorIAorICNpbmNsdWRlICJhcmxpYi5oIgorIAorKyNpZmRlZiBIQVZFX0ZVVElNRVMKKysjIGRlZmluZSBGVVRJTUVTKGZkLCBmbmFtZSwgdHZwKSBmdXRpbWVzIChmZCwgdHZwKQorKyNlbHNlCisrIyBkZWZpbmUgRlVUSU1FUyhmZCwgZm5hbWUsIHR2cCkgdXRpbWVzIChmbmFtZSwgdHZwKQorKyNlbmRpZgorIAorIC8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCisgc3RhdGljIHZvaWQgcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOworQEAgLTY5Miw3ICs2OTcsOCBAQAorIAkJICB0dlsxXS50dl9zZWMgPSBhcmhkci0+YXJfZGF0ZTsKKyAJCSAgdHZbMV0udHZfdXNlYyA9IDA7CisgCistCQkgIGlmICh1bmxpa2VseSAoZnV0aW1lcyAoeGZkLCB0dikgIT0gMCkpCisrCQkgIGlmICh1bmxpa2VseSAoRlVUSU1FUyAoeGZkLCB1c2VfbWtzdGVtcCA/IHRlbXBmbmFtZSA6CisrCQkJYXJoZHItPmFyX25hbWUsIHR2KSAhPSAwKSkKKyAJCSAgICB7CisgCQkgICAgICBlcnJvciAoMCwgZXJybm8sCisgCQkJICAgICBnZXR0ZXh0ICgiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIpLApkaWZmIC0tZ2l0IGEvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy5oYXNoIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy5oYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2I3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLmhhc2gKQEAgLTAsMCArMSwzIEBACisjIExvY2FsbHkgY2FsY3VsYXRlZAorc2hhMjU2ICA1NzBjOTFhMTc4M2ZhNTM4NmFhYTJkZmRkMDhkZGExZGU3NzdjMmI2M2JmM2I5YzE0MzdkNjM1ZmZkZDdhMDcwICBlbGZ1dGlscy0wLjE2MS50YXIuYnoyCitzaGEyNTYgIGJmMDM2M2QwM2UxZTQ2Njg3NzhlYjRlN2RkZDEwZTQwNWEyMmY3NTNiM2FkODEzYTUzN2ZjMDExNjRkMWUzZmUgIGVsZnV0aWxzLXBvcnRhYmlsaXR5LTAuMTYxLnBhdGNoCmRpZmYgLS1naXQgYS9wYWNrYWdlL2VsZnV0aWxzL2VsZnV0aWxzLm1rIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJlNDBmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9lbGZ1dGlscy9lbGZ1dGlscy5tawpAQCAtMCwwICsxLDc4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBlbGZ1dGlscworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworRUxGVVRJTFNfVkVSU0lPTiA9IDAuMTYxCitFTEZVVElMU19TT1VSQ0UgPSBlbGZ1dGlscy0kKEVMRlVUSUxTX1ZFUlNJT04pLnRhci5iejIKK0VMRlVUSUxTX1NJVEUgPSBodHRwczovL2ZlZG9yYWhvc3RlZC5vcmcvcmVsZWFzZXMvZS9sL2VsZnV0aWxzLyQoRUxGVVRJTFNfVkVSU0lPTikKK0VMRlVUSUxTX0lOU1RBTExfU1RBR0lORyA9IFlFUworRUxGVVRJTFNfTElDRU5TRSA9IEdQTHYzIEdQTHYyIExHUEx2MworRUxGVVRJTFNfTElDRU5TRV9GSUxFUyA9IENPUFlJTkcgQ09QWUlORy1HUExWMiBDT1BZSU5HLUxHUExWMworRUxGVVRJTFNfUEFUQ0ggPSBlbGZ1dGlscy1wb3J0YWJpbGl0eS0wLjE2MS5wYXRjaAorCisjIFRoZSB0YXJiYWxsIGRvZXMgbm90IGhhdmUgYSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdAorRUxGVVRJTFNfQVVUT1JFQ09ORiA9IFlFUworRUxGVVRJTFNfQ09ORl9PUFRTICs9IC0tZGlzYWJsZS13ZXJyb3IKKworRUxGVVRJTFNfQ0ZMQUdTID0gJChmaWx0ZXItb3V0IC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQsJChUQVJHRVRfQ0ZMQUdTKSkKKworIyBzcGFyYzY0IGFuZCBtaXBzIG5lZWRzIC1mUElDIGluc3RlYWQgb2YgLWZwaWMKK2lmZXEgKCQoQlIyX3NwYXJjNjQpLHkpCitFTEZVVElMU19DRkxBR1MgKz0gLWZQSUMKK2Vsc2UgaWZlcSAoJChCUjJfbWlwcykseSkKK0VMRlVUSUxTX0NGTEFHUyArPSAtZlBJQworZWxzZSBpZmVxICgkKEJSMl9taXBzZWwpLHkpCitFTEZVVElMU19DRkxBR1MgKz0gLWZQSUMKK2VuZGlmCisKKyMgZWxmdXRpbHMgZ2V0cyBjb25mdXNlZCB3aGVuIGxmcyBtb2RlIGlzIGZvcmNlZCwgc28gZG9uJ3QKK0VMRlVUSUxTX0NPTkZfRU5WICs9IFwKKwlDRkxBR1M9IiQoRUxGVVRJTFNfQ0ZMQUdTKSIgXAorCUNQUEZMQUdTPSIkKGZpbHRlci1vdXQgLURfRklMRV9PRkZTRVRfQklUUz02NCwkKFRBUkdFVF9DUFBGTEFHUykpIgorCitFTEZVVElMU19MREZMQUdTID0gJChUQVJHRVRfTERGTEFHUykKKworIyBVbmNvbmRpdGlvbm5hbGx5IHJlcXVpcmVzIGdldHRleHQuCitpZmVxICgkKEJSMl9ORUVEU19HRVRURVhUKSx5KQorRUxGVVRJTFNfREVQRU5ERU5DSUVTICs9IGdldHRleHQKK0VMRlVUSUxTX0xERkxBR1MgKz0gLWxpbnRsCitlbmRpZgorCitFTEZVVElMU19DT05GX0VOViArPSBcCisJTERGTEFHUz0iJChFTEZVVElMU19MREZMQUdTKSIKKworaWZlcSAoJChCUjJfVE9PTENIQUlOX1VTRVNfVUNMSUJDKSx5KQorRUxGVVRJTFNfREVQRU5ERU5DSUVTICs9IGFyZ3Atc3RhbmRhbG9uZQorRUxGVVRJTFNfQ09ORl9PUFRTICs9IC0tZGlzYWJsZS1zeW1ib2wtdmVyc2lvbmluZworZW5kaWYKKworaWZlcSAoJChCUjJfUEFDS0FHRV9aTElCKSx5KQorRUxGVVRJTFNfREVQRU5ERU5DSUVTICs9IHpsaWIKK0VMRlVUSUxTX0NPTkZfT1BUUyArPSAtLXdpdGgtemxpYgorZWxzZQorRUxGVVRJTFNfQ09ORl9PUFRTICs9IC0td2l0aG91dC16bGliCitlbmRpZgorCitpZmVxICgkKEJSMl9QQUNLQUdFX0JaSVAyKSx5KQorRUxGVVRJTFNfREVQRU5ERU5DSUVTICs9IGJ6aXAyCitFTEZVVElMU19DT05GX09QVFMgKz0gLS13aXRoLWJ6bGliCitlbHNlCitFTEZVVElMU19DT05GX09QVFMgKz0gLS13aXRob3V0LWJ6bGliCitlbmRpZgorCitpZmVxICgkKEJSMl9QQUNLQUdFX1haKSx5KQorRUxGVVRJTFNfREVQRU5ERU5DSUVTICs9IHh6CitFTEZVVElMU19DT05GX09QVFMgKz0gLS13aXRoLWx6bWEKK2Vsc2UKK0VMRlVUSUxTX0NPTkZfT1BUUyArPSAtLXdpdGhvdXQtbHptYQorZW5kaWYKKworaWZlcSAoJChCUjJfUEFDS0FHRV9FTEZVVElMU19QUk9HUykseSkKK0VMRlVUSUxTX0NPTkZfT1BUUyArPSAtLWVuYWJsZS1wcm9ncworZWxzZQorRUxGVVRJTFNfQ09ORl9PUFRTICs9IC0tZGlzYWJsZS1wcm9ncworZW5kaWYKKworJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfY2FzdC9nb29nbGVfY2FzdC5tayBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9jYXN0L2dvb2dsZV9jYXN0Lm1rCmluZGV4IDQ3NGUxZWMuLmM3YzAzMjMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9jYXN0L2dvb2dsZV9jYXN0Lm1rCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9jYXN0L2dvb2dsZV9jYXN0Lm1rCkBAIC00LDYyICs0LDQxIEBACiAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLSMgVE9ETyhuYmVnbGV5KTogSW52ZXN0aWdhdGUgd2hpY2ggb2YgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIG5vIGxvbmdlciBuZWNlc3NhcnkuCi0KIEdPT0dMRV9DQVNUX1NJVEUgPSByZXBvOi8vZ29vZ2xlX2Nhc3QKIAorIyBUT0RPKHNtY2dydWVyKTogQXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBuZWVkZWQuCiBHT09HTEVfQ0FTVF9ERVBFTkRFTkNJRVM9XAogCWJjbV9ic2VhdiBiY21fbmV4dXMgYmNtX2NvbW1vbiBiY21fcm9ja2ZvcmQgXAogCWdvb2dsZV9taW5pY2xpZW50IGxpYnBuZyBqcGVnIHpsaWIgZnJlZXR5cGUgZXhwYXQgXAogCWxpYmN1cmwgbGlieG1sMiBsaWJ4c2x0IGZvbnRjb25maWcgYm9vc3QgY2Fpcm8gXAogCWF2YWhpIGxpYmNhcCBsaWJuc3MgaG9zdC1neXAgaG9zdC1uaW5qYSBnb29nbGVfd2lkZXZpbmVfY2VuYwogCi0jIFRoaXMgd2lsbCByZXN1bHQgaW4gZGVmaW5pbmcgYSBtZWFuaW5nZnVsIEFQUExJQlNfVE9QICh3aGljaCBpcyByZXF1aXJlZCBieQotIyB0aGUgbG9jYWwgYnVpbGQpLgotQkNNX0FQUFNfRElSPSQoYWJzcGF0aCAkKEBEKSkKLQogR09PR0xFX0NBU1RfSU5TVEFMTF9TVEFHSU5HPU5PCiBHT09HTEVfQ0FTVF9JTlNUQUxMX1RBUkdFVD1ZRVMKIAotUExBVEZPUk09JChCUjJfUEFDS0FHRV9CQ01fQ09NTU9OX1BMQVRGT1JNKQotQkNIUF9WRVJfTE9XRVI9JChzaGVsbCBlY2hvICQoQlIyX1BBQ0tBR0VfQkNNX0NPTU1PTl9QTEFURk9STV9SRVYpIHwgdHIgQS1aIGEteikKLUJVSUxEX1RZUEVfTE9XRVI9JChzaGVsbCBlY2hvICQoQlVJTERfVFlQRSkgfCB0ciBBLVogYS16KQotCi1pZmRlZiBCUjJfbWlwc2VsCi1CQ01fQVJDSD1taXBzCi1CX1JFRlNXX0FSQ0g9bWlwc2VsLWxpbnV4CisjIFJhdGhlciB0aGFuIGluY2x1ZGUgYWxsIG9mIEJDTV9NQUtFRkxBR1MsIHdlIGNhbGN1bGF0ZSB0aGUgb25seSBuZWNlc3Nhcnkgb25lCisjIGhlcmUsIHdoaWNoIGlzIHRoZSByb2NrZm9yZCBnbCBwcmVmaXguCitpZmVxICgkKEJSMl9QQUNLQUdFX0JDTV9DT01NT05fUExBVEZPUk0pLCI5NzQzOSIpCitWM0RfUFJFRklYPXZjNQogZWxzZQotQkNNX0FSQ0g9YXJtCi1CX1JFRlNXX0FSQ0g9YXJtLWxpbnV4CitWM0RfUFJFRklYPXYzZAogZW5kaWYKIAotZGVmaW5lIEdPT0dMRV9DQVNUX0NPTkZJR1VSRV9DTURTCi0JJChjYWxsIEJDTV9DT01NT05fVVNFX0JVSUxEX1NZU1RFTSwkKEBEKSkKLWVuZGVmCi0KLWlmZXEgKCQoQlIyX0NDQUNIRSkseSkKLSAgICBHT09HTEVfQ0FTVF9DQ0FDSEU9IldFQktJVEdMX0NDQUNIRT15IgotZWxzZQotICAgIEdPT0dMRV9DQVNUX0NDQUNIRT0iV0VCS0lUR0xfQ0NBQ0hFPW4iCi1lbmRpZgorIyBUaGUgc3RhbmRhcmQgc2V0IG9mIE1ha2UgYXJndW1lbnRzIHRoYXQgd2UgbmVlZC4gSW4gcGFydGljdWxhciwgQkNNX01BS0VfRU5WCisjIGNvbnRhaW5zIG1hbnkgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3Igd29ya2luZyB3aXRoIE5FWFVTLgorR09PR0xFX0NBU1RfTUFLRUFSR1M9XAorCSQoQkNNX01BS0VfRU5WKSBcCisJQlVJTERfRElSPSQoQlVJTERfRElSKSBcCisJUEFUSD0iJHtIT1NUX0RJUn0vdXNyL2Jpbjoke1BBVEh9IiBcCisJVEFSR0VUX0FSQ0g9IiQoQlIyX0FSQ0gpIiBcCisJVEFSR0VUX0NST1NTPSIkKFRBUkdFVF9DUk9TUykiIFwKKwlWM0RfUFJFRklYPSIkKFYzRF9QUkVGSVgpIgogCiBkZWZpbmUgR09PR0xFX0NBU1RfQlVJTERfQ01EUwotCSQoQkNNX01BS0VfRU5WKSAkKE1BS0UpIFwKLQkJJChCQ01fTUFLRUZMQUdTKSBcCisJJChNQUtFKSBcCiAJCS1DICQoQEQpL2J1aWxkIFwKICAgICAgICAgICAgICAgICAtZiBNYWtlZmlsZS5vZW1saWJzIFwKLQkJJChHT09HTEVfQ0FTVF9DQ0FDSEUpIFwKLQkJUFlUSE9ORE9OVE9QVElNSVpFPSIwIiBcCi0JCUJVSUxEX0RJUj0kKEJVSUxEX0RJUikKLWVuZGVmCi0KLWRlZmluZSBHT09HTEVfQ0FTVF9CVUlMRF9URVNUX0NNRFMKLQkkKEJDTV9NQUtFX0VOVikgJChNQUtFKSBcCi0JCSQoQkNNX01BS0VGTEFHUykgXAotCQktQyAkKEBEKS9idWlsZCBcCi0JCSQoR09PR0xFX0NBU1RfQ0NBQ0hFKSBcCi0JCVBZVEhPTkRPTlRPUFRJTUlaRT0iMCIgXAotCQl1bml0dGVzdHMKKwkJJChHT09HTEVfQ0FTVF9NQUtFQVJHUykKIGVuZGVmCiAKIGRlZmluZSBHT09HTEVfQ0FTVF9JTlNUQUxMX1RBUkdFVF9DTURTCkBAIC03NSwxNiArNTQsMTUgQEAKIAogZGVmaW5lIEdPT0dMRV9DQVNUX0lOU1RBTExfQklOQVJJRVMKIAljcCAtYWZyICQoQEQpL2Jpbi8kKEJSMl9QQUNLQUdFX0JDTV9DT01NT05fUExBVEZPUk0pL2Nhc3RfYmluYXJpZXMvKiAkKFRBUkdFVF9ESVIpL2Nocm9tZS8KLQljcCAtYWYgJChARCkvdGFyZ2V0LyQoUExBVEZPUk0pJChCQ0hQX1ZFUl9MT1dFUikuJChCX1JFRlNXX0FSQ0gpLiQoQlVJTERfVFlQRV9MT1dFUikvYmluL2xvZ3dyYXBwZXIgJChUQVJHRVRfRElSKS9iaW4vbG9nd3JhcHBlcgotCWNwIC1hZnIgJChARCkvdGFyZ2V0LyQoUExBVEZPUk0pJChCQ0hQX1ZFUl9MT1dFUikuJChCX1JFRlNXX0FSQ0gpLiQoQlVJTERfVFlQRV9MT1dFUikvY2hyb21lLyogJChUQVJHRVRfRElSKS9jaHJvbWUvCi0JY3AgLWFmciAkKEBEKS90YXJnZXQvJChQTEFURk9STSkkKEJDSFBfVkVSX0xPV0VSKS4kKEJfUkVGU1dfQVJDSCkuJChCVUlMRF9UWVBFX0xPV0VSKS9vZW1fY2FzdF9zaGxpYi8qICQoVEFSR0VUX0RJUikvb2VtX2Nhc3Rfc2hsaWIvCisJY3AgLWFmICQoQEQpL3RhcmdldC8kKEJSMl9QQUNLQUdFX0JDTV9DT01NT05fUExBVEZPUk0pL2Jpbi9sb2d3cmFwcGVyICQoVEFSR0VUX0RJUikvYmluL2xvZ3dyYXBwZXIgOyBcCisJY3AgLWFmciAkKEBEKS90YXJnZXQvJChCUjJfUEFDS0FHRV9CQ01fQ09NTU9OX1BMQVRGT1JNKS9jaHJvbWUvKiAkKFRBUkdFVF9ESVIpL2Nocm9tZS8gOyBcCisJY3AgLWFmciAkKEBEKS90YXJnZXQvJChCUjJfUEFDS0FHRV9CQ01fQ09NTU9OX1BMQVRGT1JNKS9vZW1fY2FzdF9zaGxpYi8qICQoVEFSR0VUX0RJUikvb2VtX2Nhc3Rfc2hsaWIvIDsgXAogCiAJbXYgJChUQVJHRVRfRElSKS9jaHJvbWUvY2hyb21lX3NhbmRib3ggJChUQVJHRVRfRElSKS9jaHJvbWUvY2hyb21lLXNhbmRib3gKIAogCSQoSU5TVEFMTCkgLUQgLW0gMDY0NCAkKEBEKS9iaW4vJChCUjJfUEFDS0FHRV9CQ01fQ09NTU9OX1BMQVRGT1JNKS9zY3JpcHRzL3Byb2Nlc3MuanNvbiAkKFRBUkdFVF9ESVIpL2Nocm9tZS9wcm9jZXNzLmpzb24KIAkkKElOU1RBTEwpIC1EIC1tIDA3NTUgJChARCkvYnVpbGQvUzk5Y2FzdC5wcm9jZXNzX21hbmFnZXIgJChUQVJHRVRfRElSKS9ldGMvaW5pdC5kL1M5OWNhc3QucHJvY2Vzc19tYW5hZ2VyCiAJJChJTlNUQUxMKSAtRCAtbSAwNzU1ICQoQEQpL2J1aWxkL3N0YXJ0X2Nhc3RfcHJvY2Vzc19tYW5hZ2VyICQoVEFSR0VUX0RJUikvY2hyb21lL3N0YXJ0X2Nhc3RfcHJvY2Vzc19tYW5hZ2VyCi0JJChJTlNUQUxMKSAtRCAtbSAwNzU1ICQoQEQpL2J1aWxkL3N0YXJ0X2Nhc3Rfc2hlbGwgJChUQVJHRVRfRElSKS9jaHJvbWUvc3RhcnRfY2FzdF9zaGVsbAogCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSAkKEBEKS9idWlsZC9zdGFydF9jZXJ0X2ZldGNoZXIgJChUQVJHRVRfRElSKS9jaHJvbWUvc3RhcnRfY2VydF9mZXRjaGVyCiAKIAljaG1vZCA0NzU1ICQoVEFSR0VUX0RJUikvY2hyb21lL2Nocm9tZS1zYW5kYm94CmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZGFzaHBsYXllci9nb29nbGVfZGFzaHBsYXllci5tayBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9kYXNocGxheWVyL2dvb2dsZV9kYXNocGxheWVyLm1rCmluZGV4IGVhNmE5ODIuLjQ1Nzc2Y2MgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9kYXNocGxheWVyL2dvb2dsZV9kYXNocGxheWVyLm1rCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9kYXNocGxheWVyL2dvb2dsZV9kYXNocGxheWVyLm1rCkBAIC0xNSwxMCArMTUsNyBAQAogR09PR0xFX0RBU0hQTEFZRVJfSU5TVEFMTF9TVEFHSU5HPVlFUwogR09PR0xFX0RBU0hQTEFZRVJfSU5TVEFMTF9UQVJHRVQ9WUVTCiAKLSMgVE9ETyhzbWNncnVlcik6IFJlbW92ZSBCUjJfe21pcHNlbCxhcm19CiBHT09HTEVfREFTSFBMQVlFUl9DT01NT05fTUFLRUFSR1M9XAotCUJSMl9taXBzZWw9IiQoQlIyX21pcHNlbCkiIFwKLQlCUjJfYXJtPSIkKEJSMl9hcm0pIiBcCiAJQlIyX1NPRlRfRkxPQVQ9IiR7QlIyX1NPRlRfRkxPQVR9IiBcCiAJQlIyX1VTRV9TT0ZUX0ZMT0FUX0FCST0iJHtCUjJfVVNFX1NPRlRfRkxPQVRfQUJJfSIgXAogCUJVSUxEX0RJUj0iJChCVUlMRF9ESVIpIiBcCkBAIC01NCw2ICs1MSwxOCBAQAogCQlpbnN0YWxsX3N0YWdpbmcKIGVuZGVmCiAKK2RlZmluZSBIT1NUX0dPT0dMRV9EQVNIUExBWUVSX0JVSUxEX0NNRFMKKwkkKEdPT0dMRV9EQVNIUExBWUVSX01BS0VfQ01EKSBcCisJCUlTX0hPU1RfQlVJTEQ9eSBcCisJCWJ1aWxkCitlbmRlZgorCitkZWZpbmUgSE9TVF9HT09HTEVfREFTSFBMQVlFUl9JTlNUQUxMX0NNRFMKKwkkKEdPT0dMRV9EQVNIUExBWUVSX01BS0VfQ01EKSBcCisJCUlTX0hPU1RfQlVJTEQ9eSBcCisJCWluc3RhbGxfaG9zdAorZW5kZWYKKwogZGVmaW5lIEhPU1RfR09PR0xFX0RBU0hQTEFZRVJfVEVTVF9DTURTCiAJJChHT09HTEVfREFTSFBMQVlFUl9NQUtFX0NNRCkgXAogCQlJU19IT1NUX0JVSUxEPXkgXApkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX2ZmbXBlZy9nb29nbGVfZmZtcGVnLm1rIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX2ZmbXBlZy9nb29nbGVfZmZtcGVnLm1rCmluZGV4IDNlMWUzNmMuLjA1ZWUzYTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9mZm1wZWcvZ29vZ2xlX2ZmbXBlZy5taworKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZmZtcGVnL2dvb2dsZV9mZm1wZWcubWsKQEAgLTksMzMgKzksOCBAQAogR09PR0xFX0ZGTVBFR19DT05GX09QVCArPSAtLWRpc2FibGUtemxpYgogZW5kaWYKIAotR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MgPSAtZlBJQyAtREVNODYyMgotaWZlcSAoJChCUjJfYXJtKSx5KQotIyBUaGUgY29tcGlsZXIgdmVyc2lvbiBmcm9tIEJyb2FkY29tIGRlZmF1bHRzIHRvIFRodW1iMiwgYW5kIGhpdHMgYSBjb21waWxlcgotIyBidXQgaW4gdGhpcyBwYWNrYWdlLCBzbyB3ZSBhcmUgY29tcGlsaW5nIHN0cmFpZ2h0IGFybSBmb3Igbm93LCBpdCdzIGEgYml0Ci0jIHNsb3cgYnV0IGF0IGxlYXN0IGNvbXBpbGVzLgotR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MgKz0gLW1hcm0KLWVuZGlmCi0KLSMgV2Ugb25seSBpbnN0YWxsIHRoZSBwcm9ncmFtIGZvciB1c2FnZSBieSB0aGUgc2VydmVyIHNpZGUKLWRlZmluZSBHT09HTEVfRkZNUEVHX0lOU1RBTExfVEFSR0VUX0NNRFMKLSAgICAgICAgbWtkaXIgLXAgJChUQVJHRVRfRElSKS9hcHAvc2FnZS8KLSAgICAgICAgJChJTlNUQUxMKSAtRCAtbSAwNzU1ICQoQEQpL2ZmbXBlZyAkKFRBUkdFVF9ESVIpL2FwcC9zYWdlLwotZW5kZWYKLQotZGVmaW5lIEdPT0dMRV9GRk1QRUdfQ09ORklHVVJFX0NNRFMKLSAgICAgICAgKGNkICQoR09PR0xFX0ZGTVBFR19TUkNESVIpICYmIHJtIC1yZiBjb25maWcuY2FjaGUgJiYgXAotICAgICAgICAkKFRBUkdFVF9DT05GSUdVUkVfT1BUUykgXAotICAgICAgICAkKFRBUkdFVF9DT05GSUdVUkVfQVJHUykgXAotICAgICAgICAkKEdPT0dMRV9GRk1QRUdfQ09ORl9FTlYpIFwKLSAgICAgICAgJChMT0dMSU5FQVIpIC4vY29uZmlndXJlIFwKLSAgICAgICAgICAgICAgICAtLWVuYWJsZS1jcm9zcy1jb21waWxlICBcCi0gICAgICAgICAgICAgICAgLS1jcm9zcy1wcmVmaXg9JChUQVJHRVRfQ1JPU1MpIFwKLSAgICAgICAgICAgICAgICAtLXN5c3Jvb3Q9JChTVEFHSU5HX0RJUikgXAotICAgICAgICAgICAgICAgIC0taG9zdC1jYz0iJChIT1NUQ0MpIiBcCi0gICAgICAgICAgICAgICAgLS1hcmNoPSQoQlIyX0FSQ0gpIFwKLSAgICAgICAgICAgICAgICAtLXRhcmdldC1vcz1saW51eCBcCi0gICAgICAgICAgICAgICAgLS1leHRyYS1jZmxhZ3M9JyQoR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MpJyBcCitHT09HTEVfRkZNUEVHX0NPTkZfT1BUICs9IFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtZmZwbGF5IFwKICAgICAgICAgICAgICAgICAtLWRpc2FibGUtbW14IFwKICAgICAgICAgICAgICAgICAtLWRpc2FibGUtbW14MiBcCiAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLW11eGVycyBcCkBAIC0xMTcsNyArOTIsNDggQEAKICAgICAgICAgICAgICAgICAtLWVuYWJsZS1kZWNvZGVyPXZvcmJpcyBcCiAgICAgICAgICAgICAgICAgLS1lbmFibGUtZGVjb2Rlcj13YXZwYWNrIFwKICAgICAgICAgICAgICAgICAtLWVuYWJsZS1kZWNvZGVyPXdtdjMgXAotICAgICAgICAgICAgICAgIC0tZW5hYmxlLWRlY29kZXI9eHN1YiBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtZGVjb2Rlcj14c3ViCisKK0dPT0dMRV9GRk1QRUdfRVhUUkFfQ0ZMQUdTID0gLWZQSUMgLURFTTg2MjIKK0hPU1RfR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MgPSAtZlBJQyAtREVNODYyMgoraWZlcSAoJChCUjJfYXJtKSx5KQorIyBUaGUgY29tcGlsZXIgdmVyc2lvbiBmcm9tIEJyb2FkY29tIGRlZmF1bHRzIHRvIFRodW1iMiwgYW5kIGhpdHMgYSBjb21waWxlcgorIyBidXQgaW4gdGhpcyBwYWNrYWdlLCBzbyB3ZSBhcmUgY29tcGlsaW5nIHN0cmFpZ2h0IGFybSBmb3Igbm93LCBpdCdzIGEgYml0CisjIHNsb3cgYnV0IGF0IGxlYXN0IGNvbXBpbGVzLgorR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MgKz0gLW1hcm0KK2VuZGlmCisKKyMgV2Ugb25seSBpbnN0YWxsIHRoZSBwcm9ncmFtIGZvciB1c2FnZSBieSB0aGUgc2VydmVyIHNpZGUKK2RlZmluZSBHT09HTEVfRkZNUEVHX0lOU1RBTExfVEFSR0VUX0NNRFMKKyAgICAgICAgbWtkaXIgLXAgJChUQVJHRVRfRElSKS9hcHAvc2FnZS8KKyAgICAgICAgJChJTlNUQUxMKSAtRCAtbSAwNzU1ICQoQEQpL2ZmbXBlZyAkKFRBUkdFVF9ESVIpL2FwcC9zYWdlLworZW5kZWYKKworZGVmaW5lIEdPT0dMRV9GRk1QRUdfQ09ORklHVVJFX0NNRFMKKyAgICAgICAgKGNkICQoR09PR0xFX0ZGTVBFR19TUkNESVIpICYmIHJtIC1yZiBjb25maWcuY2FjaGUgJiYgXAorICAgICAgICAkKFRBUkdFVF9DT05GSUdVUkVfT1BUUykgXAorICAgICAgICAkKFRBUkdFVF9DT05GSUdVUkVfQVJHUykgXAorICAgICAgICAkKEdPT0dMRV9GRk1QRUdfQ09ORl9FTlYpIFwKKyAgICAgICAgJChMT0dMSU5FQVIpIC4vY29uZmlndXJlIFwKKyAgICAgICAgICAgICAgICAtLWVuYWJsZS1jcm9zcy1jb21waWxlICBcCisgICAgICAgICAgICAgICAgLS1jcm9zcy1wcmVmaXg9JChUQVJHRVRfQ1JPU1MpIFwKKyAgICAgICAgICAgICAgICAtLXN5c3Jvb3Q9JChTVEFHSU5HX0RJUikgXAorICAgICAgICAgICAgICAgIC0taG9zdC1jYz0iJChIT1NUQ0MpIiBcCisgICAgICAgICAgICAgICAgLS1hcmNoPSQoQlIyX0FSQ0gpIFwKKyAgICAgICAgICAgICAgICAtLXRhcmdldC1vcz1saW51eCBcCisgICAgICAgICAgICAgICAgLS1leHRyYS1jZmxhZ3M9JyQoR09PR0xFX0ZGTVBFR19FWFRSQV9DRkxBR1MpJyBcCisgICAgICAgICAgICAgICAgJChHT09HTEVfRkZNUEVHX0NPTkZfT1BUKSBcCisgICAgICAgICkKK2VuZGVmCisKK2RlZmluZSBIT1NUX0dPT0dMRV9GRk1QRUdfQ09ORklHVVJFX0NNRFMKKyAgICAgICAgKGNkICQoSE9TVF9HT09HTEVfRkZNUEVHX1NSQ0RJUikgJiYgcm0gLXJmIGNvbmZpZy5jYWNoZSAmJiBcCisgICAgICAgICQoSE9TVF9DT05GSUdVUkVfT1BUUykgXAorICAgICAgICAkKEhPU1RfQ09ORklHVVJFX0FSR1MpIFwKKyAgICAgICAgJChHT09HTEVfRkZNUEVHX0NPTkZfRU5WKSBcCisgICAgICAgICQoTE9HTElORUFSKSAuL2NvbmZpZ3VyZSBcCisgICAgICAgICAgICAgICAgLS1wcmVmaXg9JChIT1NUX0RJUikvdXNyIFwKKyAgICAgICAgICAgICAgICAtLWV4dHJhLWNmbGFncz0nJChIT1NUX0dPT0dMRV9GRk1QRUdfRVhUUkFfQ0ZMQUdTKScgXAogICAgICAgICAgICAgICAgICQoR09PR0xFX0ZGTVBFR19DT05GX09QVCkgXAogICAgICAgICApCiBlbmRlZgpAQCAtMTMxLDMgKzE0Nyw0IEBACiBHT09HTEVfRkZNUEVHX1BPU1RfSU5TVEFMTF9TVEFHSU5HX0hPT0tTKz1HT09HTEVfRkZNUEVHX0lOU1RBTExfQVVESU9DT05WRVJUCiAKICQoZXZhbCAkKGNhbGwgQVVUT1RBUkdFVFMpKQorJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUyxob3N0KSkKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9nZmxhZ3MvZ29vZ2xlX2dmbGFncy0wMDAxLXJlbW92ZS1TT05BTUUucGF0Y2ggYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZ2ZsYWdzL2dvb2dsZV9nZmxhZ3MtMDAwMS1yZW1vdmUtU09OQU1FLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjU2ZTU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9nZmxhZ3MvZ29vZ2xlX2dmbGFncy0wMDAxLXJlbW92ZS1TT05BTUUucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0tLS0gYS9jbWFrZS9DTWFrZUNYWEluZm9ybWF0aW9uLmNtYWtlCTIwMTQtMDYtMTggMTU6MzI6NDcuMjg1MTg2NzQ0IC0wNzAwCi0rKysgYi9jbWFrZS9DTWFrZUNYWEluZm9ybWF0aW9uLmNtYWtlCTIwMTQtMDYtMTggMTU6MzM6MzAuNTA1MTY5NDg1IC0wNzAwCi1AQCAtMTM4LDEwICsxMzgsNiBAQAotICAgc2V0KENNQUtFX0VYRV9FWFBPUlRTX0NYWF9GTEFHICR7Q01BS0VfRVhFX0VYUE9SVFNfQ19GTEFHfSkKLSBlbmRpZigpCi0gCi0taWYoTk9UIERFRklORUQgQ01BS0VfU0hBUkVEX0xJQlJBUllfU09OQU1FX0NYWF9GTEFHKQotLSAgc2V0KENNQUtFX1NIQVJFRF9MSUJSQVJZX1NPTkFNRV9DWFhfRkxBRyAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NPTkFNRV9DX0ZMQUd9KQotLWVuZGlmKCkKLS0KLSBpZihOT1QgQ01BS0VfRVhFQ1VUQUJMRV9SVU5USU1FX0NYWF9GTEFHKQotICAgc2V0KENNQUtFX0VYRUNVVEFCTEVfUlVOVElNRV9DWFhfRkxBRyAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1JVTlRJTUVfQ1hYX0ZMQUd9KQotIGVuZGlmKCkKLUBAIC0yNTYsNyArMjUyLDcgQEAKLSAjIGNyZWF0ZSBhIHNoYXJlZCBDKysgbGlicmFyeQotIGlmKE5PVCBDTUFLRV9DWFhfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZKQotICAgc2V0KENNQUtFX0NYWF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKLS0gICAgICAiPENNQUtFX0NYWF9DT01QSUxFUj4gPENNQUtFX1NIQVJFRF9MSUJSQVJZX0NYWF9GTEFHUz4gPExBTkdVQUdFX0NPTVBJTEVfRkxBR1M+IDxMSU5LX0ZMQUdTPiA8Q01BS0VfU0hBUkVEX0xJQlJBUllfQ1JFQVRFX0NYWF9GTEFHUz4gPFNPTkFNRV9GTEFHPjxUQVJHRVRfU09OQU1FPiAtbyA8VEFSR0VUPiA8T0JKRUNUUz4gPExJTktfTElCUkFSSUVTPiIpCi0rICAgICAgIjxDTUFLRV9DWFhfQ09NUElMRVI+IDxDTUFLRV9TSEFSRURfTElCUkFSWV9DWFhfRkxBR1M+IDxMQU5HVUFHRV9DT01QSUxFX0ZMQUdTPiA8TElOS19GTEFHUz4gPENNQUtFX1NIQVJFRF9MSUJSQVJZX0NSRUFURV9DWFhfRkxBR1M+IC1vIDxUQVJHRVQ+IDxPQkpFQ1RTPiA8TElOS19MSUJSQVJJRVM+IikKLSBlbmRpZigpCi0gCi0gIyBjcmVhdGUgYSBjKysgc2hhcmVkIG1vZHVsZSBjb3B5IHRoZSBzaGFyZWQgbGlicmFyeSBydWxlIGJ5IGRlZmF1bHQKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9nZmxhZ3MvZ29vZ2xlX2dmbGFncy5tayBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9nZmxhZ3MvZ29vZ2xlX2dmbGFncy5tawppbmRleCA3MzkxNjdiLi5hZDJiZjExIDEwMDY0NAotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZ2ZsYWdzL2dvb2dsZV9nZmxhZ3MubWsKKysrIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX2dmbGFncy9nb29nbGVfZ2ZsYWdzLm1rCkBAIC00LDEzICs0LDE0IEBACiAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUdPT0dMRV9HRkxBR1NfVkVSU0lPTiA9IDIuMS4xCi1HT09HTEVfR0ZMQUdTX1NPVVJDRSA9IHYkKEdPT0dMRV9HRkxBR1NfVkVSU0lPTikudGFyLmd6Ci1HT09HTEVfR0ZMQUdTX1NJVEUgPSBodHRwczovL2dpdGh1Yi5jb20vc2NodWhzY2h1aC9nZmxhZ3MvYXJjaGl2ZQorR09PR0xFX0dGTEFHU19WRVJTSU9OID0gdjIuMS4yCitHT09HTEVfR0ZMQUdTX1NJVEUgPSBnaXQ6Ly9naXRodWIuY29tL2dmbGFncy9nZmxhZ3MuZ2l0CiAKIEdPT0dMRV9HRkxBR1NfRElSID0gJChCVUlMRF9ESVIpL2dvb2dsZV9nZmxhZ3MtJChHT09HTEVfR0ZMQUdTX1ZFUlNJT04pCiBHT09HTEVfR0ZMQUdTX0lOU1RBTExfU1RBR0lORyA9IFlFUwogR09PR0xFX0dGTEFHU19JTlNUQUxMX1RBUkdFVCA9IFlFUwogR09PR0xFX0dGTEFHU19DT05GX09QVCA9IC1ER0ZMQUdTX05BTUVTUEFDRT1nb29nbGUgLURCVUlMRF9TSEFSRURfTElCUz1PTgorSE9TVF9HT09HTEVfR0ZMQUdTX0NPTkZfT1BUID0gLURHRkxBR1NfTkFNRVNQQUNFPWdvb2dsZSAtREJVSUxEX1NIQVJFRF9MSUJTPU9OCiAKICQoZXZhbCAkKGNhbGwgQ01BS0VUQVJHRVRTKSkKKyQoZXZhbCAkKGNhbGwgQ01BS0VUQVJHRVRTLGhvc3QpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX2dsb2cvZ29vZ2xlX2dsb2cubWsgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZ2xvZy9nb29nbGVfZ2xvZy5tawppbmRleCBmZWFmOGRhLi44MTJjNjM0IDEwMDY0NAotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZ2xvZy9nb29nbGVfZ2xvZy5taworKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfZ2xvZy9nb29nbGVfZ2xvZy5tawpAQCAtMSw5ICsxLDEzIEBACi1HT09HTEVfR0xPR19TSVRFID0gaHR0cHM6Ly9nb29nbGUtZ2xvZy5nb29nbGVjb2RlLmNvbS9maWxlcy8KLUdPT0dMRV9HTE9HX1ZFUlNJT04gPSAwLjMuMwotR09PR0xFX0dMT0dfU09VUkNFID0gZ2xvZy0kKEdPT0dMRV9HTE9HX1ZFUlNJT04pLnRhci5negorR09PR0xFX0dMT0dfU0lURSA9IGdpdDovL2dpdGh1Yi5jb20vZ29vZ2xlL2dsb2cuZ2l0CitHT09HTEVfR0xPR19WRVJTSU9OID0gdjAuMy40CitHT09HTEVfR0xPR19ESVIgPSAkKEJVSUxEX0RJUikvZ29vZ2xlX2dsb2ctJChHT09HTEVfTE9HX1ZFUlNJT04pCiBHT09HTEVfR0xPR19JTlNUQUxMX1NUQUdJTkcgPSBZRVMKIEdPT0dMRV9HTE9HX0lOU1RBTExfVEFSR0VUID0gWUVTCisKIEdPT0dMRV9HTE9HX0RFUEVOREVOQ0lFUz0gZ29vZ2xlX2dmbGFncworSE9TVF9HT09HTEVfR0xPR19ERVBFTkRFTkNJRVM9IGhvc3QtZ29vZ2xlX2dmbGFncworCitHT09HTEVfR0xPR19DT05GX09QVCA9IC0tZW5hYmxlLXN0YXRpYz1ubwogCiAkKGV2YWwgJChjYWxsIEFVVE9UQVJHRVRTKSkKICQoZXZhbCAkKGNhbGwgQVVUT1RBUkdFVFMsaG9zdCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfbWNhc3RjYXB0dXJlL0NvbmZpZy5pbiBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9tY2FzdGNhcHR1cmUvQ29uZmlnLmluCmluZGV4IDIwNmMwNDMuLjFmNGYxMjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9tY2FzdGNhcHR1cmUvQ29uZmlnLmluCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9tY2FzdGNhcHR1cmUvQ29uZmlnLmluCkBAIC00LDkgKzQsMTEgQEAKICAgICAgICAgc2VsZWN0IEJSMl9QQUNLQUdFX09QRU5TU0wKICAgICAgICAgc2VsZWN0IEJSMl9QQUNLQUdFX0xJQkNVUkwKICAgICAgICAgc2VsZWN0IEJSMl9QQUNLQUdFX1BST1RPQlVGCisgICAgICAgICMgUGFja2FnZXMgdXNlZCBieSBkYXNoc3J2CiAgICAgICAgIHNlbGVjdCBCUjJfUEFDS0FHRV9MSUJFVkVOVAogICAgICAgICBzZWxlY3QgQlIyX1BBQ0tBR0VfTElCWE1MMgotICAgICAgICAjIEZvciBkYXNoc3J2IHN1ZHUgaW5nZXN0aW9uLgotICAgICAgICBzZWxlY3QgQlIyX1BBQ0tBR0VfR09PR0xFX0RBU0hQTEFZRVIKKyAgICAgICAgc2VsZWN0IEJSMl9QQUNLQUdFX0dPT0dMRV9HRkxBR1MKKyAgICAgICAgc2VsZWN0IEJSMl9QQUNLQUdFX0dPT0dMRV9HTE9HCiAgICAgICAgIGhlbHAKLSAgICAgICAgICBCdWlsZHMgdGhlIG1jYXN0Y2FwdHVyZSBzYWdlc3J2IGJpbmFyeSBhbmQgbGlicHRzaW5kZXguc28gbGlicmFyeQorICAgICAgICAgIEJ1aWxkcyB0aGUgbWNhc3RjYXB0dXJlIHNhZ2VzcnYgYmluYXJ5LCBsaWJwdHNpbmRleC5zbyBsaWJyYXJ5LAorICAgICAgICAgIGFuZCBkYXNoc3J2IGJpbmFyeS4KZGlmZiAtLWdpdCBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9tY2FzdGNhcHR1cmUvZ29vZ2xlX21jYXN0Y2FwdHVyZS5tayBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9tY2FzdGNhcHR1cmUvZ29vZ2xlX21jYXN0Y2FwdHVyZS5tawppbmRleCAyNmE1MDZkLi4zZWZjNGE4IDEwMDY0NAotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfbWNhc3RjYXB0dXJlL2dvb2dsZV9tY2FzdGNhcHR1cmUubWsKKysrIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21jYXN0Y2FwdHVyZS9nb29nbGVfbWNhc3RjYXB0dXJlLm1rCkBAIC0xLDEwICsxLDEyIEBACiBHT09HTEVfTUNBU1RDQVBUVVJFX1NJVEU9cmVwbzovL3ZlbmRvci9nb29nbGUvbWNhc3RjYXB0dXJlCiBHT09HTEVfTUNBU1RDQVBUVVJFX0RFUEVOREVOQ0lFUz1vcGVuc3NsIGxpYmN1cmwgcHJvdG9idWYgemxpYiBnb29nbGVfcGxhdGZvcm0gXAotCWdvb2dsZV9saWJnZXAgbGliZXZlbnQgbGlieG1sMgotR09PR0xFX01DQVNUQ0FQVFVSRV9JTlNUQUxMX1NUQUdJTkcgPSBZRVMKKwlnb29nbGVfbGliZ2VwIGxpYmV2ZW50IGxpYnhtbDIgZ29vZ2xlX2dmbGFncyBsaWJqc29uLWNwcCBcCisJZ29vZ2xlX2dsb2cKIEhPU1RfR09PR0xFX01DQVNUQ0FQVFVSRV9ERVBFTkRFTkNJRVMgKz0gaG9zdC1nb29nbGV0ZXN0IGhvc3Qtb3BlbnNzbCBcCiAJaG9zdC1saWJjdXJsIGhvc3QtcHJvdG9idWYgaG9zdC16bGliIGhvc3QtZ29vZ2xlX3BsYXRmb3JtIFwKLQlob3N0LWxpYmV2ZW50IGhvc3QtZ29vZ2xlX2xpYmdlcCBob3N0LWxpYnhtbDIKKwlob3N0LWxpYmV2ZW50IGhvc3QtZ29vZ2xlX2xpYmdlcCBob3N0LWxpYnhtbDIgaG9zdC1nb29nbGVfZ2ZsYWdzIFwKKwlob3N0LWxpYmpzb25jcHAgaG9zdC1nb29nbGVfZ2xvZworR09PR0xFX01DQVNUQ0FQVFVSRV9JTlNUQUxMX1NUQUdJTkcgPSBZRVMKIAogZGVmaW5lIEdPT0dMRV9NQ0FTVENBUFRVUkVfQlVJTERfQ01EUwogCVRBUkdFVD0kKFRBUkdFVF9DUk9TUykgXApkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21pbmljbGllbnQvUzExbXBzZXJ2ZXIgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfbWluaWNsaWVudC9TMTFtcHNlcnZlcgppbmRleCA5ZmNlNjU4Li45YzlmOWYzIDEwMDc1NQotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfbWluaWNsaWVudC9TMTFtcHNlcnZlcgorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfbWluaWNsaWVudC9TMTFtcHNlcnZlcgpAQCAtMjEsNiArMjEsOSBAQAogICAgICAgICBzbGVlcCAxCiAgICAgICAgIG1jbm1wX3JldHJpZXM9JCgobWNubXBfcmV0cmllcysxKSkKICAgICAgIGRvbmUKKyAgICAgICMgQmVmb3JlIHdlIGxldCB0aGUgd29ybGQga25vdyB3ZSBhcmUgcmVhZHksIGNoZWNrIGFuZCByZS1pbml0aWFsaXplCisgICAgICAjIFBsYXlSZWFkeSBhbmQgV2lkZXZpbmUgaWYgbmVjZXNzYXJ5LgorICAgICAgL2FwcC9jbGllbnQvdmVyaWZ5X3BsYXlyZWFkeV93aWRldmluZSB8IGxvZ29zIG1jbm1wX3NlcnZlcgogICAgICAgdG91Y2ggL3RtcC9tY25tcF9yZWFkeQogICAgICAgaWYgaXMtc2VjdXJlLWJvb3Q7IHRoZW4KICAgICAgICAgOiA+L3RtcC9ncGlvL2xlZGNvbnRyb2wvc2VjdXJlX2Jvb3QKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9taW5pY2xpZW50L2dvb2dsZV9taW5pY2xpZW50Lm1rIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21pbmljbGllbnQvZ29vZ2xlX21pbmljbGllbnQubWsKaW5kZXggZmJiNmE0NS4uMTI5YWIyZSAxMDA2NDQKLS0tIGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21pbmljbGllbnQvZ29vZ2xlX21pbmljbGllbnQubWsKKysrIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21pbmljbGllbnQvZ29vZ2xlX21pbmljbGllbnQubWsKQEAgLTMsNyArMyw3IEBACiAJbGludXggXAogCWJjbV9uZXh1cyBiY21fcm9ja2ZvcmQgXAogCWdvb2dsZV9wdWxscmVhZGVyIGdvb2dsZV9kYXNocGxheWVyIGdvb2dsZV93aWRldmluZSBnb29nbGVfaGRjcCBicnVubyBcCi0Jb3BlbnNzbCBsaWJjdXJsIHpsaWIgbGlicG5nIGxpYnVuZ2lmIGxpYnByb2plY3RNIGxpYnhtbDIgXAorCW9wZW5zc2wgbGliY3VybCB6bGliIGxpYnBuZyBsaWJ1bmdpZiBsaWJ4bWwyIFwKIAlnb29nbGVfcGxhdGZvcm0gcHJvdG9idWYganBlZyBnb29nbGVfd2lkZXZpbmVfY2VuYwogR09PR0xFX01JTklDTElFTlRfSU5TVEFMTF9TVEFHSU5HPVlFUwogCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICAgICQoSU5TVEFMTCkgLUQgLW0gMDc1NSBwYWNrYWdlL2dvb2dsZS9nb29nbGVfbWluaWNsaWVudC9ydW4tdnVkdSAkKFRBUkdFVF9ESVIpL2FwcC9jbGllbnQvcnVuLXZ1ZHUKICAgICAgICAgJChJTlNUQUxMKSAtRCAtbSAwNzU1IHBhY2thZ2UvZ29vZ2xlL2dvb2dsZV9taW5pY2xpZW50L3J1bm1pbmljbGllbnQgJChUQVJHRVRfRElSKS9hcHAvY2xpZW50L3J1bm1pbmljbGllbnQKICAgICAgICAgJChJTlNUQUxMKSAtRCAtbSAwNzU1IHBhY2thZ2UvZ29vZ2xlL2dvb2dsZV9taW5pY2xpZW50L2lkbGVzbGVlcCAkKFRBUkdFVF9ESVIpL2FwcC9jbGllbnQvaWRsZXNsZWVwCisgICAgICAgICQoSU5TVEFMTCkgLUQgLW0gMDc1NSBwYWNrYWdlL2dvb2dsZS9nb29nbGVfbWluaWNsaWVudC92ZXJpZnlfcGxheXJlYWR5X3dpZGV2aW5lICQoVEFSR0VUX0RJUikvYXBwL2NsaWVudC92ZXJpZnlfcGxheXJlYWR5X3dpZGV2aW5lCiBlbmRlZgogCiAkKGV2YWwgJChjYWxsIEdFTlRBUkdFVFMpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX21pbmljbGllbnQvdmVyaWZ5X3BsYXlyZWFkeV93aWRldmluZSBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9taW5pY2xpZW50L3ZlcmlmeV9wbGF5cmVhZHlfd2lkZXZpbmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzY1MzY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9taW5pY2xpZW50L3ZlcmlmeV9wbGF5cmVhZHlfd2lkZXZpbmUKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisKK1BMQVlSRUFEWV9IQVNIX0ZJTEU9L3VzZXIvZHJtL2RybWNlcnQKK1dJREVWSU5FX0hBU0hfRklMRT0vdXNlci93aWRldmluZS9kcm0uYmluLnNoYTEKKwordmVyaWZ5X3BsYXlyZWFkeV9kcm1fc3RhdGUoKQoreworICBlY2hvICJWZXJpZnlpbmcgUGxheVJlYWR5IHN0YXR1cyIKKworICAjIC91c2VyL2RybS9kcm1jZXJ0IGlzIGFjdHVhbGx5IGEgaGFzaCBvZiB0aGUgUGxheVJlYWR5IGJpbi4gVGhlIGJpbiBjYW4gb25seQorICAjIGNoYW5nZSBkdXJpbmcgYSBwbGF0Zm9ybSB1cGRhdGUsIGFzIGl0IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCBob3dldmVyIGlmIGl0CisgICMgZG9lcyBjaGFuZ2Ugd2UgbmVlZCB0byBpbnZhbGlkYXRlIChyZW1vdmUpIHRoZSBsb2NhbCByZWFkLXdyaXRlIHN0YXRlLgorICBsb2NhbCBkcm1jZXJ0PSJpbnZhbGlkIgorICBbIC1lICIkUExBWVJFQURZX0hBU0hfRklMRSIgXSAmJiByZWFkIGRybWNlcnQgPCRQTEFZUkVBRFlfSEFTSF9GSUxFCisKKyAgbG9jYWwgZnNjZXJ0PSIkKHNoYTFzdW0gL3Vzci9sb2NhbC9saWNlbnNlcy9wbGF5cmVhZHkuYmluKSIKKyAgaWYgWyAiJGRybWNlcnQiICE9ICIkZnNjZXJ0IiBdOyB0aGVuCisgICAgZWNobyAiVGhlIFBsYXlSZWFkeSBiaW4gYXBwZWFycyB0byBoYXZlIGNoYW5nZWQ7IGludmFsaWRhdGluZyBsb2NhbCBzdGF0ZSIKKyAgICBybSAtcmYgL3VzZXIvZHJtLyoKKyAgICBlY2hvICIkZnNjZXJ0IiA+ICRQTEFZUkVBRFlfSEFTSF9GSUxFCisgIGZpCisKKyAgZWNobyAiUGxheVJlYWR5IHZlcmlmaWVkIgorfQorCit2ZXJpZnlfd2lkZXZpbmVfZHJtX3N0YXRlKCkKK3sKKyAgZWNobyAiVmVyaWZ5aW5nIG5vbi1TQUdFIFdpZGV2aW5lIENFTkMgc3RhdHVzIgorCisgICMgVGhlIG5vbi1TQUdFIFdpZGV2aW5lIENFTkMgZHJtLmJpbiBpcyBjb3BpZWQgZnJvbSBhIHJlYWQtb25seSBtb3VudGVkCisgICMgbG9jYXRpb24gdG8gYSByZWFkLXdyaXRlIGxvY2F0aW9uLCBhbmQgaW5kaXZpZHVhbGl6ZWQgZm9yIGVhY2ggYm94LiBBcyBzdWNoLAorICAjIGl0IGNhbiBiZWNvbWUgY29ycnVwdCAoZS5nLiBpZiB0aGUgZmxhc2ggZmFpbHMpLCBzbyB3ZSBzdG9yZSBhIGhhc2ggYW5kCisgICMgaW52YWxpZGF0ZSBpdCBpZiB0aGUgaGFzaCBubyBsb25nZXIgbWF0Y2hlcy4KKyAgbG9jYWwgZHJtY2VydD0iaW52YWxpZCIKKyAgWyAtZSAiJFdJREVWSU5FX0hBU0hfRklMRSIgXSAmJiByZWFkIGRybWNlcnQgPCRXSURFVklORV9IQVNIX0ZJTEUKKworICBsb2NhbCBmc2NlcnQ9IiQoc2hhMXN1bSAvdXNlci93aWRldmluZS9kcm0uYmluKSIKKyAgaWYgWyAiJGRybWNlcnQiICE9ICIkZnNjZXJ0IiBdOyB0aGVuCisgICAgZWNobyAiVGhlIFdpZGV2aW5lIGJpbiBhcHBlYXJzIHRvIGhhdmUgY2hhbmdlZDsgaW52YWxpZGF0aW5nIGFuZCByZWNyZWF0aW5nIgorICAgIHJtIC1yZiAvdXNlci93aWRldmluZS9kcm0uYmluKgorICAgIGNwIC1mIC91c3IvbG9jYWwvbGljZW5zZXMvZHJtLmJpbiAvdXNlci93aWRldmluZS9kcm0uYmluCisgICAgIyBXYWl0cG93ZXIgaGFzIGxvZ2ljIHRvIHRyaWdnZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkcm0uYmluCisgICAgL2FwcC9jbGllbnQvd2FpdHBvd2VyIC0tbgorICAgIGZzY2VydD0iJChzaGExc3VtIC91c2VyL3dpZGV2aW5lL2RybS5iaW4pIgorICAgIGVjaG8gIiRmc2NlcnQiID4gJFdJREVWSU5FX0hBU0hfRklMRQorICBmaQorCisgIGVjaG8gIldpZGV2aW5lIHZlcmlmaWVkIgorfQorCit2ZXJpZnlfcGxheXJlYWR5X2RybV9zdGF0ZQorCit2ZXJpZnlfd2lkZXZpbmVfZHJtX3N0YXRlCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfb3JlZ2Fuby9TOTlvcmVnYW5vIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX29yZWdhbm8vUzk5b3JlZ2FubwppbmRleCAyMWRlMGI0Li4xZDk2MjlmIDEwMDc1NQotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfb3JlZ2Fuby9TOTlvcmVnYW5vCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9vcmVnYW5vL1M5OW9yZWdhbm8KQEAgLTI2LDcgKzI2LDcgQEAKICAgc3RhcnQpCiAgICAgZWNobyAiUzk5b3JlZ2Fubzogc3RhcnQgY2FsbGVkIGJ5ICRwYXJlbnRfY29tbSIgfCBsb2dvcyBvcmVnYW5vCiAgICAgKAotICAgICAgd2FpdC11bnRpbC1jcmVhdGVkIC90bXAvbmV4dXNfbXVsdGlwcm9jZXNzCisgICAgICB3YWl0LXVudGlsLWNyZWF0ZWQgL3RtcC9tY25tcF9yZWFkeQogICAgICAgd2FpdC11bnRpbC1jcmVhdGVkIC90bXAvdGltZS5zeW5jZWQKICAgICAgIGlmIGlzLXR2LWJveDsgdGhlbgogICAgICAgICAoCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vQ29uZmlnLmluIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL0NvbmZpZy5pbgppbmRleCA5YThjYWZjLi44ZDBjYTU4IDEwMDY0NAotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vQ29uZmlnLmluCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9Db25maWcuaW4KQEAgLTEwMSw2ICsxMDEsMTIgQEAKIAloZWxwCiAJICBJbmNsdWRlIHRoZSBsZWRwYXR0ZXJuIHRvb2wuCiAKK2NvbmZpZyBCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fU1lTTE9HCisJYm9vbCAiaW5jbHVkZSBzeXNsb2dkIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNpbXBsZSBzeXNsb2cgZGFlbW9uIHdpdGggc3Ryb25nIGZpbHRlcmluZyBzdXBwb3J0LgorCiBjb25maWcgQlIyX1BBQ0tBR0VfR09PR0xFX09QRU5CT1gKIAlib29sICJPcGVuYm94IFJlbGVhc2UiCiAJZGVmYXVsdCBuCkBAIC0xMzksNyArMTQ1LDYgQEAKIAlib29sICJJbmNsdWRlIFRlc3QgUGFja2FnZXMiCiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiAhKEJSMl9QQUNLQUdFX0dPT0dMRV9QUk9EICYmIEJSMl9QQUNLQUdFX0dPT0dMRV9TUEFDRUNBU1QpCi0Jc2VsZWN0IEJSMl9QQUNLQUdFX0JPTk5JRQogCXNlbGVjdCBCUjJfUEFDS0FHRV9DUkFTSE1FCiAJc2VsZWN0IEJSMl9QQUNLQUdFX0RIUllTVE9ORQogCXNlbGVjdCBCUjJfUEFDS0FHRV9EUk9QQkVBUgpAQCAtMTUzLDcgKzE1OCw2IEBACiAJc2VsZWN0IEJSMl9QQUNLQUdFX0ZJTwogCXNlbGVjdCBCUjJfUEFDS0FHRV9JUEVSRgogCXNlbGVjdCBCUjJfUEFDS0FHRV9JUEVSRjMKLQlzZWxlY3QgQlIyX1BBQ0tBR0VfTE1CRU5DSAogCXNlbGVjdCBCUjJfUEFDS0FHRV9NRU1TVEFUCiAJc2VsZWN0IEJSMl9QQUNLQUdFX01FTVRFU1RFUgogCXNlbGVjdCBCUjJfUEFDS0FHRV9ORVRQRVJGCkBAIC0xNjUsNyArMTY5LDYgQEAKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfVVRJTF9MSU5VWF9MT0dJTl9VVElMUwogCXNlbGVjdCBCUjJfUEFDS0FHRV9VVElMX0xJTlVYX0FHRVRUWQogCXNlbGVjdCBCUjJfUEFDS0FHRV9XSEVUU1RPTkUKLQlzZWxlY3QgQlIyX1BBQ0tBR0VfU0RQQVJNCiAJc2VsZWN0IEJSMl9QQUNLQUdFX1NZU1NUQVQKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfVEVTVFVTQgogCXNlbGVjdCBCUjJfUEFDS0FHRV9UUkFDRVJPVVRFX05FVwpAQCAtMjI5LDggKzIzMiwxMCBAQAogCXNlbGVjdCBCUjJfUEFDS0FHRV9HT09HTEVfVFZTVFJFQU1QQVJTRVIKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfQVZBSEkKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfQVZBSElfREFFTU9OCisJc2VsZWN0IEJSMl9QQUNLQUdFX0JPTk5JRQogCXNlbGVjdCBCUjJfUEFDS0FHRV9TQU1CQQogCXNlbGVjdCBCUjJfUEFDS0FHRV9TQU1CQV9OTUJMT09LVVAKKwlzZWxlY3QgQlIyX1BBQ0tBR0VfU0RQQVJNCiAJc2VsZWN0IEJSMl9QQUNLQUdFX0FWQUhJX0NPTVBBVF9MSUJETlNfU0QKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfUFJPVE9CVUYKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfR09PR0xFX0ZST0JOSUNBU1QKQEAgLTI2Miw3ICsyNjcsNiBAQAogCXNlbGVjdCBCUjJfUEFDS0FHRV9JRlBMVUdECiAJc2VsZWN0IEJSMl9QQUNLQUdFX0pQRUcKIAlzZWxlY3QgQlIyX1BBQ0tBR0VfTElCUE5HCi0Jc2VsZWN0IEJSMl9QQUNLQUdFX0xJQlBST0pFQ1RNCiAJc2VsZWN0IEJSMl9QQUNLQUdFX0JPT1NUCiAJc2VsZWN0IEJSMl9QQUNLQUdFX0FWQUhJCiAJc2VsZWN0IEJSMl9QQUNLQUdFX0FWQUhJX0RBRU1PTgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL1M1MmNvbm1hbiBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9TNTJjb25tYW4KaW5kZXggNmFhYmQxYS4uYTkxODgyZCAxMDA3NTUKLS0tIGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL1M1MmNvbm1hbgorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vUzUyY29ubWFuCkBAIC0xOSw4ICsxOSwxMCBAQAogICAgIGZpCiAgICAgOzsKICAgc3RvcCkKLSAgICBwa2lsbHdhaXQgLWYgIlxiY29ubWFuIgotICAgIHBraWxsd2FpdCAtZiAiXGJhcG1hbiIKKyAgICBwa2lsbHdhaXQgYXBtYW4KKyAgICBwa2lsbHdhaXQgLWYgImJhYnlzaXQuKmRlYXRocmF0dGxlLipjb25tYW4iCisgICAgcGtpbGx3YWl0IC1mICJkZWF0aHJhdHRsZS4qY29ubWFuIgorICAgIHBraWxsd2FpdCBjb25tYW4KICAgICA7OwogICByZXN0YXJ0KQogICAgICQwIHN0b3A7ICQwIHN0YXJ0CmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vUzUzd2F2ZWd1aWRlIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL1M1M3dhdmVndWlkZQppbmRleCA0N2NhMjBlLi4xNmNkYzY2IDEwMDc1NQotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vUzUzd2F2ZWd1aWRlCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9TNTN3YXZlZ3VpZGUKQEAgLTQyLDEyICs0MiwxMyBAQAogICAgICAgU0k9LS1zY2FuLWludGVydmFsPTMwMAogICAgIGZpCiAgICAgaWYgWyAtbiAiJFlFUyIgXTsgdGhlbgorICAgICAgbWtkaXIgLXAgL3RtcC93YXZlZ3VpZGUKICAgICAgIHN1cGVybmljZSBiYWJ5c2l0IDYwIGFsaXZlbW9uaXRvciAvdG1wL3dhdmVndWlkZS9hbGl2ZSAxMCAxMCA2MDAgXAogICAgICAgICAgIHdhdmVndWlkZSAiJEhQIiAiJFNJIiAiJFRCIiAyPiYxIHwgbG9nb3Mgd2F2ZWd1aWRlICYKICAgICBmaQogICAgIDs7CiAgIHN0b3ApCi0gICAgcGtpbGx3YWl0IC1mICJcYndhdmVndWlkZSIKKyAgICBwa2lsbHdhaXQgd2F2ZWd1aWRlCiAgICAgOzsKICAgcmVzdGFydCkKICAgICAkMCBzdG9wOyAkMCBzdGFydApkaWZmIC0tZ2l0IGEvZnMvc2tlbGV0b24vdXNyL3N2L2Nvbm5lY3RpbmcudHMucGxhdGZvcm1fZ2ZpYmVydHYgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vY29ubmVjdGluZy50cwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZnMvc2tlbGV0b24vdXNyL3N2L2Nvbm5lY3RpbmcudHMucGxhdGZvcm1fZ2ZpYmVydHYKcmVuYW1lIHRvIHBhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9jb25uZWN0aW5nLnRzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZzL3NrZWxldG9uL3Vzci9zdi9maWJlci1sb2dvLWFuaW1hdGlvbi50cy5wbGF0Zm9ybV9nZmliZXJ0diBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9maWJlci1sb2dvLWFuaW1hdGlvbi50cwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZnMvc2tlbGV0b24vdXNyL3N2L2ZpYmVyLWxvZ28tYW5pbWF0aW9uLnRzLnBsYXRmb3JtX2dmaWJlcnR2CnJlbmFtZSB0byBwYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vZmliZXItbG9nby1hbmltYXRpb24udHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL2dvb2dsZV9wbGF0Zm9ybS5tayBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9nb29nbGVfcGxhdGZvcm0ubWsKaW5kZXggNmRiYTQxMS4uNGI3OTIzZCAxMDA2NDQKLS0tIGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL2dvb2dsZV9wbGF0Zm9ybS5taworKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vZ29vZ2xlX3BsYXRmb3JtLm1rCkBAIC0zMiw4ICszMiw3IEBACiBIT1NUX0dPT0dMRV9QTEFURk9STV9ERVBFTkRFTkNJRVM9XAogCSQoR09PR0xFX1BMQVRGT1JNX0RFUEVOREVOQ0lFUykgXAogCWhvc3QtZ29vZ2xldGVzdCBcCi0JaG9zdC1wcm90b2J1ZiBcCi0JaG9zdC1saWJwY2FwCisJaG9zdC1wcm90b2J1ZgogCiBHT09HTEVfUExBVEZPUk1fVEFSR0VUX0NGTEFHUz0tSSQoU1RBR0lOR19ESVIpL3Vzci9pbmNsdWRlL3B5dGhvbjIuNwogR09PR0xFX1BMQVRGT1JNX0hPU1RfQ0ZMQUdTPS1pc3lzdGVtICQoSE9TVF9ESVIpL3Vzci9pbmNsdWRlCkBAIC0xMDEsNiArMTAwLDcgQEAKIGVuZGlmCiAKIGlmZXEgKCQoQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNX1dBVkVHVUlERSkseSkKK0hPU1RfR09PR0xFX1BMQVRGT1JNX0RFUEVOREVOQ0lFUyArPSBob3N0LWxpYnBjYXAKIEJVSUxEX1dBVkVHVUlERT15CiBlbmRpZgogCkBAIC0xNDMsNiArMTQzLDEwIEBACiBCVUlMRF9MRURQQVRURVJOPXkKIGVuZGlmCiAKK2lmZXEgKCQoQlIyX1BBQ0tBR0VfR09PR0xFX1BMQVRGT1JNX1NZU0xPRykseSkKK0JVSUxEX1NZU0xPRz15CitlbmRpZgorCiBpZm5lcSAoJChCUjJfUEFDS0FHRV9HT09HTEVfRklCRVJfSkFDSykseSkKICMgZmliZXIgamFjayBrZXJuZWwgaXMgdG9vIG9sZCBmb3IgdGhlIG5ldy1zdHlsZSBsb2d1cGxvYWRlciBmb3Igbm93CiBCVUlMRF9MT0dVUExPQUQ9eQpAQCAtMjc1LDYgKzI3OSwxMyBAQAogCSQoaWYgJChCUjJfUEFDS0FHRV9HT09HTEVfUExBVEZPUk1fU1lTTUdSKSwkKElOU1RBTEwpIC1tIDA3NTUgLUQgcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL1MwNHN5c21nciAkKFRBUkdFVF9ESVIpL2V0Yy9pbml0LmQvKQogCSQoaWYgJChCUjJfSEFWRV9FWFRSQV9DTEVBTlVQKSwkKElOU1RBTEwpIC1tIDA3NTUgLUQgcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL1M5OXh4ZW1lcmdlbmN5ICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC8pCiAJJChJTlNUQUxMKSAtbSAwNzU1IC1EIC1UIHBhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9nZmliZXJfcHVibGljLmRlci8kKFBVQl9LRVkpICQoVEFSR0VUX0RJUikvZXRjL2dmaWJlcl9wdWJsaWMuZGVyCisJJChpZiAkKEJSMl9QQUNLQUdFX0dPT0dMRV9UVl9CT1gpLG1rZGlyIC1wIC1tIDA3NTUgJChUQVJHRVRfRElSKS91c3Ivc3YvKQorCSQoaWYgJChCUjJfUEFDS0FHRV9HT09HTEVfVFZfQk9YKSwkKElOU1RBTEwpIC1tIDA1NTUgLUQgcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtLyoudHMgJChUQVJHRVRfRElSKS91c3Ivc3YvKQorCSQoSU5TVEFMTCkgLW0gMDY0NCAtRCBwYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vc3lzbG9nLmNvbmYgJChUQVJHRVRfRElSKS9ldGMvCisKKwkjIEF2YWhpIHNlcnZpY2UgZmlsZXMKKwkkKElOU1RBTEwpIC1tIDA2NDQgLUQgcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3NlcnZpY2VzL2lzb3Bpbmcuc2VydmljZSAkKFRBUkdFVF9ESVIpL2V0Yy9hdmFoaS9zZXJ2aWNlcworCSQoaWYgJChCVUlMRF9TWVNMT0cpLCQoSU5TVEFMTCkgLW0gMDY0NCAtRCBwYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vc2VydmljZXMvc3lzbG9nLnNlcnZpY2UgJChUQVJHRVRfRElSKS9ldGMvYXZhaGkvc2VydmljZXMpCiAKIAkjIHJlZ2lzdGVyY2hlY2sKIAkjVE9ETyhhcGVud2Fycik6IGRvIHdlIGFjdHVhbGx5IG5lZWQgdGhpcyBmb3IgYW55dGhpbmc/CmRpZmYgLS1naXQgYS9mcy9za2VsZXRvbi91c3Ivc3YvaW5pdGlhbGl6aW5nLnRzLnBsYXRmb3JtX2dmaWJlcnR2IGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL2luaXRpYWxpemluZy50cwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZnMvc2tlbGV0b24vdXNyL3N2L2luaXRpYWxpemluZy50cy5wbGF0Zm9ybV9nZmliZXJ0dgpyZW5hbWUgdG8gcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL2luaXRpYWxpemluZy50cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vcmMvc3lzbG9nL2RlcGVuZGVuY2llcyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9yYy9zeXNsb2cvZGVwZW5kZW5jaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzdmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vcmMvc3lzbG9nL2RlcGVuZGVuY2llcwpAQCAtMCwwICsxIEBACitmaXJld2FsbApkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3JjL3N5c2xvZy9ydW4gYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vcmMvc3lzbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YWNjNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3JjL3N5c2xvZy9ydW4KQEAgLTAsMCArMSw1IEBACisjIS91c3IvYmluL2V4ZWNsaW5lYgorZmRtb3ZlIC1jIDIgMQoraWYgeyBydW5uYWJsZSBzeXNsb2dkIH0KKyMgcnVuIHdpdGggQ0FQX05FVF9CSU5EX1NFUlZJQ0UKK21pbmlqYWlsMCAtdSBzeXNsb2cgLWcgc3lzbG9nIC1jIDB4NDAwIC9iaW4vc3lzbG9nZCAtbCAwLjAuMC4wOjUxNApkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3JjL3N5c2xvZy90eXBlIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3JjL3N5c2xvZy90eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODNjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vcmMvc3lzbG9nL3R5cGUKQEAgLTAsMCArMSBAQAorbG9uZ3J1bgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3NlcnZpY2VzL2lzb3Bpbmcuc2VydmljZSBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9zZXJ2aWNlcy9pc29waW5nLnNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2NjE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9wbGF0Zm9ybS9zZXJ2aWNlcy9pc29waW5nLnNlcnZpY2UKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc2VydmljZS1ncm91cCBTWVNURU0gImF2YWhpLXNlcnZpY2UuZHRkIj4KKzxzZXJ2aWNlLWdyb3VwPgorICAgIDxuYW1lIHJlcGxhY2Utd2lsZGNhcmRzPSJ5ZXMiPmlzb3Bpbmcgb24gJWg8L25hbWU+CisgICAgPHNlcnZpY2U+CisgICAgICAgIDx0eXBlPl9pc29waW5nLl91ZHA8L3R5cGU+CisgICAgICAgIDxwb3J0PjQ5NDg8L3BvcnQ+CisgICAgPC9zZXJ2aWNlPgorPC9zZXJ2aWNlLWdyb3VwPgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3NlcnZpY2VzL3N5c2xvZy5zZXJ2aWNlIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3NlcnZpY2VzL3N5c2xvZy5zZXJ2aWNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmFiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vc2VydmljZXMvc3lzbG9nLnNlcnZpY2UKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc2VydmljZS1ncm91cCBTWVNURU0gImF2YWhpLXNlcnZpY2UuZHRkIj4KKzxzZXJ2aWNlLWdyb3VwPgorICAgIDxuYW1lIHJlcGxhY2Utd2lsZGNhcmRzPSJ5ZXMiPnN5c2xvZyBvbiAlaDwvbmFtZT4KKyAgICA8c2VydmljZT4KKyAgICAgICAgPHR5cGU+X3N5c2xvZy5fdWRwPC90eXBlPgorICAgICAgICA8cG9ydD41MTQ8L3BvcnQ+CisgICAgPC9zZXJ2aWNlPgorPC9zZXJ2aWNlLWdyb3VwPgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3N5c2xvZy5jb25mIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3BsYXRmb3JtL3N5c2xvZy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOThmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfcGxhdGZvcm0vc3lzbG9nLmNvbmYKQEAgLTAsMCArMSBAQAorLioKZGlmZiAtLWdpdCBhL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9zcGFjZWNhc3QvQ29uZmlnLmluIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3NwYWNlY2FzdC9Db25maWcuaW4KaW5kZXggZDg4MTY5Mi4uMDQxYTVjMiAxMDA2NDQKLS0tIGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3NwYWNlY2FzdC9Db25maWcuaW4KKysrIGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3NwYWNlY2FzdC9Db25maWcuaW4KQEAgLTE5LDMgKzE5LDE0IEBACiAJc2VsZWN0IEJSMl9QQUNLQUdFX1RST1VTRVJTCiAJaGVscAogCSAgR29vZ2xlJ3MgU3BhY2VjYXN0CisKK2lmIEJSMl9QQUNLQUdFX0dPT0dMRV9TUEFDRUNBU1QKKworY29uZmlnIEJSMl9QQUNLQUdFX0dPT0dMRV9TUEFDRUNBU1RfVEFSR0VUCisJc3RyaW5nICJUYXJnZXQgZGV2aWNlIChhcHBsaWFuY2Ugb3IgRkRTKSIKKwlkZWZhdWx0ICJzcGFjZWNhc3RfYXBwbGlhbmNlLm1rIgorCWhlbHAKKwkgVGFyZ2V0IGRldmljZSB0byBpbnN0YWxsLgorCSAgRWl0aGVyICJzcGFjZWNhc3RfYXBwbGlhbmNlLm1rIiBvciAic3BhY2VjYXN0X0ZEUy5tayIuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfc3BhY2VjYXN0L2V0Yy9pbml0LmQvUzkwc3BhY2VjYXN0IGIvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3NwYWNlY2FzdC9ldGMvaW5pdC5kL1M5MHNwYWNlY2FzdAppbmRleCAyYzBlMWE0Li44NWE2YmJjIDEwMDY0NAotLS0gYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfc3BhY2VjYXN0L2V0Yy9pbml0LmQvUzkwc3BhY2VjYXN0CisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9zcGFjZWNhc3QvZXRjL2luaXQuZC9TOTBzcGFjZWNhc3QKQEAgLTIsMTEgKzIsMTEgQEAKICMgU3BhY2VDYXN0IGluaXQgc2NyaXB0LgogLiAvZXRjL3V0aWxzLnNoCiAKLSMgU2V0IHRoZSBzdGFjayBzaXplIHRvIDFNQiAoRGVmYXVsdCB0byA4TSkgdG8gc3VwcG9ydCBtb3JlIGNvbmN1cnJlbnQgc3RyZWFtcy4KKyMgU2V0IHRoZSBzdGFjayBzaXplIHRvIDI1NktCIChEZWZhdWx0IHRvIDhNKSB0byBhdm9pZCBPT00gaXNzdWVzLgogIyBXaGVuIENHTyBpcyBlbmFibGVkLCBlYWNoIGJsb2NraW5nIHN5c2NhbGwgKFJlYWQsIFdyaXRlKSB3aWxsIGNhbGwKICMgcHRocmVhZF9jcmVhdGUgdG8gY3JlYXRlIGEgbmV3IHRocmVhZCwgc28gc3RhY2sgc2l6ZSBmb3IgMTAwIGNvbmN1cnJlbnQKICMgc3RyZWFtcyB3b3VsZCBiZSA4MDBNQiBhbmQgdGhlIG1lbW9yeSBsaW1pdCB3b3VsZCBiZSBoaXQgd2l0aG91dCB0aGlzIGNoYW5nZS4KLXVsaW1pdCAtcyAxMDI0Cit1bGltaXQgLXMgMjU2CiAKIEFQUD0ic3BhY2VjYXN0IgogQklOQVJZPSIvYXBwL3NwYWNlY2FzdC9hcHBsaWFuY2UiCmRpZmYgLS1naXQgYS9wYWNrYWdlL2dvb2dsZS9nb29nbGVfc3BhY2VjYXN0L2dvb2dsZV9zcGFjZWNhc3QubWsgYi9wYWNrYWdlL2dvb2dsZS9nb29nbGVfc3BhY2VjYXN0L2dvb2dsZV9zcGFjZWNhc3QubWsKaW5kZXggMTRmYjhiNS4uYzNlNDZlOCAxMDA2NDQKLS0tIGEvcGFja2FnZS9nb29nbGUvZ29vZ2xlX3NwYWNlY2FzdC9nb29nbGVfc3BhY2VjYXN0Lm1rCisrKyBiL3BhY2thZ2UvZ29vZ2xlL2dvb2dsZV9zcGFjZWNhc3QvZ29vZ2xlX3NwYWNlY2FzdC5tawpAQCAtOSw2ICs5LDcgQEAKIAkJCQlob3N0LWdvX3Byb3RvYnVmIFwKIAkJCQlob3N0LWdvX21vY2sgXAogCQkJCWhvc3QtZ29vZ2xlX3dpZGV2aW5lX2NlbmMgXAorCQkJCWhvc3QtdHJvdXNlcnMgXAogCQkJCWdvX2Nyb24gXAogCQkJCWdvX2Zzbm90aWZ5IFwKIAkJCQlnb19nbG9nIFwKQEAgLTMzLDIyICszNCwyMiBAQAogCiBkZWZpbmUgR09PR0xFX1NQQUNFQ0FTVF9CVUlMRF9DTURTCiAJZXhwb3J0ICQoR09MQU5HX0VOVikgOyBcCi0JJChHT09HTEVfU1BBQ0VDQVNUX0dPRU5WKTsgXAotCSQoTUFLRSkgLUMgJChARCkgT1VURElSPSQoQEQpIC1mIHNwYWNlY2FzdC5tayBhbGwKKwkkKEdPT0dMRV9TUEFDRUNBU1RfR09FTlYpIDsgXAorCSQoTUFLRSkgLUMgJChARCkgLWYgc3BhY2VjYXN0Lm1rIGFsbCBcCisJCVRPT0xDSEFJTj0iJChCUjJfVE9PTENIQUlOX0VYVEVSTkFMX1BSRUZJWCktIgogZW5kZWYKIAogZGVmaW5lIEdPT0dMRV9TUEFDRUNBU1RfVEVTVF9DTURTCiAJZXhwb3J0ICQoSE9TVF9HT0xBTkdfRU5WKSA7IFwKLQkkKEdPT0dMRV9TUEFDRUNBU1RfR09FTlYpOyBcCi0JZXhwb3J0IENHT19DWFhGTEFHUz0iJChIT1NUX0NYWEZMQUdTKSIgOyBcCi0JZXhwb3J0IENHT19MREZMQUdTPSIkKEhPU1RfTERGTEFHUykiIDsgXAotCSQoTUFLRSkgLUMgJChARCkgT1VURElSPSQoQEQpIC1mIHNwYWNlY2FzdC5tayB0ZXN0CisJJChHT09HTEVfU1BBQ0VDQVNUX0dPRU5WKSA7IFwKKwkkKE1BS0UpIC1DICQoQEQpIC1mIHNwYWNlY2FzdC5tayB0ZXN0CiBlbmRlZgogCiBkZWZpbmUgR09PR0xFX1NQQUNFQ0FTVF9JTlNUQUxMX1RBUkdFVF9DTURTCi0JJChNQUtFKSAtQyAkKEBEKSBPVVRESVI9JChARCkgLWYgc3BhY2VjYXN0Lm1rIGluc3RhbGxfdGFyZ2V0IFwKKwkkKE1BS0UpIC1DICQoQEQpIC1mICQoQlIyX1BBQ0tBR0VfR09PR0xFX1NQQUNFQ0FTVF9UQVJHRVQpIGluc3RhbGwgXAogCQlJTlNUQUxMPSIkKElOU1RBTEwpIiBcCiAJCVRBUkdFVF9ESVI9IiQoVEFSR0VUX0RJUikiIFwKKwkJQklOQVJJRVNfRElSPSIkKEJJTkFSSUVTX0RJUikiIFwKIAkJU1RSSVBDTUQ9IiQoU1RSSVBDTUQpIgogCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSBwYWNrYWdlL2dvb2dsZS9nb29nbGVfc3BhY2VjYXN0L2V0Yy9pbml0LmQvUzgwY29tbWFuZHJ1bm5lciBcCiAJCSQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC8KQEAgLTc3LDE4ICs3OCwyMSBAQAogZW5kZWYKIAogZGVmaW5lIEdPT0dMRV9TUEFDRUNBU1RfQ0xFQU5fQ01EUwotCSQoTUFLRSkgLUMgJChARCkgT1VURElSPSQoQEQpIC1mIHNwYWNlY2FzdC5tayBjbGVhbiBcCi0JCVRBUkdFVF9ESVI9IiQoVEFSR0VUX0RJUikiCi0KKwkkKE1BS0UpIC1DICQoQEQpIC1mIHNwYWNlY2FzdC5tayBjbGVhbgorCSQoTUFLRSkgLUMgJChARCkgLWYgJChCUjJfUEFDS0FHRV9HT09HTEVfU1BBQ0VDQVNUX1RBUkdFVCkgY2xlYW4gXAorCQlUQVJHRVRfRElSPSIkKFRBUkdFVF9ESVIpIiBcCisJCUJJTkFSSUVTX0RJUj0iJChCSU5BUklFU19ESVIpIgorCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TODBjb21tYW5kcnVubmVyCiAJcm0gLWYgJChUQVJHRVRfRElSKS9ldGMvaW5pdC5kL1M4MHN0YXRlbWFuYWdlcgogCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TODJzY2RhZW1vbgogCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TODRjb25maWdtYW5hZ2VyCiAJcm0gLWYgJChUQVJHRVRfRElSKS9ldGMvaW5pdC5kL1M4OHVwZGF0ZWVuZ2luZQogCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TOTBzcGFjZWNhc3QKIAlybSAtZiAkKFRBUkdFVF9ESVIpL2V0Yy9pbml0LmQvUzkybW9ubG9ncHVzaGVyCi0Jcm0gLWYgJChUQVJHRVRfRElSKS9ldGMvaW5pdC5kL1M5NWFkYgotCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TOTlhbmRyb2lkc2VydmVyCisJcm0gLWYgJChUQVJHRVRfRElSKS9ldGMvaW5pdC5kL1M0MmFkYgorCXJtIC1mICQoVEFSR0VUX0RJUikvZXRjL2luaXQuZC9TNDJhbmRyb2lkc2VydmVyCiAJcm0gLWYgJChUQVJHRVRfRElSKS9zYmluL3Jlc2V0X3R1bmVyCisJcm0gLWYgJChUQVJHRVRfRElSKS9zYmluL3Byb2RzeXNpbmZvCiBlbmRlZgogCiAkKGV2YWwgJChjYWxsIEdFTlRBUkdFVFMpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9pZnBsdWdkL2lmcGx1Z2QuYWN0aW9uIGIvcGFja2FnZS9pZnBsdWdkL2lmcGx1Z2QuYWN0aW9uCmluZGV4IGQ4YjMzYWIuLmQzZWFlODYgMTAwNzU1Ci0tLSBhL3BhY2thZ2UvaWZwbHVnZC9pZnBsdWdkLmFjdGlvbgorKysgYi9wYWNrYWdlL2lmcGx1Z2QvaWZwbHVnZC5hY3Rpb24KQEAgLTksNiArOSw4IEBACiAKIENPTk1BTl9TVEFUVVNfRElSPS90bXAvY29ubWFuL2ludGVyZmFjZXMKIAorZWNobyAiaWZwbHVnZDogJGlmYWNlIGlzICRhY3Rpb24iCisKIGNhc2UgIiRhY3Rpb24iIGluCiAgIHVwKQogICAgICMgQ2xlYXIgYW55IGV4aXN0aW5nIGR5bmFtaWMgSVAgY29uZmlnLgpAQCAtMzUsNiArMzcsMTAgQEAKICAgICAgIGZpCiAKICAgICAgIGlmIFsgLWUgIi9zeXMvY2xhc3MvbmV0L2JyMCIgXTsgdGhlbgorICAgICAgICAjIFN0b3AgYW55IHJ1bm5pbmcgZGhjbGllbnRzIG9uIGJyMCBub3cgdGhhdCB0aGUgd2FuIGlzIHVwLgorICAgICAgICBraWxscGlkIC92YXIvcnVuL2RoY2xpZW50LmJyMC5waWQKKyAgICAgICAga2lsbHBpZCAvdmFyL3J1bi9kaGNsaWVudDYuYnIwLnBpZAorCiAgICAgICAgICMgQnJpZGdlIG1vZGUgbWlnaHQgcmVxdWlyZSBicjAgdG8gc3dpdGNoIGFkZHJlc3MgY29uZmlnLgogICAgICAgICBpcGFwcGx5IGJyMAogICAgICAgZmkKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGliYWlvL2xpYmFpby0wLjMuMTA5LWFyY2hlcy5wYXRjaCBiL3BhY2thZ2UvbGliYWlvL2xpYmFpby0wLjMuMTA5LTAwMS1hcmNoZXMucGF0Y2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2UvbGliYWlvL2xpYmFpby0wLjMuMTA5LWFyY2hlcy5wYXRjaApyZW5hbWUgdG8gcGFja2FnZS9saWJhaW8vbGliYWlvLTAuMy4xMDktMDAxLWFyY2hlcy5wYXRjaApkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJhaW8vbGliYWlvLTAuMy4xMDktYXZyMzItc3VwcG9ydC5wYXRjaCBiL3BhY2thZ2UvbGliYWlvL2xpYmFpby0wLjMuMTA5LTAwMi1hdnIzMi1zdXBwb3J0LnBhdGNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlL2xpYmFpby9saWJhaW8tMC4zLjEwOS1hdnIzMi1zdXBwb3J0LnBhdGNoCnJlbmFtZSB0byBwYWNrYWdlL2xpYmFpby9saWJhaW8tMC4zLjEwOS0wMDItYXZyMzItc3VwcG9ydC5wYXRjaApkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJhaW8vbGliYWlvLTAuMy4xMDktZGVzdGRpci5wYXRjaCBiL3BhY2thZ2UvbGliYWlvL2xpYmFpby0wLjMuMTA5LTAwMy1kZXN0ZGlyLnBhdGNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlL2xpYmFpby9saWJhaW8tMC4zLjEwOS1kZXN0ZGlyLnBhdGNoCnJlbmFtZSB0byBwYWNrYWdlL2xpYmFpby9saWJhaW8tMC4zLjEwOS0wMDMtZGVzdGRpci5wYXRjaApkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJhaW8vbGliYWlvLTAuMy4xMDktMDA0LWFyYy1zdXBwb3J0LnBhdGNoIGIvcGFja2FnZS9saWJhaW8vbGliYWlvLTAuMy4xMDktMDA0LWFyYy1zdXBwb3J0LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGVmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYmFpby9saWJhaW8tMC4zLjEwOS0wMDQtYXJjLXN1cHBvcnQucGF0Y2gKQEAgLTAsMCArMSwxODQgQEAKK0Zyb20gZTUxZWUwMjJiOWFiNjcwYTZhM2JjN2YyZGQzYmY4YjkyNWM0NmIwOSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IERlbnRvbiBHZW50cnkgPGRnZW50cnlAZ29vZ2xlLmNvbT4KK0RhdGU6IFR1ZSwgMjkgTm92IDIwMTYgMTE6NTY6MDkgLTA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gQWRkIEFSQyBzdXBwb3J0LgorCistLS0KKyBzcmMvbGliYWlvLmggICAgICB8ICAxMiArKysrKysKKyBzcmMvc3lzY2FsbC1hcmMuaCB8IDEyNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBzcmMvc3lzY2FsbC5oICAgICB8ICAgMiArCisgMyBmaWxlcyBjaGFuZ2VkLCAxNDEgaW5zZXJ0aW9ucygrKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvc3lzY2FsbC1hcmMuaAorCitkaWZmIC0tZ2l0IGEvc3JjL2xpYmFpby5oIGIvc3JjL2xpYmFpby5oCitpbmRleCA0ZmI5Mjg1Li40YWViN2M2IDEwMDY0NAorLS0tIGEvc3JjL2xpYmFpby5oCisrKysgYi9zcmMvbGliYWlvLmgKK0BAIC0xMTEsNiArMTExLDE4IEBAIHR5cGVkZWYgZW51bSBpb19pb2NiX2NtZCB7CisgI2RlZmluZSBQQURERUQoeCwgeSkJdW5zaWduZWQgeTsgeAorICNkZWZpbmUgUEFEREVEcHRyKHgsIHkpCXVuc2lnbmVkIHk7IHgKKyAjZGVmaW5lIFBBRERFRHVsKHgsIHkpCXVuc2lnbmVkIHk7IHVuc2lnbmVkIGxvbmcgeDsKKysjZWxpZiBkZWZpbmVkKF9fYXJjX18pCisrIyAgaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKysjZGVmaW5lIFBBRERFRCh4LCB5KQl1bnNpZ25lZCB5OyB4CisrI2RlZmluZSBQQURERURwdHIoeCwgeSkJdW5zaWduZWQgeTsgeAorKyNkZWZpbmUgUEFEREVEdWwoeCwgeSkJdW5zaWduZWQgeTsgdW5zaWduZWQgbG9uZyB4OworKyMgIGVsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKKysjZGVmaW5lIFBBRERFRCh4LCB5KQl4OyB1bnNpZ25lZCB5CisrI2RlZmluZSBQQURERURwdHIoeCwgeSkJeDsgdW5zaWduZWQgeQorKyNkZWZpbmUgUEFEREVEdWwoeCwgeSkJdW5zaWduZWQgbG9uZyB4OyB1bnNpZ25lZCB5CisrIyAgZWxzZQorKyMgICAgZXJyb3IgIm5laXRoZXIgQVJDIEJFIG5vciBMRT8iCisrIyAgZW5kaWYKKyAjZWxzZQorICNlcnJvcgllbmRpYW4/CisgI2VuZGlmCitkaWZmIC0tZ2l0IGEvc3JjL3N5c2NhbGwtYXJjLmggYi9zcmMvc3lzY2FsbC1hcmMuaAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjA0YmVmYWMKKy0tLSAvZGV2L251bGwKKysrKyBiL3NyYy9zeXNjYWxsLWFyYy5oCitAQCAtMCwwICsxLDEyNyBAQAorKy8qCisrICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKysgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisrICogZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIENvcHlyaWdodCAoQykgMjAxNiBHb29nbGUsIEluYy4KKysgKi8KKysKKysvLyBmcm9tIHVzci9pbmNsdWRlL2JpdHMvc3lzbnVtLmgKKysjZGVmaW5lIF9fTlJfaW9fc2V0dXAJCQkwCisrI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCQkxCisrI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkJNAorKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCQkyCisrI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJCTMKKysKKysvKgorKyAqIHN5c2NhbGwgaW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tCisrICogaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9tbC9uZXdsaWIvMjAxNS9tc2cwMDczMS5odG1sCisrICovCisrCisrI2lmZGVmIF9fQVJDNzAwX18KKysjZGVmaW5lIFNZU0NBTEwgXAorKyAgICAgICAgICAgICJ0cmFwMCAgICBcblx0IgorKyNlbHNlCisrI2RlZmluZSBTWVNDQUxMICAgIFwKKysgICAgICAgICAgICAic3dpICAgIFxuXHQiXAorKyAgICAgICAgICAgICJub3AgICAgXG5cdCJcCisrICAgICAgICAgICAgIm5vcCAgICBcblx0IgorKyNlbmRpZiAvKiBfX0FSQzcwMF9fICovCisrCisrI2RlZmluZSBpb19zeXNjYWxsMSh0eXBlLGZuYW1lLHNuYW1lLGF0eXBlLGEpICAgICAgICAgICAgICAgICBcCisrdHlwZSBmbmFtZShhdHlwZSBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgIGxvbmcgX19yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92ICAgIHIwLCAlMlxuXHQiICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByOCwgJTFcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgU1lTQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICAlMCwgcjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiPXIiIChfX3JlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiaSIgKFNZU18jI3NuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgICAiciIgKChsb25nKWEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiY2MiLCAicjAiLCAicjgiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgIHJldHVybiAodHlwZSlfX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrfQorKworKyNkZWZpbmUgaW9fc3lzY2FsbDIodHlwZSxmbmFtZSxzbmFtZSxhdHlwZSxhLGJ0eXBlLGIpICAgICAgICAgXAorK3R5cGUgZm5hbWUoYXR5cGUgYSwgYnR5cGUgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICBsb25nIF9fcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdiAgICByMSwgJTNcblx0IiAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgICJtb3YgICAgcjAsICUyXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgICJtb3YgICAgcjgsICUxXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgIFNZU0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgICJtb3YgICAgJTAsIHIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgIDogIj1yIiAoX19yZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgIDogImkiIChTWVNfIyNzbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgICAgInIiICgobG9uZylhKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgICAgInIiICgobG9uZyliKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICAgICAgICAgIDogImNjIiwgInIwIiwgInIxIiwgInI4Iik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgICByZXR1cm4gKHR5cGUpX19yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorK30KKysKKysjZGVmaW5lIGlvX3N5c2NhbGwzKHR5cGUsZm5hbWUsc25hbWUsYXR5cGUsYSxidHlwZSxiLGN0eXBlLGMpIFwKKyt0eXBlIGZuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgbG9uZyBfX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIyLCAlNFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIxLCAlM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIwLCAlMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHI4LCAlMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICBTWVNDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgICUwLCByMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICI9ciIgKF9fcmVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICJpIiAoU1lTXyMjc25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICJjYyIsICJyMCIsICJyMSIsICJyMiIsICJyOCIpOyAgICAgICAgICAgICAgICAgIFwKKysgICAgcmV0dXJuICh0eXBlKV9fcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyt9CisrCisrI2RlZmluZSBpb19zeXNjYWxsNCh0eXBlLGZuYW1lLHNuYW1lLGF0eXBlLGEsYnR5cGUsYixjdHlwZSxjLGR0eXBlLCBkKSBcCisrdHlwZSBmbmFtZShhdHlwZSBhLCBidHlwZSBiLCBjdHlwZSBjLCBkdHlwZSBkKSAgICAgICAgICAgICAgICBcCisreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgIGxvbmcgX19yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByMywgJTVcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByMiwgJTRcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByMSwgJTNcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByMCwgJTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICByOCwgJTFcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgU1lTQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgIm1vdiAgICAlMCwgcjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiPXIiIChfX3JlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiaSIgKFNZU18jI3NuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgICAiciIgKChsb25nKWEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgICAiciIgKChsb25nKWIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgICAiciIgKChsb25nKWMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgICAiciIgKChsb25nKWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrICAgICAgICAgICAgOiAiY2MiLCAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjgiKTsgICAgICAgICAgICBcCisrICAgIHJldHVybiAodHlwZSlfX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrfQorKworKyNkZWZpbmUgaW9fc3lzY2FsbDUodHlwZSxmbmFtZSxzbmFtZSxhdHlwZSxhLGJ0eXBlLGIsY3R5cGUsYyxkdHlwZSxkLGV0eXBlLGUpIFwKKyt0eXBlIGZuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMsIGR0eXBlIGQsIGV0eXBlIGUpICAgICAgIFwKKyt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgbG9uZyBfX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHI0LCAlNlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIzLCAlNVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIyLCAlNFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIxLCAlM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHIwLCAlMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgIHI4LCAlMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICBTWVNDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAibW92ICAgICUwLCByMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICI9ciIgKF9fcmVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICJpIiAoU1lTXyMjc25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICAgICJyIiAoKGxvbmcpZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgICAgICAgICA6ICJjYyIsICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyOCIpOyAgICAgIFwKKysgICAgcmV0dXJuICh0eXBlKV9fcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyt9CitkaWZmIC0tZ2l0IGEvc3JjL3N5c2NhbGwuaCBiL3NyYy9zeXNjYWxsLmgKK2luZGV4IDE5OTY1YTQuLjE0ZGU5OGIgMTAwNjQ0CistLS0gYS9zcmMvc3lzY2FsbC5oCisrKysgYi9zcmMvc3lzY2FsbC5oCitAQCAtMzQsNiArMzQsOCBAQAorICNpbmNsdWRlICJzeXNjYWxsLW1pcHMuaCIKKyAjZWxpZiBkZWZpbmVkKF9fYXZyMzJfXykKKyAjaW5jbHVkZSAic3lzY2FsbC1hdnIzMi5oIgorKyNlbGlmIGRlZmluZWQoX19hcmNfXykKKysjaW5jbHVkZSAic3lzY2FsbC1hcmMuaCIKKyAjZWxzZQorICNlcnJvciAiYWRkIHN5c2NhbGwtYXJjaC5oIgorICNlbmRpZgorLS0gCisyLjguMC5yYzMuMjI2LmczOWQ0MDIwCisKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGliY3VybF8zMi9Db25maWcuaW4gYi9wYWNrYWdlL2xpYmN1cmxfMzIvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2UyMGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYmN1cmxfMzIvQ29uZmlnLmluCkBAIC0wLDAgKzEsOCBAQAorY29uZmlnIEJSMl9QQUNLQUdFX0xJQkNVUkxfMzIKKwlib29sICJsaWJjdXJsXzMyIgorCWhlbHAKKwkgIGNVUkwgaXMgYSB0b29sIGZvciBnZXR0aW5nIGZpbGVzIGZyb20gRlRQLCBIVFRQLCBHb3BoZXIsIFRlbG5ldCwKKwkgIGFuZCBEaWN0IHNlcnZlcnMsIHVzaW5nIGFueSBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29scy4KKworCSAgaHR0cDovL2N1cmwuaGF4eC5udS8KKwkgIFRoaXMgcGFja2FnZSB2ZXJzaW9uIGlzIG9ubHkgbWVhbnQgZm9yIHVzYWdlIHdpdGggTmV0ZmxpeApkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJjdXJsXzMyL2xpYmN1cmxfMzIubWsgYi9wYWNrYWdlL2xpYmN1cmxfMzIvbGliY3VybF8zMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2EyMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9saWJjdXJsXzMyL2xpYmN1cmxfMzIubWsKQEAgLTAsMCArMSw0NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBsaWJjdXJsXzMyIChGb3IgTmV0ZmxpeCkKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTElCQ1VSTF8zMl9WRVJTSU9OID0gNy4zMi4wCitMSUJDVVJMXzMyX1NPVVJDRSA9IGN1cmwtJChMSUJDVVJMXzMyX1ZFUlNJT04pLnRhci5iejIKK0xJQkNVUkxfMzJfU0lURSA9IGh0dHA6Ly9jdXJsLmhheHguc2UvZG93bmxvYWQvCitMSUJDVVJMXzMyX0lOU1RBTExfU1RBR0lORyA9IE5PCitMSUJDVVJMXzMyX0NPTkZfT1BUID0gLS1kaXNhYmxlLXZlcmJvc2UgLS1kaXNhYmxlLW1hbnVhbCAtLWVuYWJsZS1oaWRkZW4tc3ltYm9scyBcCisgICAgICAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNoYXJlZCAtLWVuYWJsZS1vcHRpbWl6ZSAtLWRpc2FibGUtZGVidWcgXAorICAgICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1mdHAgLS1kaXNhYmxlLWZpbGUgLS1kaXNhYmxlLWxkYXAgXAorICAgICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1sZGFwcyAtLWRpc2FibGUtcnRzcCAtLWRpc2FibGUtZGljdCBcCisgICAgICAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXRlbG5ldCAtLWRpc2FibGUtdGZ0cCAtLWRpc2FibGUtZ29waGVyIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLWRpc2FibGUtcG9wMyAtLWRpc2FibGUtaW1hcCAtLWRpc2FibGUtc210cCBcCisgICAgICAgICAgICAgICAgICAgICAgLS13aXRob3V0LWxpYmlkbgorCitpZmVxICgkKEJSMl9QQUNLQUdFX09QRU5TU0wpLHkpCitMSUJDVVJMXzMyX0RFUEVOREVOQ0lFUyArPSBvcGVuc3NsCitMSUJDVVJMXzMyX0NPTkZfRU5WICs9IGFjX2N2X2xpYl9jcnlwdG9fQ1JZUFRPX2xvY2s9eWVzCisjIGNvbmZpZ3VyZSBhZGRzIHRoZSBjcm9zcyBvcGVuc3NsIGRpciB0byBMRF9MSUJSQVJZX1BBVEggd2hpY2ggc2NyZXdzIHVwCisjIG5hdGl2ZSBzdHVmZiBkdXJpbmcgdGhlIHJlc3Qgb2YgY29uZmlndXJlIHdoZW4gdGFyZ2V0ID09IGhvc3QuCisjIEZpeCBpdCBieSBzZXR0aW5nIExEX0xJQlJBUllfUEFUSCB0byBzb21ldGhpbmcgc2Vuc2libGUgc28gdGhvc2UgbGlicworIyBhcmUgZm91bmQgZmlyc3QuCitMSUJDVVJMXzMyX0NPTkZfRU5WICs9IExEX0xJQlJBUllfUEFUSD0kJExEX0xJQlJBUllfUEFUSDovbGliOi91c3IvbGliCitMSUJDVVJMXzMyX0NPTkZfT1BUICs9IC0td2l0aC1zc2w9JChTVEFHSU5HX0RJUikvdXNyIC0td2l0aC1yYW5kb209L2Rldi91cmFuZG9tIFwKKwktLXdpdGgtY2EtYnVuZGxlPS9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQKK2Vsc2UKK0xJQkNVUkxfMzJfQ09ORl9PUFQgKz0gLS13aXRob3V0LXNzbAorZW5kaWYKKworaWZlcSAoJChCUjJfSU5FVF9JUFY2KSx5KQorTElCQ1VSTF8zMl9DT05GX09QVCArPSAtLWVuYWJsZS1pcHY2CitlbmRpZgorCitpZmVxICgkKEJSMl9QQUNLQUdFX0xJQkNBUkVTKSx5KQorTElCQ1VSTF8zMl9ERVBFTkRFTkNJRVMgKz0gbGliY2FyZXMKK0xJQkNVUkxfMzJfQ09ORl9PUFQgKz0gLS1lbmFibGUtYXJlcworZW5kaWYKKworZGVmaW5lIExJQkNVUkxfMzJfSU5TVEFMTF9UQVJHRVRfQ01EUworIyBXZSBkb24ndCBpbnN0YWxsIHRoaXMgdmVyc2lvbiwgaXQgaXMgYWNjZXNzZWQgZGlyZWN0bHkgYnkgdGhlIE5ldGZsaXggcGFja2FnZQorZW5kZWYKKworJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCiskKGV2YWwgJChjYWxsIEFVVE9UQVJHRVRTLGhvc3QpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJlbGYvQ29uZmlnLmluIGIvcGFja2FnZS9saWJlbGYvQ29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBlZjY4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2UvbGliZWxmL0NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotY29uZmlnIEJSMl9QQUNLQUdFX0xJQkVMRgotCWJvb2wgImxpYmVsZiIKLQloZWxwCi0JICBUaGUgZWxmIGxpYnJhcnkgcHJvdmlkZXMgcm91dGluZXMgdG8gYWNjZXNzLCBhbmQgbWFuaXB1bGF0ZSwKLQkgIEVsZiBvYmplY3QgZmlsZXMuCi0KLQkgIGh0dHA6Ly93d3cubXI1MTEuZGUvc29mdHdhcmUvCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYmVsZi9saWJlbGYtMC44LjEwLUVsZjY0LWZpeHVwcy5wYXRjaCBiL3BhY2thZ2UvbGliZWxmL2xpYmVsZi0wLjguMTAtRWxmNjQtZml4dXBzLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmEwNjRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2UvbGliZWxmL2xpYmVsZi0wLjguMTAtRWxmNjQtZml4dXBzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNjEgKzAsMCBAQAotZGlmZiAtcmR1cCBsaWJlbGYtMC44LjEwLm9yaWcvY29uZmlndXJlIGxpYmVsZi0wLjguMTAvY29uZmlndXJlCi0tLS0gbGliZWxmLTAuOC4xMC5vcmlnL2NvbmZpZ3VyZQkyMDA3LTA5LTA3IDE0OjA4OjA2LjAwMDAwMDAwMCArMDIwMAotKysrIGxpYmVsZi0wLjguMTAvY29uZmlndXJlCTIwMDctMDktMjAgMTA6MzI6MDQuMDAwMDAwMDAwICswMjAwCi1AQCAtMSw0NyArMSw3MjggQEAKLSAjISAvYmluL3NoCi0tCi0gIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSsjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MS4KLSAjCi0rIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCi0rIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLSsjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSsjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSsjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSAKLS0jIERlZmF1bHRzOgotLWFjX2hlbHA9Ci0rIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi0rRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAotK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotKyAgZW11bGF0ZSBzaAotKyAgTlVMTENNRD06Ci0rICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0rICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0rICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotK2Vsc2UKLSsgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci0rZXNhYwotKwotK2ZpCi0rCi0rCi0rCi0rCi0rIyBQQVRIIG5lZWRzIENSCi0rIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwotK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLSthc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKLSsKLSsjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLStpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgotKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotKyAgY2htb2QgK3ggY29uZiQkLnNoCi0rICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSsgIGVsc2UKLSsgICAgUEFUSF9TRVBBUkFUT1I9OgotKyAgZmkKLSsgIHJtIC1mIGNvbmYkJC5zaAotK2ZpCi0rCi0rIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCi0raWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICBhc191bnNldD11bnNldAotK2Vsc2UKLSsgIGFzX3Vuc2V0PWZhbHNlCi0rZmkKLSsKLSsKLSsjIElGUwotKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0rIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0rIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0rIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotK2FzX25sPScKLSsnCi0rSUZTPSIgIiIJJGFzX25sIgotKwotKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi0rY2FzZSAkMCBpbgotKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSsgICAgIDs7Ci0rZXNhYwotKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSsjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLStpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0rICBhc19teXNlbGY9JDAKLStmaQotK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSsgIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSsgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotK2ZpCi0rCi0rIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi0rZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAotK2RvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0rZG9uZQotK1BTMT0nJCAnCi0rUFMyPSc+ICcKLStQUzQ9JysgJwotKwotKyMgTkxTIG51aXNhbmNlcy4KLStmb3IgYXNfdmFyIGluIFwKLSsgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCi0rICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotKyAgTENfVEVMRVBIT05FIExDX1RJTUUKLStkbwotKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSsgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0rICBlbHNlCi0rICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0rICBmaQotK2RvbmUKLSsKLSsjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLStpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgotKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0rICBhc19leHByPWV4cHIKLStlbHNlCi0rICBhc19leHByPWZhbHNlCi0rZmkKLSsKLStpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0rICBhc19iYXNlbmFtZT1iYXNlbmFtZQotK2Vsc2UKLSsgIGFzX2Jhc2VuYW1lPWZhbHNlCi0rZmkKLSsKLSsKLSsjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi0rYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8Ci0rJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLSsJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0rCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLStlY2hvIFgvIiQwIiB8Ci0rICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotKwkgICAgcy8vXDEvCi0rCSAgICBxCi0rCSAgfQotKwkgIC9eWFwvXChcL1wvXCkkL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcL1woXC9cKS4qL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICBzLy4qLy4vOyBxJ2AKLSsKLSsjIENEUEFUSC4KLSskYXNfdW5zZXQgQ0RQQVRICi0rCi0rCi0raWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgotKyAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgotKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLStlbHNlCi0rICBhc19oYXZlX3JlcXVpcmVkPW5vCi0rZmkKLSsKLSsgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYgCSAoZXZhbCAiOgotKyhhc19mdW5jX3JldHVybiAoKSB7Ci0rICAoZXhpdCBcJDEpCi0rfQotK2FzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAwCi0rfQotK2FzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAxCi0rfQotK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotKyAgcmV0dXJuIDAKLSt9Ci0rYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0rICByZXR1cm4gMQotK30KLSsKLStleGl0Y29kZT0wCi0raWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotK2ZpCi0rCi0raWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0rICBleGl0Y29kZT0xCi0rICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLStmaQotKwotK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSsgIGV4aXRjb2RlPTEKLSsgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi0rZmkKLSsKLSt0ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSsKLSsoCi0rICBhc19saW5lbm9fMT1cJExJTkVOTwotKyAgYXNfbGluZW5vXzI9XCRMSU5FTk8KLSsgIHRlc3QgXCJ4XCRhc19saW5lbm9fMVwiICE9IFwieFwkYXNfbGluZW5vXzJcIiAmJgotKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSsiKSAyPiAvZGV2L251bGw7IHRoZW4KLSsgIDoKLStlbHNlCi0rICBhc19jYW5kaWRhdGVfc2hlbGxzPQotKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgY2FzZSAkYXNfZGlyIGluCi0rCSAvKikKLSsJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotKwkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCi0rCSAgIGRvbmU7OwotKyAgICAgICBlc2FjCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSsKLSsgICAgICBmb3IgYXNfc2hlbGwgaW4gJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJFNIRUxMOyBkbwotKwkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotKwkgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCi0rCQl7ICgiJGFzX3NoZWxsIikgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgotK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotKyAgZW11bGF0ZSBzaAotKyAgTlVMTENNRD06Ci0rICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0rICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi0rICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotK2Vsc2UKLSsgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgotKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci0rZXNhYwotKwotK2ZpCi0rCi0rCi0rOgotK19BU0VPRgotK307IHRoZW4KLSsgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKLSsJICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCi0rCSAgICAgICBpZiB7ICIkYXNfc2hlbGwiIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLStpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGVtdWxhdGUgc2gKLSsgIE5VTExDTUQ9OgotKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSsgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLStlbHNlCi0rICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSsgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotK2VzYWMKLSsKLStmaQotKwotKwotKzoKLSsoYXNfZnVuY19yZXR1cm4gKCkgewotKyAgKGV4aXQgJDEpCi0rfQotK2FzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAwCi0rfQotK2FzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAxCi0rfQotK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotKyAgcmV0dXJuIDAKLSt9Ci0rYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0rICByZXR1cm4gMQotK30KLSsKLStleGl0Y29kZT0wCi0raWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotK2ZpCi0rCi0raWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0rICBleGl0Y29kZT0xCi0rICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLStmaQotKwotK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSsgIGV4aXRjb2RlPTEKLSsgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi0rZmkKLSsKLSt0ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotKwotKygKLSsgIGFzX2xpbmVub18xPSRMSU5FTk8KLSsgIGFzX2xpbmVub18yPSRMSU5FTk8KLSsgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0rCi0rX0FTRU9GCi0rfTsgdGhlbgotKyAgYnJlYWsKLStmaQotKwotK2ZpCi0rCi0rICAgICAgZG9uZQotKwotKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0rICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgotKyAgICAgICAgZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKLSsgICAgICAgIGRvbmUKLSsgICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSsgICAgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkYXNfbXlzZWxmIiAkezErIiRAIn0KLStmaQotKwotKwotKyAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KLSsgIGVjaG8gVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCB0aGUKLSsgICAgICBlY2hvIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uICBQbGVhc2UgaW5zdGFsbCBhCi0rICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQotKyAgICAgIGVjaG8gc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLgotKyAgICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotK2ZpCi0rCi0rCi0rZmkKLSsKLStmaQotKwotKwotKwotKyhldmFsICJhc19mdW5jX3JldHVybiAoKSB7Ci0rICAoZXhpdCBcJDEpCi0rfQotK2FzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAwCi0rfQotK2FzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0rICBhc19mdW5jX3JldHVybiAxCi0rfQotK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotKyAgcmV0dXJuIDAKLSt9Ci0rYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0rICByZXR1cm4gMQotK30KLSsKLStleGl0Y29kZT0wCi0raWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotK2ZpCi0rCi0raWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0rICBleGl0Y29kZT0xCi0rICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLStmaQotKwotK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSsgIGV4aXRjb2RlPTEKLSsgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi0rZmkKLSsKLStpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgZXhpdGNvZGU9MQotKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi0rZmkKLSsKLSt0ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgewotKyAgZWNobyBObyBzaGVsbCBmb3VuZCB0aGF0IHN1cHBvcnRzIHNoZWxsIGZ1bmN0aW9ucy4KLSsgIGVjaG8gUGxlYXNlIHRlbGwgYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKLSsgIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSsgIGVjaG8gbWVzc2FnZQotK30KLSsKLSsKLSsKLSsgIGFzX2xpbmVub18xPSRMSU5FTk8KLSsgIGFzX2xpbmVub18yPSRMSU5FTk8KLSsgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0rCi0rICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0rICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0rICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSsgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0rICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0rICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0rICAjIGNhc2UgYXQgbGluZSBlbmQuCi0rICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSsgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSsgIHNlZCAtbiAnCi0rICAgIHAKLSsgICAgL1skXUxJTkVOTy89Ci0rICAnIDwkYXNfbXlzZWxmIHwKLSsgICAgc2VkICcKLSsgICAgICBzL1skXUxJTkVOTy4qLyYtLwotKyAgICAgIHQgbGluZW5vCi0rICAgICAgYgotKyAgICAgIDpsaW5lbm8KLSsgICAgICBOCi0rICAgICAgOmxvb3AKLSsgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSsgICAgICB0IGxvb3AKLSsgICAgICBzLy1cbi4qLy8KLSsgICAgJyA+JGFzX21lLmxpbmVubyAmJgotKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKwotKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSsgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSsgIC4gIi4vJGFzX21lLmxpbmVubyIKLSsgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotKyAgZXhpdAotK30KLSsKLSsKLStpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGFzX2Rpcm5hbWU9ZGlybmFtZQotK2Vsc2UKLSsgIGFzX2Rpcm5hbWU9ZmFsc2UKLStmaQotKwotK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci0rY2FzZSBgZWNobyAtbiB4YCBpbgotKy1uKikKLSsgIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0rICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSsgICopICAgRUNIT19DPSdcYyc7OwotKyAgZXNhYzs7Ci0rKikKLSsgIEVDSE9fTj0nLW4nOzsKLStlc2FjCi0rCi0raWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSsgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotKyAgYXNfZXhwcj1leHByCi0rZWxzZQotKyAgYXNfZXhwcj1mYWxzZQotK2ZpCi0rCi0rcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLStpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSsgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLStlbHNlCi0rICBybSAtZiBjb25mJCQuZGlyCi0rICBta2RpciBjb25mJCQuZGlyCi0rZmkKLStlY2hvID5jb25mJCQuZmlsZQotK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotKyAgYXNfbG5fcz0nbG4gLXMnCi0rICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotKyAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSsgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotKyAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSsgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSsgICAgYXNfbG5fcz0nY3AgLXAnCi0rZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSsgIGFzX2xuX3M9bG4KLStlbHNlCi0rICBhc19sbl9zPSdjcCAtcCcKLStmaQotK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLStybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0rCi0raWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotKyAgYXNfbWtkaXJfcD06Ci0rZWxzZQotKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSsgIGFzX21rZGlyX3A9ZmFsc2UKLStmaQotKwotK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGFzX3Rlc3RfeD0ndGVzdCAteCcKLStlbHNlCi0rICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgYXNfbHNfTF9vcHRpb249TAotKyAgZWxzZQotKyAgICBhc19sc19MX29wdGlvbj0KLSsgIGZpCi0rICBhc190ZXN0X3g9JwotKyAgICBldmFsIHNoIC1jICdcJycKLSsgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSsgICAgICAgIHRlc3QgLWQgIiQxLy4iOwotKyAgICAgIGVsc2UKLSsJY2FzZSAkMSBpbgotKyAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0rCWVzYWM7Ci0rCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0rCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSsgICAgJ1wnJyBzaAotKyAgJwotK2ZpCi0rYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLSsKLSsjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCi0rYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLSsKLSsjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KLSthc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgotKwotKwotKwotK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKLSsKLSsjIE5hbWUgb2YgdGhlIGhvc3QuCi0rIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSsjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KLSthY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSsKLSsjCi0rIyBJbml0aWFsaXphdGlvbnMuCi0rIwotIGFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLS0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgbWFrZSBydWxlcyAoZGVmYXVsdDogYXV0bykiCi0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLWNvbXBhdCAgICAgICAgIGluc3RhbGwgPGxpYmVsZi5oPiwgPG5saXN0Lmg+IGFuZCA8Z2VsZi5oPiAoZGVmYXVsdDogYXV0bykiCi0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLWVsZjY0ICAgICAgICAgIGNvbXBpbGUgaW4gNjQtYml0IHN1cHBvcnQgKGRlZmF1bHQ6IGF1dG8pIgotLWFjX2hlbHA9IiRhY19oZWxwCi0tICAtLWVuYWJsZS12ZXJzaW9uaW5nICAgICBjb21waWxlIGluIHZlcnNpb25pbmcgc3VwcG9ydCAoZGVmYXVsdDogYXV0bykiCi0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLW5scyAgICAgICAgICAgIHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCAoZGVmYXVsdDogeWVzKSIKLS1hY19oZWxwPSIkYWNfaGVscAotLSAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcnkgKGRlZmF1bHQ6IHllcykiCi0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLWdudS1uYW1lcyAgICAgIHVzZSBHTlUgbGlicmFyeSBuYW1pbmcgY29udmVudGlvbnMgKGRlZmF1bHQ6IG5vKSIKLS1hY19oZWxwPSIkYWNfaGVscAotLSAgLS1lbmFibGUtZXh0ZW5kZWQtZm9ybWF0ICAgIHN1cHBvcnQgZXh0ZW5kZWQgZmlsZSBmb3JtYXRzIChkZWZhdWx0OiBubykiCi0tYWNfaGVscD0iJGFjX2hlbHAKLS0gIC0tZW5hYmxlLXNhbml0eS1jaGVja3MgICAgICBlbmFibGUgc2FuaXR5IGNoZWNrcyBieSBkZWZhdWx0IChkZWZhdWx0OiB5ZXMpIgotLWFjX2hlbHA9IiRhY19oZWxwCi0tICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBpbmNsdWRlIGV4dHJhIGRlYnVnZ2luZyBjb2RlIChkZWZhdWx0OiBubykiCi0rYWNfY2xlYW5fZmlsZXM9Ci0rYWNfY29uZmlnX2xpYm9ial9kaXI9LgotK0xJQk9CSlM9Ci0rY3Jvc3NfY29tcGlsaW5nPW5vCi0rc3ViZGlycz0KLStNRkxBR1M9Ci0rTUFLRUZMQUdTPQotK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0rCi0rIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi0rUEFDS0FHRV9OQU1FPQotK1BBQ0tBR0VfVEFSTkFNRT0KLStQQUNLQUdFX1ZFUlNJT049Ci0rUEFDS0FHRV9TVFJJTkc9Ci0rUEFDS0FHRV9CVUdSRVBPUlQ9Ci0rCi0rYWNfdW5pcXVlX2ZpbGU9IlZFUlNJT04iCi0rIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKLSsjaW5jbHVkZSA8c3RkaW8uaD4KLSsjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0rI2VuZGlmCi0rI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSsjZW5kaWYKLSsjaWZkZWYgU1REQ19IRUFERVJTCi0rIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSsjIGluY2x1ZGUgPHN0ZGRlZi5oPgotKyNlbHNlCi0rIyBpZmRlZiBIQVZFX1NURExJQl9ICi0rIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0rIyBlbmRpZgotKyNlbmRpZgotKyNpZmRlZiBIQVZFX1NUUklOR19ICi0rIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0rIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Ci0rIyBlbmRpZgotKyMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0rI2VuZGlmCi0rI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0rIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0rI2VuZGlmCi0rI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSsjZW5kaWYKLSsjaWZkZWYgSEFWRV9TVERJTlRfSAotKyMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0rI2VuZGlmCi0rI2lmZGVmIEhBVkVfVU5JU1REX0gKLSsjIGluY2x1ZGUgPHVuaXN0ZC5oPgotKyNlbmRpZiIKLSsKLSthY19zdWJzdF92YXJzPSdTSEVMTAotK1BBVEhfU0VQQVJBVE9SCi0rUEFDS0FHRV9OQU1FCi0rUEFDS0FHRV9UQVJOQU1FCi0rUEFDS0FHRV9WRVJTSU9OCi0rUEFDS0FHRV9TVFJJTkcKLStQQUNLQUdFX0JVR1JFUE9SVAotK2V4ZWNfcHJlZml4Ci0rcHJlZml4Ci0rcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotK2JpbmRpcgotK3NiaW5kaXIKLStsaWJleGVjZGlyCi0rZGF0YXJvb3RkaXIKLStkYXRhZGlyCi0rc3lzY29uZmRpcgotK3NoYXJlZHN0YXRlZGlyCi0rbG9jYWxzdGF0ZWRpcgotK2luY2x1ZGVkaXIKLStvbGRpbmNsdWRlZGlyCi0rZG9jZGlyCi0raW5mb2RpcgotK2h0bWxkaXIKLStkdmlkaXIKLStwZGZkaXIKLStwc2RpcgotK2xpYmRpcgotK2xvY2FsZWRpcgotK21hbmRpcgotK0RFRlMKLStFQ0hPX0MKLStFQ0hPX04KLStFQ0hPX1QKLStMSUJTCi0rYnVpbGRfYWxpYXMKLStob3N0X2FsaWFzCi0rdGFyZ2V0X2FsaWFzCi0rUEFDS0FHRQotK1ZFUlNJT04KLStNQUlOVAotK01BSk9SCi0rU0VUX01BS0UKLStDQwotK0NGTEFHUwotK0xERkxBR1MKLStDUFBGTEFHUwotK2FjX2N0X0NDCi0rRVhFRVhUCi0rT0JKRVhUCi0rQ1BQCi0rSU5TVEFMTF9QUk9HUkFNCi0rSU5TVEFMTF9TQ1JJUFQKLStJTlNUQUxMX0RBVEEKLStSQU5MSUIKLStMTl9TCi0rR1JFUAotK0VHUkVQCi0rRE9fQ09NUEFUCi0rTElCT0JKUwotK0dNT0ZJTEVTCi0rTVNHRklMRVMKLStQT0ZJTEVTCi0rTVNHRk1UCi0rR01TR0ZNVAotK1hHRVRURVhUCi0rTVNHTUVSR0UKLStHRU5DQVQKLStDQVRPQkpFWFQKLStJTlNUT0JKRVhUCi0rQ0FUQUxPR1MKLStQT1NVQgotK0xJQklOVEwKLStidWlsZAotK2J1aWxkX2NwdQotK2J1aWxkX3ZlbmRvcgotK2J1aWxkX29zCi0raG9zdAotK2hvc3RfY3B1Ci0raG9zdF92ZW5kb3IKLStob3N0X29zCi0rTEQKLStQSUNGTEFHUwotK1NITElCX1NGWAotK1NITElOS19TRlgKLStTT05BTUVfU0ZYCi0rTElOS19TSExJQgotK0lOU1RBTExfU0hMSUIKLStERVBTSExJQlMKLStET19TSExJQgotK0xUTElCT0JKUycKLSthY19zdWJzdF9maWxlcz0nJwotKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCi0raG9zdF9hbGlhcwotK3RhcmdldF9hbGlhcwotK0NDCi0rQ0ZMQUdTCi0rTERGTEFHUwotK0xJQlMKLStDUFBGTEFHUwotK0NQUCcKLSsKLSAKLSAjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0rYWNfaW5pdF9oZWxwPQotK2FjX2luaXRfdmVyc2lvbj1mYWxzZQotICMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0gIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotLWJ1aWxkPU5PTkUKLS1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi0rY2FjaGVfZmlsZT0vZGV2L251bGwKLSBleGVjX3ByZWZpeD1OT05FCi0taG9zdD1OT05FCi0gbm9fY3JlYXRlPQotLW5vbm9wdD1OT05FCi0gbm9fcmVjdXJzaW9uPQotIHByZWZpeD1OT05FCi0gcHJvZ3JhbV9wcmVmaXg9Tk9ORQotQEAgLTUwLDk0ICs3MzEsMTE3IEBAIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi0gc2lsZW50PQotIHNpdGU9Ci0gc3JjZGlyPQotLXRhcmdldD1OT05FCi0gdmVyYm9zZT0KLSB4X2luY2x1ZGVzPU5PTkUKLSB4X2xpYnJhcmllcz1OT05FCi0rCi0rIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCi0rIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCi0rIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKLSsjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCi0rIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KLSsjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCi0gYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi0gc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLSBsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLStkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJwotK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9JwotIHN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi0gc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi0gbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLS1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLSBpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLSBvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi0taW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi0tbWFuZGlyPScke3ByZWZpeH0vbWFuJwotLQotLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLS1zdWJkaXJzPQotLU1GTEFHUz0gTUFLRUZMQUdTPQotLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0tIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotLWFjX21heF9oZXJlX2xpbmVzPTEyCi0rZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFfScKLStpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJwotK2h0bWxkaXI9JyR7ZG9jZGlyfScKLStkdmlkaXI9JyR7ZG9jZGlyfScKLStwZGZkaXI9JyR7ZG9jZGlyfScKLStwc2Rpcj0nJHtkb2NkaXJ9JwotK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJwotK21hbmRpcj0nJHtkYXRhcm9vdGRpcn0vbWFuJwotIAotIGFjX3ByZXY9Ci0rYWNfZGFzaGRhc2g9Ci0gZm9yIGFjX29wdGlvbgotIGRvCi0tCi0gICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSsgICAgZXZhbCAkYWNfcHJldj1cJGFjX29wdGlvbgotICAgICBhY19wcmV2PQotICAgICBjb250aW51ZQotICAgZmkKLSAKLS0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0tICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLS0gICopIGFjX29wdGFyZz0gOzsKLSsgIGNhc2UgJGFjX29wdGlvbiBpbgotKyAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OwotKyAgKikJYWNfb3B0YXJnPXllcyA7OwotICAgZXNhYwotIAotICAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLSAKLS0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0rICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSsgIC0tKQotKyAgICBhY19kYXNoZGFzaD15ZXMgOzsKLSAKLSAgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0rICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0rICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKLSAgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLSsgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OwotIAotICAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLSAKLS0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotKyAgLS1jb25maWctY2FjaGUgfCAtQykKLSsgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKLSsKLSsgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQotICAgICBhY19wcmV2PWRhdGFkaXIgOzsKLS0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotLSAgfCAtLWRhPSopCi0tICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0rICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQotKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKLSsKLSsgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAotKyAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCi0rICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSsgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKLSsgIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQotKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0tICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSsgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKLSAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLS0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0tICAgIGZpCi0tICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0tICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0rICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSsgICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9bm8gOzsKLSsKLSsgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCi0rICAgIGFjX3ByZXY9ZG9jZGlyIDs7Ci0rICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKLSsgICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKLSsKLSsgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCi0rICAgIGFjX3ByZXY9ZHZpZGlyIDs7Ci0rICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQotKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwotIAotICAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLS0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCi0gICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLS0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0tICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotLSAgICBmaQotLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotLSAgICAgICo9KikgOzsKLS0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0tICAgIGVzYWMKLS0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0rICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSsgICAgZXZhbCBlbmFibGVfJGFjX2ZlYXR1cmU9XCRhY19vcHRhcmcgOzsKLSAKLSAgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLUBAIC0xNDYsMTE2ICs4NTAsNzcgQEAgZG8KLSAgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLSsgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OwotIAotICAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgIHdpdGhfZ2FzPXllcyA7OwotIAotLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0tICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0tICAgIGNhdCA8PCBFT0YKLS1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLS1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotLUNvbmZpZ3VyYXRpb246Ci0tICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0tICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0tICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi0tRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLS0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLS0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLS0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0tICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0tICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLS0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLS0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLS0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0tICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0tICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLS0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0tICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0tICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0tRU9GCi0tICAgIGNhdCA8PCBFT0YKLS1Ib3N0IHR5cGU6Ci0tICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLS0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLS0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLS0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLS0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi0tRU9GCi0tICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotLSAgICBmaQotLSAgICBleGl0IDAgOzsKLSsgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCi0rICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0rICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCi0rICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKLSsgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSsgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7Ci0gCi0gICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLS0gICAgYWNfcHJldj1ob3N0IDs7Ci0rICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OwotICAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLS0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLSsgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7Ci0rCi0rICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSsgICAgYWNfcHJldj1odG1sZGlyIDs7Ci0rICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKLSsgIHwgLS1odD0qKQotKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKLSAKLSAgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLS0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLSsgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0tICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0rICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwotIAotICAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICAgYWNfcHJldj1saWJkaXIgOzsKLSAgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLS0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotKyAgICBsaWJkaXI9JGFjX29wdGFyZyA7OwotIAotICAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLSsKLSsgIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKLSsgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSsgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCi0rICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0tICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0tICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSsgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCi0gICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0tICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLS0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLS0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLSsgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLSAKLSAgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0tICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLSsgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKLSAKLSAgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgIHdpdGhfZnA9bm8gOzsKLSAKLSAgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0tICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0rICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICAgbm9fY3JlYXRlPXllcyA7OwotIAotICAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi1AQCAtMjY5LDI2ICs5MzQsMjYgQEAgRU9GCi0gICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0tICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0rICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotIAotICAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICAgYWNfcHJldj1wcmVmaXggOzsKLSAgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLS0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OwotIAotICAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLS0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0rICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKLSAKLSAgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0tICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi1AQCAtMzA1LDcgKzk3MCwxNyBAQCBFT0YKLSAgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0tICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0rICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotKwotKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKLSsgICAgYWNfcHJldj1wZGZkaXIgOzsKLSsgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCi0rICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7Ci0rCi0rICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQotKyAgICBhY19wcmV2PXBzZGlyIDs7Ci0rICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSsgICAgcHNkaXI9JGFjX29wdGFyZyA7OwotIAotICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotQEAgLTMxNSw3ICs5OTAsNyBAQCBFT0YKLSAgICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICAgfCAtLXNiaT0qIHwgLS1zYj0qKQotLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKLSAKLSAgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi1AQCAtMzI2LDU4ICsxMDAxLDUzIEBAIEVPRgotICAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICAgfCAtLXNoYT0qIHwgLS1zaD0qKQotLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLSsgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotIAotICAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICAgYWNfcHJldj1zaXRlIDs7Ci0gICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKLSAKLSAgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0rICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7Ci0gCi0gICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLSAKLSAgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0tICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0rICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0tICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLSsgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKLSAKLSAgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgIHZlcmJvc2U9eWVzIDs7Ci0gCi0tICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLS0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0tICAgIGV4aXQgMCA7OwotKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKLSsgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKLSAKLSAgIC13aXRoLSogfCAtLXdpdGgtKikKLS0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSsgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKLSAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLS0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0tICAgIGZpCi0tICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0tICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0tICAgICAgKj0qKSA7OwotLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLS0gICAgZXNhYwotLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0rICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSsgICAgZXZhbCB3aXRoXyRhY19wYWNrYWdlPVwkYWNfb3B0YXJnIDs7Ci0gCi0gICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0tICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSsgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKLSAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLS0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0tICAgIGZpCi0tICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0tICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLSsgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy9bLS5dL18vZydgCi0rICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1ubyA7OwotIAotICAgLS14KQotICAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi1AQCAtMzg4LDE1NyArMTA1OCw2NTIgQEAgRU9GCi0gICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLS0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLSsgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7Ci0gCi0gICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLSsgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotIAotLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0rICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCi0rVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgICA7OwotIAotKyAgKj0qKQotKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCi0rICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSsgICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0rICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7Ci0rCi0gICAqKQotLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLS0gICAgZmkKLS0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0tICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0tICAgIGZpCi0tICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSsgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgotKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgotKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSsgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKLSsgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQotICAgICA7OwotIAotICAgZXNhYwotIGRvbmUKLSAKLSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLS0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi0gCi0tdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLSsjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCi0rZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCi0rCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKLSsJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKLSsJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCi0rZG8KLSsgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotKyAgY2FzZSAkYWNfdmFsIGluCi0rICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7Ci0rICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKLSsgIGVzYWMKLSsgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rZG9uZQotIAotLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotLSMgMCBzdGFuZGFyZCBpbnB1dAotLSMgMSBmaWxlIGNyZWF0aW9uCi0tIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLS0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0tIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLS0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0tICBleGVjIDY+L2Rldi9udWxsCi0tZWxzZQotLSAgZXhlYyA2PiYxCi0rIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgotKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLStidWlsZD0kYnVpbGRfYWxpYXMKLStob3N0PSRob3N0X2FsaWFzCi0rdGFyZ2V0PSR0YXJnZXRfYWxpYXMKLSsKLSsjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi0raWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCi0rICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KLSsgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCi0rICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KLSsgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKLSsgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KLSsgICAgY3Jvc3NfY29tcGlsaW5nPXllcwotKyAgZmkKLSBmaQotLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLSAKLS1lY2hvICJcCi0tVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLS1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotLSIgMT4mNQotK2FjX3Rvb2xfcHJlZml4PQotK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KLSAKLS0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLS0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLS1hY19jb25maWd1cmVfYXJncz0KLS1mb3IgYWNfYXJnCi0tZG8KLS0gIGNhc2UgIiRhY19hcmciIGluCi0tICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0tICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLS0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0tICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLS0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLS0gIGVzYWMKLS1kb25lCi0rdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAotIAotLSMgTkxTIG51aXNhbmNlcy4KLS0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0tIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0tIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0tIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotIAotLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi0tcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0tIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi0tZWNobyA+IGNvbmZkZWZzLmgKLSthY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKLSthY19sc19kaT1gbHMgLWRpIC5gICYmCi0rYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8Ci0rICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IFdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSt0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKLSsgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IiA+JjIKLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAKLS0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0tIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLS1hY191bmlxdWVfZmlsZT1WRVJTSU9OCi0gCi0gIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotIGlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0tICBhY19wcm9nPSQwCi0tICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLS0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSsgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLSsgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKLSskYXNfZXhwciBYIiQwIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKLSsJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0rCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLStlY2hvIFgiJDAiIHwKLSsgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcKFwvXC9cKVteL10uKi97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgL15YXChcL1wvXCkkL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcKFwvXCkuKi97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgcy8uKi8uLzsgcSdgCi0gICBzcmNkaXI9JGFjX2NvbmZkaXIKLS0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KLSAgICAgc3JjZGlyPS4uCi0gICBmaQotIGVsc2UKLSAgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLSBmaQotLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0tICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotLSAgZWxzZQotLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotLSAgZmkKLStpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCi0rICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIgPiYyCi0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLS1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLSthY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCi0rYWNfYWJzX2NvbmZkaXI9YCgKLSsJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKwlwd2QpYAotKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCi0raWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgotKyAgc3JjZGlyPS4KLStmaQotKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCi0rIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCi0rIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCi0rY2FzZSAkc3JjZGlyIGluCi0rKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Ci0rZXNhYwotK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCi0rICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0rICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KLSsgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KLSsgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotK2RvbmUKLSsKLSsjCi0rIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgotKyMKLStpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgotKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0rICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0rICBjYXQgPDxfQUNFT0YKLStcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgotKwotK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotKwotK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKLStWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotKwotK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgotKwotK0NvbmZpZ3VyYXRpb246Ci0rICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCi0rICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSsgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQotKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKLSsgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0rICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KLSsKLStJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0rICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSsJCQkgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0rICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotKwkJCSAgW1BSRUZJWF0KLSsKLStCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLStcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQotK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCi0rZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLSsKLStGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KLSsKLStGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgotKyAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KLSsgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0rICAtLWxpYmV4ZWNkaXI9RElSICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KLSsgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCi0rICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0rICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KLSsgIC0tbGliZGlyPURJUiAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KLSsgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQotKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCi0rICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0rICAtLWluZm9kaXI9RElSICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KLSsgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCi0rICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0rICAtLWRvY2Rpcj1ESVIgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCi0rICAtLWh0bWxkaXI9RElSICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotKyAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotKyAgLS1wZGZkaXI9RElSICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0rX0FDRU9GCi0rCi0rICBjYXQgPDxcX0FDRU9GCi0rCi0rU3lzdGVtIHR5cGVzOgotKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KLSsgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotK19BQ0VPRgotK2ZpCi0rCi0raWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KLSsKLSsgIGNhdCA8PFxfQUNFT0YKLSsKLStPcHRpb25hbCBGZWF0dXJlczoKLSsgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSsgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgbWFrZSBydWxlcyAoZGVmYXVsdDogYXV0bykKLSsgIC0tZW5hYmxlLWNvbXBhdCAgICAgICAgIGluc3RhbGwgPGxpYmVsZi5oPiwgPG5saXN0Lmg+IGFuZCA8Z2VsZi5oPiAoZGVmYXVsdDogYXV0bykKLSsgIC0tZW5hYmxlLWVsZjY0ICAgICAgICAgIGNvbXBpbGUgaW4gNjQtYml0IHN1cHBvcnQgKGRlZmF1bHQ6IGF1dG8pCi0rICAtLWVuYWJsZS12ZXJzaW9uaW5nICAgICBjb21waWxlIGluIHZlcnNpb25pbmcgc3VwcG9ydCAoZGVmYXVsdDogYXV0bykKLSsgIC0tZW5hYmxlLW5scyAgICAgICAgICAgIHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCAoZGVmYXVsdDogeWVzKQotKyAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcnkgKGRlZmF1bHQ6IHllcykKLSsgIC0tZW5hYmxlLWdudS1uYW1lcyAgICAgIHVzZSBHTlUgbGlicmFyeSBuYW1pbmcgY29udmVudGlvbnMgKGRlZmF1bHQ6IG5vKQotKyAgLS1lbmFibGUtZXh0ZW5kZWQtZm9ybWF0ICAgIHN1cHBvcnQgZXh0ZW5kZWQgZmlsZSBmb3JtYXRzIChkZWZhdWx0OiBubykKLSsgIC0tZW5hYmxlLXNhbml0eS1jaGVja3MgICAgICBlbmFibGUgc2FuaXR5IGNoZWNrcyBieSBkZWZhdWx0IChkZWZhdWx0OiB5ZXMpCi0rICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBpbmNsdWRlIGV4dHJhIGRlYnVnZ2luZyBjb2RlIChkZWZhdWx0OiBubykKLSsKLStTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSsgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAotKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwotKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCi0rICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Ci0rICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+Ci0rICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0rICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KLSsgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCi0rCi0rVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKLStpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCi0rCi0rX0FDRU9GCi0rYWNfc3RhdHVzPSQ/Ci0rZmkKLSsKLStpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCi0rICAjIElmIHRoZXJlIGFyZSBzdWJkaXJzLCByZXBvcnQgdGhlaXIgc3BlY2lmaWMgLS1oZWxwLgotKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKLSsgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwgY29udGludWUKLSsgICAgYWNfYnVpbGRkaXI9LgotKwotK2Nhc2UgIiRhY19kaXIiIGluCi0rLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0rKikKLSsgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSsgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSsgIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0rICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCi0rICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Ci0rICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSsgIGVzYWMgOzsKLStlc2FjCi0rYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi0rYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAotKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0rYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0rCi0rY2FzZSAkc3JjZGlyIGluCi0rICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0rICAgIGFjX3NyY2Rpcj0uCi0rICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKLSsgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgotKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OwotKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSsgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OwotKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgotKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSsgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKLSsgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Ci0rZXNhYwotK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSsKLSsgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQotKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KLSsgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgotKyAgICAgIGVjaG8gJiYKLSsgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQotKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgotKyAgICAgIGVjaG8gJiYKLSsgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCi0rICAgIGVsc2UKLSsgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCi0rICAgIGZpIHx8IGFjX3N0YXR1cz0kPwotKyAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Ci0rICBkb25lCi0rZmkKLSsKLSt0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKLStpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCi0rICBjYXQgPDxcX0FDRU9GCi0rY29uZmlndXJlCi0rZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxCi0rCi0rQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0rVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLStnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0rX0FDRU9GCi0rICBleGl0Ci0rZmkKLStjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLStUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0rCi0rSXQgd2FzIGNyZWF0ZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKLStnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLSsKLSsgICQgJDAgJEAKLSsKLStfQUNFT0YKLStleGVjIDU+PmNvbmZpZy5sb2cKLSt7Ci0rY2F0IDw8X0FTVU5BTUUKLSsjIyAtLS0tLS0tLS0gIyMKLSsjIyBQbGF0Zm9ybS4gIyMKLSsjIyAtLS0tLS0tLS0gIyMKLSsKLStob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAotK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotKwotKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotKwotKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLSsvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0rL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKLSsvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0rL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAotKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKLSsKLStfQVNVTkFNRQotKwotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBlY2hvICJQQVRIOiAkYXNfZGlyIgotK2RvbmUKLStJRlM9JGFzX3NhdmVfSUZTCi0rCi0rfSA+JjUKLSsKLStjYXQgPiY1IDw8X0FDRU9GCi0rCi0rCi0rIyMgLS0tLS0tLS0tLS0gIyMKLSsjIyBDb3JlIHRlc3RzLiAjIwotKyMjIC0tLS0tLS0tLS0tICMjCi0rCi0rX0FDRU9GCi0rCi0rCi0rIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSsjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSsjIFN0cmlwIG91dCAtLXNpbGVudCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIGl0IGZvciBmdXR1cmUgcnVucy4KLSsjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0rIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCi0rYWNfY29uZmlndXJlX2FyZ3M9Ci0rYWNfY29uZmlndXJlX2FyZ3MwPQotK2FjX2NvbmZpZ3VyZV9hcmdzMT0KLSthY19tdXN0X2tlZXBfbmV4dD1mYWxzZQotK2ZvciBhY19wYXNzIGluIDEgMgotK2RvCi0rICBmb3IgYWNfYXJnCi0rICBkbwotKyAgICBjYXNlICRhY19hcmcgaW4KLSsgICAgLW5vLWNyZWF0ZSB8IC0tbm8tYyogfCAtbiB8IC1uby1yZWN1cnNpb24gfCAtLW5vLXIqKSBjb250aW51ZSA7OwotKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSsgICAgICBjb250aW51ZSA7OwotKyAgICAqXCcqKQotKyAgICAgIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKLSsgICAgZXNhYwotKyAgICBjYXNlICRhY19wYXNzIGluCi0rICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7Ci0rICAgIDIpCi0rICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSsgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KLSsJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgotKyAgICAgIGVsc2UKLSsJY2FzZSAkYWNfYXJnIGluCi0rCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCi0rCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKLSsJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKLSsJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OwotKwkgICAgZXNhYwotKwkgICAgOzsKLSsJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKLSsJZXNhYwotKyAgICAgIGZpCi0rICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCi0rICAgICAgOzsKLSsgICAgZXNhYwotKyAgZG9uZQotK2RvbmUKLSskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KLSsKLSsjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0rIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKLSsjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KLSsjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSsjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCi0rdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSsgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotKyAgewotKyAgICBlY2hvCi0rCi0rICAgIGNhdCA8PFxfQVNCT1gKLSsjIyAtLS0tLS0tLS0tLS0tLS0tICMjCi0rIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKLStfQVNCT1gKLSsgICAgZWNobwotKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotKygKLSsgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSsgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0rICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotKyAgICAqJHthc19ubH0qKQotKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotKyAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSsgICAgICBlc2FjCi0rICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0rICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotKyAgICAgICopICRhc191bnNldCAkYWNfdmFyIDs7Ci0rICAgICAgZXNhYyA7OwotKyAgICBlc2FjCi0rICBkb25lCi0rICAoc2V0KSAyPiYxIHwKLSsgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0rICAgICAgc2VkIC1uIFwKLSsJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0rCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgotKyAgICAgIDs7ICMoCi0rICAgICopCi0rICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSsgICAgICA7OwotKyAgICBlc2FjIHwKLSsgICAgc29ydAotKykKLSsgICAgZWNobwotKwotKyAgICBjYXQgPDxcX0FTQk9YCi0rIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSsjIyBPdXRwdXQgdmFyaWFibGVzLiAjIwotKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCi0rX0FTQk9YCi0rICAgIGVjaG8KLSsgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycwotKyAgICBkbwotKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotKyAgICAgIGNhc2UgJGFjX3ZhbCBpbgotKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotKyAgICAgIGVzYWMKLSsgICAgICBlY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSsgICAgZG9uZSB8IHNvcnQKLSsgICAgZWNobwotIAotKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0rICAgICAgY2F0IDw8XF9BU0JPWAotKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSsjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0rIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotK19BU0JPWAotKyAgICAgIGVjaG8KLSsgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcwotKyAgICAgIGRvCi0rCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotKwljYXNlICRhY192YWwgaW4KLSsJKlwnXCcnKikgYWNfdmFsPWBlY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Ci0rCWVzYWMKLSsJZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0rICAgICAgZG9uZSB8IHNvcnQKLSsgICAgICBlY2hvCi0rICAgIGZpCi0rCi0rICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotKyAgICAgIGNhdCA8PFxfQVNCT1gKLSsjIyAtLS0tLS0tLS0tLSAjIwotKyMjIGNvbmZkZWZzLmguICMjCi0rIyMgLS0tLS0tLS0tLS0gIyMKLStfQVNCT1gKLSsgICAgICBlY2hvCi0rICAgICAgY2F0IGNvbmZkZWZzLmgKLSsgICAgICBlY2hvCi0rICAgIGZpCi0rICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKLSsgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKLSsgICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSsgIH0gPiY1Ci0rICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKLSsgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotKyAgICBleGl0ICRleGl0X3N0YXR1cwotKycgMAotK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAkYWNfc2lnbmFsCi0rZG9uZQotK2FjX3NpZ25hbD0wCi0rCi0rIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLStybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotKwotKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSsjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKLStfQUNFT0YKLSsKLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCi0rX0FDRU9GCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotK19BQ0VPRgotKwotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSsjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCi0rX0FDRU9GCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKLStfQUNFT0YKLSsKLSsKLSsjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KLSAjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLS0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLS0gIGVsc2UKLS0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotLSAgZmkKLStpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCi0rICBzZXQgeCAiJENPTkZJR19TSVRFIgotK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0rICBzZXQgeCAiJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgIiRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotK2Vsc2UKLSsgIHNldCB4ICIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiIFwKLSsJIiRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gZmkKLS1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLStzaGlmdAotK2ZvciBhY19zaXRlX2ZpbGUKLStkbwotICAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLS0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQotK2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQotKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgIGZpCi0gZG9uZQotIAotIGlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLS0gIC4gJGNhY2hlX2ZpbGUKLSsgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCi0rICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KLSsgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLStlY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0rICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSsgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7Ci0rICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OwotKyAgICBlc2FjCi0rICBmaQotIGVsc2UKLS0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotLSAgPiAkY2FjaGVfZmlsZQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0rICA+JGNhY2hlX2ZpbGUKLSBmaQotIAotLWFjX2V4dD1jCi0tIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi0tYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLS1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLS0KLS1hY19leGVleHQ9Ci0tYWNfb2JqZXh0PW8KLS1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0tICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotLSAgICBhY19uPSBhY19jPScKLS0nIGFjX3Q9JwknCi0tICBlbHNlCi0tICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSsjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCi0rIyB2YWx1ZS4KLSthY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKLStmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSsgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0Ci0rICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCi0rICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0rICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCi0rICAgIHNldCwpCi0rICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSsgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotKyAgICAsc2V0KQotKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KLSsgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotKyAgICAsKTs7Ci0rICAgICopCi0rICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KLSsJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci0rZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQotKwl7IGVjaG8gIiRhc19tZTokTElORU5POiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjUKLStlY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0rCWFjX2NhY2hlX2NvcnJ1cHRlZD06Ci0rICAgICAgZmk7OwotKyAgZXNhYwotKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgotKyAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCi0rICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSsgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwotKyAgICBlc2FjCi0rICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgotKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgotKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotKyAgICBlc2FjCi0gICBmaQotLWVsc2UKLS0gIGFjX249IGFjX2M9J1xjJyBhY190PQotK2RvbmUKLStpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi0gCi0gCi1AQCAtNTQ2LDE0ICsxNzExLDM2IEBAIGZpCi0gCi0gCi0gCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rYWNfZXh0PWMKLSthY19jcHA9JyRDUFAgJENQUEZMQUdTJwotK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLSthY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLSsKLSsKLSthY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGNvbmZpZy5oIGxpYi9zeXNfZWxmLmgiCi0rCi0rCi0rCi0rCi0gICAgIFBBQ0tBR0U9bGliZWxmCi0gICBWRVJTSU9OPWBjYXQgJHNyY2Rpci9WRVJTSU9OYAotLSAgCi0tICAKLS0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi0rCi0rCi0rICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLS0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0tICBtcl9lbmFibGVfbWFpbnRhaW5lcl9tb2RlPSIkZW5hYmxldmFsIgotKyAgZW5hYmxldmFsPSRlbmFibGVfbWFpbnRhaW5lcl9tb2RlOyBtcl9lbmFibGVfbWFpbnRhaW5lcl9tb2RlPSIkZW5hYmxldmFsIgotIGVsc2UKLSAgIGNhc2UgOiR7SV9BTV9USEVfTUFJTlRBSU5FUl9PRn06IGluCi0gICAgICAgKjpsaWJlbGY6KikgbXJfZW5hYmxlX21haW50YWluZXJfbW9kZT15ZXM7OwotQEAgLTU2Niw3ICsxNzUzLDcgQEAgZmkKLSAgIGVsc2UKLSAgICAgTUFJTlQ9J21haW50YWluZXItb25seS0nCi0gICBmaQotLSAgCi0rCi0gCi0gCi0gQUxMX0xJTkdVQVM9YGNkICRzcmNkaXIvcG8gJiYgZWNobyAqLnBvIHwgc2VkICdzL1wucG8vL2cnYAotQEAgLTU3NywyNDEgKzE3NjQsODIxIEBAIE1JTk9SPSR7Mi0wfQotIFBBVENIPSR7My0wfQotIAotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo1ODI6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNjsgfQotK3NldCB4ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKLStpZiB7IGFzX3Zhcj1hY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgotK1NIRUxMID0gL2Jpbi9zaAotIGFsbDoKLS0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLS1FT0YKLSsJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLStfQUNFT0YKLSAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLS1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLS1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0tICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLS1lbHNlCi0tICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotLWZpCi0tcm0gLWYgY29uZnRlc3RtYWtlCi0rY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCi0rICAqQEBAJSUlPT8qPUBAQCUlJSopCi0rICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0rICAqKQotKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Ci0rZXNhYwotK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKLSBmaQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0raWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSAgIFNFVF9NQUtFPQotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotIGZpCi0gCi0tIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotK2FjX2V4dD1jCi0rYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLSthY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0rYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLSthY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0raWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0rc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLStlbHNlCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotK2ZpCi0rZmkKLStDQz0kYWNfY3ZfcHJvZ19DQwotK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLStlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotK2Vsc2UKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLStmaQotKwotKwotK2ZpCi0raWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0rICBhY19jdF9DQz0kQ0MKLSsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLStlbHNlCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLStmaQotK2ZpCi0rYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLStpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLStlbHNlCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLStlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0rZmkKLSsKLSsgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotKyAgICBDQz0iIgotKyAgZWxzZQotKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi0reWVzOikKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLSt3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi0rY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi0rd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotK2FjX3Rvb2xfd2FybmVkPXllcyA7OwotK2VzYWMKLSsgICAgQ0M9JGFjX2N0X0NDCi0rICBmaQotK2Vsc2UKLSsgIENDPSIkYWNfY3ZfcHJvZ19DQyIKLStmaQotKwotK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSsgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSBlbHNlCi0tICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotLSAgYWNfZHVtbXk9IiRQQVRIIgotLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLS0gICAgICBicmVhawotLSAgICBmaQotLSAgZG9uZQotLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotK2RvbmUKLStJRlM9JGFzX3NhdmVfSUZTCi0rCi0gZmkKLSBmaQotLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLStDQz0kYWNfY3ZfcHJvZ19DQwotIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLStlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotIGZpCi0gCi0rCi0rICBmaQotK2ZpCi0gaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NjQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSBlbHNlCi0tICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICAgYWNfcHJvZ19yZWplY3RlZD1ubwotLSAgYWNfZHVtbXk9IiRQQVRIIgotLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLS0JY29udGludWUKLS0gICAgICBmaQotLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotLSAgICAgIGJyZWFrCi0tICAgIGZpCi0tICBkb25lCi0tICBJRlM9IiRhY19zYXZlX2lmcyIKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotKyAgICAgICBjb250aW51ZQotKyAgICAgZmkKLSsgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSBpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgIHNoaWZ0Ci0tICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0rICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgIHNoaWZ0Ci0tICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotLSAgICBzaGlmdAotLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSsgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCi0gICBmaQotIGZpCi0gZmkKLSBmaQotLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLStDQz0kYWNfY3ZfcHJvZ19DQwotIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLStlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotIGZpCi0gCi0tICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0tICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0tICAgICp3aW4zMiogfCAqV0lOMzIqKQotLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjY5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKwotK2ZpCi0raWYgdGVzdCAteiAiJENDIjsgdGhlbgotKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0rICBkbwotKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLStzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotIGVsc2UKLS0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0tICBhY19kdW1teT0iJFBBVEgiCi0tICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLS0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLS0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0tICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0tICAgICAgYnJlYWsKLS0gICAgZmkKLS0gIGRvbmUKLS0gIElGUz0iJGFjX3NhdmVfaWZzIgotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSBmaQotIGZpCi0tQ0M9IiRhY19jdl9wcm9nX0NDIgotK0NDPSRhY19jdl9wcm9nX0NDCi0gaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci0gZWxzZQotLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLStlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gZmkKLS0gOzsKLS0gICAgZXNhYwotKwotKwotKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0rICBkb25lCi0rZmkKLStpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0rICBhY19jdF9DQz0kQ0MKLSsgIGZvciBhY19wcm9nIGluIGNsLmV4ZQotK2RvCi0rICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLStzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0rICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotK2Vsc2UKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSAgIGZpCi0tICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotK2ZpCi0rZmkKLSthY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQotK2Vsc2UKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSBmaQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjcyNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLSAKLS1hY19leHQ9YwotLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLS1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLS1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi0tY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0rICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCi0rZG9uZQotIAotLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0rICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSsgICAgQ0M9IiIKLSsgIGVsc2UKLSsgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgotK3llczopCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi0rd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLStjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLSthY190b29sX3dhcm5lZD15ZXMgOzsKLStlc2FjCi0rICAgIENDPSRhY19jdF9DQwotKyAgZmkKLStmaQotIAotLSNsaW5lIDczNSAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotK2ZpCi0gCi0tbWFpbigpe3JldHVybigwKTt9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLS0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLS0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0rCi0rdGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsKLSsjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi0rZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKLSt7IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9Ci0reyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLSt7IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZXIgLVYgPiY1IikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfQotKwotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rCi0raW50Ci0rbWFpbiAoKQotK3sKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLSthY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwotK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0rIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSsjIG9mIGV4ZWV4dC4KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICRFQ0hPX0MiID4mNjsgfQotK2FjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKLSsjCi0rIyBMaXN0IG9mIHBvc3NpYmxlIG91dHB1dCBmaWxlcywgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuCi0rIyBUaGUgYWxnb3JpdGhtIGlzIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKQotKyMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KLSthY19maWxlcz0nYV9vdXQuZXhlIGEuZXhlIGNvbmZ0ZXN0LmV4ZSBhLm91dCBjb25mdGVzdCBhLiogY29uZnRlc3QuKiBiLm91dCcKLSsjCi0rIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCi0rIyBleGVjdXRhYmxlLCByZXRhaW5pbmcgdGhlaXIgcGVybWlzc2lvbnMuICBSZW1vdmUgdGhlbSBmaXJzdCBzbyBhCi0rIyBzdWJzZXF1ZW50IGV4ZWN1dGlvbiB0ZXN0IHdvcmtzLgotK2FjX3JtZmlsZXM9Ci0rZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCi0rZG8KLSsgIGNhc2UgJGFjX2ZpbGUgaW4KLSsgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKLSsgIGVzYWMKLStkb25lCi0rcm0gLWYgJGFjX3JtZmlsZXMKLSsKLStpZiB7IChhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCi0rIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSsjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAotKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCi0rIyBBdXRvY29uZi4KLStmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKLStkbwotKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0rICBjYXNlICRhY19maWxlIGluCi0rICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkKLSsJOzsKLSsgICAgW2FiXS5vdXQgKQotKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotKwkjIGNlcnRhaW5seSByaWdodC4KLSsJYnJlYWs7OwotKyAgICAqLiogKQotKyAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0rCXRoZW4gOjsgZWxzZQotKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLSsJZmkKLSsJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Ci0rCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLSsJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCi0rCSMgYWN0dWFsbHkgd29ya2luZy4KLSsJYnJlYWs7OwotKyAgICAqICkKLSsJYnJlYWs7OwotKyAgZXNhYwotK2RvbmUKLSt0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLSsKLStlbHNlCi0rICBhY19maWxlPScnCi0rZmkKLSsKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9Ci0raWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSt7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0rICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLStmaQotKwotK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0rCi0rIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSsjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQotKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSsjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgotK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICAgIGNyb3NzX2NvbXBpbGluZz1ubwotICAgZWxzZQotLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0rCWNyb3NzX2NvbXBpbGluZz15ZXMKLSsgICAgZWxzZQotKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi0rSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLStJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsgICAgZmkKLSAgIGZpCi0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLSsKLStybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKLSthY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0rIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLStlY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLSsKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0rIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0rIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSsjIGBybScuCi0rZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0rICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSsgIGNhc2UgJGFjX2ZpbGUgaW4KLSsgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OwotKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLSsJICBicmVhazs7Ci0rICAgICogKSBicmVhazs7Ci0rICBlc2FjCi0rZG9uZQotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotLWFjX2V4dD1jCi0tIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi0tYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLS1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLSAKLS1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLS1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLS0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0rcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLSsKLStybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0rRVhFRVhUPSRhY19jdl9leGVleHQKLSthY19leGVleHQ9JEVYRUVYVAotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rCi0raW50Ci0rbWFpbiAoKQotK3sKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSsgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0rICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Ci0rICBjYXNlICRhY19maWxlIGluCi0rICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7Ci0rICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAotKyAgICAgICBicmVhazs7Ci0rICBlc2FjCi0rZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLS1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjc2NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6NzcxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9vYmpleHQiID4mNjsgfQotK09CSkVYVD0kYWNfY3Zfb2JqZXh0Ci0rYWNfb2JqZXh0PSRPQkpFWFQKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotLSNpZmRlZiBfX0dOVUNfXwotLSAgeWVzOwotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSsKLStpbnQKLSttYWluICgpCi0rewotKyNpZm5kZWYgX19HTlVDX18KLSsgICAgICAgY2hva2UgbWUKLSAjZW5kaWYKLS1FT0YKLS1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzgwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLS0gIGFjX2N2X3Byb2dfZ2NjPXllcwotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jb21waWxlcl9nbnU9eWVzCi0gZWxzZQotLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19jb21waWxlcl9nbnU9bm8KLSBmaQotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLSsKLSBmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQotK0dDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAotK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLSthY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0rICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0rICAgQ0ZMQUdTPSItZyIKLSsgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotIAotLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLStpbnQKLSttYWluICgpCi0rewotIAotLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0tICBHQ0M9eWVzCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2N2X3Byb2dfY2NfZz15ZXMKLSBlbHNlCi0tICBHQ0M9Ci0tZmkKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotIAotLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotLUNGTEFHUz0KLS1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo3OTk6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKwlDRkxBR1M9IiIKLSsgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKwotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIDoKLSBlbHNlCi0tICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLS1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLSsJIENGTEFHUz0iLWciCi0rCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKwotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGFjX2N2X3Byb2dfY2NfZz15ZXMKLSBlbHNlCi0tICBhY19jdl9wcm9nX2NjX2c9bm8KLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0gCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLS0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgICBDRkxBR1M9Ii1nIC1PMiIKLUBAIC04MjUsMTA1ICsyNTkyLDM4NyBAQCBlbHNlCi0gICAgIENGTEFHUz0KLSAgIGZpCi0gZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCi0rYWNfc2F2ZV9DQz0kQ0MKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyNpbmNsdWRlIDxzdGRhcmcuaD4KLSsjaW5jbHVkZSA8c3RkaW8uaD4KLSsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0rI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0rLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLwotK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKLStGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotK3N0YXRpYyBjaGFyICplIChwLCBpKQotKyAgICAgY2hhciAqKnA7Ci0rICAgICBpbnQgaTsKLSt7Ci0rICByZXR1cm4gcFtpXTsKLSt9Ci0rc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQotK3sKLSsgIGNoYXIgKnM7Ci0rICB2YV9saXN0IHY7Ci0rICB2YV9zdGFydCAodixwKTsKLSsgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7Ci0rICB2YV9lbmQgKHYpOwotKyAgcmV0dXJuIHM7Ci0rfQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6ODMxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0rLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKLSsgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCi0rICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0rICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KLSsgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSsgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi0raW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKLSsKLSsvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSsgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCi0rI2RlZmluZSBGT08oeCkgJ3gnCi0raW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0rCi0raW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci0rc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci0rc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci0raW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci0raW50IGFyZ2M7Ci0rY2hhciAqKmFyZ3Y7Ci0raW50Ci0rbWFpbiAoKQotK3sKLStyZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotKwktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotK2RvCi0rICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKLSsgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0rICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawotK2RvbmUKLStybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0rQ0M9JGFjX3NhdmVfQ0MKLSsKLStmaQotKyMgQUNfQ0FDSEVfVkFMCi0rY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KLSsgIHgpCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotK2VjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKLSsgIHhubykKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OwotKyAgKikKLSsgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwotK2VzYWMKLSsKLSsKLSthY19leHQ9YwotK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi0rYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi0rYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotKwotK2FjX2V4dD1jCi0rYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLSthY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi0rYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLSthY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLSBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICAgQ1BQPQotIGZpCi0gaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLS0gIENQUD0iJHtDQy1jY30gLUUiCi0rICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0rICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCi0rICAgIGRvCi0rICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQotK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotK2RvCi0rICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0rICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSsgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4NDYgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0tU3ludGF4IEVycm9yCi0tRU9GCi0tYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjg1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLS1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0taWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLS0gIDoKLS1lbHNlCi0tICBlY2hvICIkYWNfZXJyIiA+JjUKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSA4NjMgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0tU3ludGF4IEVycm9yCi0tRU9GCi0tYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjg2OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLS1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0taWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSsgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSsjaWZkZWYgX19TVERDX18KLSsjIGluY2x1ZGUgPGxpbWl0cy5oPgotKyNlbHNlCi0rIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSsjZW5kaWYKLSsJCSAgICAgU3ludGF4IGVycm9yCi0rX0FDRU9GCi0raWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9OyB0aGVuCi0gICA6Ci0gZWxzZQotLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgODgwICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0tI2luY2x1ZGUgPGFzc2VydC5oPgotLVN5bnRheCBFcnJvcgotLUVPRgotLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0tYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0tICA6Ci0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLStjb250aW51ZQotK2ZpCi0rCi0rcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLSsKLSsgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0rICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSsjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLStfQUNFT0YKLStpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH07IHRoZW4KLSsgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi0rY29udGludWUKLSBlbHNlCi0tICBlY2hvICIkYWNfZXJyIiA+JjUKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIENQUD0vbGliL2NwcAotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rICAjIFBhc3NlcyBib3RoIHRlc3RzLgotK2FjX3ByZXByb2Nfb2s9OgotK2JyZWFrCi0gZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsKLStybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotKwotK2RvbmUKLSsjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLStybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCi0rICBicmVhawotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0rCi0rICAgIGRvbmUKLSsgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotKwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0tICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLSsgIENQUD0kYWNfY3ZfcHJvZ19DUFAKLStlbHNlCi0rICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0gZmkKLS0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JENQUCIgPiY2OyB9Ci0rYWNfcHJlcHJvY19vaz1mYWxzZQotK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotK2RvCi0rICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0rICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSsgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0rICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyNpZmRlZiBfX1NURENfXwotKyMgaW5jbHVkZSA8bGltaXRzLmg+Ci0rI2Vsc2UKLSsjIGluY2x1ZGUgPGFzc2VydC5oPgotKyNlbmRpZgotKwkJICAgICBTeW50YXggZXJyb3IKLStfQUNFT0YKLStpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH07IHRoZW4KLSsgIDoKLSBlbHNlCi0tICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotK2NvbnRpbnVlCi0gZmkKLS1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotKwotK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0rCi0rICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwotKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci0rX0FDRU9GCi0raWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9OyB0aGVuCi0rICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotK2NvbnRpbnVlCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rICAjIFBhc3NlcyBib3RoIHRlc3RzLgotK2FjX3ByZXByb2Nfb2s9OgotK2JyZWFrCi0rZmkKLSsKLStybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotKwotK2RvbmUKLSsjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLStybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCi0rICA6Ci0rZWxzZQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotK2ZpCi0rCi0rYWNfZXh0PWMKLSthY19jcHA9JyRDUFAgJENQUEZMQUdTJwotK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLSthY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLSAKLSBhY19hdXhfZGlyPQotLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0tICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCi0rICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCi0gICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgICBicmVhawotLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCi0gICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgICBicmVhawotKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KLSsgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0rICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgotKyAgICBicmVhawotICAgZmkKLSBkb25lCi0gaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0tICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLS1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi0tYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0tYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0rCi0rIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0rIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgotKyMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQotKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLSthY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0rYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCi0rYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotKwotIAotICMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotICMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotQEAgLTkzMiwxNTYgKzI5ODEsNDE4IEBAIGFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGkKLSAjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSAjIElSSVggL3NiaW4vaW5zdGFsbAotICMgQUlYIC9iaW4vaW5zdGFsbAotKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotICMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0gIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0gIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotICMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5NDE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjY7IH0KLSBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLS0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0tICAgIGNhc2UgIiRhY19kaXIvIiBpbgotLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLS0gICAgKikKLS0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotLSAgICAgICMgYnkgZGVmYXVsdC4KLS0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0tICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLSsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLStjYXNlICRhc19kaXIvIGluCi0rICAuLyB8IC4vLyB8IC9jQy8qIHwgXAotKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCi0rICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKLSsgIC91c3IvdWNiLyogKSA7OwotKyAgKikKLSsgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSsgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0rICAgICMgYnkgZGVmYXVsdC4KLSsgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKwlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLS0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgotIAkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotIAkgICAgOgotKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSsJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotKwkgICAgOgotIAkgIGVsc2UKLS0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLS0JICAgIGJyZWFrIDIKLSsJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKLSsJICAgIGJyZWFrIDMKLSAJICBmaQotIAlmaQotICAgICAgIGRvbmUKLS0gICAgICA7OwotLSAgICBlc2FjCi0tICBkb25lCi0tICBJRlM9IiRhY19zYXZlX0lGUyIKLSsgICAgZG9uZQotKyAgICA7OwotK2VzYWMKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotIAotIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKLSAgIGVsc2UKLS0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSsgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQotKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0tICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0tICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0rICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKLSAgIGZpCi0gZmkKLS1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLStlY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2OyB9Ci0gCi0gIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotICMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi0gdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotIAotLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLSt0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotIAotIHRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0gCi0tIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLS1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTo5OTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0raWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0rc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gZWxzZQotLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLS0gIGFjX2R1bW15PSIkUEFUSCIKLS0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLS0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotLSAgICAgIGJyZWFrCi0rYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLStmaQotK2ZpCi0rUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgotK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNjsgfQotK2Vsc2UKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLStmaQotKwotKwotK2ZpCi0raWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKLSsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLStzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0rICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0rZWxzZQotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSsgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotK2ZpCi0rZmkKLSthY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCi0raWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2OyB9Ci0rZWxzZQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotK2ZpCi0rCi0rICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCi0rICAgIFJBTkxJQj0iOiIKLSsgIGVsc2UKLSsgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgotK3llczopCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi0rd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLStjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KLSthY190b29sX3dhcm5lZD15ZXMgOzsKLStlc2FjCi0rICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCi0rICBmaQotK2Vsc2UKLSsgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotK2ZpCi0rCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQotK0xOX1M9JGFzX2xuX3MKLStpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLStlbHNlCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KLStmaQotKwotKwotKwotKwotKwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJncmVwIGdncmVwIiB0byB1c2UgaW4gbXNnIG91dHB1dAotK2lmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotK3NldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKLStpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSsjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAotK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0rICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKLSsgICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKLStjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0rKkdOVSopCi0rICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKLSsqKQotKyAgYWNfY291bnQ9MAotKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKLSsgIHdoaWxlIDoKLSsgIGRvCi0rICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0rICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSsgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0rICAgIGVjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKLSsgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSsgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotKyAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCi0rICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0rICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgotKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgIGZpCi0rICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSsgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gICBkb25lCi0tICBJRlM9IiRhY19zYXZlX2lmcyIKLS0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi0rICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLStlc2FjCi0rCi0rCi0rICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwotKyAgZG9uZQotK2RvbmUKLSsKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotKwotIGZpCi0rCi0rR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLStpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLS1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLS1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLSsKLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEwMjQ6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0rIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi0rCi0rCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0taWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLS10aGVuCi0tICBybSAtZiBjb25mdGVzdGRhdGEKLS0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi0rICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQotKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCi0rICAgZWxzZQotKyAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJlZ3JlcCIgdG8gdXNlIGluIG1zZyBvdXRwdXQKLStpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi0rc2V0IGR1bW15IGVncmVwOyBhY19wcm9nX25hbWU9JDIKLStpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi0rICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCi0rIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbwotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0rICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQotKyAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCi0rY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSsqR05VKikKLSsgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OwotKyopCi0rICBhY19jb3VudD0wCi0rICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotKyAgd2hpbGUgOgotKyAgZG8KLSsgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSsgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSsgICAgZWNobyAnRUdSRVAnID4+ICJjb25mdGVzdC5ubCIKLSsgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0rICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSsgICAgYWNfY291bnQ9YGV4cHIgJGFjX2NvdW50ICsgMWAKLSsgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KLSsgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSsgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKLSsgICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKLSsgICAgZmkKLSsgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSsgIGRvbmUKLSsgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotK2VzYWMKLSsKLSsKLSsgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwotKyAgZG9uZQotK2RvbmUKLSsKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotKwotIGZpCi0rCi0rRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotK2lmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KLSsgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gZmkKLS1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotKwotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLSBmaQotIAotIAotKyAgIGZpCi0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9Ci0rIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKLSAKLS1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjEwNDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMDUyICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0gI2luY2x1ZGUgPHN0cmluZy5oPgotICNpbmNsdWRlIDxmbG9hdC5oPgotLUVPRgotLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDYwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLS1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKwotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotIGVsc2UKLS0gIGVjaG8gIiRhY19lcnIiID4mNQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19jdl9oZWFkZXJfc3RkYz1ubwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gCi0gaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLS1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTA3NyAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0tRU9GCi0rCi0rX0FDRU9GCi0gaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICA6Ci0gZWxzZQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLSBmaQotIHJtIC1mIGNvbmZ0ZXN0KgotQEAgLTEwOTAsMTYgKzM0MDEsMTkgQEAgZmkKLSAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMDk1ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxzdGRsaWIuaD4KLS1FT0YKLSsKLStfQUNFT0YKLSBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0tICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgOgotIGVsc2UKLS0gIHJtIC1yZiBjb25mdGVzdCoKLSAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi0gZmkKLSBybSAtZiBjb25mdGVzdCoKLUBAIC0xMTA4LDIxOCArMzQyMiw2NTggQEAgZmkKLSAKLSBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0rICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgOgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMTE2ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIDxjdHlwZS5oPgotLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi0taW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci0tZXhpdCAoMCk7IH0KLSsjaW5jbHVkZSA8c3RkbGliLmg+Ci0rI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQotKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSsjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0rI2Vsc2UKLSsjIGRlZmluZSBJU0xPV0VSKGMpIFwKLSsJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0rCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKLSsJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0rIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSsjZW5kaWYKLSAKLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLS10aGVuCi0rI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLStpbnQKLSttYWluICgpCi0rewotKyAgaW50IGk7Ci0rICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0rICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKLSsJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0rICAgICAgcmV0dXJuIDI7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICA6Ci0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLWZyIGNvbmZ0ZXN0KgotLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLSsgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0rZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rKCBleGl0ICRhY19zdGF0dXMgKQotK2FjX2N2X2hlYWRlcl9zdGRjPW5vCi0gZmkKLS1ybSAtZnIgY29uZnRlc3QqCi0rcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLSAKLSsKLSBmaQotIGZpCi0tCi0tZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQotIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgU1REQ19IRUFERVJTIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWZvciBhY19oZHIgaW4gdW5pc3RkLmggc3RkaW50LmggZmNudGwuaAotKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rCi0rZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCi0rCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLSBkbwotLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTE1NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSthc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMTU5ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0tI2luY2x1ZGUgPCRhY19oZHI+Ci0tRU9GCi0tYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjExNjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0tYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0tICBybSAtcmYgY29uZnRlc3QqCi0tICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKwotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLSBlbHNlCi0tICBlY2hvICIkYWNfZXJyIiA+JjUKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotLSNkZWZpbmUgJGFjX3RyX2hkciAxCi0tRU9GCi0tIAotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLStpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLStfQUNFT0YKLSsKLStmaQotKwotK2RvbmUKLSsKLSsKLSsKLSsKLSsKLStmb3IgYWNfaGVhZGVyIGluIHVuaXN0ZC5oIHN0ZGludC5oIGZjbnRsLmgKLStkbwotK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZmkKLSthY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLSsJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci0gZWxzZQotLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi0gZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfTsgdGhlbgotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotK2ZpCi0rCi0rcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLSsKLSsjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLStjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0rICB5ZXM6bm86ICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0rICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotKyAgICA7OwotKyAgbm86eWVzOiogKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0rCi0rICAgIDs7Ci0rZXNhYwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgotK2ZpCi0rYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0rCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotKwotK2ZpCi0raWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi0rX0FDRU9GCi0rCi0rZmkKLSsKLSBkb25lCi0gCi0tZm9yIGFjX2hkciBpbiBlbGYuaCBzeXMvZWxmLmggbGluay5oIHN5cy9saW5rLmgKLSsKLSsKLSsKLSsKLStmb3IgYWNfaGVhZGVyIGluIGVsZi5oIHN5cy9lbGYuaCBsaW5rLmggc3lzL2xpbmsuaAotIGRvCi0tYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMTk0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZmkKLSthY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLSsJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDExOTkgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0jaW5jbHVkZSA8JGFjX2hkcj4KLS1FT0YKLS1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgotLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLS1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi0taWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi0rICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLSBlbHNlCi0tICBlY2hvICIkYWNfZXJyIiA+JjUKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0rCi0rIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci0rX0FDRU9GCi0raWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9OyB0aGVuCi0rICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi0gZmkKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotLSNkZWZpbmUgJGFjX3RyX2hkciAxCi0tRU9GCi0tIAotKwotK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0rCi0rIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci0rY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotKyAgeWVzOm5vOiApCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSsgICAgOzsKLSsgIG5vOnllczoqICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotKwotKyAgICA7OwotK2VzYWMKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgotIGZpCi0rYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0rCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotKwotK2ZpCi0raWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi0rX0FDRU9GCi0rCi0rZmkKLSsKLSBkb25lCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJHtDQ30gY2FuIGNvbXBpbGUgZWxmLmgiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMjMxOiBjaGVja2luZyBpZiAke0NDfSBjYW4gY29tcGlsZSBlbGYuaCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmVsZl9jdl9lbGZfaF93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICR7Q0N9IGNhbiBjb21waWxlIGVsZi5oIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICR7Q0N9IGNhbiBjb21waWxlIGVsZi5oLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7bGliZWxmX2N2X2VsZl9oX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIAotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDEyMzcgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2lmIEhBVkVfRUxGX0gKLSAgICAgI2luY2x1ZGUgPGVsZi5oPgotICAgICAjZWxpZiBIQVZFX1NZU19FTEZfSAotICAgICAjaW5jbHVkZSA8c3lzL2VsZi5oPgotICAgICAjZW5kaWYKLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIEVsZjMyX0VoZHIgZHVtbXkKLS07IHJldHVybiAwOyB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0tICBybSAtcmYgY29uZnRlc3QqCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGxpYmVsZl9jdl9lbGZfaF93b3Jrcz15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBsaWJlbGZfY3ZfZWxmX2hfd29ya3M9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gCi0rCWxpYmVsZl9jdl9lbGZfaF93b3Jrcz1ubwotIGZpCi0gCi0tZWNobyAiJGFjX3QiIiRsaWJlbGZfY3ZfZWxmX2hfd29ya3MiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSsKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl9lbGZfaF93b3JrcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGxpYmVsZl9jdl9lbGZfaF93b3JrcyIgPiY2OyB9Ci0gaWYgdGVzdCAiJGxpYmVsZl9jdl9lbGZfaF93b3JrcyIgPSBubzsgdGhlbgotICAgYWNfY3ZfaGVhZGVyX2VsZl9oPW5vCi0gICBhY19jdl9oZWFkZXJfc3lzX2VsZl9oPW5vCi0gZmkKLSBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX2VsZl9oIiA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgX19MSUJFTEZfSEVBREVSX0VMRl9IIDxlbGYuaD4KLS1FT0YKLStfQUNFT0YKLSAKLSBlbGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX2VsZl9oIiA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgX19MSUJFTEZfSEVBREVSX0VMRl9IIDxzeXMvZWxmLmg+Ci0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLS1mb3IgYWNfaGRyIGluIGFyLmggbGliZWxmLmggbmxpc3QuaCBnZWxmLmgKLSsKLSsKLSsKLSsKLStmb3IgYWNfaGVhZGVyIGluIGFyLmggbGliZWxmLmggbmxpc3QuaCBnZWxmLmgKLSBkbwotLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTI4MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSthc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLStpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2ZpCi0rYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0rCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxMjg3ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0tI2luY2x1ZGUgPCRhY19oZHI+Ci0tRU9GCi0tYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLS17IChldmFsIGVjaG8gY29uZmlndXJlOjEyOTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci0tYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0tICBybSAtcmYgY29uZnRlc3QqCi0tICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi0gZWxzZQotLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi0gZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotKwotKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgotK19BQ0VPRgotK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfTsgdGhlbgotKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rICBhY19oZWFkZXJfcHJlcHJvYz1ubwotIGZpCi0taWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLS0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLS0jZGVmaW5lICRhY190cl9oZHIgMQotLUVPRgotLSAKLSsKLStybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotKwotKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KLSsgIHllczpubzogKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSsgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0rICAgIDs7Ci0rICBubzp5ZXM6KiApCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLSsKLSsgICAgOzsKLStlc2FjCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLStmaQotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLSsKLStmaQotK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSsjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotK19BQ0VPRgotKwotIGZpCi0rCi0gZG9uZQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5zdGFsbCA8bGliZWxmLmg+LCA8bmxpc3QuaD4gYW5kIDxnZWxmLmg+IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTMxOTogY2hlY2tpbmcgd2hldGhlciB0byBpbnN0YWxsIDxsaWJlbGYuaD4sIDxubGlzdC5oPiBhbmQgPGdlbGYuaD4iID4mNQotLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21wYXQgb3IgLS1kaXNhYmxlLWNvbXBhdCB3YXMgZ2l2ZW4uCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBpbnN0YWxsIDxsaWJlbGYuaD4sIDxubGlzdC5oPiBhbmQgPGdlbGYuaD4iID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBpbnN0YWxsIDxsaWJlbGYuaD4sIDxubGlzdC5oPiBhbmQgPGdlbGYuaD4uLi4gJEVDSE9fQyIgPiY2OyB9Ci0rIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbXBhdCB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfY29tcGF0K3NldH0iID0gc2V0OyB0aGVuCi0tICBlbmFibGV2YWw9IiRlbmFibGVfY29tcGF0IgotLSAgRE9fQ09NUEFUPSIkZW5hYmxldmFsIgotKyAgZW5hYmxldmFsPSRlbmFibGVfY29tcGF0OyBET19DT01QQVQ9IiRlbmFibGV2YWwiCi0gZWxzZQotICAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saWJlbGZfaCRhY19jdl9oZWFkZXJfbmxpc3RfaCRhY19jdl9oZWFkZXJfZ2VsZl9oIiA9IHllc3llc3llcwotICAgdGhlbiBET19DT01QQVQ9bm8KLUBAIC0xMzI3LDM0NSArNDA4MSwyMjY3IEBAIGVsc2UKLSAgIGZpCi0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJERPX0NPTVBBVCIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJERPX0NPTVBBVCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JERPX0NPTVBBVCIgPiY2OyB9Ci0gCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxMzM1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfY19jb25zdCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTM0MCAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAKLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotKy8qIEZJWE1FOiBJbmNsdWRlIHRoZSBjb21tZW50cyBzdWdnZXN0ZWQgYnkgUGF1bC4gKi8KLSsjaWZuZGVmIF9fY3BsdXNwbHVzCi0rICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotKyAgdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsKLSsgIGNvbnN0IGNoYXJzZXQgY3M7Ci0rICAvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotKyAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOwotKyAgY2hhciAqKnBwYzsKLSsgIC8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi0rICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci0rICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLSsgIC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSsgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCi0rICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50Ci0rICAgICBleHByZXNzaW9uICovCi0rICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0rICBwY3BjYyA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLSsgIC8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rICArK3BjcGNjOwotKyAgcHBjID0gKGNoYXIqKikgcGNwY2M7Ci0rICBwY3BjYyA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwcGM7Ci0rICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotKyAgICBjaGFyICp0OwotKyAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotIAotLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi0tdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi0tY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLS1jaGFyICoqcDsKLS0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLS1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0tICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0tICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLS1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci0tY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0tKytjY3A7Ci0tcCA9IChjaGFyKiopIGNjcDsKLS1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLS17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotLSAgY2hhciAqdDsKLS0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0rICAgICp0KysgPSAwOwotKyAgICBpZiAocykgcmV0dXJuIDA7Ci0rICB9Ci0rICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotKyAgICBpbnQgeFtdID0gezI1LCAxN307Ci0rICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0rICAgICsrZm9vOwotKyAgfQotKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0rICAgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotKyAgICBpcHRyIHAgPSAwOwotKyAgICArK3A7Ci0rICB9Ci0rICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSsgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotKyAgICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotKyAgICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci0rICB9Ci0rICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotKyAgICBjb25zdCBpbnQgZm9vID0gMTA7Ci0rICAgIGlmICghZm9vKSByZXR1cm4gMDsKLSsgIH0KLSsgIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKLSsjZW5kaWYKLSAKLS0gICp0KysgPSAwOwotLX0KLS17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLS0gICsrZm9vOwotLX0KLS17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLS0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotLSAgaXB0ciBwID0gMDsKLS0gICsrcDsKLS19Ci0teyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0tICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0tICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotLX0KLS17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotLSAgY29uc3QgaW50IGZvbyA9IDEwOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0gfQotLQotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICAgYWNfY3ZfY19jb25zdD15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBhY19jdl9jX2NvbnN0PW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19jdl9jX2NvbnN0PW5vCi0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjY7IH0KLSBpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotLSNkZWZpbmUgY29uc3QgCi0tRU9GCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSsjZGVmaW5lIGNvbnN0Ci0rX0FDRU9GCi0gCi0gZmkKLSAKLS1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNDEwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvZmZfdC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3R5cGVfb2ZmX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE0MTUgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0tI2lmIFNURENfSEVBREVSUwotLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0tI2VuZGlmCi0tRU9GCi0taWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSt0eXBlZGVmIG9mZl90IGFjX190eXBlX25ld187Ci0raW50Ci0rbWFpbiAoKQotK3sKLStpZiAoKGFjX190eXBlX25ld18gKikgMCkKLSsgIHJldHVybiAwOwotK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotKyAgcmV0dXJuIDA7Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi0gZWxzZQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2N2X3R5cGVfb2ZmX3Q9bm8KLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotIAotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci0taWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLS0jZGVmaW5lIG9mZl90IGxvbmcKLS1FT0YKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX29mZl90IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9vZmZfdCIgPiY2OyB9Ci0raWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IHllczsgdGhlbgotKyAgOgotK2Vsc2UKLSsKLStjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBvZmZfdCBsb25nIGludAotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE0NDM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNpemVfdC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2l6ZV90K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNDQ4ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0tI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotLSNpZiBTVERDX0hFQURFUlMKLS0jaW5jbHVkZSA8c3RkbGliLmg+Ci0tI2luY2x1ZGUgPHN0ZGRlZi5oPgotLSNlbmRpZgotLUVPRgotLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLS0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotK3R5cGVkZWYgc2l6ZV90IGFjX190eXBlX25ld187Ci0raW50Ci0rbWFpbiAoKQotK3sKLStpZiAoKGFjX190eXBlX25ld18gKikgMCkKLSsgIHJldHVybiAwOwotK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotKyAgcmV0dXJuIDA7Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotIGVsc2UKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotIAotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0tZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi0tRU9GCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpemVfdCIgPiY2OyB9Ci0raWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSB5ZXM7IHRoZW4KLSsgIDoKLStlbHNlCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGludAotK19BQ0VPRgotIAotIGZpCi0gCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE0Nzc6IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2Zfc2hvcnQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2hvcnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaG9ydCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9uZXdfOwotK2ludAotK21haW4gKCkKLSt7Ci0raWYgKChhY19fdHlwZV9uZXdfICopIDApCi0rICByZXR1cm4gMDsKLStpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSsgIHJldHVybiAwOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jdl90eXBlX3Nob3J0PXllcwotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19jdl90eXBlX3Nob3J0PW5vCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2hvcnQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Nob3J0IiA+JjY7IH0KLSsKLSsjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSsjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KLSsjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9zaG9ydCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0gICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotLSAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTIKLSsgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCi0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0wIGFjX21pZD0wCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSt7Ci0rc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hpPSRhY19taWQ7IGJyZWFrCi0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE0ODUgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0jaW5jbHVkZSA8c3RkaW8uaD4KLS1tYWluKCkKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKLSsJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotKwkJCSAgYWNfbG89IGFjX2hpPQotKwkJCSAgYnJlYWsKLSsJCQlmaQotKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKLStmaQotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyAgZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSB7Ci0tICBGSUxFICpmPWZvcGVuKCJjb25mdGVzdHZhbCIsICJ3Iik7Ci0tICBpZiAoIWYpIGV4aXQoMSk7Ci0tICBmcHJpbnRmKGYsICIlZFxuIiwgc2l6ZW9mKHNob3J0KSk7Ci0tICBleGl0KDApOwotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0tdGhlbgotLSAgYWNfY3Zfc2l6ZW9mX3Nob3J0PWBjYXQgY29uZnRlc3R2YWxgCi0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hpPS0xIGFjX21pZD0tMQotKyAgd2hpbGUgOjsgZG8KLSsgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0kYWNfbWlkOyBicmVhawotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1mciBjb25mdGVzdCoKLS0gIGFjX2N2X3NpemVvZl9zaG9ydD0wCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLSsJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotKwkJCSAgYWNfbG89IGFjX2hpPQotKwkJCSAgYnJlYWsKLSsJCQlmaQotKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyAgZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz0gYWNfaGk9Ci0gZmkKLSAKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhY190IiIkYWNfY3Zfc2l6ZW9mX3Nob3J0IiAxPiY2Ci0tY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSsjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgotK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KLSsgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSt7Ci0rc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hpPSRhY19taWQKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKLStmaQotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2RvbmUKLStjYXNlICRhY19sbyBpbgotKz8qKSBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX2xvOzsKLSsnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCi0rICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKLSsgICBmaSA7OwotK2VzYWMKLStlbHNlCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci0rc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci0rI2luY2x1ZGUgPHN0ZGlvLmg+Ci0rI2luY2x1ZGUgPHN0ZGxpYi5oPgotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotKyAgaWYgKCEgZikKLSsgICAgcmV0dXJuIDE7Ci0rICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0rICAgIHsKLSsgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKLSsgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotKwlyZXR1cm4gMTsKLSsgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKLSsgICAgfQotKyAgZWxzZQotKyAgICB7Ci0rICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0rCXJldHVybiAxOwotKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotKyAgICB9Ci0rICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19jdl9zaXplb2Zfc2hvcnQ9YGNhdCBjb25mdGVzdC52YWxgCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLStlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0raWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCi0rICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKLSsgICBmaQotK2ZpCi0rcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLStybSAtZiBjb25mdGVzdC52YWwKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9zaG9ydCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9zaG9ydCIgPiY2OyB9Ci0rCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgU0laRU9GX1NIT1JUICRhY19jdl9zaXplb2Zfc2hvcnQKLS1FT0YKLStfQUNFT0YKLSAKLSAKLS1lY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIGludCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE1MTY6IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2l6ZW9mX2ludCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotK2Vsc2UKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSt0eXBlZGVmIGludCBhY19fdHlwZV9uZXdfOwotK2ludAotK21haW4gKCkKLSt7Ci0raWYgKChhY19fdHlwZV9uZXdfICopIDApCi0rICByZXR1cm4gMDsKLStpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSsgIHJldHVybiAwOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jdl90eXBlX2ludD15ZXMKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfY3ZfdHlwZV9pbnQ9bm8KLStmaQotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9pbnQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2ludCIgPiY2OyB9Ci0rCi0rIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSsjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCi0rIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0rIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGludCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGludC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9pbnQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLS0gIGFjX2N2X3NpemVvZl9pbnQ9NAotKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0wIGFjX21pZD0wCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19oaT0kYWNfbWlkOyBicmVhawotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNTI0ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0tI2luY2x1ZGUgPHN0ZGlvLmg+Ci0tbWFpbigpCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0rCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLSsJCQkgIGFjX2xvPSBhY19oaT0KLSsJCQkgIGJyZWFrCi0rCQkJZmkKLSsJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSsgIGRvbmUKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotIHsKLS0gIEZJTEUgKmY9Zm9wZW4oImNvbmZ0ZXN0dmFsIiwgInciKTsKLS0gIGlmICghZikgZXhpdCgxKTsKLS0gIGZwcmludGYoZiwgIiVkXG4iLCBzaXplb2YoaW50KSk7Ci0tICBleGl0KDApOwotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0tdGhlbgotLSAgYWNfY3Zfc2l6ZW9mX2ludD1gY2F0IGNvbmZ0ZXN0dmFsYAotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19oaT0tMSBhY19taWQ9LTEKLSsgIHdoaWxlIDo7IGRvCi0rICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSt7Ci0rc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2xvPSRhY19taWQ7IGJyZWFrCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLWZyIGNvbmZ0ZXN0KgotLSAgYWNfY3Zfc2l6ZW9mX2ludD0wCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLSsJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotKwkJCSAgYWNfbG89IGFjX2hpPQotKwkJCSAgYnJlYWsKLSsJCQlmaQotKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyAgZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz0gYWNfaGk9Ci0gZmkKLSAKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhY190IiIkYWNfY3Zfc2l6ZW9mX2ludCIgMT4mNgotLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KLSt3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0rICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9JGFjX21pZAotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZG9uZQotK2Nhc2UgJGFjX2xvIGluCi0rPyopIGFjX2N2X3NpemVvZl9pbnQ9JGFjX2xvOzsKLSsnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgotKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX2ludD0wCi0rICAgZmkgOzsKLStlc2FjCi0rZWxzZQotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87Ci0rc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLStzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLSsjaW5jbHVkZSA8c3RkaW8uaD4KLSsjaW5jbHVkZSA8c3RkbGliLmg+Ci0raW50Ci0rbWFpbiAoKQotK3sKLSsKLSsgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7Ci0rICBpZiAoISBmKQotKyAgICByZXR1cm4gMTsKLSsgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKLSsgICAgewotKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwotKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0rCXJldHVybiAxOwotKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwotKyAgICB9Ci0rICBlbHNlCi0rICAgIHsKLSsgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7Ci0rICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLSsJcmV0dXJuIDE7Ci0rICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7Ci0rICAgIH0KLSsgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdCRhY19leGVleHQKLStpZiB7IChhY190cnk9IiRhY19saW5rIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSsgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSsgIGFjX2N2X3NpemVvZl9pbnQ9YGNhdCBjb25mdGVzdC52YWxgCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLStlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0raWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgotKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCi0rU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX2ludD0wCi0rICAgZmkKLStmaQotK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0rcm0gLWYgY29uZnRlc3QudmFsCi0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfaW50IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9Ci0rCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgU0laRU9GX0lOVCAkYWNfY3Zfc2l6ZW9mX2ludAotLUVPRgotK19BQ0VPRgotIAotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE1NTU6IGNoZWNraW5nIHNpemUgb2YgbG9uZyIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmciID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmcrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotK3R5cGVkZWYgbG9uZyBhY19fdHlwZV9uZXdfOwotK2ludAotK21haW4gKCkKLSt7Ci0raWYgKChhY19fdHlwZV9uZXdfICopIDApCi0rICByZXR1cm4gMDsKLStpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSsgIHJldHVybiAwOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jdl90eXBlX2xvbmc9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2N2X3R5cGVfbG9uZz1ubwotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmciID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2xvbmciID4mNjsgfQotKwotKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0rIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0tICBhY19jdl9zaXplb2ZfbG9uZz00Ci0rICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0wIGFjX21pZD0wCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTU2MyAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLSNpbmNsdWRlIDxzdGRpby5oPgotLW1haW4oKQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2xvPWBleHByICRhY19taWQgKyAxYAotKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0rCQkJICBhY19sbz0gYWNfaGk9Ci0rCQkJICBicmVhawotKwkJCWZpCi0rCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rICBkb25lCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0gewotLSAgRklMRSAqZj1mb3BlbigiY29uZnRlc3R2YWwiLCAidyIpOwotLSAgaWYgKCFmKSBleGl0KDEpOwotLSAgZnByaW50ZihmLCAiJWRcbiIsIHNpemVvZihsb25nKSk7Ci0tICBleGl0KDApOwotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0tdGhlbgotLSAgYWNfY3Zfc2l6ZW9mX2xvbmc9YGNhdCBjb25mdGVzdHZhbGAKLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9LTEgYWNfbWlkPS0xCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtZnIgY29uZnRlc3QqCi0tICBhY19jdl9zaXplb2ZfbG9uZz0wCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLSsJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotKwkJCSAgYWNfbG89IGFjX2hpPQotKwkJCSAgYnJlYWsKLSsJCQlmaQotKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyAgZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz0gYWNfaGk9Ci0gZmkKLSAKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhY190IiIkYWNfY3Zfc2l6ZW9mX2xvbmciIDE+JjYKLS1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi0rd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19oaT0kYWNfbWlkCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStkb25lCi0rY2FzZSAkYWNfbG8gaW4KLSs/KikgYWNfY3Zfc2l6ZW9mX2xvbmc9JGFjX2xvOzsKLSsnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAotKyAgIGZpIDs7Ci0rZXNhYwotK2Vsc2UKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLStzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotKyNpbmNsdWRlIDxzdGRpby5oPgotKyNpbmNsdWRlIDxzdGRsaWIuaD4KLStpbnQKLSttYWluICgpCi0rewotKwotKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKLSsgIGlmICghIGYpCi0rICAgIHJldHVybiAxOwotKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQotKyAgICB7Ci0rICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0rICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLSsJcmV0dXJuIDE7Ci0rICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0rICAgIH0KLSsgIGVsc2UKLSsgICAgewotKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKLSsgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotKwlyZXR1cm4gMTsKLSsgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKLSsgICAgfQotKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGluayIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfdHJ5IikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotKyAgYWNfY3Zfc2l6ZW9mX2xvbmc9YGNhdCBjb25mdGVzdC52YWxgCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLStlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0raWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAotKyAgIGZpCi0rZmkKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3JtIC1mIGNvbmZ0ZXN0LnZhbAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfbG9uZyIgPiY2OyB9Ci0rCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgU0laRU9GX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nCi0tRU9GCi0rX0FDRU9GCi0gCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxNTk0OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9uZyBsb25nIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl90eXBlX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStlbHNlCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfbmV3XzsKLStpbnQKLSttYWluICgpCi0rewotK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotKyAgcmV0dXJuIDA7Ci0raWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0rICByZXR1cm4gMDsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQotKwotKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0rIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0tICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKLSsgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCi0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfbG89MCBhY19taWQ9MAotKyAgd2hpbGUgOjsgZG8KLSsgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKyAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTYwMiAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLSNpbmNsdWRlIDxzdGRpby5oPgotLW1haW4oKQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2xvPWBleHByICRhY19taWQgKyAxYAotKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0rCQkJICBhY19sbz0gYWNfaGk9Ci0rCQkJICBicmVhawotKwkJCWZpCi0rCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rICBkb25lCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSB7Ci0tICBGSUxFICpmPWZvcGVuKCJjb25mdGVzdHZhbCIsICJ3Iik7Ci0tICBpZiAoIWYpIGV4aXQoMSk7Ci0tICBmcHJpbnRmKGYsICIlZFxuIiwgc2l6ZW9mKGxvbmcgbG9uZykpOwotLSAgZXhpdCgwKTsKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0gfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotLXRoZW4KLS0gIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9YGNhdCBjb25mdGVzdHZhbGAKLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9LTEgYWNfbWlkPS0xCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0kYWNfbWlkOyBicmVhawotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1mciBjb25mdGVzdCoKLS0gIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0rCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLSsJCQkgIGFjX2xvPSBhY19oaT0KLSsJCQkgIGJyZWFrCi0rCQkJZmkKLSsJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKLSBmaQotLXJtIC1mciBjb25mdGVzdCoKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSsgIGRvbmUKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfbG89IGFjX2hpPQotIGZpCi0gCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1lY2hvICIkYWNfdCIiJGFjX2N2X3NpemVvZl9sb25nX2xvbmciIDE+JjYKLS1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi0rd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotK2ludAotK21haW4gKCkKLSt7Ci0rc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSsgIGFjX2hpPSRhY19taWQKLStlbHNlCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKLStmaQotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2RvbmUKLStjYXNlICRhY19sbyBpbgotKz8qKSBhY19jdl9zaXplb2ZfbG9uZ19sb25nPSRhY19sbzs7Ci0rJycpIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSsgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotKyAgIGVsc2UKLSsgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAotKyAgIGZpIDs7Ci0rZXNhYwotK2Vsc2UKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci0rc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci0rI2luY2x1ZGUgPHN0ZGlvLmg+Ci0rI2luY2x1ZGUgPHN0ZGxpYi5oPgotK2ludAotK21haW4gKCkKLSt7Ci0rCi0rICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotKyAgaWYgKCEgZikKLSsgICAgcmV0dXJuIDE7Ci0rICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0rICAgIHsKLSsgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKLSsgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotKwlyZXR1cm4gMTsKLSsgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKLSsgICAgfQotKyAgZWxzZQotKyAgICB7Ci0rICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0rCXJldHVybiAxOwotKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotKyAgICB9Ci0rICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Ci0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0rICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3QudmFsYAotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0rZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rKCBleGl0ICRhY19zdGF0dXMgKQotK2lmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSsgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotKyAgIGVsc2UKLSsgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAotKyAgIGZpCi0rZmkKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3JtIC1mIGNvbmZ0ZXN0LnZhbAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNjsgfQotKwotKwotKwotK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKLS1FT0YKLStfQUNFT0YKLSAKLSAKLSAjIFdpbmRvd3MgcG9ydAotLWVjaG8gJGFjX24gImNoZWNraW5nIHNpemUgb2YgX19pbnQ2NCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE2MzQ6IGNoZWNraW5nIHNpemUgb2YgX19pbnQ2NCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9fX2ludDY0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF9faW50NjQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIF9faW50NjQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl90eXBlX19faW50NjQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotK3R5cGVkZWYgX19pbnQ2NCBhY19fdHlwZV9uZXdfOwotK2ludAotK21haW4gKCkKLSt7Ci0raWYgKChhY19fdHlwZV9uZXdfICopIDApCi0rICByZXR1cm4gMDsKLStpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSsgIHJldHVybiAwOwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19jdl90eXBlX19faW50NjQ9eWVzCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2N2X3R5cGVfX19pbnQ2ND1ubwotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX19faW50NjQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX19faW50NjQiID4mNjsgfQotKwotKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0rIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBfX2ludDY0IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgX19pbnQ2NC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9fX2ludDY0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0tICBhY19jdl9zaXplb2ZfX19pbnQ2ND0wCi0rICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIF9faW50NjQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19sbz0wIGFjX21pZD0wCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBfX2ludDY0IGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTY0MiAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLSNpbmNsdWRlIDxzdGRpby5oPgotLW1haW4oKQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2xvPWBleHByICRhY19taWQgKyAxYAotKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0rCQkJICBhY19sbz0gYWNfaGk9Ci0rCQkJICBicmVhawotKwkJCWZpCi0rCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotK2ZpCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rICBkb25lCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIF9faW50NjQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0gewotLSAgRklMRSAqZj1mb3BlbigiY29uZnRlc3R2YWwiLCAidyIpOwotLSAgaWYgKCFmKSBleGl0KDEpOwotLSAgZnByaW50ZihmLCAiJWRcbiIsIHNpemVvZihfX2ludDY0KSk7Ci0tICBleGl0KDApOwotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07Ci0rdGVzdF9hcnJheSBbMF0gPSAwCi0rCi0rICA7Ci0rICByZXR1cm4gMDsKLSB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0tdGhlbgotLSAgYWNfY3Zfc2l6ZW9mX19faW50NjQ9YGNhdCBjb25mdGVzdHZhbGAKLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGk9LTEgYWNfbWlkPS0xCi0rICB3aGlsZSA6OyBkbwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKyRhY19pbmNsdWRlc19kZWZhdWx0Ci0rICAgdHlwZWRlZiBfX2ludDY0IGFjX190eXBlX3NpemVvZl87Ci0raW50Ci0rbWFpbiAoKQotK3sKLStzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLSt0ZXN0X2FycmF5IFswXSA9IDAKLSsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtZnIgY29uZnRlc3QqCi0tICBhY19jdl9zaXplb2ZfX19pbnQ2ND0wCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLSsJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotKwkJCSAgYWNfbG89IGFjX2hpPQotKwkJCSAgYnJlYWsKLSsJCQlmaQotKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyAgZG9uZQotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlhY19sbz0gYWNfaGk9Ci0gZmkKLSAKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotLWVjaG8gIiRhY190IiIkYWNfY3Zfc2l6ZW9mX19faW50NjQiIDE+JjYKLS1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi0rd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotKyAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIF9faW50NjQgYWNfX3R5cGVfc2l6ZW9mXzsKLStpbnQKLSttYWluICgpCi0rewotK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotK3Rlc3RfYXJyYXkgWzBdID0gMAotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0rICBhY19oaT0kYWNfbWlkCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi0rZmkKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStkb25lCi0rY2FzZSAkYWNfbG8gaW4KLSs/KikgYWNfY3Zfc2l6ZW9mX19faW50NjQ9JGFjX2xvOzsKLSsnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfX19pbnQ2NCIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoX19pbnQ2NCkKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChfX2ludDY0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX19faW50NjQ9MAotKyAgIGZpIDs7Ci0rZXNhYwotK2Vsc2UKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsgICB0eXBlZGVmIF9faW50NjQgYWNfX3R5cGVfc2l6ZW9mXzsKLStzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotKyNpbmNsdWRlIDxzdGRpby5oPgotKyNpbmNsdWRlIDxzdGRsaWIuaD4KLStpbnQKLSttYWluICgpCi0rewotKwotKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKLSsgIGlmICghIGYpCi0rICAgIHJldHVybiAxOwotKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQotKyAgICB7Ci0rICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0rICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLSsJcmV0dXJuIDE7Ci0rICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0rICAgIH0KLSsgIGVsc2UKLSsgICAgewotKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKLSsgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotKwlyZXR1cm4gMTsKLSsgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKLSsgICAgfQotKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotKwotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGluayIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfdHJ5IikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotKyAgYWNfY3Zfc2l6ZW9mX19faW50NjQ9YGNhdCBjb25mdGVzdC52YWxgCi0rZWxzZQotKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLStlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0raWYgdGVzdCAiJGFjX2N2X3R5cGVfX19pbnQ2NCIgPSB5ZXM7IHRoZW4KLSsgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoX19pbnQ2NCkKLStTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChfX2ludDY0KQotK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0rICAgZWxzZQotKyAgICAgYWNfY3Zfc2l6ZW9mX19faW50NjQ9MAotKyAgIGZpCi0rZmkKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3JtIC1mIGNvbmZ0ZXN0LnZhbAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX19faW50NjQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfX19pbnQ2NCIgPiY2OyB9Ci0rCi0rCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgU0laRU9GX19fSU5UNjQgJGFjX2N2X3NpemVvZl9fX2ludDY0Ci0tRU9GCi0rX0FDRU9GCi0gCi0gCi0gCi1AQCAtMTY3NCwzNjIgKzYzNTAsNjUyIEBAIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfZWxmX2giID0geWVzIFwKLSAKLSAgICMgU2xvd2FyaXMgZGVjbGFyZXMgRWxmMzJfRHluIGluIDxsaW5rLmg+LgotICAgIyBRTlggZGVjbGFyZXMgRWxmMzJfRHluIGluIDxzeXMvbGluay5oPi4KLS0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgRWxmMzJfRHluIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGYzMl9EeW4iID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJlbGZfY3Zfc3RydWN0X2VsZjMyX2R5bicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGYzMl9EeW4iID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGYzMl9EeW4uLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3Zfc3RydWN0X2VsZjMyX2R5bitzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAKLS0gICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE2ODUgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsKLSsgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSBfX0xJQkVMRl9IRUFERVJfRUxGX0gKLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIEVsZjMyX0R5biB4Ci0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY5MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3RydWN0X2VsZjMyX2R5bj15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTcwMCAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPGxpbmsuaD4KLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIEVsZjMyX0R5biB4Ci0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3RydWN0X2VsZjMyX2R5bj1saW5rLmgKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTcxNSAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN5cy9saW5rLmg+Ci0taW50IG1haW4oKSB7Ci0raW50Ci0rbWFpbiAoKQotK3sKLSBFbGYzMl9EeW4geAotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICAgbGliZWxmX2N2X3N0cnVjdF9lbGYzMl9keW49c3lzL2xpbmsuaAotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGxpYmVsZl9jdl9zdHJ1Y3RfZWxmMzJfZHluPW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlsaWJlbGZfY3Zfc3RydWN0X2VsZjMyX2R5bj1ubwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3N0cnVjdF9lbGYzMl9keW4iIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl9zdHJ1Y3RfZWxmMzJfZHluIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2N2X3N0cnVjdF9lbGYzMl9keW4iID4mNjsgfQotICAgaWYgdGVzdCAiJGxpYmVsZl9jdl9zdHJ1Y3RfZWxmMzJfZHluIiA9IGxpbmsuaDsgdGhlbgotLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIF9fTElCRUxGX05FRURfTElOS19IIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIGVsaWYgdGVzdCAiJGxpYmVsZl9jdl9zdHJ1Y3RfZWxmMzJfZHluIiA9IHN5cy9saW5rLmg7IHRoZW4KLS0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBfX0xJQkVMRl9ORUVEX1NZU19MSU5LX0ggMQotLUVPRgotK19BQ0VPRgotIAotICAgZWxpZiB0ZXN0ICIkbGliZWxmX2N2X3N0cnVjdF9lbGYzMl9keW4iID0gbm87IHRoZW4KLS0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBkZWNsYXJhdGlvbiBmb3IgRWxmMzJfRHluIiAxPiYyOyBleGl0IDE7IH0KLSsgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gZGVjbGFyYXRpb24gZm9yIEVsZjMyX0R5biIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogbm8gZGVjbGFyYXRpb24gZm9yIEVsZjMyX0R5biIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgIGZpCi0gCi0gICAjIExpbnV4IGRlY2xhcmVzIHN0cnVjdCBubGlzdCBpbiA8ZWxmLmg+LgotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBubGlzdCBpbiBlbGYuaCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE3NTU6IGNoZWNraW5nIGZvciBzdHJ1Y3Qgbmxpc3QgaW4gZWxmLmgiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJlbGZfY3Zfc3RydWN0X25saXN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IG5saXN0IGluIGVsZi5oIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3Qgbmxpc3QgaW4gZWxmLmguLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3Zfc3RydWN0X25saXN0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIAotLSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMTc2MSAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKwotKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gc3RydWN0IG5saXN0IG5sCi0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc2ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3RydWN0X25saXN0PXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGxpYmVsZl9jdl9zdHJ1Y3Rfbmxpc3Q9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWxpYmVsZl9jdl9zdHJ1Y3Rfbmxpc3Q9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3N0cnVjdF9ubGlzdCIgMT4mNgotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2N2X3N0cnVjdF9ubGlzdCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGxpYmVsZl9jdl9zdHJ1Y3Rfbmxpc3QiID4mNjsgfQotICAgaWYgdGVzdCAiJGxpYmVsZl9jdl9zdHJ1Y3Rfbmxpc3QiID0geWVzOyB0aGVuCi0tICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9TVFJVQ1RfTkxJU1RfREVDTEFSQVRJT04gMQotLUVPRgotK19BQ0VPRgotIAotICAgZmkKLSAKLSAgICMgQ2hlY2sgZm9yIDY0LWJpdCBkYXRhIHR5cGVzLgotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGY2NF9FaGRyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTc5MDogY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGY2NF9FaGRyIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9laGRyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IEVsZjY0X0VoZHIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGY2NF9FaGRyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7bGliZWxmX2N2X3N0cnVjdF9lbGY2NF9laGRyK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxNzk1ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gRWxmNjRfRWhkciB4Ci0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgwMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHI9eWVzCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9laGRyPW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHI9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9laGRyIiAxPiY2Ci0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHIiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHIiID4mNjsgfQotIAotICAgIyBMaW51eCBsYWNrcyB0eXBlZGVmcyBmb3Igc2NhbGFyIEVMRjY0XyogdHlwZXMuCi0tICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgRWxmNjRfQWRkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE4MTg6IGNoZWNraW5nIGZvciBFbGY2NF9BZGRyIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X3R5cGVfZWxmNjRfYWRkcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEVsZjY0X0FkZHIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEVsZjY0X0FkZHIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3ZfdHlwZV9lbGY2NF9hZGRyK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxODIzICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gRWxmNjRfQWRkciB4Ci0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgzMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3ZfdHlwZV9lbGY2NF9hZGRyPXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGxpYmVsZl9jdl90eXBlX2VsZjY0X2FkZHI9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWxpYmVsZl9jdl90eXBlX2VsZjY0X2FkZHI9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3R5cGVfZWxmNjRfYWRkciIgMT4mNgotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2N2X3R5cGVfZWxmNjRfYWRkciIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGxpYmVsZl9jdl90eXBlX2VsZjY0X2FkZHIiID4mNjsgfQotIAotICAgIyBJUklYJyBzdHJ1Y3QgRWxmNjRfUmVsIGlzIHNsaWdodGx5IGRpZmZlcmVudC4gVWdoLgotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBFbGY2NF9SZWwiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxODQ2OiBjaGVja2luZyBmb3Igc3RydWN0IEVsZjY0X1JlbCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmVsZl9jdl9zdHJ1Y3RfZWxmNjRfcmVsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IEVsZjY0X1JlbCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IEVsZjY0X1JlbC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2xpYmVsZl9jdl9zdHJ1Y3RfZWxmNjRfcmVsK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxODUxICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gRWxmNjRfUmVsIHg7IHgucl9pbmZvID0gMQotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICAgbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWw9eWVzCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE4NjYgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gRWxmNjRfUmVsIHg7IHgucl9zeW0gPSAxCi0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg3MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X3JlbD1pcml4Ci0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWw9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWxpYmVsZl9jdl9zdHJ1Y3RfZWxmNjRfcmVsPW5vCi0gZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWwiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl9zdHJ1Y3RfZWxmNjRfcmVsIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWwiID4mNjsgfQotIAotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIDY0Yml0IHN1cHBvcnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIDY0Yml0IHN1cHBvcnQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfNjRiaXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotICAgY2FzZSAiJGxpYmVsZl9jdl9zdHJ1Y3RfZWxmNjRfZWhkcjpcCi0gJGxpYmVsZl9jdl90eXBlX2VsZjY0X2FkZHI6XAotICRsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X3JlbCIgaW4KLSAgICAgeWVzOnllczp5ZXMpCi0gICAgICAgbGliZWxmXzY0Yml0PXllczs7Ci0gICAgIHllczp5ZXM6aXJpeCkKLS0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLS0jZGVmaW5lIF9fTElCRUxGNjRfSVJJWCAxCi0tRU9GCi0tCi0tICAgICAgbGliZWxmXzY0Yml0PXllczs7Ci0rICAgICAgbGliZWxmXzY0Yml0PWlyaXg7OwotICAgICB5ZXM6bm86eWVzKQotLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotLSNkZWZpbmUgX19MSUJFTEY2NF9MSU5VWCAxCi0tRU9GCi0tCi0tICAgICAgbGliZWxmXzY0Yml0PXllczs7Ci0rICAgICAgbGliZWxmXzY0Yml0PWxpbnV4OzsKLSAgICAgKikKLSAgICAgICBsaWJlbGZfNjRiaXQ9bm87OwotICAgZXNhYwotIAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmXzY0Yml0IiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmXzY0Yml0IiA+JjY7IH0KLSsgIGNhc2UgJGxpYmVsZl82NGJpdCBpbgotKyAgeWVzKSA7OwotKyAgbGludXgpIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0rI2RlZmluZSBfX0xJQkVMRjY0X0xJTlVYIDEKLStfQUNFT0YKLSsgOzsKLSsgIGlyaXgpIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0rI2RlZmluZSBfX0xJQkVMRjY0X0lSSVggMQotK19BQ0VPRgotKyA7OwotKyAgZXNhYwotKwotICAgIyBDaGVjayBmb3Igc3ltYm9sIHZlcnNpb25pbmcgZGVmaW5pdGlvbnMKLS0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBFbGYzMl9WZXJkZWYiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToxOTEyOiBjaGVja2luZyBmb3IgRWxmMzJfVmVyZGVmIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X3ZlcmRlZjMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgRWxmMzJfVmVyZGVmIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBFbGYzMl9WZXJkZWYuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3ZfdmVyZGVmMzIrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE5MTcgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgX19MSUJFTEZfSEVBREVSX0VMRl9ICi0gICAgICAgI2lmIF9fTElCRUxGX05FRURfTElOS19ICi0gICAgICAgI2luY2x1ZGUgPGxpbmsuaD4JLyogU29sYXJpcyB3YW50cyB0aGlzICovCi0gICAgICAgI2VuZGlmCi0taW50IG1haW4oKSB7Ci0raW50Ci0rbWFpbiAoKQotK3sKLSBzdHJ1Y3QgewotIAlFbGYzMl9WZXJkZWYgdmQ7Ci0gCUVsZjMyX1ZlcmRhdXggdmRhOwotIAlFbGYzMl9WZXJuZWVkIHZuOwotIAlFbGYzMl9WZXJuYXV4IHZuYTsKLSAgICAgICB9IHgKLS07IHJldHVybiAwOyB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0tICBybSAtcmYgY29uZnRlc3QqCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGxpYmVsZl9jdl92ZXJkZWYzMj15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBsaWJlbGZfY3ZfdmVyZGVmMzI9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWxpYmVsZl9jdl92ZXJkZWYzMj1ubwotIGZpCi0gCi0tZWNobyAiJGFjX3QiIiRsaWJlbGZfY3ZfdmVyZGVmMzIiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl92ZXJkZWYzMiIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGxpYmVsZl9jdl92ZXJkZWYzMiIgPiY2OyB9Ci0gCi0tICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgRWxmNjRfVmVyZGVmIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgZm9yIEVsZjY0X1ZlcmRlZiIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmVsZl9jdl92ZXJkZWY2NCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEVsZjY0X1ZlcmRlZiIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgRWxmNjRfVmVyZGVmLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7bGliZWxmX2N2X3ZlcmRlZjY0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAxOTUyICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotICNpbmNsdWRlIF9fTElCRUxGX0hFQURFUl9FTEZfSAotICAgICAgICNpZiBfX0xJQkVMRl9ORUVEX0xJTktfSAotICAgICAgICNpbmNsdWRlIDxsaW5rLmg+CS8qIFNvbGFyaXMgd2FudHMgdGhpcyAqLwotICAgICAgICNlbmRpZgotLWludCBtYWluKCkgewotK2ludAotK21haW4gKCkKLSt7Ci0gc3RydWN0IHsKLSAJRWxmNjRfVmVyZGVmIHZkOwotIAlFbGY2NF9WZXJkYXV4IHZkYTsKLSAJRWxmNjRfVmVybmVlZCB2bjsKLSAJRWxmNjRfVmVybmF1eCB2bmE7Ci0gICAgICAgfSB4Ci0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk2NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3ZfdmVyZGVmNjQ9eWVzCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgbGliZWxmX2N2X3ZlcmRlZjY0PW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlsaWJlbGZfY3ZfdmVyZGVmNjQ9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3ZlcmRlZjY0IiAxPiY2Ci0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJlbGZfY3ZfdmVyZGVmNjQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfY3ZfdmVyZGVmNjQiID4mNjsgfQotIAotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFNIVF9TVU5XX3ZlcmRlZiIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjE5ODI6IGNoZWNraW5nIGZvciBTSFRfU1VOV192ZXJkZWYiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJlbGZfY3Zfc3VuX3ZlcmRlZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFNIVF9TVU5XX3ZlcmRlZiIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgU0hUX1NVTldfdmVyZGVmLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7bGliZWxmX2N2X3N1bl92ZXJkZWYrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDE5ODcgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgX19MSUJFTEZfSEVBREVSX0VMRl9ICi0taW50IG1haW4oKSB7Ci0raW50Ci0rbWFpbiAoKQotK3sKLSBFbGYzMl9Xb3JkIHggPSBTSFRfU1VOV192ZXJkZWYgKyBTSFRfU1VOV192ZXJuZWVkICsgU0hUX1NVTldfdmVyc3ltCi0tOyByZXR1cm4gMDsgfQotLUVPRgotLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk5NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLStpZiB7IChhY190cnk9IiRhY19jb21waWxlIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gICBsaWJlbGZfY3Zfc3VuX3ZlcmRlZj15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBsaWJlbGZfY3Zfc3VuX3ZlcmRlZj1ubwotLWZpCi0tcm0gLWYgY29uZnRlc3QqCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJbGliZWxmX2N2X3N1bl92ZXJkZWY9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X3N1bl92ZXJkZWYiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl9zdW5fdmVyZGVmIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2N2X3N1bl92ZXJkZWYiID4mNjsgfQotIAotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFNIVF9HTlVfdmVyZGVmIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjAwOTogY2hlY2tpbmcgZm9yIFNIVF9HTlVfdmVyZGVmIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X2dudV92ZXJkZWYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBTSFRfR05VX3ZlcmRlZiIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgU0hUX0dOVV92ZXJkZWYuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3ZfZ251X3ZlcmRlZitzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjAxNCAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSBfX0xJQkVMRl9IRUFERVJfRUxGX0gKLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIEVsZjMyX1dvcmQgeCA9IFNIVF9HTlVfdmVyZGVmICsgU0hUX0dOVV92ZXJuZWVkICsgU0hUX0dOVV92ZXJzeW0KLS07IHJldHVybiAwOyB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0tICBybSAtcmYgY29uZnRlc3QqCi0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgIGxpYmVsZl9jdl9nbnVfdmVyZGVmPXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGxpYmVsZl9jdl9nbnVfdmVyZGVmPW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwlsaWJlbGZfY3ZfZ251X3ZlcmRlZj1ubwotIGZpCi0gCi0tZWNobyAiJGFjX3QiIiRsaWJlbGZfY3ZfZ251X3ZlcmRlZiIgMT4mNgotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2N2X2dudV92ZXJkZWYiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfY3ZfZ251X3ZlcmRlZiIgPiY2OyB9Ci0gZWxzZQotICAgIyBsaWIvZWxmX3JlcGwuaCBzdXBwb3J0cyA2NC1iaXQKLSAgIGxpYmVsZl82NGJpdD15ZXMKLUBAIC0yMDQxLDEyICs3MDA3LDEyIEBAIGVsc2UKLSAgIGxpYmVsZl9jdl9nbnVfdmVyZGVmPXllcwotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIDY0LWJpdCBpbnRlZ2VyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjA0NjogY2hlY2tpbmcgZm9yIDY0LWJpdCBpbnRlZ2VyIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X2ludDY0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIDY0LWJpdCBpbnRlZ2VyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciA2NC1iaXQgaW50ZWdlci4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2xpYmVsZl9jdl9pbnQ2NCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAKLSsKLSAgIGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgPSA4OyB0aGVuCi0gICAgIGxpYmVsZl9jdl9pbnQ2ND0nbG9uZycKLSAgIGVsaWYgdGVzdCAiJGFjX2N2X3NpemVvZl9fX2ludDY0IiA9IDg7IHRoZW4KLUBAIC0yMDU3LDI3ICs3MDIzLDI3IEBAIGVsc2UKLSAgICAgbGliZWxmX2N2X2ludDY0PW5vCi0gICBmaQotIGZpCi0tCi0tZWNobyAiJGFjX3QiIiRsaWJlbGZfY3ZfaW50NjQiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJlbGZfY3ZfaW50NjQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfY3ZfaW50NjQiID4mNjsgfQotIGlmIHRlc3QgIiRsaWJlbGZfY3ZfaW50NjQiID0gbm87IHRoZW4KLSAgIGxpYmVsZl82NGJpdD1ubwotIGVsc2UKLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0gI2RlZmluZSBfX2xpYmVsZl9pNjRfdCAkbGliZWxmX2N2X2ludDY0Ci0tRU9GCi0rX0FDRU9GCi0gCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgX19saWJlbGZfdTY0X3QgdW5zaWduZWQgJGxpYmVsZl9jdl9pbnQ2NAotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIDMyLWJpdCBpbnRlZ2VyIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjA3NzogY2hlY2tpbmcgZm9yIDMyLWJpdCBpbnRlZ2VyIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliZWxmX2N2X2ludDMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIDMyLWJpdCBpbnRlZ2VyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAzMi1iaXQgaW50ZWdlci4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2xpYmVsZl9jdl9pbnQzMitzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAKLSsKLSAgIGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfaW50IiA9IDQ7IHRoZW4KLSAgICAgbGliZWxmX2N2X2ludDMyPSdpbnQnCi0gICBlbGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgPSA0OyB0aGVuCi1AQCAtMjA4NiwyNyArNzA1MiwyOSBAQCBlbHNlCi0gICAgIGxpYmVsZl9jdl9pbnQzMj1ubwotICAgZmkKLSBmaQotLQotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X2ludDMyIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2N2X2ludDMyIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2N2X2ludDMyIiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX2N2X2ludDMyIiA9IG5vOyB0aGVuCi0tICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5laXRoZXIgaW50IG5vciBsb25nIGlzIDMyLWJpdCIgMT4mMjsgZXhpdCAxOyB9Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBuZWl0aGVyIGludCBub3IgbG9uZyBpcyAzMi1iaXQiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IG5laXRoZXIgaW50IG5vciBsb25nIGlzIDMyLWJpdCIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBlbHNlCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgX19saWJlbGZfaTMyX3QgJGxpYmVsZl9jdl9pbnQzMgotLUVPRgotK19BQ0VPRgotIAotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIF9fbGliZWxmX3UzMl90IHVuc2lnbmVkICRsaWJlbGZfY3ZfaW50MzIKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAxNi1iaXQgaW50ZWdlciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIxMDY6IGNoZWNraW5nIGZvciAxNi1iaXQgaW50ZWdlciIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmVsZl9jdl9pbnQxNicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAxNi1iaXQgaW50ZWdlciIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgMTYtYml0IGludGVnZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHtsaWJlbGZfY3ZfaW50MTYrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgCi0rCi0gICBpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA9IDI7IHRoZW4KLSAgICAgbGliZWxmX2N2X2ludDE2PSdzaG9ydCcKLSAgIGVsaWYgdGVzdCAiJGFjX2N2X3NpemVvZl9pbnQiID0gMjsgdGhlbgotQEAgLTIxMTUsMTI3ICs3MDgzLDI3NSBAQCBlbHNlCi0gICAgIGxpYmVsZl9jdl9pbnQxNj1ubwotICAgZmkKLSBmaQotLQotLWVjaG8gIiRhY190IiIkbGliZWxmX2N2X2ludDE2IiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2N2X2ludDE2IiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2N2X2ludDE2IiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX2N2X2ludDE2IiA9IG5vOyB0aGVuCi0tICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5laXRoZXIgc2hvcnQgbm9yIGludCBpcyAxNi1iaXQiIDE+JjI7IGV4aXQgMTsgfQotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbmVpdGhlciBzaG9ydCBub3IgaW50IGlzIDE2LWJpdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogbmVpdGhlciBzaG9ydCBub3IgaW50IGlzIDE2LWJpdCIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSBlbHNlCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotICNkZWZpbmUgX19saWJlbGZfaTE2X3QgJGxpYmVsZl9jdl9pbnQxNgotLUVPRgotK19BQ0VPRgotIAotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSAjZGVmaW5lIF9fbGliZWxmX3UxNl90IHVuc2lnbmVkICRsaWJlbGZfY3ZfaW50MTYKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLSsKLSsKLStmb3IgYWNfaGVhZGVyIGluIHN0ZGxpYi5oIHVuaXN0ZC5oCi0gZG8KLS1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLS1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjIxMzg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi0raWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLStmaQotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjE0MyAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLSNpbmNsdWRlIDwkYWNfaGRyPgotLUVPRgotLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi0teyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLS1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLSsgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSsjaW5jbHVkZSA8JGFjX2hlYWRlcj4KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotIGVsc2UKLS0gIGVjaG8gIiRhY19lcnIiID4mNQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCWFjX2hlYWRlcl9jb21waWxlcj1ubwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0rCi0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLSsKLSsjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci0rY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSsjaW5jbHVkZSA8JGFjX2hlYWRlcj4KLStfQUNFT0YKLStpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH07IHRoZW4KLSsgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotK2Vsc2UKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLSBmaQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0tICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0tI2RlZmluZSAkYWNfdHJfaGRyIDEKLS1FT0YKLS0gCi0rCi0rcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLSsKLSsjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLStjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0rICB5ZXM6bm86ICkKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0rICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotKyAgICA7OwotKyAgbm86eWVzOiogKQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0rCi0rICAgIDs7Ci0rZXNhYwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0rICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi0rZmkKLSthY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLSsJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci0rCi0rZmkKLStpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLStfQUNFT0YKLSsKLSBmaQotKwotIGRvbmUKLSAKLSsKLSBmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotIGRvCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjE3NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyMTgyICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0rCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLS0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0tLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0tICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0tY2hhciAkYWNfZnVuYygpOwotKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSsgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotIAotLWludCBtYWluKCkgewotKyNpZmRlZiBfX1NURENfXwotKyMgaW5jbHVkZSA8bGltaXRzLmg+Ci0rI2Vsc2UKLSsjIGluY2x1ZGUgPGFzc2VydC5oPgotKyNlbmRpZgotKwotKyN1bmRlZiAkYWNfZnVuYwotIAotKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIgotKyNlbmRpZgotK2NoYXIgJGFjX2Z1bmMgKCk7Ci0gLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLS0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLSsjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotIGNob2tlIG1lCi0tI2Vsc2UKLS0kYWNfZnVuYygpOwotICNlbmRpZgotIAotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0raW50Ci0rbWFpbiAoKQotK3sKLStyZXR1cm4gJGFjX2Z1bmMgKCk7Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLStpZiB7IChhY190cnk9IiRhY19saW5rIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSsgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSsgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0rICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLStpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0rX0FDRU9GCi0gCi0taWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0tICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0tI2RlZmluZSAkYWNfdHJfZnVuYyAxCi0tRU9GCi0tIAotLWVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGZpCi0gZG9uZQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyMjMwOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjIzOCAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSskYWNfaW5jbHVkZXNfZGVmYXVsdAotKy8qIG1hbGxvYyBtaWdodCBoYXZlIGJlZW4gcmVuYW1lZCBhcyBycGxfbWFsbG9jLiAqLwotKyN1bmRlZiBtYWxsb2MKLSAKLSAvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLUBAIC0yMjQ5LDI1ICs3MzY1LDI1IEBAIGVsc2UKLSAgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKLSAgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0tICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0rICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0gCi0gICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSsKLSAjaW5jbHVkZSA8ZmNudGwuaD4KLSAjaW5jbHVkZSA8c3lzL21tYW4uaD4KLSAKLSsjaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmICFkZWZpbmVkIEhBVkVfU1RETElCX0gKLStjaGFyICptYWxsb2MgKCk7Ci0rI2VuZGlmCi0rCi0gLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotICNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotLSMgaWZkZWYgSEFWRV9VTklTVERfSAotLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotLSMgZW5kaWYKLS0KLSAvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotICMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSAjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi1AQCAtMjMwMywyMjkgKzc0MTksMzI4IEBAIGVsc2UKLSAKLSAjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotIAotLSNpZmRlZiBfX2NwbHVzcGx1cwotLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0tI2Vsc2UKLS1jaGFyICptYWxsb2MoKTsKLS0jZW5kaWYKLS0KLSBpbnQKLS1tYWluKCkKLSttYWluICgpCi0gewotLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLS0JaW50IGksIHBhZ2VzaXplOwotLQlpbnQgZmQ7Ci0rICBjaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLSsgIGludCBpLCBwYWdlc2l6ZTsKLSsgIGludCBmZDsKLSAKLS0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotKyAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKLSAKLS0JLyoKLS0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotLQkgKi8KLS0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0tCWlmICghZGF0YSkKLS0JCWV4aXQoMSk7Ci0tCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0tCXVtYXNrKDApOwotLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLS0JaWYgKGZkIDwgMCkKLS0JCWV4aXQoMSk7Ci0tCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotLQkJZXhpdCgxKTsKLS0JY2xvc2UoZmQpOwotKyAgLyogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLwotKyAgZGF0YSA9IChjaGFyICopIG1hbGxvYyAocGFnZXNpemUpOwotKyAgaWYgKCFkYXRhKQotKyAgICByZXR1cm4gMTsKLSsgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotKyAgICAqKGRhdGEgKyBpKSA9IHJhbmQgKCk7Ci0rICB1bWFzayAoMCk7Ci0rICBmZCA9IGNyZWF0ICgiY29uZnRlc3QubW1hcCIsIDA2MDApOwotKyAgaWYgKGZkIDwgMCkKLSsgICAgcmV0dXJuIDE7Ci0rICBpZiAod3JpdGUgKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0rICAgIHJldHVybiAxOwotKyAgY2xvc2UgKGZkKTsKLSAKLS0JLyoKLS0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0tCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLS0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLS0JICovCi0tCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLS0JaWYgKGZkIDwgMCkKLS0JCWV4aXQoMSk7Ci0tCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0tCWlmICghZGF0YTIpCi0tCQlleGl0KDEpOwotLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0tCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLS0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotLQkJZXhpdCgxKTsKLS0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0tCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotLQkJCWV4aXQoMSk7Ci0rICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKLSsgICAgIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwgYWxzbyBtYWtlIHN1cmUgdGhhdAotKyAgICAgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuICAqLwotKyAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRXUik7Ci0rICBpZiAoZmQgPCAwKQotKyAgICByZXR1cm4gMTsKLSsgIGRhdGEyID0gKGNoYXIgKikgbWFsbG9jICgyICogcGFnZXNpemUpOwotKyAgaWYgKCFkYXRhMikKLSsgICAgcmV0dXJuIDE7Ci0rICBkYXRhMiArPSAocGFnZXNpemUgLSAoKGxvbmcgaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLSsgIGlmIChkYXRhMiAhPSBtbWFwIChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0rCQkgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotKyAgICByZXR1cm4gMTsKLSsgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotKyAgICAgIHJldHVybiAxOwotIAotLQkvKgotLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0tCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotLQkgKi8KLS0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0tCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0tCWlmICghZGF0YTMpCi0tCQlleGl0KDEpOwotLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLS0JCWV4aXQoMSk7Ci0tCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLS0JCQlleGl0KDEpOwotLQljbG9zZShmZCk7Ci0tCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0tCWV4aXQoMCk7Ci0rICAvKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYSBkbyBub3QKLSsgICAgIHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLiAgKFRoaXMgaXMgYSBidWcgb24KLSsgICAgIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKSAgKi8KLSsgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotKyAgICAqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotKyAgZGF0YTMgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKLSsgIGlmICghZGF0YTMpCi0rICAgIHJldHVybiAxOwotKyAgaWYgKHJlYWQgKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotKyAgICByZXR1cm4gMTsKLSsgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotKyAgICAgIHJldHVybiAxOwotKyAgY2xvc2UgKGZkKTsKLSsgIHJldHVybiAwOwotIH0KLS0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLS10aGVuCi0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1mciBjb25mdGVzdCoKLS0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSsgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0rZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rKCBleGl0ICRhY19zdGF0dXMgKQotK2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLSBmaQotLXJtIC1mciBjb25mdGVzdCoKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWZpCi0gCi0tZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY2OyB9Ci0gaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rCi0rY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEhBVkVfTU1BUCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLStybSAtZiBjb25mdGVzdC5tbWFwCi0rCi0rCi0rCi0rCi0gCi0gZm9yIGFjX2Z1bmMgaW4gZnRydW5jYXRlIG1lbWNtcCBtZW1jcHkgbWVtbW92ZQotIGRvCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjQwMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNDA4ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0rCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLS0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0tLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0tICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0tY2hhciAkYWNfZnVuYygpOwotKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSsgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotIAotLWludCBtYWluKCkgewotKyNpZmRlZiBfX1NURENfXwotKyMgaW5jbHVkZSA8bGltaXRzLmg+Ci0rI2Vsc2UKLSsjIGluY2x1ZGUgPGFzc2VydC5oPgotKyNlbmRpZgotKwotKyN1bmRlZiAkYWNfZnVuYwotIAotKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIgotKyNlbmRpZgotK2NoYXIgJGFjX2Z1bmMgKCk7Ci0gLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLS0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLSsjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotIGNob2tlIG1lCi0tI2Vsc2UKLS0kYWNfZnVuYygpOwotICNlbmRpZgotIAotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0raW50Ci0rbWFpbiAoKQotK3sKLStyZXR1cm4gJGFjX2Z1bmMgKCk7Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLStpZiB7IChhY190cnk9IiRhY19saW5rIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSsgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSsgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0rICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLStpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0rX0FDRU9GCi0gCi0taWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0tICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0tI2RlZmluZSAkYWNfdHJfZnVuYyAxCi0tRU9GCi0tIAotLWVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotIGZpCi0gZG9uZQotIAotKwotIGZvciBhY19mdW5jIGluIG1lbXNldAotIGRvCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjQ1ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNDYzICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0rCi0gLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLS0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0tLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0tICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0tY2hhciAkYWNfZnVuYygpOwotKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSsgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotIAotLWludCBtYWluKCkgewotKyNpZmRlZiBfX1NURENfXwotKyMgaW5jbHVkZSA8bGltaXRzLmg+Ci0rI2Vsc2UKLSsjIGluY2x1ZGUgPGFzc2VydC5oPgotKyNlbmRpZgotKwotKyN1bmRlZiAkYWNfZnVuYwotIAotKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rZXh0ZXJuICJDIgotKyNlbmRpZgotK2NoYXIgJGFjX2Z1bmMgKCk7Ci0gLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLS0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLSsjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotIGNob2tlIG1lCi0tI2Vsc2UKLS0kYWNfZnVuYygpOwotICNlbmRpZgotIAotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi0raW50Ci0rbWFpbiAoKQotK3sKLStyZXR1cm4gJGFjX2Z1bmMgKCk7Ci0rICA7Ci0rICByZXR1cm4gMDsKLSt9Ci0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLStpZiB7IChhY190cnk9IiRhY19saW5rIgotK2Nhc2UgIigoJGFjX3RyeSIgaW4KLSsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci0rZXNhYwotK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0rICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotKyAgcm0gLWYgY29uZnRlc3QuZXIxCi0rICBjYXQgY29uZnRlc3QuZXJyID4mNQotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0rCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0rICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSsgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSsgIGV2YWwgIiRhc19hY192YXI9eWVzIgotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLSBmaQotLXJtIC1mIGNvbmZ0ZXN0KgotKwotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0rICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLStpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0rI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi0rX0FDRU9GCi0gCi0taWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0tICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0tI2RlZmluZSAkYWNfdHJfZnVuYyAxCi0tRU9GCi0tIAotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotLUxJQk9CSlM9IiRMSUJPQkpTICR7YWNfZnVuY30uJHthY19vYmpleHR9IgotKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSsgICoiICRhY19mdW5jLiRhY19vYmpleHQgIiogKSA7OwotKyAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIKLSsgOzsKLStlc2FjCi0rCi0gZmkKLSBkb25lCi0gCi0gCi0gaWYgdGVzdCAiJGFjX2N2X2Z1bmNfbWVtc2V0IiA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgSEFWRV9NRU1TRVQgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBvdmVybGFwcGluZyBhcnJheXMgYXJlIGNvcGllZCBjb3JyZWN0bHkiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNTIwOiBjaGVja2luZyB3aGV0aGVyIG92ZXJsYXBwaW5nIGFycmF5cyBhcmUgY29waWVkIGNvcnJlY3RseSIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmVsZl9jdl93b3JraW5nX21lbW1vdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIG92ZXJsYXBwaW5nIGFycmF5cyBhcmUgY29waWVkIGNvcnJlY3RseSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIG92ZXJsYXBwaW5nIGFycmF5cyBhcmUgY29waWVkIGNvcnJlY3RseS4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2xpYmVsZl9jdl93b3JraW5nX21lbW1vdmUrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgIGxpYmVsZl9jdl93b3JraW5nX21lbW1vdmU9J21heWJlIG5vdCcKLSBlbHNlCi0tICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjUyOCAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAjaWYgSEFWRV9NRU1NT1ZFCi0gZXh0ZXJuIHZvaWQgKm1lbW1vdmUoKTsKLUBAIC0yNTQwLDEwOCArNzc1NSwxMzEgQEAgbWFpbigpIHsKLSAgIGlmIChzdHJjbXAoYnVmLCAiMDAxMjM0NTY3OCIpKSBleGl0KDEpOwotICAgZXhpdCgwKTsKLSB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi0tdGhlbgotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGluayIpIDI+JjUKLSsgIGFjX3N0YXR1cz0kPwotKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfdHJ5IikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICAgICAgIGxpYmVsZl9jdl93b3JraW5nX21lbW1vdmU9eWVzCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLWZyIGNvbmZ0ZXN0KgotLSAgbGliZWxmX2N2X3dvcmtpbmdfbWVtbW92ZT1ubwotKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLStlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsoIGV4aXQgJGFjX3N0YXR1cyApCi0rbGliZWxmX2N2X3dvcmtpbmdfbWVtbW92ZT1ubwotIGZpCi0tcm0gLWZyIGNvbmZ0ZXN0KgotK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotIGZpCi0gCi0tZmkKLSAKLS1lY2hvICIkYWNfdCIiJGxpYmVsZl9jdl93b3JraW5nX21lbW1vdmUiIDE+JjYKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9jdl93b3JraW5nX21lbW1vdmUiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfY3Zfd29ya2luZ19tZW1tb3ZlIiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX2N2X3dvcmtpbmdfbWVtbW92ZSIgIT0geWVzOyB0aGVuCi0tICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX0JST0tFTl9NRU1NT1ZFIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIHRoZSBjb2ZmZWUgbWFjaGluZSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI1Njg6IGNoZWNraW5nIHRoZSBjb2ZmZWUgbWFjaGluZSIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J21yX2N2X2NvZmZlZV9tYWNoaW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdGhlIGNvZmZlZSBtYWNoaW5lIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIHRoZSBjb2ZmZWUgbWFjaGluZS4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke21yX2N2X2NvZmZlZV9tYWNoaW5lK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIG1yX2N2X2NvZmZlZV9tYWNoaW5lPSdlbXB0eSAtIG9wZXJhdG9yIG1heSBub3Qgd29yayBhcyBleHBlY3RlZCcKLSBmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2N2X2NvZmZlZV9tYWNoaW5lIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbXJfY3ZfY29mZmVlX21hY2hpbmUiID4mNjsgfQotIAotLWVjaG8gIiRhY190IiIkbXJfY3ZfY29mZmVlX21hY2hpbmUiIDE+JjYKLS0KLS1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIDY0LWJpdCBFTEYgc3VwcG9ydCBpcyBzdWZmaWNpZW50IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjU3ODogY2hlY2tpbmcgd2hldGhlciA2NC1iaXQgRUxGIHN1cHBvcnQgaXMgc3VmZmljaWVudCIgPiY1Ci0tZWNobyAiJGFjX3QiIiRsaWJlbGZfNjRiaXQiIDE+JjYKLS1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgNjQtYml0IHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyNTgxOiBjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgNjQtYml0IHN1cHBvcnQiID4mNQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgNjQtYml0IEVMRiBzdXBwb3J0IGlzIHN1ZmZpY2llbnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciA2NC1iaXQgRUxGIHN1cHBvcnQgaXMgc3VmZmljaWVudC4uLiAkRUNIT19DIiA+JjY7IH0KLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJlbGZfNjRiaXQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfNjRiaXQiID4mNjsgfQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSA2NC1iaXQgc3VwcG9ydCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgNjQtYml0IHN1cHBvcnQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gaWYgdGVzdCAiJGxpYmVsZl82NGJpdCIgPSBubzsgdGhlbgotICAgbGliZWxmX2VuYWJsZV82NGJpdD1ubwotIGVsc2UKLS0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lbGY2NCBvciAtLWRpc2FibGUtZWxmNjQgd2FzIGdpdmVuLgotKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWVsZjY0IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke2VuYWJsZV9lbGY2NCtzZXR9IiA9IHNldDsgdGhlbgotLSAgZW5hYmxldmFsPSIkZW5hYmxlX2VsZjY0IgotLSAgbGliZWxmX2VuYWJsZV82NGJpdD0iJGVuYWJsZXZhbCIKLSsgIGVuYWJsZXZhbD0kZW5hYmxlX2VsZjY0OyBsaWJlbGZfZW5hYmxlXzY0Yml0PSIkZW5hYmxldmFsIgotIGVsc2UKLSAgIGxpYmVsZl9lbmFibGVfNjRiaXQ9eWVzCi0gZmkKLSAKLSBmaQotLWVjaG8gIiRhY190IiIkbGliZWxmX2VuYWJsZV82NGJpdCIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl9lbmFibGVfNjRiaXQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRsaWJlbGZfZW5hYmxlXzY0Yml0IiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX2VuYWJsZV82NGJpdCIgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIF9fTElCRUxGNjQgMQotLUVPRgotK19BQ0VPRgotIAotIGZpCi0gCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB2ZXJzaW9uaW5nIHN1cHBvcnQgaXMgc3VmZmljaWVudCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI2MDM6IGNoZWNraW5nIHdoZXRoZXIgdmVyc2lvbmluZyBzdXBwb3J0IGlzIHN1ZmZpY2llbnQiID4mNQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdmVyc2lvbmluZyBzdXBwb3J0IGlzIHN1ZmZpY2llbnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB2ZXJzaW9uaW5nIHN1cHBvcnQgaXMgc3VmZmljaWVudC4uLiAkRUNIT19DIiA+JjY7IH0KLSBsaWJlbGZfdmVyc2lvbmluZz1ubwotIGNhc2UgIiRsaWJlbGZfZW5hYmxlXzY0Yml0OiRsaWJlbGZfY3ZfdmVyZGVmMzI6JGxpYmVsZl9jdl92ZXJkZWY2NCIgaW4KLSAgIG5vOnllczoqIHwgeWVzOnllczp5ZXMpCi0gICAgIGlmIHRlc3QgIiRsaWJlbGZfY3Zfc3VuX3ZlcmRlZiIgPSB5ZXM7IHRoZW4KLS0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSsgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgX19MSUJFTEZfU1VOX1NZTUJPTF9WRVJTSU9OUyAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gICAgICAgbGliZWxmX3ZlcnNpb25pbmc9eWVzCi0gICAgIGVsaWYgdGVzdCAiJGxpYmVsZl9jdl9nbnVfdmVyZGVmIiA9IHllczsgdGhlbgotLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBfX0xJQkVMRl9HTlVfU1lNQk9MX1ZFUlNJT05TIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgICAgICBsaWJlbGZfdmVyc2lvbmluZz15ZXMKLSAgICAgZmk7OwotIGVzYWMKLS1lY2hvICIkYWNfdCIiJGxpYmVsZl92ZXJzaW9uaW5nIiAxPiY2Ci0tZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHZlcnNpb25pbmcgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI2MjM6IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSB2ZXJzaW9uaW5nIHN1cHBvcnQiID4mNQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxpYmVsZl92ZXJzaW9uaW5nIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX3ZlcnNpb25pbmciID4mNjsgfQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSB2ZXJzaW9uaW5nIHN1cHBvcnQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHZlcnNpb25pbmcgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX3ZlcnNpb25pbmciID0gbm87IHRoZW4KLSAgIGxpYmVsZl9lbmFibGVfdmVyc2lvbmluZz1ubwotIGVsc2UKLS0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12ZXJzaW9uaW5nIG9yIC0tZGlzYWJsZS12ZXJzaW9uaW5nIHdhcyBnaXZlbi4KLSsgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12ZXJzaW9uaW5nIHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke2VuYWJsZV92ZXJzaW9uaW5nK3NldH0iID0gc2V0OyB0aGVuCi0tICBlbmFibGV2YWw9IiRlbmFibGVfdmVyc2lvbmluZyIKLS0gIGxpYmVsZl9lbmFibGVfdmVyc2lvbmluZz0iJGVuYWJsZXZhbCIKLSsgIGVuYWJsZXZhbD0kZW5hYmxlX3ZlcnNpb25pbmc7IGxpYmVsZl9lbmFibGVfdmVyc2lvbmluZz0iJGVuYWJsZXZhbCIKLSBlbHNlCi0gICBsaWJlbGZfZW5hYmxlX3ZlcnNpb25pbmc9eWVzCi0gZmkKLSAKLSBmaQotLWVjaG8gIiRhY190IiIkbGliZWxmX2VuYWJsZV92ZXJzaW9uaW5nIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGliZWxmX2VuYWJsZV92ZXJzaW9uaW5nIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbGliZWxmX2VuYWJsZV92ZXJzaW9uaW5nIiA+JjY7IH0KLSBpZiB0ZXN0ICIkbGliZWxmX2VuYWJsZV92ZXJzaW9uaW5nIiA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgX19MSUJFTEZfU1lNQk9MX1ZFUlNJT05TIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotIAotLSAgCi0rCi0gCi0gICAjIE5lZWRlZCBmb3IgYG1ha2UgZGlzdCcgZXZlbiBpZiBOTFMgaXMgZGlzYWJsZWQuCi0gICBHTU9GSUxFUz0KLUBAIC0yNjUyLDI5MiArNzg5MCw0MTIgQEAgZmkKLSAgICAgTVNHRklMRVM9IiRNU0dGSUxFUyAkbXJfbGFuZy5tc2ciCi0gICAgIFBPRklMRVM9IiRQT0ZJTEVTICRtcl9sYW5nLnBvIgotICAgZG9uZQotLSAgCi0tICAKLS0gIAotIAotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjY2MTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLS0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi0rCi0rCi0rCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkLi4uICRFQ0hPX0MiID4mNjsgfQotKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0tICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotLSAgbXJfZW5hYmxlX25scz0iJGVuYWJsZXZhbCIKLSsgIGVuYWJsZXZhbD0kZW5hYmxlX25sczsgbXJfZW5hYmxlX25scz0iJGVuYWJsZXZhbCIKLSBlbHNlCi0gICBtcl9lbmFibGVfbmxzPXllcwotIGZpCi0gCi0tICBlY2hvICIkYWNfdCIiJG1yX2VuYWJsZV9ubHMiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2VuYWJsZV9ubHMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRtcl9lbmFibGVfbmxzIiA+JjY7IH0KLSAKLSAgIENBVE9CSkVYVD0KLSAgIElOU1RPQkpFWFQ9Ci0gICBsb2NhbGVkaXI9Ci0gICBpZiB0ZXN0ICIkbXJfZW5hYmxlX25scyIgPSB5ZXM7IHRoZW4KLSAgICAgbXJfUEFUSD1gZWNobyAiOiRQQVRIIiB8IHNlZCAtZSAncyw6Xjoqb3Blbndpbl46KiwsZycgLWUgJ3MsXjosLCdgCi0tICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkZ2V0dGV4dCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI2Nzg6IGNoZWNraW5nIGZvciBkZ2V0dGV4dCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J21yX2N2X2Z1bmNfZGdldHRleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRnZXR0ZXh0IiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkZ2V0dGV4dC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke21yX2N2X2Z1bmNfZGdldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgCi0tCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyNjg0ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0rCi0rCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPGxpYmludGwuaD4KLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIGNoYXIgKnMgPSBkZ2V0dGV4dCgiIiwgIiIpOyByZXR1cm4gMAotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0rICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICBtcl9jdl9mdW5jX2RnZXR0ZXh0PXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIG1yX2N2X2Z1bmNfZGdldHRleHQ9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotLSAgICAKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwltcl9jdl9mdW5jX2RnZXR0ZXh0PW5vCi0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJG1yX2N2X2Z1bmNfZGdldHRleHQiIDE+JjYKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rCi0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtcl9jdl9mdW5jX2RnZXR0ZXh0IiA+JjUKLStlY2hvICIke0VDSE9fVH0kbXJfY3ZfZnVuY19kZ2V0dGV4dCIgPiY2OyB9Ci0gICAgIGlmIHRlc3QgIiRtcl9jdl9mdW5jX2RnZXR0ZXh0IiA9IHllczsgdGhlbgotICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MjcwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9NU0dGTVQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLS0gIC8qKQotKyAgY2FzZSAkTVNHRk1UIGluCi0rICBbXFwvXSogfCA/OltcXC9dKikKLSAgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgIDs7Ci0tICA/Oi8qKQkJCSAKLS0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0tICA7OwotICAgKikKLS0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0tICBhY19kdW1teT0iJG1yX1BBVEgiCi0tICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotLSAgICAgIGJyZWFrCi0tICAgIGZpCi0tICBkb25lCi0tICBJRlM9IiRhY19zYXZlX2lmcyIKLSsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRtcl9QQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSsgICAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSAgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICAgOzsKLSBlc2FjCi0gZmkKLS1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLStNU0dGTVQ9JGFjX2N2X3BhdGhfTVNHRk1UCi0gaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNU0dGTVQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRNU0dGTVQiID4mNjsgfQotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotIGZpCi0gCi0rCi0gICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gbm87IHRoZW4KLSAJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI3NDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX0dNU0dGTVQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0tICAvKikKLSsgIGNhc2UgJEdNU0dGTVQgaW4KLSsgIFtcXC9dKiB8ID86W1xcL10qKQotICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICA7OwotLSAgPzovKikJCQkgCi0tICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0tICA7OwotICAgKikKLS0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0tICBhY19kdW1teT0iJG1yX1BBVEgiCi0tICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICAgICBicmVhawotLSAgICBmaQotLSAgZG9uZQotLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0rICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkbXJfUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICAgOzsKLSBlc2FjCi0gZmkKLS1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotK0dNU0dGTVQ9JGFjX2N2X3BhdGhfR01TR0ZNVAotIGlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRHTVNHRk1UIiA+JjUKLStlY2hvICIke0VDSE9fVH0kR01TR0ZNVCIgPiY2OyB9Ci0gZWxzZQotLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLStlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gZmkKLSAKLSsKLSAJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjc4MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX1hHRVRURVhUK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLS0gIC8qKQotKyAgY2FzZSAkWEdFVFRFWFQgaW4KLSsgIFtcXC9dKiB8ID86W1xcL10qKQotICAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgIDs7Ci0tICA/Oi8qKQkJCSAKLS0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotLSAgOzsKLSAgICopCi0tICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotLSAgYWNfZHVtbXk9IiRtcl9QQVRIIgotLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLS0gICAgICBhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotLSAgICAgIGJyZWFrCi0tICAgIGZpCi0tICBkb25lCi0tICBJRlM9IiRhY19zYXZlX2lmcyIKLSsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRtcl9QQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSsgICAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9InhnZXR0ZXh0IgotICAgOzsKLSBlc2FjCi0gZmkKLS1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi0rWEdFVFRFWFQ9JGFjX2N2X3BhdGhfWEdFVFRFWFQKLSBpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRYR0VUVEVYVCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JFhHRVRURVhUIiA+JjY7IH0KLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSBmaQotIAotKwotIAkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ21lcmdlIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLSBzZXQgZHVtbXkgbXNnbWVyZ2U7IGFjX3dvcmQ9JDIKLS1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyODE4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR01FUkdFJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTVNHTUVSR0Urc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2FzZSAiJE1TR01FUkdFIiBpbgotLSAgLyopCi0rICBjYXNlICRNU0dNRVJHRSBpbgotKyAgW1xcL10qIHwgPzpbXFwvXSopCi0gICBhY19jdl9wYXRoX01TR01FUkdFPSIkTVNHTUVSR0UiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICAgOzsKLS0gID86LyopCQkJIAotLSAgYWNfY3ZfcGF0aF9NU0dNRVJHRT0iJE1TR01FUkdFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0tICA7OwotICAgKikKLS0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0tICBhY19kdW1teT0iJG1yX1BBVEgiCi0tICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGFjX2N2X3BhdGhfTVNHTUVSR0U9IiRhY19kaXIvJGFjX3dvcmQiCi0tICAgICAgYnJlYWsKLS0gICAgZmkKLS0gIGRvbmUKLS0gIElGUz0iJGFjX3NhdmVfaWZzIgotKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJG1yX1BBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotKyAgICBhY19jdl9wYXRoX01TR01FUkdFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotK2RvbmUKLStJRlM9JGFzX3NhdmVfSUZTCi0rCi0gICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dNRVJHRSIgJiYgYWNfY3ZfcGF0aF9NU0dNRVJHRT0ibXNnbWVyZ2UiCi0gICA7OwotIGVzYWMKLSBmaQotLU1TR01FUkdFPSIkYWNfY3ZfcGF0aF9NU0dNRVJHRSIKLStNU0dNRVJHRT0kYWNfY3ZfcGF0aF9NU0dNRVJHRQotIGlmIHRlc3QgLW4gIiRNU0dNRVJHRSI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiIkTVNHTUVSR0UiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1TR01FUkdFIiA+JjUKLStlY2hvICIke0VDSE9fVH0kTVNHTUVSR0UiID4mNjsgfQotIGVsc2UKLS0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotIGZpCi0gCi0tCWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI4NTI6IGNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J21yX2N2X2dudV9nZXR0ZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0rCi0rCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBHTlUgZ2V0dGV4dCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgR05VIGdldHRleHQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHttcl9jdl9nbnVfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAKLS0JICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLS0jbGluZSAyODU4ICJjb25maWd1cmUiCi0tI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0gCi0taW50IG1haW4oKSB7Ci0rCSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKwotK2ludAotK21haW4gKCkKLSt7Ci0gZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOyByZXR1cm4gX25sX21zZ19jYXRfY250cgotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0rICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICBtcl9jdl9nbnVfZ2V0dGV4dD15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBtcl9jdl9nbnVfZ2V0dGV4dD1ubwotLWZpCi0tcm0gLWYgY29uZnRlc3QqCi0tCQotKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rCW1yX2N2X2dudV9nZXR0ZXh0PW5vCi0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJG1yX2N2X2dudV9nZXR0ZXh0IiAxPiY2Ci0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSsgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotKwotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbXJfY3ZfZ251X2dldHRleHQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRtcl9jdl9nbnVfZ2V0dGV4dCIgPiY2OyB9Ci0gCWlmIHRlc3QgIiRtcl9jdl9nbnVfZ2V0dGV4dCIgPSB5ZXM7IHRoZW4KLS0JICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9zaW5nIGNhdGdldHMtYmFzZWQgR05VIGdldHRleHQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZToyODgxOiBjaGVja2luZyBmb3IgbG9zaW5nIGNhdGdldHMtYmFzZWQgR05VIGdldHRleHQiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydtcl9jdl9jYXRnZXRzX2Jhc2VkX2dldHRleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsJICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9zaW5nIGNhdGdldHMtYmFzZWQgR05VIGdldHRleHQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvc2luZyBjYXRnZXRzLWJhc2VkIEdOVSBnZXR0ZXh0Li4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7bXJfY3ZfY2F0Z2V0c19iYXNlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIAotLQkgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0tI2xpbmUgMjg4NyAiY29uZmlndXJlIgotLSNpbmNsdWRlICJjb25mZGVmcy5oIgotIAotLWludCBtYWluKCkgewotKwkgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotKwotK2ludAotK21haW4gKCkKLSt7Ci0gZXh0ZXJuIGludCBfbXNnX3RibF9sZW5ndGg7IHJldHVybiBfbXNnX3RibF9sZW5ndGgKLS07IHJldHVybiAwOyB9Ci0tRU9GCi0taWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLS0gIHJtIC1yZiBjb25mdGVzdCoKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICAgbXJfY3ZfY2F0Z2V0c19iYXNlZF9nZXR0ZXh0PXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIG1yX2N2X2NhdGdldHNfYmFzZWRfZ2V0dGV4dD1ubwotLWZpCi0tcm0gLWYgY29uZnRlc3QqCi0tCSAgCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJbXJfY3ZfY2F0Z2V0c19iYXNlZF9nZXR0ZXh0PW5vCi0gZmkKLSAKLS1lY2hvICIkYWNfdCIiJG1yX2N2X2NhdGdldHNfYmFzZWRfZ2V0dGV4dCIgMT4mNgotK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0rICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSsKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2N2X2NhdGdldHNfYmFzZWRfZ2V0dGV4dCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JG1yX2N2X2NhdGdldHNfYmFzZWRfZ2V0dGV4dCIgPiY2OyB9Ci0gCSAgaWYgdGVzdCAiJG1yX2N2X2NhdGdldHNfYmFzZWRfZ2V0dGV4dCIgPSB5ZXM7IHRoZW4KLSAJICAgICMgVGhpcyBsb3NlcyBjb21wbGV0ZWx5LiBUdXJuIGl0IG9mZiBhbmQgdXNlIGNhdGdldHMuCi0gCSAgICBMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLC1saW50bCwsZydgCi0gCSAgICBtcl9jdl9mdW5jX2RnZXR0ZXh0PW5vCi0gCSAgZWxzZQotIAkgICAgIyBJcyB0aGVyZSBhIGJldHRlciB0ZXN0IGZvciB0aGlzIGNhc2U/Ci0tCSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHVyZSBHTlUgZ2V0dGV4dCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjI5MTU6IGNoZWNraW5nIGZvciBwdXJlIEdOVSBnZXR0ZXh0IiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbXJfY3ZfcHVyZV9nbnVfZ2V0dGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotKwkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB1cmUgR05VIGdldHRleHQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB1cmUgR05VIGdldHRleHQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHttcl9jdl9wdXJlX2dudV9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIAotLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDI5MjEgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSAKLS1pbnQgbWFpbigpIHsKLSsJCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0rCi0raW50Ci0rbWFpbiAoKQotK3sKLSBleHRlcm4gaW50IGdldHRleHQoKTsgcmV0dXJuIGdldHRleHQoKQotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0rICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICBtcl9jdl9wdXJlX2dudV9nZXR0ZXh0PXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1yZiBjb25mdGVzdCoKLS0gIG1yX2N2X3B1cmVfZ251X2dldHRleHQ9bm8KLS1maQotLXJtIC1mIGNvbmZ0ZXN0KgotLQkgICAgCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJbXJfY3ZfcHVyZV9nbnVfZ2V0dGV4dD1ubwotIGZpCi0gCi0tZWNobyAiJGFjX3QiIiRtcl9jdl9wdXJlX2dudV9nZXR0ZXh0IiAxPiY2Ci0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSsgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotKwotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbXJfY3ZfcHVyZV9nbnVfZ2V0dGV4dCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JG1yX2N2X3B1cmVfZ251X2dldHRleHQiID4mNjsgfQotIAkgICAgaWYgdGVzdCAiJG1yX2N2X3B1cmVfZ251X2dldHRleHQiID0geWVzOyB0aGVuCi0gCSAgICAgIENBVE9CSkVYVD0uZ21vCi0gCSAgICAgIGxvY2FsZWRpcj0nJChwcmVmaXgpL3NoYXJlL2xvY2FsZScKLUBAIC0yOTU5LDE3MiArODMxNywyMTMgQEAgZWNobyAiJGFjX3QiIiRtcl9jdl9wdXJlX2dudV9nZXR0ZXh0IiAxPgotICAgICAgIGZpCi0gICAgIGZpCi0gICAgIGlmIHRlc3QgIiRtcl9jdl9mdW5jX2RnZXR0ZXh0IiA9IHllczsgdGhlbgotLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX0RHRVRURVhUIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgICAgZWxzZQotLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRnZXRzIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6Mjk2OTogY2hlY2tpbmcgZm9yIGNhdGdldHMiID4mNQotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydtcl9jdl9mdW5jX2NhdGdldHMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgY2F0Z2V0cyIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgY2F0Z2V0cy4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke21yX2N2X2Z1bmNfY2F0Z2V0cytzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICAKLS0JY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDI5NzUgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsKLSsJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogY29uZmRlZnMuaC4gICovCi0rX0FDRU9GCi0rY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci0rY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAjaW5jbHVkZSA8bmxfdHlwZXMuaD4KLS1pbnQgbWFpbigpIHsKLStpbnQKLSttYWluICgpCi0rewotIGNhdGdldHMoY2F0b3BlbigiIiwwKSwwLDAsIiIpO3JldHVybiAwOwotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotKyAgOwotKyAgcmV0dXJuIDA7Ci0rfQotK19BQ0VPRgotK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSsgIGFjX3N0YXR1cz0kPwotKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSsgIHJtIC1mIGNvbmZ0ZXN0LmVyMQotKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLSsJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0rICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gICBtcl9jdl9mdW5jX2NhdGdldHM9eWVzCi0gZWxzZQotLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLS0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgbXJfY3ZfZnVuY19jYXRnZXRzPW5vCi0tZmkKLS1ybSAtZiBjb25mdGVzdCoKLS0gICAgICAKLSsgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0rc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotKwotKwltcl9jdl9mdW5jX2NhdGdldHM9bm8KLSBmaQotIAotLWVjaG8gIiRhY190IiIkbXJfY3ZfZnVuY19jYXRnZXRzIiAxPiY2Ci0rcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSsgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotKwotK2ZpCi0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbXJfY3ZfZnVuY19jYXRnZXRzIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbXJfY3ZfZnVuY19jYXRnZXRzIiA+JjY7IH0KLSAgICAgICBpZiB0ZXN0ICIkbXJfY3ZfZnVuY19jYXRnZXRzIiA9IHllczsgdGhlbgotIAkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdlbmNhdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGdlbmNhdDsgYWNfd29yZD0kMgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwMDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR0VOQ0FUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLS0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci0reyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR0VOQ0FUK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhc2UgIiRHRU5DQVQiIGluCi0tICAvKikKLSsgIGNhc2UgJEdFTkNBVCBpbgotKyAgW1xcL10qIHwgPzpbXFwvXSopCi0gICBhY19jdl9wYXRoX0dFTkNBVD0iJEdFTkNBVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICA7OwotLSAgPzovKikJCQkgCi0tICBhY19jdl9wYXRoX0dFTkNBVD0iJEdFTkNBVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotLSAgOzsKLSAgICopCi0tICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotLSAgYWNfZHVtbXk9IiRtcl9QQVRIIgotLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLS0gICAgICBhY19jdl9wYXRoX0dFTkNBVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICAgICBicmVhawotLSAgICBmaQotLSAgZG9uZQotLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0rICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkbXJfUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGFjX2N2X3BhdGhfR0VOQ0FUPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0rICAgIGJyZWFrIDIKLSsgIGZpCi0rZG9uZQotK2RvbmUKLStJRlM9JGFzX3NhdmVfSUZTCi0rCi0gICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HRU5DQVQiICYmIGFjX2N2X3BhdGhfR0VOQ0FUPSJubyIKLSAgIDs7Ci0gZXNhYwotIGZpCi0tR0VOQ0FUPSIkYWNfY3ZfcGF0aF9HRU5DQVQiCi0rR0VOQ0FUPSRhY19jdl9wYXRoX0dFTkNBVAotIGlmIHRlc3QgLW4gIiRHRU5DQVQiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIiJEdFTkNBVCIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkR0VOQ0FUIiA+JjUKLStlY2hvICIke0VDSE9fVH0kR0VOQ0FUIiA+JjY7IH0KLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSBmaQotIAotKwotIAlpZiB0ZXN0ICIkR0VOQ0FUIiAhPSBubzsgdGhlbgotLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKwkgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0gI2RlZmluZSBIQVZFX0NBVEdFVFMgMQotLUVPRgotK19BQ0VPRgotIAotIAkgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCBtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSBnbXNnZm10IG1zZ2ZtdDsgYWNfd29yZD0kMgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwNDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX0dNU0dGTVQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0gZWxzZQotLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0tICAvKikKLSsgIGNhc2UgJEdNU0dGTVQgaW4KLSsgIFtcXC9dKiB8ID86W1xcL10qKQotICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICA7OwotLSAgPzovKikJCQkgCi0tICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0tICA7OwotICAgKikKLS0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0tICBhY19kdW1teT0iJG1yX1BBVEgiCi0tICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0tICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0tICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICAgICBicmVhawotLSAgICBmaQotLSAgZG9uZQotLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0rICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkbXJfUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSJtc2dmbXQiCi0gICA7OwotIGVzYWMKLSBmaQotLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi0rR01TR0ZNVD0kYWNfY3ZfcGF0aF9HTVNHRk1UCi0gaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEdNU0dGTVQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRHTVNHRk1UIiA+JjY7IH0KLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSBmaQotIAotKwotIAkgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotIHNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMwNzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICBjYXNlICIkWEdFVFRFWFQiIGluCi0tICAvKikKLSsgIGNhc2UgJFhHRVRURVhUIGluCi0rICBbXFwvXSogfCA/OltcXC9dKikKLSAgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICA7OwotLSAgPzovKikJCQkgCi0tICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLS0gIDs7Ci0gICAqKQotLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLS0gIGFjX2R1bW15PSIkbXJfUEFUSCIKLS0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLS0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLS0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0tICAgICAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLS0gICAgICBicmVhawotLSAgICBmaQotLSAgZG9uZQotLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0rICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi0rZm9yIGFzX2RpciBpbiAkbXJfUEFUSAotK2RvCi0rICBJRlM9JGFzX3NhdmVfSUZTCi0rICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0rICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0rICAgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0rICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSsgICAgYnJlYWsgMgotKyAgZmkKLStkb25lCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSAgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSJ4Z2V0dGV4dCIKLSAgIDs7Ci0gZXNhYwotIGZpCi0tWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotK1hHRVRURVhUPSRhY19jdl9wYXRoX1hHRVRURVhUCi0gaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkWEdFVFRFWFQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRYR0VUVEVYVCIgPiY2OyB9Ci0gZWxzZQotLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLStlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gZmkKLSAKLSsKLSAJICBDQVRPQkpFWFQ9LmNhdAotIAkgIElOU1RPQkpFWFQ9LmNhdAotIAkgIGxvY2FsZWRpcj0nJChwcmVmaXgpL2xpYi9sb2NhbGUnCi0gCWZpCi0gICAgICAgZWxzZQotLQllY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IG5vIE5MUyBzdXBwb3J0LCBkaXNhYmxlZCIgMT4mMgotKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBubyBOTFMgc3VwcG9ydCwgZGlzYWJsZWQiID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogbm8gTkxTIHN1cHBvcnQsIGRpc2FibGVkIiA+JjI7fQotIAltcl9lbmFibGVfbmxzPW5vCi0gICAgICAgZmkKLSAgICAgZmkKLSAgIGZpCi0tICAKLS0gIAotLSAgCi0rCi0rCi0rCi0gCi0gICBQT1NVQj0KLSAgIENBVEFMT0dTPQotICAgaWYgdGVzdCAiJG1yX2VuYWJsZV9ubHMiID0geWVzOyB0aGVuCi0tICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozMTI4OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkLi4uICRFQ0hPX0MiID4mNjsgfQotICAgICBtcl9saW5ndWFzPQotICAgICBmb3IgbXJfbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICBjYXNlICIgJEFMTF9MSU5HVUFTICIgaW4KLUBAIC0zMTM0LDg0ICs4NTMzLDE2NiBAQCBlY2hvICJjb25maWd1cmU6MzEyODogY2hlY2tpbmcgZm9yIGNhdGFsCi0gCSAgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLS0gICAgZWNobyAiJGFjX3QiIiRtcl9saW5ndWFzIiAxPiY2Ci0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2xpbmd1YXMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRtcl9saW5ndWFzIiA+JjY7IH0KLSAgICAgUE9TVUI9cG8KLSAgIGZpCi0tICAKLS0gIAotKwotKwotIAotIExJQklOVEw9Ci0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzE0NjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gLWxpbnRsIiA+JjUKLS1hY19saWJfdmFyPWBlY2hvIGludGwnXydnZXR0ZXh0IHwgc2VkICd5JS4vKy0lX19wXyUnYAotLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiAtbGludGwiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gLWxpbnRsLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2ludGxfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLSBlbHNlCi0tICBhY19zYXZlX0xJQlM9IiRMSUJTIgotKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotIExJQlM9Ii1saW50bCAgJExJQlMiCi0tY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMxNTQgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLS0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLS1jaGFyIGdldHRleHQoKTsKLStjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBjb25mZGVmcy5oLiAgKi8KLStfQUNFT0YKLStjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLStjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0rLyogZW5kIGNvbmZkZWZzLmguICAqLwotIAotLWludCBtYWluKCkgewotLWdldHRleHQoKQotLTsgcmV0dXJuIDA7IH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotLSAgcm0gLXJmIGNvbmZ0ZXN0KgotLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLSsvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSsgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotKyNpZmRlZiBfX2NwbHVzcGx1cwotK2V4dGVybiAiQyIKLSsjZW5kaWYKLStjaGFyIGdldHRleHQgKCk7Ci0raW50Ci0rbWFpbiAoKQotK3sKLStyZXR1cm4gZ2V0dGV4dCAoKTsKLSsgIDsKLSsgIHJldHVybiAwOwotK30KLStfQUNFT0YKLStybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi0rY2FzZSAiKCgkYWNfdHJ5IiBpbgotKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0rICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLStlc2FjCi0rZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSsgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0rICBhY19zdGF0dXM9JD8KLSsgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0rICBybSAtZiBjb25mdGVzdC5lcjEKLSsgIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0rCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLSsJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSsgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotKyAgYWNfY3ZfbGliX2ludGxfZ2V0dGV4dD15ZXMKLSBlbHNlCi0tICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0tICBybSAtcmYgY29uZnRlc3QqCi0tICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi0rICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSsKLSsJYWNfY3ZfbGliX2ludGxfZ2V0dGV4dD1ubwotIGZpCi0tcm0gLWYgY29uZnRlc3QqCi0tTElCUz0iJGFjX3NhdmVfTElCUyIKLSAKLStybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci0rTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotIGZpCi0taWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLS0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF9nZXR0ZXh0IiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2ludGxfZ2V0dGV4dCIgPiY2OyB9Ci0raWYgdGVzdCAkYWNfY3ZfbGliX2ludGxfZ2V0dGV4dCA9IHllczsgdGhlbgotICAgTElCSU5UTD0tbGludGwKLS1lbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSBmaQotIAotIAotIAotLQotICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLS1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0tZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Ci0rICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLStlY2hvICRFQ0hPX04gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNjsgfQotK2lmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi0rdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0rICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAotK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsKLSBmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLStlY2hvICIke0VDSE9fVH0kYWNfY3ZfYnVpbGQiID4mNjsgfQotK2Nhc2UgJGFjX2N2X2J1aWxkIGluCi0rKi0qLSopIDs7Ci0rKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0rZXNhYwotK2J1aWxkPSRhY19jdl9idWlsZAotK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLStzZXQgeCAkYWNfY3ZfYnVpbGQKLStzaGlmdAotK2J1aWxkX2NwdT0kMQotK2J1aWxkX3ZlbmRvcj0kMgotK3NoaWZ0OyBzaGlmdAotKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLStidWlsZF9vcz0kKgotK0lGUz0kYWNfc2F2ZV9JRlMKLStjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwotIAotLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotLWVjaG8gImNvbmZpZ3VyZTozMTk0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSAKLS1ob3N0X2FsaWFzPSRob3N0Ci0tY2FzZSAiJGhvc3RfYWxpYXMiIGluCi0tTk9ORSkKLS0gIGNhc2UgJG5vbm9wdCBpbgotLSAgTk9ORSkKLS0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLS0gICAgZmkgOzsKLS0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotLSAgZXNhYyA7OwotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjY7IH0KLStpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSsgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci0rZWxzZQotKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KLSsgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCi0rZWxzZQotKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKLSsgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0rZmkKLSsKLStmaQotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjY7IH0KLStjYXNlICRhY19jdl9ob3N0IGluCi0rKi0qLSopIDs7Ci0rKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotIGVzYWMKLStob3N0PSRhY19jdl9ob3N0Ci0rYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotK3NldCB4ICRhY19jdl9ob3N0Ci0rc2hpZnQKLStob3N0X2NwdT0kMQotK2hvc3RfdmVuZG9yPSQyCi0rc2hpZnQ7IHNoaWZ0Ci0rIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0rIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotK2hvc3Rfb3M9JCoKLStJRlM9JGFjX3NhdmVfSUZTCi0rY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLSsKLSAKLS1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLS1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0taG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotIAotIAotLSAgCi0gICBQSUNGTEFHUz0KLSAgIFNITElCX1NGWD0KLSAgIFNITElOS19TRlg9Ci1AQCAtMzIxOSw4MyArODcwMCw5MSBAQCBlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLSAgIExJTktfU0hMSUI9Ci0gICBJTlNUQUxMX1NITElCPQotICAgREVQU0hMSUJTPQotLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzIyNDogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IiA+JjUKLS0gICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5Li4uICRFQ0hPX0MiID4mNjsgfQotKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0tICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotLSAgbXJfZW5hYmxlX3NoYXJlZD0iJGVuYWJsZXZhbCIKLSsgIGVuYWJsZXZhbD0kZW5hYmxlX3NoYXJlZDsgbXJfZW5hYmxlX3NoYXJlZD0iJGVuYWJsZXZhbCIKLSBlbHNlCi0gICBtcl9lbmFibGVfc2hhcmVkPXllcwotIGZpCi0gCi0tICBlY2hvICIkYWNfdCIiJG1yX2VuYWJsZV9zaGFyZWQiIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2VuYWJsZV9zaGFyZWQiID4mNQotK2VjaG8gIiR7RUNIT19UfSRtcl9lbmFibGVfc2hhcmVkIiA+JjY7IH0KLSAgIGlmIHRlc3QgIiRtcl9lbmFibGVfc2hhcmVkIiA9IHllczsgdGhlbgotLSAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIEdOVSBuYW1pbmcgY29udmVudGlvbnMgYXJlIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMyMzY6IGNoZWNraW5nIHdoZXRoZXIgR05VIG5hbWluZyBjb252ZW50aW9ucyBhcmUgcmVxdWVzdGVkIiA+JjUKLS0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWdudS1uYW1lcyBvciAtLWRpc2FibGUtZ251LW5hbWVzIHdhcyBnaXZlbi4KLSsgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBHTlUgbmFtaW5nIGNvbnZlbnRpb25zIGFyZSByZXF1ZXN0ZWQiID4mNQotK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBHTlUgbmFtaW5nIGNvbnZlbnRpb25zIGFyZSByZXF1ZXN0ZWQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0rICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1nbnUtbmFtZXMgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX2dudV9uYW1lcytzZXR9IiA9IHNldDsgdGhlbgotLSAgZW5hYmxldmFsPSIkZW5hYmxlX2dudV9uYW1lcyIKLS0gIG1yX2VuYWJsZV9nbnVfbmFtZXM9IiRlbmFibGV2YWwiCi0rICBlbmFibGV2YWw9JGVuYWJsZV9nbnVfbmFtZXM7IG1yX2VuYWJsZV9nbnVfbmFtZXM9IiRlbmFibGV2YWwiCi0gZWxzZQotICAgbXJfZW5hYmxlX2dudV9uYW1lcz1ubwotIGZpCi0gCi0tICAgIGVjaG8gIiRhY190IiIkbXJfZW5hYmxlX2dudV9uYW1lcyIgMT4mNgotLSAgICAKLS0gICAgCi0rICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJG1yX2VuYWJsZV9nbnVfbmFtZXMiID4mNQotK2VjaG8gIiR7RUNIT19UfSRtcl9lbmFibGVfZ251X25hbWVzIiA+JjY7IH0KLSsKLSsKLSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi0gc2V0IGR1bW15IGxkOyBhY193b3JkPSQyCi0tZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLS1lY2hvICJjb25maWd1cmU6MzI1MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLS1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0tICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHthY19jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLS0gIGNhc2UgIiRMRCIgaW4KLS0gIC8qKQotKyAgY2FzZSAkTEQgaW4KLSsgIFtcXC9dKiB8ID86W1xcL10qKQotICAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgIDs7Ci0tICA/Oi8qKQkJCSAKLS0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotLSAgOzsKLSAgICopCi0tICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotLSAgYWNfZHVtbXk9IiRQQVRIIgotLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLS0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY193b3JkIgotLSAgICAgIGJyZWFrCi0tICAgIGZpCi0tICBkb25lCi0tICBJRlM9IiRhY19zYXZlX2lmcyIKLSsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLStmb3IgYXNfZGlyIGluICRQQVRICi0rZG8KLSsgIElGUz0kYXNfc2F2ZV9JRlMKLSsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0rICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSsgICAgYWNfY3ZfcGF0aF9MRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSsgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotKyAgICBicmVhayAyCi0rICBmaQotK2RvbmUKLStkb25lCi0rSUZTPSRhc19zYXZlX0lGUwotKwotICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTEQiICYmIGFjX2N2X3BhdGhfTEQ9ImxkIgotICAgOzsKLSBlc2FjCi0gZmkKLS1MRD0iJGFjX2N2X3BhdGhfTEQiCi0rTEQ9JGFjX2N2X3BhdGhfTEQKLSBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0tICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci0rICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMRCIgPiY1Ci0rZWNobyAiJHtFQ0hPX1R9JExEIiA+JjY7IH0KLSBlbHNlCi0tICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSBmaQotIAotKwotICAgICBjYXNlICIkaG9zdCIgaW4KLSAgICAgICAqLWxpbnV4KnwqLWdudSopCi0gCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0tCSAgCi0tICAKLS0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMyOTA6IGNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J21yX2N2X3RhcmdldF9lbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsKLSsKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbmF0aXZlIEVMRiBzeXN0ZW0uLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHttcl9jdl90YXJnZXRfZWxmK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICBtcl9jdl90YXJnZXRfZWxmPW5vCi0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMyOTggImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gaW50Ci0gbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLUBAIC0zMzE2LDIyICs4ODA1LDQzIEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICB9Ci0gICBleGl0KDEpOwotIH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLS10aGVuCi0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICAgICBtcl9jdl90YXJnZXRfZWxmPXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1mciBjb25mdGVzdCoKLS0gIG1yX2N2X3RhcmdldF9lbGY9bm8KLSsgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0rZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rKCBleGl0ICRhY19zdGF0dXMgKQotK21yX2N2X3RhcmdldF9lbGY9bm8KLSBmaQotLXJtIC1mciBjb25mdGVzdCoKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWZpCi0gCi0tZWNobyAiJGFjX3QiIiRtcl9jdl90YXJnZXRfZWxmIiAxPiY2Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtcl9jdl90YXJnZXRfZWxmIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbXJfY3ZfdGFyZ2V0X2VsZiIgPiY2OyB9Ci0gCSAgaWYgdGVzdCAiJG1yX2N2X3RhcmdldF9lbGYiID0geWVzOyB0aGVuCi0gCSAgICBQSUNGTEFHUz0nLWZQSUMgLURQSUMnCi0gCSAgICBpZiB0ZXN0ICIkbXJfZW5hYmxlX2dudV9uYW1lcyIgPSB5ZXMKLUBAIC0zMzQ0LDExICs4ODU0LDEzIEBAIGVjaG8gIiRhY190IiIkbXJfY3ZfdGFyZ2V0X2VsZiIgMT4mNgotIAkgICAgSU5TVEFMTF9TSExJQj0nJChJTlNUQUxMX1BST0dSQU0pJwotIAkgICAgREVQU0hMSUJTPSctbGMnCi0gCSAgZWxzZQotLQkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgZm9yICRob3N0IiAxPiYyCi0rCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgZm9yICRob3N0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBmb3IgJGhvc3QiID4mMjt9Ci0gCSAgICBtcl9lbmFibGVfc2hhcmVkPW5vCi0gCSAgZmkKLSAJZWxpZiAke0NDfSAtViAyPiYxIHwgZ3JlcCAnSW50ZWwoUikgQysrIENvbXBpbGVyJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLS0JICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFVzZSAtLWRpc2FibGUtc2hhcmVkIGlmICRDQyBmYWlscyB0byBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcnkiIDE+JjIKLSsJICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBVc2UgLS1kaXNhYmxlLXNoYXJlZCBpZiAkQ0MgZmFpbHMgdG8gYnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJ5IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFVzZSAtLWRpc2FibGUtc2hhcmVkIGlmICRDQyBmYWlscyB0byBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcnkiID4mMjt9Ci0gCSAgUElDRkxBR1M9Jy1mUElDIC1EUElDJwotIAkgIGlmIHRlc3QgIiRtcl9lbmFibGVfZ251X25hbWVzIiA9IHllcwotIAkgIHRoZW4gU0hMSUJfU0ZYPSctJChWRVJTSU9OKS5zbycKLUBAIC0zMzYwLDI0ICs4ODcyLDI4IEBAIGVjaG8gIiRhY190IiIkbXJfY3ZfdGFyZ2V0X2VsZiIgMT4mNgotIAkgIElOU1RBTExfU0hMSUI9JyQoSU5TVEFMTF9QUk9HUkFNKScKLSAJICBERVBTSExJQlM9Jy1sYycKLSAJZWxzZQotLQkgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogR05VIENDIHJlcXVpcmVkIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0rCSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogR05VIENDIHJlcXVpcmVkIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEdOVSBDQyByZXF1aXJlZCBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcyIgPiYyO30KLSAJICBtcl9lbmFibGVfc2hhcmVkPW5vCi0gCWZpCi0gCTs7Ci0gICAgICAgaTM4Ni1wYy1udG8tcW54KikKLS0JCi0tICAKLS0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIiLi4uICRhY19jIiAxPiY2Ci0tZWNobyAiY29uZmlndXJlOjMzNzI6IGNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIgPiY1Ci0taWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J21yX2N2X3RhcmdldF9lbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLSsKLSsKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBuYXRpdmUgRUxGIHN5c3RlbSIgPiY1Ci0rZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbmF0aXZlIEVMRiBzeXN0ZW0uLi4gJEVDSE9fQyIgPiY2OyB9Ci0raWYgdGVzdCAiJHttcl9jdl90YXJnZXRfZWxmK3NldH0iID0gc2V0OyB0aGVuCi0rICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotIGVsc2UKLSAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICBtcl9jdl90YXJnZXRfZWxmPW5vCi0gZWxzZQotLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotLSNsaW5lIDMzODAgImNvbmZpZ3VyZSIKLS0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSsgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotKy8qIGNvbmZkZWZzLmguICAqLwotK19BQ0VPRgotK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLSsvKiBlbmQgY29uZmRlZnMuaC4gICovCi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gaW50Ci0gbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLUBAIC0zMzk4LDIyICs4OTE0LDQzIEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICB9Ci0gICBleGl0KDEpOwotIH0KLS1FT0YKLS1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLS10aGVuCi0rX0FDRU9GCi0rcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci0raWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLStjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotKyAgYWNfc3RhdHVzPSQ/Ci0rICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0rICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0rICB7IChjYXNlICIoKCRhY190cnkiIGluCi0rICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotK2VzYWMKLStldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0rICBhY19zdGF0dXM9JD8KLSsgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSsgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgICAgICBtcl9jdl90YXJnZXRfZWxmPXllcwotIGVsc2UKLS0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0tICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLS0gIHJtIC1mciBjb25mdGVzdCoKLS0gIG1yX2N2X3RhcmdldF9lbGY9bm8KLSsgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci0rZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLStzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0rCi0rKCBleGl0ICRhY19zdGF0dXMgKQotK21yX2N2X3RhcmdldF9lbGY9bm8KLSBmaQotLXJtIC1mciBjb25mdGVzdCoKLStybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSBmaQotIAotLWZpCi0gCi0tZWNobyAiJGFjX3QiIiRtcl9jdl90YXJnZXRfZWxmIiAxPiY2Ci0rZmkKLSt7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtcl9jdl90YXJnZXRfZWxmIiA+JjUKLStlY2hvICIke0VDSE9fVH0kbXJfY3ZfdGFyZ2V0X2VsZiIgPiY2OyB9Ci0gCWlmIHRlc3QgIiRtcl9jdl90YXJnZXRfZWxmIiA9IHllczsgdGhlbgotIAkgIFBJQ0ZMQUdTPSctZlBJQyAtRFBJQycKLSAJICBpZiB0ZXN0ICIkbXJfZW5hYmxlX2dudV9uYW1lcyIgPSB5ZXMKLUBAIC0zNDI2LDcgKzg5NjMsOCBAQCBlY2hvICIkYWNfdCIiJG1yX2N2X3RhcmdldF9lbGYiIDE+JjYKLSAJICBJTlNUQUxMX1NITElCPSckKElOU1RBTExfUFJPR1JBTSknCi0gCSAgREVQU0hMSUJTPSctbGMnCi0gCWVsc2UKLS0JICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBmb3IgJGhvc3QiIDE+JjIKLSsJICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgZm9yICRob3N0IiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBmb3IgJGhvc3QiID4mMjt9Ci0gCSAgbXJfZW5hYmxlX3NoYXJlZD1ubwotIAlmaQotIAk7OwotQEAgLTM0NDYsNDY1ICs4OTg0LDEyMjcgQEAgZWNobyAiJGFjX3QiIiRtcl9jdl90YXJnZXRfZWxmIiAxPiY2Ci0gCUlOU1RBTExfU0hMSUI9JyQoSU5TVEFMTF9QUk9HUkFNKScKLSAJOzsKLSAgICAgICAqKQotLQllY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBmb3IgJGhvc3QiIDE+JjIKLSsJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGZvciAkaG9zdCIgPiY1Ci0rZWNobyAiJGFzX21lOiBXQVJOSU5HOiBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgZm9yICRob3N0IiA+JjI7fQotIAltcl9lbmFibGVfc2hhcmVkPW5vCi0gCTs7Ci0gICAgIGVzYWMKLSAgIGVsc2UKLSAgICAgbXJfZW5hYmxlX3NoYXJlZD1ubwotICAgZmkKLS0gIAotLSAgCi0tICAKLS0gIAotLSAgCi0tICAKLS0gIAotKwotKwotKwotKwotKwotKwotKwotICAgRE9fU0hMSUI9IiRtcl9lbmFibGVfc2hhcmVkIgotLSAgCi0gCi0gCi0tIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dGVuZGVkLWZvcm1hdCBvciAtLWRpc2FibGUtZXh0ZW5kZWQtZm9ybWF0IHdhcyBnaXZlbi4KLSsKLSsjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZXh0ZW5kZWQtZm9ybWF0IHdhcyBnaXZlbi4KLSBpZiB0ZXN0ICIke2VuYWJsZV9leHRlbmRlZF9mb3JtYXQrc2V0fSIgPSBzZXQ7IHRoZW4KLS0gIGVuYWJsZXZhbD0iJGVuYWJsZV9leHRlbmRlZF9mb3JtYXQiCi0tICBtcl9lbmFibGVfZXh0ZW5kZWRfZm9ybWF0PSIkZW5hYmxldmFsIgotKyAgZW5hYmxldmFsPSRlbmFibGVfZXh0ZW5kZWRfZm9ybWF0OyBtcl9lbmFibGVfZXh0ZW5kZWRfZm9ybWF0PSIkZW5hYmxldmFsIgotIGVsc2UKLSAgIG1yX2VuYWJsZV9leHRlbmRlZF9mb3JtYXQ9bm8KLSBmaQotIAotIGlmIHRlc3QgIiRtcl9lbmFibGVfZXh0ZW5kZWRfZm9ybWF0IiA9IHllczsgdGhlbgotLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0rICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgRU5BQkxFX0VYVEVOREVEX0ZPUk1BVCAxCi0tRU9GCi0rX0FDRU9GCi0gCi0gZmkKLSAKLS0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2FuaXR5LWNoZWNrcyBvciAtLWRpc2FibGUtc2FuaXR5LWNoZWNrcyB3YXMgZ2l2ZW4uCi0rIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNhbml0eS1jaGVja3Mgd2FzIGdpdmVuLgotIGlmIHRlc3QgIiR7ZW5hYmxlX3Nhbml0eV9jaGVja3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLS0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zYW5pdHlfY2hlY2tzIgotLSAgbXJfZW5hYmxlX3Nhbml0eV9jaGVja3M9IiRlbmFibGV2YWwiCi0rICBlbmFibGV2YWw9JGVuYWJsZV9zYW5pdHlfY2hlY2tzOyBtcl9lbmFibGVfc2FuaXR5X2NoZWNrcz0iJGVuYWJsZXZhbCIKLSBlbHNlCi0gICBtcl9lbmFibGVfc2FuaXR5X2NoZWNrcz15ZXMKLSBmaQotIAotIGlmIHRlc3QgIiRtcl9lbmFibGVfc2FuaXR5X2NoZWNrcyIgPSB5ZXM7IHRoZW4KLS0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSAjZGVmaW5lIEVOQUJMRV9TQU5JVFlfQ0hFQ0tTIDEKLS1FT0YKLStfQUNFT0YKLSAKLSBmaQotIAotIAotLSAgCi0tICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KLSsKLSsgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCi0gaWYgdGVzdCAiJHtlbmFibGVfZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLS0gIGVuYWJsZXZhbD0iJGVuYWJsZV9kZWJ1ZyIKLS0gIG1yX2VuYWJsZV9kZWJ1Zz0iJGVuYWJsZXZhbCIKLSsgIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnOyBtcl9lbmFibGVfZGVidWc9IiRlbmFibGV2YWwiCi0gZWxzZQotICAgbXJfZW5hYmxlX2RlYnVnPW5vCi0gZmkKLSAKLSAgIGlmIHRlc3QgIiRtcl9lbmFibGVfZGVidWciID0geWVzOyB0aGVuCi0tICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotICNkZWZpbmUgRU5BQkxFX0RFQlVHIDEKLS1FT0YKLStfQUNFT0YKLSAKLSAgIGZpCi0gCi0gCi0tdHJhcCAnJyAxIDIgMTUKLS1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0rYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIGxpYi9NYWtlZmlsZSBwby9NYWtlZmlsZSBsaWJlbGYucGMiCi0rCi0rYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQiCi0rCi0rY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCi0gIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0gIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0tIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLS0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSsjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgotKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKLSsjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSAjCi0tIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLS0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0tIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0tIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLS0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLS0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0rIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKLSsjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSAjCi0tRU9GCi0rIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCi0rIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQotKyMgZm9sbG93aW5nIHZhbHVlcy4KLSsKLStfQUNFT0YKLSsKLSAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotICMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0tIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCi0gIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0gIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLS0oc2V0KSAyPiYxIHwKLS0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0tICAqYWNfc3BhY2U9XCAqKQotLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotLSAgICBzZWQgLW4gXAotLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0tICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotLSAgICA7OwotLSAgKikKLS0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLS0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotLSAgICA7OwotLSAgZXNhYyA+PiBjb25mY2FjaGUKLS1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0tICA6Ci0tZWxzZQotLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLS0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0rKAotKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbwotKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSsgICAgY2FzZSAkYWNfdmFsIGluICMoCi0rICAgICoke2FzX25sfSopCi0rICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0rICAgICAgKl9jdl8qKSB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBDYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZS4iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OwotKyAgICAgIGVzYWMKLSsgICAgICBjYXNlICRhY192YXIgaW4gIygKLSsgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0rICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSsgICAgICBlc2FjIDs7Ci0rICAgIGVzYWMKLSsgIGRvbmUKLSsKLSsgIChzZXQpIDI+JjEgfAotKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCi0rICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSsgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCi0rICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0rICAgICAgc2VkIC1uIFwKLSsJInMvJy8nXFxcXCcnL2c7Ci0rCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgotKyAgICAgIDs7ICMoCi0rICAgICopCi0rICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSsgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotKyAgICAgIDs7Ci0rICAgIGVzYWMgfAotKyAgICBzb3J0Ci0rKSB8Ci0rICBzZWQgJwotKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCi0rICAgICB0IGNsZWFyCi0rICAgICA6Y2xlYXIKLSsgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KLSsgICAgIHQgZW5kCi0rICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KLSsgICAgIDplbmQnID4+Y29uZmNhY2hlCi0raWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0rICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCi0rICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotK2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0rICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCi0gICBlbHNlCi0tICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Ci0rZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgIGZpCi0gZmkKLSBybSAtZiBjb25mY2FjaGUKLSAKLS10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotLQotIHRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSAjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLSB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0gCi0tIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0tIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0tIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi0taWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLS0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLS1maQotK0RFRlM9LURIQVZFX0NPTkZJR19ICi0gCi0tdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotK2FjX2xpYm9ianM9Ci0rYWNfbHRsaWJvYmpzPQotK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQotKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCi0rICBhY19pPWBlY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAotKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgotKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCi0rICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKLSsgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotK2RvbmUKLStMSUJPQkpTPSRhY19saWJvYmpzCi0gCi0tREVGUz0tREhBVkVfQ09ORklHX0gKLStMVExJQk9CSlM9JGFjX2x0bGlib2JqcwotIAotLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLSAKLS1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi0tcm0gLWYgJENPTkZJR19TVEFUVVMKLS1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotLSMhIC9iaW4vc2gKLS0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSsKLSs6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0rYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLSthY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgotK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKLStlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQotK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSsjISAkU0hFTEwKLSsjIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0gIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0tIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0tIwotLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0tIwotICMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLS0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLSsjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0gCi0tYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLS1mb3IgYWNfb3B0aW9uCi0tZG8KLS0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0tICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLS0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0tICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLS0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLS0gICAgZXhpdCAwIDs7Ci0tICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLS0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotLSAgZXNhYwotLWRvbmUKLStkZWJ1Zz1mYWxzZQotK2FjX2NzX3JlY2hlY2s9ZmFsc2UKLSthY19jc19zaWxlbnQ9ZmFsc2UKLStTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQotK19BQ0VPRgotIAotLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi0tYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0rIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0rIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0rIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0gCi0tdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBsaWIvTWFrZWZpbGUgcG8vTWFrZWZpbGUgbGliZWxmLnBjIGNvbmZpZy5oIGxpYi9zeXNfZWxmLmgiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLS1FT0YKLS1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSsjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLStEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi0raWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICBlbXVsYXRlIHNoCi0rICBOVUxMQ01EPToKLSsgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKLSsgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0rICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSsgIHNldG9wdCBOT19HTE9CX1NVQlNUCi0rZWxzZQotKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0rICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKLStlc2FjCi0gCi0tIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLS1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotLSRhY192cHN1YgotLSRleHRyYXN1YgotLXMlQFNIRUxMQCUkU0hFTEwlZwotLXMlQENGTEFHU0AlJENGTEFHUyVnCi0tcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi0tcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi0tcyVARkZMQUdTQCUkRkZMQUdTJWcKLS1zJUBERUZTQCUkREVGUyVnCi0tcyVATERGTEFHU0AlJExERkxBR1MlZwotLXMlQExJQlNAJSRMSUJTJWcKLS1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLS1zJUBwcmVmaXhAJSRwcmVmaXglZwotLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLS1zJUBiaW5kaXJAJSRiaW5kaXIlZwotLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLS1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi0tcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLS1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLS1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi0tcyVAbGliZGlyQCUkbGliZGlyJWcKLS1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi0tcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLS1zJUBtYW5kaXJAJSRtYW5kaXIlZwotLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLS1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi0tcyVATUFJTlRAJSRNQUlOVCVnCi0tcyVATUFKT1JAJSRNQUpPUiVnCi0tcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi0tcyVAQ0NAJSRDQyVnCi0tcyVAQ1BQQCUkQ1BQJWcKLS1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi0tcyVAUkFOTElCQCUkUkFOTElCJWcKLS1zJUBMTl9TQCUkTE5fUyVnCi0tcyVARE9fQ09NUEFUQCUkRE9fQ09NUEFUJWcKLS1zJUBMSUJPQkpTQCUkTElCT0JKUyVnCi0tcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi0tcyVATVNHRklMRVNAJSRNU0dGSUxFUyVnCi0tcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi0tcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotLXMlQE1TR01FUkdFQCUkTVNHTUVSR0UlZwotLXMlQEdFTkNBVEAlJEdFTkNBVCVnCi0tcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLS1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi0tcyVAbG9jYWxlZGlyQCUkbG9jYWxlZGlyJWcKLS1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLS1zJUBQT1NVQkAlJFBPU1VCJWcKLS1zJUBMSUJJTlRMQCUkTElCSU5UTCVnCi0tcyVAaG9zdEAlJGhvc3QlZwotLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLS1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLS1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLS1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi0tcyVATERAJSRMRCVnCi0tcyVAUElDRkxBR1NAJSRQSUNGTEFHUyVnCi0tcyVAU0hMSUJfU0ZYQCUkU0hMSUJfU0ZYJWcKLS1zJUBTSExJTktfU0ZYQCUkU0hMSU5LX1NGWCVnCi0tcyVAU09OQU1FX1NGWEAlJFNPTkFNRV9TRlglZwotLXMlQExJTktfU0hMSUJAJSRMSU5LX1NITElCJWcKLS1zJUBJTlNUQUxMX1NITElCQCUkSU5TVEFMTF9TSExJQiVnCi0tcyVAREVQU0hMSUJTQCUkREVQU0hMSUJTJWcKLS1zJUBET19TSExJQkAlJERPX1NITElCJWcKLStmaQotIAotLUNFT0YKLS1FT0YKLSAKLS1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gCi0tIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLS0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLS1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi0tYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi0tYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotLWFjX21vcmVfbGluZXM9OgotLWFjX3NlZF9jbWRzPSIiCi0td2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0tICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLS0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSsKLSsjIFBBVEggbmVlZHMgQ1IKLSsjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCi0rYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi0rYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi0rYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCi0rYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotKwotKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0rICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCi0rICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0rICBjaG1vZCAreCBjb25mJCQuc2gKLSsgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICAgZWxzZQotLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSsgICAgUEFUSF9TRVBBUkFUT1I9OgotICAgZmkKLS0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLS0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSsgIHJtIC1mIGNvbmYkJC5zaAotK2ZpCi0rCi0rIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCi0raWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0rICBhc191bnNldD11bnNldAotK2Vsc2UKLSsgIGFzX3Vuc2V0PWZhbHNlCi0rZmkKLSsKLSsKLSsjIElGUwotKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCi0rIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0rIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0rIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQotK2FzX25sPScKLSsnCi0rSUZTPSIgIiIJJGFzX25sIgotKwotKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi0rY2FzZSAkMCBpbgotKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotK2ZvciBhc19kaXIgaW4gJFBBVEgKLStkbwotKyAgSUZTPSRhc19zYXZlX0lGUwotKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSsgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi0rZG9uZQotK0lGUz0kYXNfc2F2ZV9JRlMKLSsKLSsgICAgIDs7Ci0rZXNhYwotKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSsjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLStpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCi0rICBhc19teXNlbGY9JDAKLStmaQotK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KLSsgIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSsgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotK2ZpCi0rCi0rIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi0rZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAotK2RvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0rZG9uZQotK1BTMT0nJCAnCi0rUFMyPSc+ICcKLStQUzQ9JysgJwotKwotKyMgTkxTIG51aXNhbmNlcy4KLStmb3IgYXNfdmFyIGluIFwKLSsgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCi0rICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotKyAgTENfVEVMRVBIT05FIExDX1RJTUUKLStkbwotKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSsgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gICBlbHNlCi0tICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLS0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLS0gICAgZWxzZQotLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotLSAgICBmaQotLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLS0gICAgYWNfYmVnPSRhY19lbmQKLS0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotKyAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICAgZmkKLSBkb25lCi0taWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotLSAgYWNfc2VkX2NtZHM9Y2F0Ci0rCi0rIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCi0raWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSsgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotKyAgYXNfZXhwcj1leHByCi0rZWxzZQotKyAgYXNfZXhwcj1mYWxzZQotIGZpCi0tRU9GCi0gCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0raWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKLStlbHNlCi0rICBhc19iYXNlbmFtZT1mYWxzZQotK2ZpCi0gCi0tQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgbGliL01ha2VmaWxlIHBvL01ha2VmaWxlIGxpYmVsZi5wYyJ9Ci0tRU9GCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0tICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0tICBjYXNlICIkYWNfZmlsZSIgaW4KLS0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0tICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLS0gIGVzYWMKLSAKLS0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0rIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgotK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0rCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAotKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci0rZWNobyBYLyIkMCIgfAotKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcL1woXC9cL1wpJC97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgL15YXC9cKFwvXCkuKi97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgcy8uKi8uLzsgcSdgCi0gCi0tICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLS0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0tICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLS0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLS0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLS0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotKyMgQ0RQQVRILgotKyRhc191bnNldCBDRFBBVEgKLSsKLSsKLSsKLSsgIGFzX2xpbmVub18xPSRMSU5FTk8KLSsgIGFzX2xpbmVub18yPSRMSU5FTk8KLSsgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0rCi0rICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCi0rICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0rICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKLSsgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCi0rICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0rICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCi0rICAjIGNhc2UgYXQgbGluZSBlbmQuCi0rICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSsgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQotKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKLSsgIHNlZCAtbiAnCi0rICAgIHAKLSsgICAgL1skXUxJTkVOTy89Ci0rICAnIDwkYXNfbXlzZWxmIHwKLSsgICAgc2VkICcKLSsgICAgICBzL1skXUxJTkVOTy4qLyYtLwotKyAgICAgIHQgbGluZW5vCi0rICAgICAgYgotKyAgICAgIDpsaW5lbm8KLSsgICAgICBOCi0rICAgICAgOmxvb3AKLSsgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KLSsgICAgICB0IGxvb3AKLSsgICAgICBzLy1cbi4qLy8KLSsgICAgJyA+JGFzX21lLmxpbmVubyAmJgotKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotKwotKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKLSsgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQotKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSsgIC4gIi4vJGFzX21lLmxpbmVubyIKLSsgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgotKyAgZXhpdAotK30KLSsKLSsKLStpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGFzX2Rpcm5hbWU9ZGlybmFtZQotK2Vsc2UKLSsgIGFzX2Rpcm5hbWU9ZmFsc2UKLStmaQotKwotK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Ci0rY2FzZSBgZWNobyAtbiB4YCBpbgotKy1uKikKLSsgIGNhc2UgYGVjaG8gJ3hcYydgIGluCi0rICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KLSsgICopICAgRUNIT19DPSdcYyc7OwotKyAgZXNhYzs7Ci0rKikKLSsgIEVDSE9fTj0nLW4nOzsKLStlc2FjCi0rCi0raWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSsgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotKyAgYXNfZXhwcj1leHByCi0rZWxzZQotKyAgYXNfZXhwcj1mYWxzZQotK2ZpCi0rCi0rcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKLStpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KLSsgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLStlbHNlCi0rICBybSAtZiBjb25mJCQuZGlyCi0rICBta2RpciBjb25mJCQuZGlyCi0rZmkKLStlY2hvID5jb25mJCQuZmlsZQotK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotKyAgYXNfbG5fcz0nbG4gLXMnCi0rICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgotKyAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSsgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgotKyAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KLSsgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSsgICAgYXNfbG5fcz0nY3AgLXAnCi0rZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KLSsgIGFzX2xuX3M9bG4KLStlbHNlCi0rICBhc19sbl9zPSdjcCAtcCcKLStmaQotK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKLStybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCi0rCi0raWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgotKyAgYXNfbWtkaXJfcD06Ci0rZWxzZQotKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKLSsgIGFzX21rZGlyX3A9ZmFsc2UKLStmaQotKwotK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgIGFzX3Rlc3RfeD0ndGVzdCAteCcKLStlbHNlCi0rICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgYXNfbHNfTF9vcHRpb249TAotICAgZWxzZQotLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotKyAgICBhc19sc19MX29wdGlvbj0KLSAgIGZpCi0rICBhc190ZXN0X3g9JwotKyAgICBldmFsIHNoIC1jICdcJycKLSsgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSsgICAgICAgIHRlc3QgLWQgIiQxLy4iOwotKyAgICAgIGVsc2UKLSsJY2FzZSAkMSBpbgotKyAgICAgICAgLSopc2V0ICIuLyQxIjs7Ci0rCWVzYWM7Ci0rCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0rCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKLSsgICAgJ1wnJyBzaAotKyAgJwotK2ZpCi0rYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKLSAKLS0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0tICAuKSAgc3JjZGlyPS4KLS0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0tICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0tICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0rIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgotK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0rCi0rIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCi0rYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLSsKLSsKLStleGVjIDY+JjEKLSsKLSsjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwotKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCi0rYWNfbG9nPSIKLStUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCi0rZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0rCi0rICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0rICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKLSsgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKLSsgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSsgICQgJDAgJEAKLSsKLStvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSsiCi0rCi0rX0FDRU9GCi0rCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSsjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi0rY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgotK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCi0rY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotKwotK19BQ0VPRgotKwotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotK2FjX2NzX3VzYWdlPSJcCi0rXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi0rY3VycmVudCBjb25maWd1cmF0aW9uLgotKwotK1VzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0rCi0rICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0rICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSsgIC1xLCAtLXF1aWV0ICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCi0rICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKLSsgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSsgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KLSsJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQotKyAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0rCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQotKwotK0NvbmZpZ3VyYXRpb24gZmlsZXM6Ci0rJGNvbmZpZ19maWxlcwotKwotK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSskY29uZmlnX2hlYWRlcnMKLSsKLStDb25maWd1cmF0aW9uIGNvbW1hbmRzOgotKyRjb25maWdfY29tbWFuZHMKLSsKLStSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLSsKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotK2FjX2NzX3ZlcnNpb249IlxcCi0rY29uZmlnLnN0YXR1cwotK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSwKLSsgIHdpdGggb3B0aW9ucyBcXCJgZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCi0rCi0rQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0rCi0rYWNfcHdkPSckYWNfcHdkJwotK3NyY2Rpcj0nJHNyY2RpcicKLStJTlNUQUxMPSckSU5TVEFMTCcKLStfQUNFT0YKLSsKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSsjIElmIG5vIGZpbGUgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB3ZSBuZWVkIHRvIHByb3ZpZGUgZGVmYXVsdAotKyMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0rYWNfbmVlZF9kZWZhdWx0cz06Ci0rd2hpbGUgdGVzdCAkIyAhPSAwCi0rZG8KLSsgIGNhc2UgJDEgaW4KLSsgIC0tKj0qKQotKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAotKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0rICAgIGFjX3NoaWZ0PToKLSsgICAgOzsKLSsgICopCi0rICAgIGFjX29wdGlvbj0kMQotKyAgICBhY19vcHRhcmc9JDIKLSsgICAgYWNfc2hpZnQ9c2hpZnQKLSsgICAgOzsKLSAgIGVzYWMKLSAKLS0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSsgIGNhc2UgJGFjX29wdGlvbiBpbgotKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KLSsgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotKyAgICBhY19jc19yZWNoZWNrPTogOzsKLSsgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKLSsgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0rICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQotKyAgICBkZWJ1Zz06IDs7Ci0rICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotKyAgICAkYWNfc2hpZnQKLSsgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCi0rICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQotKyAgICAkYWNfc2hpZnQKLSsgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgotKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKLSsgIC0taGUgfCAtLWgpCi0rICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0rICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLStUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSsgIC0taGVscCB8IC0taGVsIHwgLWggKQotKyAgICBlY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7Ci0rICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQotKyAgICBhY19jc19zaWxlbnQ9OiA7OwotKwotKyAgIyBUaGlzIGlzIGFuIGVycm9yLgotKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKLStUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Ci0rCi0rICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgotKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OwotKwotICAgZXNhYwotKyAgc2hpZnQKLStkb25lCi0gCi0tICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLS0gIHJtIC1mICIkYWNfZmlsZSIKLS0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0tICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLS0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0tICAqKSBhY19jb21zdWI9IDs7Ci0rYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Ci0rCi0raWYgJGFjX2NzX3NpbGVudDsgdGhlbgotKyAgZXhlYyA2Pi9kZXYvbnVsbAotKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKLStmaQotKwotK19BQ0VPRgotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0raWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCi0rICBlY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgJFNIRUxMICQwICIkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAiIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIiA+JjYKLSsgIENPTkZJR19TSEVMTD0kU0hFTEwKLSsgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSsgIGV4ZWMgJFNIRUxMICIkMCIkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgotK2ZpCi0rCi0rX0FDRU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0rZXhlYyA1Pj5jb25maWcubG9nCi0rewotKyAgZWNobwotKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKLSsjIyBSdW5uaW5nICRhc19tZS4gIyMKLStfQVNCT1gKLSsgIGVjaG8gIiRhY19sb2ciCi0rfSA+JjUKLSsKLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotK19BQ0VPRgotKwotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotKwotKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgotK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cwotK2RvCi0rICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCi0rICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7Ci0rICAgICJsaWIvc3lzX2VsZi5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBsaWIvc3lzX2VsZi5oIiA7OwotKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7Ci0rICAgICJsaWIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliL01ha2VmaWxlIiA7OwotKyAgICAicG8vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcG8vTWFrZWZpbGUiIDs7Ci0rICAgICJsaWJlbGYucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliZWxmLnBjIiA7OwotKyAgICAiZGVmYXVsdCIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZWZhdWx0IiA7OwotKwotKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQotK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gICBlc2FjCi0rZG9uZQotIAotLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLS0gIHNlZCAtZSAiJGFjX2NvbXN1YgotLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi0tcyVAc3JjZGlyQCUkc3JjZGlyJWcKLS1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi0tcyVASU5TVEFMTEAlJElOU1RBTEwlZwotLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLS1maTsgZG9uZQotLXJtIC1mIGNvbmZ0ZXN0LnMqCi0gCi0tIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLS0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0rIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAotKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgotKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSsjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgotK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCi0rICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKLSsgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCi0rZmkKLSsKLSsjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSsjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0rIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgotKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KLSsjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0rIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCi0rJGRlYnVnIHx8Ci0rewotKyAgdG1wPQotKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KLSsgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0rJyAwCi0rICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQotK30KLSsjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KLSsKLSt7Ci0rICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKLSsgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCi0rfSAgfHwKLSt7Ci0rICB0bXA9Li9jb25mJCQtJFJBTkRPTQotKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi0rfSB8fAotK3sKLSsgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotK30KLSsKLSsjCi0rIyBTZXQgdXAgdGhlIHNlZCBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KLSAjCi0tIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotLWFjX2RDPSdcMycKLS1hY19kRD0nJWcnCi0tIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLS1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLS1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLS1hY191Qz0nICcKLS1hY191RD0nXDQlZycKLS0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi0tYWNfZUM9JyAnCi0tYWNfZUQ9JyVnJwotIAotLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi0tRU9GCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0tICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmggbGliL3N5c19lbGYuaCIKLS1FT0YKLS1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0rIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCi0rIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi0raWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSsKLStfQUNFT0YKLSsKLSsKLSsKLSthY19kZWxpbT0nJSFfISMgJwotK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbwotKyAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotK1NIRUxMISRTSEVMTCRhY19kZWxpbQotK1BBVEhfU0VQQVJBVE9SISRQQVRIX1NFUEFSQVRPUiRhY19kZWxpbQotK1BBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi0rUEFDS0FHRV9UQVJOQU1FISRQQUNLQUdFX1RBUk5BTUUkYWNfZGVsaW0KLStQQUNLQUdFX1ZFUlNJT04hJFBBQ0tBR0VfVkVSU0lPTiRhY19kZWxpbQotK1BBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotK1BBQ0tBR0VfQlVHUkVQT1JUISRQQUNLQUdFX0JVR1JFUE9SVCRhY19kZWxpbQotK2V4ZWNfcHJlZml4ISRleGVjX3ByZWZpeCRhY19kZWxpbQotK3ByZWZpeCEkcHJlZml4JGFjX2RlbGltCi0rcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSEkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSRhY19kZWxpbQotK2JpbmRpciEkYmluZGlyJGFjX2RlbGltCi0rc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotK2xpYmV4ZWNkaXIhJGxpYmV4ZWNkaXIkYWNfZGVsaW0KLStkYXRhcm9vdGRpciEkZGF0YXJvb3RkaXIkYWNfZGVsaW0KLStkYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi0rc3lzY29uZmRpciEkc3lzY29uZmRpciRhY19kZWxpbQotK3NoYXJlZHN0YXRlZGlyISRzaGFyZWRzdGF0ZWRpciRhY19kZWxpbQotK2xvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLStpbmNsdWRlZGlyISRpbmNsdWRlZGlyJGFjX2RlbGltCi0rb2xkaW5jbHVkZWRpciEkb2xkaW5jbHVkZWRpciRhY19kZWxpbQotK2RvY2RpciEkZG9jZGlyJGFjX2RlbGltCi0raW5mb2RpciEkaW5mb2RpciRhY19kZWxpbQotK2h0bWxkaXIhJGh0bWxkaXIkYWNfZGVsaW0KLStkdmlkaXIhJGR2aWRpciRhY19kZWxpbQotK3BkZmRpciEkcGRmZGlyJGFjX2RlbGltCi0rcHNkaXIhJHBzZGlyJGFjX2RlbGltCi0rbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLStsb2NhbGVkaXIhJGxvY2FsZWRpciRhY19kZWxpbQotK21hbmRpciEkbWFuZGlyJGFjX2RlbGltCi0rREVGUyEkREVGUyRhY19kZWxpbQotK0VDSE9fQyEkRUNIT19DJGFjX2RlbGltCi0rRUNIT19OISRFQ0hPX04kYWNfZGVsaW0KLStFQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotK0xJQlMhJExJQlMkYWNfZGVsaW0KLStidWlsZF9hbGlhcyEkYnVpbGRfYWxpYXMkYWNfZGVsaW0KLStob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi0rdGFyZ2V0X2FsaWFzISR0YXJnZXRfYWxpYXMkYWNfZGVsaW0KLStQQUNLQUdFISRQQUNLQUdFJGFjX2RlbGltCi0rVkVSU0lPTiEkVkVSU0lPTiRhY19kZWxpbQotK01BSU5UISRNQUlOVCRhY19kZWxpbQotK01BSk9SISRNQUpPUiRhY19kZWxpbQotK1NFVF9NQUtFISRTRVRfTUFLRSRhY19kZWxpbQotK0NDISRDQyRhY19kZWxpbQotK0NGTEFHUyEkQ0ZMQUdTJGFjX2RlbGltCi0rTERGTEFHUyEkTERGTEFHUyRhY19kZWxpbQotK0NQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQotK2FjX2N0X0NDISRhY19jdF9DQyRhY19kZWxpbQotK0VYRUVYVCEkRVhFRVhUJGFjX2RlbGltCi0rT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KLStDUFAhJENQUCRhY19kZWxpbQotK0lOU1RBTExfUFJPR1JBTSEkSU5TVEFMTF9QUk9HUkFNJGFjX2RlbGltCi0rSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCi0rSU5TVEFMTF9EQVRBISRJTlNUQUxMX0RBVEEkYWNfZGVsaW0KLStSQU5MSUIhJFJBTkxJQiRhY19kZWxpbQotK0xOX1MhJExOX1MkYWNfZGVsaW0KLStHUkVQISRHUkVQJGFjX2RlbGltCi0rRUdSRVAhJEVHUkVQJGFjX2RlbGltCi0rRE9fQ09NUEFUISRET19DT01QQVQkYWNfZGVsaW0KLStMSUJPQkpTISRMSUJPQkpTJGFjX2RlbGltCi0rR01PRklMRVMhJEdNT0ZJTEVTJGFjX2RlbGltCi0rTVNHRklMRVMhJE1TR0ZJTEVTJGFjX2RlbGltCi0rUE9GSUxFUyEkUE9GSUxFUyRhY19kZWxpbQotK01TR0ZNVCEkTVNHRk1UJGFjX2RlbGltCi0rR01TR0ZNVCEkR01TR0ZNVCRhY19kZWxpbQotK1hHRVRURVhUISRYR0VUVEVYVCRhY19kZWxpbQotK01TR01FUkdFISRNU0dNRVJHRSRhY19kZWxpbQotK0dFTkNBVCEkR0VOQ0FUJGFjX2RlbGltCi0rQ0FUT0JKRVhUISRDQVRPQkpFWFQkYWNfZGVsaW0KLStJTlNUT0JKRVhUISRJTlNUT0JKRVhUJGFjX2RlbGltCi0rQ0FUQUxPR1MhJENBVEFMT0dTJGFjX2RlbGltCi0rUE9TVUIhJFBPU1VCJGFjX2RlbGltCi0rTElCSU5UTCEkTElCSU5UTCRhY19kZWxpbQotK2J1aWxkISRidWlsZCRhY19kZWxpbQotK2J1aWxkX2NwdSEkYnVpbGRfY3B1JGFjX2RlbGltCi0rYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLStidWlsZF9vcyEkYnVpbGRfb3MkYWNfZGVsaW0KLStob3N0ISRob3N0JGFjX2RlbGltCi0raG9zdF9jcHUhJGhvc3RfY3B1JGFjX2RlbGltCi0raG9zdF92ZW5kb3IhJGhvc3RfdmVuZG9yJGFjX2RlbGltCi0raG9zdF9vcyEkaG9zdF9vcyRhY19kZWxpbQotK0xEISRMRCRhY19kZWxpbQotK1BJQ0ZMQUdTISRQSUNGTEFHUyRhY19kZWxpbQotK1NITElCX1NGWCEkU0hMSUJfU0ZYJGFjX2RlbGltCi0rU0hMSU5LX1NGWCEkU0hMSU5LX1NGWCRhY19kZWxpbQotK1NPTkFNRV9TRlghJFNPTkFNRV9TRlgkYWNfZGVsaW0KLStMSU5LX1NITElCISRMSU5LX1NITElCJGFjX2RlbGltCi0rSU5TVEFMTF9TSExJQiEkSU5TVEFMTF9TSExJQiRhY19kZWxpbQotK0RFUFNITElCUyEkREVQU0hMSUJTJGFjX2RlbGltCi0rRE9fU0hMSUIhJERPX1NITElCJGFjX2RlbGltCi0rTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KLStfQUNFT0YKLSsKLSsgIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gOTA7IHRoZW4KLSsgICAgYnJlYWsKLSsgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCi0rICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSsgIGVsc2UKLSsgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKLSsgIGZpCi0rZG9uZQotKwotK2FjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8wL3AnIGNvbmYkJHN1YnMuc2VkYAotK2lmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCi0rICBhY19lb2Y9YGVjaG8gIiRhY19lb2YiIHwgc29ydCAtbnJ1IHwgc2VkIDFxYAotKyAgYWNfZW9mPWBleHByICRhY19lb2YgKyAxYAotIGZpCi0tZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0tICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLS0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0rCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLStjYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgotKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIgZW5kCi0rX0FDRU9GCi0rc2VkICcKLStzL1ssXFwmXS9cXCYvZzsgcy9AL0B8I18hIV8jfC9nCi0rcy9eL3MsQC87IHMvIS9ALHwjXyEhXyN8LwotKzpuCi0rdCBuCi0rcy8nIiRhY19kZWxpbSInJC8sZy87IHQKLStzLyQvXFwvOyBwCi0rTjsgcy9eLipcbi8vOyBzL1ssXFwmXS9cXCYvZzsgcy9AL0B8I18hIV8jfC9nOyBiIG4KLSsnID4+JENPTkZJR19TVEFUVVMgPGNvbmYkJHN1YnMuc2VkCi0rcm0gLWYgY29uZiQkc3Vicy5zZWQKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotKzplbmQKLStzL3wjXyEhXyN8Ly9nCi0rQ0VPRiRhY19lb2YKLStfQUNFT0YKLSsKLSsKLSsjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKLSsjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5Ci0rIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgotK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0rICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9L3sKLStzLzoqXCQoc3JjZGlyKToqLzovCi0rcy86Klwke3NyY2Rpcn06Ki86LwotK3MvOipAc3JjZGlyQDoqLzovCi0rcy9eXChbXj1dKj1bCSBdKlwpOiovXDEvCi0rcy86KiQvLwotK3MvXltePV0qPVsJIF0qJC8vCi0rfScKLStmaQotKwotK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKLSsKLSsKLStmb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUwotK2RvCi0rICBjYXNlICRhY190YWcgaW4KLSsgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotKyAgZXNhYwotKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KLSsgIDpbRkhMXSo6Kik7OwotKyAgOkwqIHwgOkMqOiopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjUKLStlY2hvICIkYXNfbWU6IGVycm9yOiBJbnZhbGlkIHRhZyAkYWNfdGFnLiIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotKyAgOltGSF0tKSBhY190YWc9LTotOzsKLSsgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7Ci0gICBlc2FjCi0rICBhY19zYXZlX0lGUz0kSUZTCi0rICBJRlM9OgotKyAgc2V0IHggJGFjX3RhZwotKyAgSUZTPSRhY19zYXZlX0lGUwotKyAgc2hpZnQKLSsgIGFjX2ZpbGU9JDEKLSsgIHNoaWZ0Ci0gCi0tICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0rICBjYXNlICRhY19tb2RlIGluCi0rICA6TCkgYWNfc291cmNlPSQxOzsKLSsgIDpbRkhdKQotKyAgICBhY19maWxlX2lucHV0cz0KLSsgICAgZm9yIGFjX2YKLSsgICAgZG8KLSsgICAgICBjYXNlICRhY19mIGluCi0rICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OwotKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCi0rCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKLSsJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCi0rCSB0ZXN0IC1mICIkYWNfZiIgfHwKLSsJICAgY2FzZSAkYWNfZiBpbgotKwkgICBbXFwvJF0qKSBmYWxzZTs7Ci0rCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKLSsJICAgZXNhYyB8fAotKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mMjt9Ci0rICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSsgICAgICBlc2FjCi0rICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAkYWNfZiIKLSsgICAgZG9uZQotIAotLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLS0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0tICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLSsgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKLSsgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgotKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwotKyAgICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBmcm9tICJgSUZTPToKLSsJICBlY2hvICQqIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZydgIiBieSBjb25maWd1cmUuIgotKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0rICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0rICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9Ci0rICAgIGZpCi0gCi0tRU9GCi0rICAgIGNhc2UgJGFjX3RhZyBpbgotKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiI7OwotKyAgICBlc2FjCi0rICAgIDs7Ci0rICBlc2FjCi0gCi0tIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLS0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLS0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLS1ybSAtZiBjb25mdGVzdC52YWxzCi0tY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotLXMvW1xcJiVdL1xcJi9nCi0tcyVbXFwkYF0lXFwmJWcKLS1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotLXMlYWNfZCVhY191JWdwCi0tcyVhY191JWFjX2UlZ3AKLS1FT0YKLS1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi0tcm0gLWYgY29uZnRlc3QuaGRyCi0rICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKLSskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLSsJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0rCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLStlY2hvIFgiJGFjX2ZpbGUiIHwKLSsgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcKFwvXC9cKVteL10uKi97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgL15YXChcL1wvXCkkL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcKFwvXCkuKi97Ci0rCSAgICBzLy9cMS8KLSsJICAgIHEKLSsJICB9Ci0rCSAgcy8uKi8uLzsgcSdgCi0rICB7IGFzX2Rpcj0iJGFjX2RpciIKLSsgIGNhc2UgJGFzX2RpciBpbiAjKAotKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotKyAgZXNhYwotKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewotKyAgICBhc19kaXJzPQotKyAgICB3aGlsZSA6OyBkbwotKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAotKyAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSsgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwotKyAgICAgIGVzYWMKLSsgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Ci0rJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLStlY2hvIFgiJGFzX2RpciIgfAotKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotKwkgICAgcy8vXDEvCi0rCSAgICBxCi0rCSAgfQotKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICAvXlhcKFwvXC9cKSQvewotKwkgICAgcy8vXDEvCi0rCSAgICBxCi0rCSAgfQotKwkgIC9eWFwoXC9cKS4qL3sKLSsJICAgIHMvL1wxLwotKwkgICAgcQotKwkgIH0KLSsJICBzLy4qLy4vOyBxJ2AKLSsgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotKyAgICBkb25lCi0rICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKLSsgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci0rZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KLSsgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLSsgIGFjX2J1aWxkZGlyPS4KLSAKLS0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0rY2FzZSAiJGFjX2RpciIgaW4KLSsuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSsqKQotKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKLSsgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSsgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSsgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwotKyAgZXNhYyA7OwotK2VzYWMKLSthY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKLSthY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0rIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLSthY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKLSsKLStjYXNlICRzcmNkaXIgaW4KLSsgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KLSsgICAgYWNfc3JjZGlyPS4KLSsgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgotKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7Ci0rICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0rICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Ci0rICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgotKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0rICAqKSAjIFJlbGF0aXZlIG5hbWUuCi0rICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAotKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKLStlc2FjCi0rYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotKwotKwotKyAgY2FzZSAkYWNfbW9kZSBpbgotKyAgOkYpCi0rICAjCi0rICAjIENPTkZJR19GSUxFCi0rICAjCi0rCi0rICBjYXNlICRJTlNUQUxMIGluCi0rICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7Ci0rICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKLSsgIGVzYWMKLStfQUNFT0YKLSsKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSsjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCi0rIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCi0rYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci0rCi0rY2FzZSBgc2VkIC1uICcvZGF0YXJvb3RkaXIvIHsKLSsgIHAKLSsgIHEKLSt9Ci0rL0BkYXRhZGlyQC9wCi0rL0Bkb2NkaXJAL3AKLSsvQGluZm9kaXJAL3AKLSsvQGxvY2FsZWRpckAvcAotKy9AbWFuZGlyQC9wCi0rJyAkYWNfZmlsZV9pbnB1dHNgIGluCi0rKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQotKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKLStlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLStfQUNFT0YKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotKyAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0rICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCi0rICBzJkBkb2NkaXJAJiRkb2NkaXImZwotKyAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKLSsgIHMmQG1hbmRpckAmJG1hbmRpciZnCi0rICAgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Ci0rZXNhYwotK19BQ0VPRgotKwotKyMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KLSsjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KLSsjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/Ci0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSsgIHNlZCAiJGFjX3Zwc3ViCi0rJGV4dHJhc3ViCi0rX0FDRU9GCi0rY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0rOnQKLSsvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCi0rcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKLStzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLStzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAotK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKLStzJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci0rcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Ci0rcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0Ci0rcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLStzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Ci0rcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAotKyRhY19kYXRhcm9vdGRpcl9oYWNrCi0rIiAkYWNfZmlsZV9pbnB1dHMgfCBzZWQgLWYgIiR0bXAvc3Vicy0xLnNlZCIgPiR0bXAvb3V0Ci0rCi0rdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSsgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCi0rICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKLSsgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mNQotK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCi0rd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KLSsKLSsgIHJtIC1mICIkdG1wL3N0ZGluIgotKyAgY2FzZSAkYWNfZmlsZSBpbgotKyAgLSkgY2F0ICIkdG1wL291dCI7IHJtIC1mICIkdG1wL291dCI7OwotKyAgKikgcm0gLWYgIiRhY19maWxlIjsgbXYgIiR0bXAvb3V0IiAkYWNfZmlsZTs7Ci0rICBlc2FjCi0rIDs7Ci0rICA6SCkKLSsgICMKLSsgICMgQ09ORklHX0hFQURFUgotKyAgIwotK19BQ0VPRgotKwotKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgYGNvbmZ0ZXN0LmRlZmluZXMnLCB0aGF0Ci0rIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCi0rcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC50YWlsCi0rIyBGaXJzdCwgYXBwZW5kIGEgc3BhY2UgdG8gZXZlcnkgdW5kZWYvZGVmaW5lIGxpbmUsIHRvIGVhc2UgbWF0Y2hpbmcuCi0rZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcwotKyMgVGhlbiwgcHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0LCBvciBpbgotKyMgYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCwgaW4gY29uZmlnLnN0YXR1cy4gIElmIHNvbWUgbWFjcm9zIHdlcmUKLSsjIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCi0rIyBzeW1ib2wsIHdoaWNoIGlzIHVzZWxlc3MuICBCdXQgZG8gbm90IHNvcnQgdGhlbSwgc2luY2UgdGhlIGxhc3QKLSsjIEFDX0RFRklORSBtdXN0IGJlIGhvbm9yZWQuCi0rYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLSsjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgUEFSQU1TIEMgVkFMVUUgRCIsIHdoZXJlCi0rIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCwgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotKyMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncwotKyMganVzdCBhbiBlbXB0eSBzdHJpbmcuCi0rYWNfZEE9J3MsXlxcKFsJICNdKlxcKVteCSBdKlxcKFsJIF0qJwotK2FjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKLSthY19kQz0nICcKLSthY19kRD0nICwnCi0rCi0rdW5pcSBjb25mZGVmcy5oIHwKLSsgIHNlZCAtbiAnCi0rCXQgcnNldAotKwk6cnNldAotKwlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCi0rCXQgb2sKLSsJZAotKwk6b2sKLSsJcy9bXFwmLF0vXFwmL2cKLSsJcy9eXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpLyAnIiRhY19kQSInXDEnIiRhY19kQiInXDInIiR7YWNfZEN9IidcMyciJGFjX2REIicvcAotKwlzL15cKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvJyIkYWNfZEEiJ1wxJyIkYWNfZEIkYWNfZEMiJ1wyJyIkYWNfZEQiJy9wCi0rICAnID4+Y29uZnRlc3QuZGVmaW5lcwotKwotKyMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgotKyMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotICMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLS1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLS1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotLUVPRgotKyMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQotK2VjaG8gJ3MvICQvLwotK3MsXlsJICNdKnUuKiwvKiAmICovLCcgPj5jb25mdGVzdC5kZWZpbmVzCi0gCi0tIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0tIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLSsjIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXM6Ci0rYWNfbWF4X3NlZF9saW5lcz01MAotKwotKyMgRmlyc3Qgc2VkIGNvbW1hbmQgaXM6CSBzZWQgLWYgZGVmaW5lcy5zZWQgJGFjX2ZpbGVfaW5wdXRzID4iJHRtcC9vdXQxIgotKyMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKLSsjIFRoaXJkIG9uZSB3aWxsIGJlOgkgc2VkIC1mIGRlZmluZXMuc2VkICIkdG1wL291dDIiID4iJHRtcC9vdXQxIgotKyMgZXQgY2V0ZXJhLgotK2FjX2luPSckYWNfZmlsZV9pbnB1dHMnCi0rYWNfb3V0PSciJHRtcC9vdXQxIicKLSthY19ueHQ9JyIkdG1wL291dDIiJwotIAotLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLSB3aGlsZSA6Ci0gZG8KLS0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLS0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLS0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLS0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLS0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotKyAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6Ci0rICAgIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0rICAgICMgRmlyc3QsIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmU6Ci0rICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgotKy9eWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKiRhY193b3JkX3JlWwkgXSpcJC9iIGRlZgotKy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSokYWNfd29yZF9yZVsoCSBdL2IgZGVmCi0rYgotKzpkZWYKLStfQUNFT0YKLSsgIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKLSAgIGVjaG8gJ0NFT0YKLS0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0tICBybSAtZiBjb25mdGVzdC5pbgotLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0tJyA+PiAkQ09ORklHX1NUQVRVUwotLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0tICBybSAtZiBjb25mdGVzdC52YWxzCi0tICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLSsgICAgc2VkIC1mICIkdG1wL2RlZmluZXMuc2VkIicgIiRhY19pbiA+JGFjX291dCIgPj4kQ09ORklHX1NUQVRVUwotKyAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KLSsgIHNlZCAxLCR7YWNfbWF4X3NlZF9saW5lc31kIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnRhaWwKLSsgIGdyZXAgLiBjb25mdGVzdC50YWlsID4vZGV2L251bGwgfHwgYnJlYWsKLSsgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKLSsgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QuZGVmaW5lcwotIGRvbmUKLS1ybSAtZiBjb25mdGVzdC52YWxzCi0rcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC50YWlsCi0gCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0tICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLS0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0tICBybSAtZiBjb25mdGVzdC5pbgotLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLS0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotLSAgICBybSAtZiBjb25mdGVzdC5oCi0tICBlbHNlCi0tICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0tICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0tICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLS0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotK2VjaG8gImFjX3Jlc3VsdD0kYWNfaW4iID4+JENPTkZJR19TVEFUVVMKLStjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSsgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSsgICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iID4iJHRtcC9jb25maWcuaCIKLSsgICAgY2F0ICIkYWNfcmVzdWx0IiA+PiIkdG1wL2NvbmZpZy5oIgotKyAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSsgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQotK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQotKyAgICBlbHNlCi0rICAgICAgcm0gLWYgJGFjX2ZpbGUKLSsgICAgICBtdiAiJHRtcC9jb25maWcuaCIgJGFjX2ZpbGUKLSAgICAgZmkKLS0gICAgcm0gLWYgJGFjX2ZpbGUKLS0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotKyAgZWxzZQotKyAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIKLSsgICAgY2F0ICIkYWNfcmVzdWx0IgotICAgZmkKLS1maTsgZG9uZQotKyAgcm0gLWYgIiR0bXAvb3V0MTIiCi0rIDs7Ci0gCi0tRU9GCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0rICA6QykgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci0rZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9Ci0rIDs7Ci0rICBlc2FjCi0gCi0tRU9GCi0tY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotLWVjaG8gdGltZXN0YW1wID4gc3RhbXAtaDsgZWNobyB0aW1lc3RhbXAgPiBsaWIvc3RhbXAtaAotLWV4aXQgMAotLUVPRgotKwotKyAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCi0rICAgICJkZWZhdWx0IjpDKSBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWg7IGVjaG8gdGltZXN0YW1wID4gbGliL3N0YW1wLWggOzsKLSsKLSsgIGVzYWMKLStkb25lICMgZm9yIGFjX3RhZwotKwotKwotK3sgKGV4aXQgMCk7IGV4aXQgMDsgfQotK19BQ0VPRgotIGNobW9kICt4ICRDT05GSUdfU1RBVFVTCi0tcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLS10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLSthY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotKwotKwotKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KLSsjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KLSsjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwotKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCi0rIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQotKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCi0raWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0rICBhY19jc19zdWNjZXNzPToKLSsgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KLSsgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0rICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgotKyAgZXhlYyA1Pi9kZXYvbnVsbAotKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotKyAgZXhlYyA1Pj5jb25maWcubG9nCi0rICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAotKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0rICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLStmaQotIAotIAotICMgdmk6IHNldCB0cz04IHN3PTIgOgotZGlmZiAtcmR1cCBsaWJlbGYtMC44LjEwLm9yaWcvY29uZmlndXJlLmluIGxpYmVsZi0wLjguMTAvY29uZmlndXJlLmluCi0tLS0gbGliZWxmLTAuOC4xMC5vcmlnL2NvbmZpZ3VyZS5pbgkyMDA3LTA5LTA3IDE0OjA3OjU5LjAwMDAwMDAwMCArMDIwMAotKysrIGxpYmVsZi0wLjguMTAvY29uZmlndXJlLmluCTIwMDctMDktMjAgMTA6MzE6NDIuMDAwMDAwMDAwICswMjAwCi1AQCAtMTQ4LDIwICsxNDgsMjUgQEAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9lbGZfaCIgPSB5ZXMgXAotIAlbbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWw9aXJpeF0sCi0gCVtsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X3JlbD1ub10pKSkKLSAKLS0gIGNhc2UgIiRsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHI6XAotKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciA2NGJpdCBzdXBwb3J0XSwgbGliZWxmXzY0Yml0LAotKyAgW2Nhc2UgIiRsaWJlbGZfY3Zfc3RydWN0X2VsZjY0X2VoZHI6XAotICRsaWJlbGZfY3ZfdHlwZV9lbGY2NF9hZGRyOlwKLSAkbGliZWxmX2N2X3N0cnVjdF9lbGY2NF9yZWwiIGluCi0gICAgIHllczp5ZXM6eWVzKQotICAgICAgIGxpYmVsZl82NGJpdD15ZXM7OwotICAgICB5ZXM6eWVzOmlyaXgpCi0tICAgICAgQUNfREVGSU5FKF9fTElCRUxGNjRfSVJJWCkKLS0gICAgICBsaWJlbGZfNjRiaXQ9eWVzOzsKLSsgICAgICBsaWJlbGZfNjRiaXQ9aXJpeDs7Ci0gICAgIHllczpubzp5ZXMpCi0tICAgICAgQUNfREVGSU5FKF9fTElCRUxGNjRfTElOVVgpCi0tICAgICAgbGliZWxmXzY0Yml0PXllczs7Ci0rICAgICAgbGliZWxmXzY0Yml0PWxpbnV4OzsKLSAgICAgKikKLSAgICAgICBsaWJlbGZfNjRiaXQ9bm87OwotICAgZXNhYwotKyAgXSkKLSsgIGNhc2UgJGxpYmVsZl82NGJpdCBpbgotKyAgeWVzKSA7OwotKyAgbGludXgpIEFDX0RFRklORShfX0xJQkVMRjY0X0xJTlVYKSA7OwotKyAgaXJpeCkgQUNfREVGSU5FKF9fTElCRUxGNjRfSVJJWCkgOzsKLSsgIGVzYWMKLSAKLSAgICMgQ2hlY2sgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nIGRlZmluaXRpb25zCi0gICBBQ19DQUNIRV9DSEVDSyhbZm9yIEVsZjMyX1ZlcmRlZl0sIGxpYmVsZl9jdl92ZXJkZWYzMiwKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGliZWxmL2xpYmVsZi5tayBiL3BhY2thZ2UvbGliZWxmL2xpYmVsZi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwZWMxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlL2xpYmVsZi9saWJlbGYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGxpYmVsZgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElCRUxGX1ZFUlNJT049MC44LjEzCi1MSUJFTEZfU09VUkNFPWxpYmVsZi0kKExJQkVMRl9WRVJTSU9OKS50YXIuZ3oKLUxJQkVMRl9TSVRFPWh0dHA6Ly93d3cubXI1MTEuZGUvc29mdHdhcmUvCi1MSUJFTEZfSU5TVEFMTF9TVEFHSU5HID0gWUVTCi1MSUJFTEZfSU5TVEFMTF9TVEFHSU5HX09QVCA9IGluc3Ryb290PSQoU1RBR0lOR19ESVIpIGluc3RhbGwKLUxJQkVMRl9JTlNUQUxMX1RBUkdFVF9PUFQgPSBpbnN0cm9vdD0kKFRBUkdFVF9ESVIpIGluc3RhbGwKLQotTElCRUxEX0NPTkZfRU5WID0gbGliZWxmX2N2X3dvcmtpbmdfbWVtbW92ZT15ZXMgXAotCQltcl9jdl90YXJnZXRfZWxmPXllcyBcCi0JCWxpYmVsZl82NGJpdD15ZXMKLQotTElCRUxGX0NPTkZfT1BUID0gLS1kaXNhYmxlLXNhbml0eS1jaGVja3MgXAotCQkkKGlmICQoQlIyX0VOQUJMRV9ERUJVRyksLS1lbmFibGUtZGVidWcsLS1kaXNhYmxlLWRlYnVnKSBcCi0JCSQoaWYgJChCUjJfTEFSR0VGSUxFKSwtLWVuYWJsZS1lbGY2NCkKLQotJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYmV2L2xpYmV2Lm1rIGIvcGFja2FnZS9saWJldi9saWJldi5tawppbmRleCA5NGJkMWM4Li5kOGMwZTZjIDEwMDY0NAotLS0gYS9wYWNrYWdlL2xpYmV2L2xpYmV2Lm1rCisrKyBiL3BhY2thZ2UvbGliZXYvbGliZXYubWsKQEAgLTgsNCArOCwxNSBAQAogTElCRVZfU0lURSA9IGh0dHA6Ly9kaXN0LnNjaG1vcnAuZGUvbGliZXYvQXR0aWMvCiBMSUJFVl9JTlNUQUxMX1NUQUdJTkcgPSBZRVMKIAorZGVmaW5lIExJQkVWX0RBTUFHRV9ERVBSRUNBVEVECisJZm9yIG4gaW4gZXZlbnQuaDsgZG8gXAorCQlzZWQgLWkgJzFpI2Vycm9yICJldiouaCBkZXByZWNhdGVkLCB1c2UgZXZlbnQyLyouaCBvciBldi5oIicgXAorCSAgCQkkKFNUQUdJTkdfRElSKS91c3IvaW5jbHVkZS8kJG47IFwKKwlkb25lCitlbmRlZgorCisjIGxpYmV2IGFuZCBsaWJldmVudCBib3RoIGluc3RhbGwgZGVwcmVjYXRlZCBldmVudC5oLgorIyBEYW1hZ2UgZGVwcmVjYXRlZCBmaWxlcyBzbyB3ZSBkb24ndCBjb25mbGljdC4KK0xJQkVWX1BPU1RfSU5TVEFMTF9UQVJHRVRfSE9PS1MgKz0gTElCRVZfREFNQUdFX0RFUFJFQ0FURUQKKwogJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYmV2ZW50L2xpYmV2ZW50Lm1rIGIvcGFja2FnZS9saWJldmVudC9saWJldmVudC5tawppbmRleCA0NWYxNWY5Li42MTQxYTJkIDEwMDY0NAotLS0gYS9wYWNrYWdlL2xpYmV2ZW50L2xpYmV2ZW50Lm1rCisrKyBiL3BhY2thZ2UvbGliZXZlbnQvbGliZXZlbnQubWsKQEAgLTMsMTAgKzMsOSBAQAogIyBsaWJldmVudAogIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElCRVZFTlRfVkVSU0lPTiA9IDIuMC4yMgotTElCRVZFTlRfU09VUkNFID0gbGliZXZlbnQtJChMSUJFVkVOVF9WRVJTSU9OKS1zdGFibGUudGFyLmd6Ci1MSUJFVkVOVF9TSVRFID0gaHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJChMSUJFVkVOVF9WRVJTSU9OKS1zdGFibGUKLQorTElCRVZFTlRfVkVSU0lPTiA9IDIuMS43LXJjCitMSUJFVkVOVF9TT1VSQ0UgPSBsaWJldmVudC0kKExJQkVWRU5UX1ZFUlNJT04pLnRhci5negorTElCRVZFTlRfU0lURSA9IGh0dHBzOi8vZ2l0aHViLmNvbS9saWJldmVudC9saWJldmVudC9hcmNoaXZlL3JlbGVhc2UtJChMSUJFVkVOVF9WRVJTSU9OKQogTElCRVZFTlRfQVVUT1JFQ09ORiA9IE5PCiBMSUJFVkVOVF9JTlNUQUxMX1NUQUdJTkcgPSBZRVMKIExJQkVWRU5UX0lOU1RBTExfVEFSR0VUID0gWUVTCkBAIC0xNSw2ICsxNCw2MyBAQAogCXJtICQoVEFSR0VUX0RJUikvdXNyL2Jpbi9ldmVudF9ycGNnZW4ucHkKIGVuZGVmCiAKK2RlZmluZSBMSUJFVkVOVF9EQU1BR0VfREVQUkVDQVRFRAorCWZvciBuIGluIGV2ZG5zLmggZXZ1dGlsLmggZXZycGMuaCBldmh0dHAuaCBldmVudC5oOyBkbyBcCisJCXNlZCAtaSAnMWkjZXJyb3IgImV2Ki5oIGRlcHJlY2F0ZWQsIHVzZSBldmVudDIvKi5oIG9yIGV2LmgiJyBcCisJCQkkKFNUQUdJTkdfRElSKS91c3IvaW5jbHVkZS8kJG47IFwKKwlkb25lCitlbmRlZgorZGVmaW5lIEhPU1RfTElCRVZFTlRfREFNQUdFX0RFUFJFQ0FURUQKKwlmb3IgbiBpbiBldmRucy5oIGV2dXRpbC5oIGV2cnBjLmggZXZodHRwLmggZXZlbnQuaDsgZG8gXAorCQlzZWQgLWkgJzFpI2Vycm9yICJldiouaCBkZXByZWNhdGVkLCB1c2UgZXZlbnQyLyouaCBvciBldi5oIicgXAorCQkJJChIT1NUX0RJUikvdXNyL2luY2x1ZGUvJCRuOyBcCisJZG9uZQorZW5kZWYKKworIyBsaWJldmVudCBpbnN0YWxscyBhIHB5dGhvbiBzY3JpcHQgdG8gdGFyZ2V0IC0gZ2V0IHJpZCBvZiBpdCBpZiB3ZQorIyBkb24ndCBoYXZlIHB5dGhvbiBzdXBwb3J0IGVuYWJsZWQKK2lmbmVxICgkKEJSMl9QQUNLQUdFX1BZVEhPTikseSkKK0xJQkVWRU5UX1BPU1RfSU5TVEFMTF9UQVJHRVRfSE9PS1MgKz0gTElCRVZFTlRfUkVNT1ZFX1BZU0NSSVBUCitlbmRpZgorCisjIGxpYmV2ZW50ID49IDIuMS43LXJjIHJlcXVpcmVzIG1hbnVhbCBhdXRvZ2VuLnNoIGludm9jYXRpb24uCitkZWZpbmUgTElCRVZFTlRfQVVUT0dFTgorCWNkICQoQEQpICYmIFwKKwkkKFRBUkdFVF9NQUtFX0VOVikgLi9hdXRvZ2VuLnNoCitlbmRlZgorTElCRVZFTlRfUFJFX0NPTkZJR1VSRV9IT09LUyArPSBMSUJFVkVOVF9BVVRPR0VOCitIT1NUX0xJQkVWRU5UX1BSRV9DT05GSUdVUkVfSE9PS1MgKz0gTElCRVZFTlRfQVVUT0dFTgorCisjIGxpYmV2IGFuZCBsaWJldmVudCBib3RoIGluc3RhbGwgZGVwcmVjYXRlZCBldmVudC5oLgorIyBEYW1hZ2UgZGVwcmVjYXRlZCBmaWxlcyBzbyB3ZSBkb24ndCBjb25mbGljdC4KK0xJQkVWRU5UX1BPU1RfSU5TVEFMTF9UQVJHRVRfSE9PS1MgKz0gTElCRVZFTlRfREFNQUdFX0RFUFJFQ0FURUQKK0hPU1RfTElCRVZFTlRfUE9TVF9JTlNUQUxMX0hPT0tTICs9IEhPU1RfTElCRVZFTlRfREFNQUdFX0RFUFJFQ0FURUQKKworIyBPbmx5IGJ1aWxkIGZvciBTU0wgaWYgaXQncyBlbmFibGVkLgoraWZlcSAoJChCUjJfUEFDS0FHRV9PUEVOU1NMKSx5KQorTElCRVZFTlRfREVQRU5ERU5DSUVTICs9IG9wZW5zc2wKK0xJQkVWRU5UX0NPTkZfT1BUUyArPSAtLWVuYWJsZS1vcGVuc3NsCisjIG9wZW5zc2wgbmVlZHMgemxpYiBidXQgY29uZmlndXJlIGZvcmdldHMgdG8gbGluayBhZ2FpbnN0IGl0IGNhdXNpbmcKKyMgb3BlbnNzbCBkZXRlY3Rpb24gdG8gZmFpbAoraWZlcSAoJChCUjJfU1RBVElDX0xJQlMpLHkpCitMSUJFVkVOVF9DT05GX0VOViArPSBPUEVOU1NMX0xJQkFERD0nLWx6JworZW5kaWYKK2Vsc2UKK0xJQkVWRU5UX0NPTkZfT1BUUyArPSAtLWRpc2FibGUtb3BlbnNzbAorZW5kaWYKKworIyBXZSBkb24ndCBuZWVkIHNhbXBsZXMsIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBzdGF0aWMgbGlicmFyaWVzLgorTElCRVZFTlRfQ09ORl9PUFRTICs9IC0tZGlzYWJsZS1zYW1wbGVzIC0tZGlzYWJsZS1zdGF0aWMKK0hPU1RfTElCRVZFTlRfQ09ORl9PUFRTICs9IC0tZGlzYWJsZS1zYW1wbGVzIC0tZGlzYWJsZS1zdGF0aWMKKworIyBCdWlsZCB3aXRoIFBJQyBvbmx5LgorTElCRVZFTlRfQ09ORl9PUFRTICs9IC0td2l0aC1waWMKK0hPU1RfTElCRVZFTlRfQ09ORl9PUFRTICs9IC0td2l0aC1waWMKKworZGVmaW5lIExJQkVWRU5UX1JFTU9WRV9QWVNDUklQVAorCXJtICQoVEFSR0VUX0RJUikvdXNyL2Jpbi9ldmVudF9ycGNnZW4ucHkKK2VuZGVmCisKICMgbGliZXZlbnQgaW5zdGFsbHMgYSBweXRob24gc2NyaXB0IHRvIHRhcmdldCAtIGdldCByaWQgb2YgaXQgaWYgd2UKICMgZG9uJ3QgaGF2ZSBweXRob24gc3VwcG9ydCBlbmFibGVkCiBpZm5lcSAoJChCUjJfUEFDS0FHRV9QWVRIT04pLHkpCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYmdsaWIyL2xpYmdsaWIyLm1rIGIvcGFja2FnZS9saWJnbGliMi9saWJnbGliMi5tawppbmRleCA3MDdlZWFhLi5mZmU0YjA2IDEwMDY0NAotLS0gYS9wYWNrYWdlL2xpYmdsaWIyL2xpYmdsaWIyLm1rCisrKyBiL3BhY2thZ2UvbGliZ2xpYjIvbGliZ2xpYjIubWsKQEAgLTc4LDYgKzc4LDcgQEAKIGRlZmluZSBMSUJHTElCMl9SRU1PVkVfREVWX0ZJTEVTCiAJcm0gLXJmICQoVEFSR0VUX0RJUikvdXNyL2xpYi9nbGliLTIuMAogCXJtIC1yZiAkKFRBUkdFVF9ESVIpL3Vzci9zaGFyZS9nbGliLTIuMC9nZXR0ZXh0CisJcm0gLXJmICQoVEFSR0VUX0RJUikvdXNyL3NoYXJlL2dsaWItMi4wL2NvZGVnZW4KIAlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKFRBUkdFVF9ESVIpL3Vzci9zaGFyZS9nbGliLTIuMAogCXJtIC1mICQoYWRkcHJlZml4ICQoVEFSR0VUX0RJUikvdXNyL2Jpbi8sZ2xpYi1nZW5tYXJzaGFsIGdsaWItZ2V0dGV4dGl6ZSBnbGliLW1rZW51bXMgZ29iamVjdC1xdWVyeSBndGVzdGVyIGd0ZXN0ZXItcmVwb3J0KQogZW5kZWYKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGlibG9ja2ZpbGUvbGlibG9ja2ZpbGUtMDAwMS1EaXNhYmxlLWxvY2tmaWxlX2NyZWF0ZS1saW5lYXItYmFja29mZi5wYXRjaCBiL3BhY2thZ2UvbGlibG9ja2ZpbGUvbGlibG9ja2ZpbGUtMDAwMS1EaXNhYmxlLWxvY2tmaWxlX2NyZWF0ZS1saW5lYXItYmFja29mZi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E5NDIxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9saWJsb2NrZmlsZS9saWJsb2NrZmlsZS0wMDAxLURpc2FibGUtbG9ja2ZpbGVfY3JlYXRlLWxpbmVhci1iYWNrb2ZmLnBhdGNoCkBAIC0wLDAgKzEsNDMgQEAKK0Zyb20gOTdmMGI4ZmRiZWJhYzNmZDMzOTgwNzlkM2RiM2NjY2I4NTNlYjBlNyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFJpY2hhcmQgRnJhbmtlbCA8cm9mcmFua2VsQGdvb2dsZS5jb20+CitEYXRlOiBGcmksIDIgRGVjIDIwMTYgMTM6NDY6NDAgLTA1MDAKK1N1YmplY3Q6IFtQQVRDSF0gRGlzYWJsZSBsb2NrZmlsZV9jcmVhdGUgbGluZWFyIGJhY2tvZmYuCisKK0xpbmVhciBiYWNrb2ZmIGNhdXNlcyB2ZXJ5IHVuZmFpciBiZWhhdmlvciwgaW4gd2hpY2ggdGhlIGxvbmdlciBhCitwcm9jZXNzIGhhcyBiZWVuIHdhaXRpbmcsIHRoZSBsZXNzIGxpa2VseSBpdCBpcyB0byBncmFiIGEgY29udGVzdGVkCitsb2NrLgorCitSZW1vdmUgdGhlIGJhY2tvZmYgYW5kIGNoZWNrIG9uY2UgcGVyIHNlY29uZCBpbnN0ZWFkLgorLS0tCisgbG9ja2ZpbGUuYyB8IDggKysrKystLS0KKyAxIGZpbGUgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvbG9ja2ZpbGUuYyBiL2xvY2tmaWxlLmMKK2luZGV4IGY1NzFhNjcuLmU1MmYzZTQgMTAwNjQ0CistLS0gYS9sb2NrZmlsZS5jCisrKysgYi9sb2NrZmlsZS5jCitAQCAtMTc3LDcgKzE3Nyw3IEBAIGludCBsb2NrZmlsZV9jcmVhdGUoY29uc3QgY2hhciAqbG9ja2ZpbGUsIGludCByZXRyaWVzLCBpbnQgZmxhZ3MpCisgCWNoYXIJCXN5c25hbWVbMjU2XTsKKyAJY2hhcgkJYnVmWzhdOworIAljaGFyCQkqcDsKKy0JaW50CQlzbGVlcHRpbWUgPSAwOworKwlpbnQJCXNsZWVwdGltZSA9IDE7CisgCWludAkJc3RhdGZhaWxlZCA9IDA7CisgCWludAkJZmQ7CisgCWludAkJaSwgZSwgbGVuOworQEAgLTI1Myw4ICsyNTMsMTAgQEAgaW50IGxvY2tmaWxlX2NyZWF0ZShjb25zdCBjaGFyICpsb2NrZmlsZSwgaW50IHJldHJpZXMsIGludCBmbGFncykKKyAJZm9yIChpID0gMDsgaSA8IHRyaWVzICYmIHRyaWVzID4gMDsgaSsrKSB7CisgCisgCQlpZiAoIWRvbnRzbGVlcCkgeworLQkJCXNsZWVwdGltZSArPSA1OworLQkJCWlmIChzbGVlcHRpbWUgPiA2MCkgc2xlZXB0aW1lID0gNjA7CisrCQkJLy8gR0ZpYmVyIG1vZGlmaWNhdGlvbjogIERpc2FibGUgbGluZWFyIGJhY2tvZmYsIHdoaWNoIGNhdXNlcyB2ZXJ5IHVuZmFpcgorKwkJCS8vIGJlaGF2aW9yLgorKwkJCS8vIHNsZWVwdGltZSArPSA1OworKwkJCS8vIGlmIChzbGVlcHRpbWUgPiA2MCkgc2xlZXB0aW1lID0gNjA7CisgI2lmZGVmIExJQgorIAkJCXNsZWVwKHNsZWVwdGltZSk7CisgI2Vsc2UKKy0tIAorMi44LjAucmMzLjIyNi5nMzlkNDAyMAorCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYnVud2luZC9Db25maWcuaW4gYi9wYWNrYWdlL2xpYnVud2luZC9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjYjQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvbGlidW53aW5kL0NvbmZpZy5pbgpAQCAtMCwwICsxLDE1IEBACitjb25maWcgQlIyX1BBQ0tBR0VfTElCVU5XSU5ECisJYm9vbCAibGlidW53aW5kIgorCWRlcGVuZHMgb24gQlIyX1RPT0xDSEFJTl9IQVNfVEhSRUFEUworCWRlcGVuZHMgb24gKEJSMl9VQ0xJQkNfVkVSU0lPTl9TTkFQU0hPVCB8fCBCUjJfVE9PTENIQUlOX1VTRVNfR0xJQkMpICMge2csc31ldGNvbnRleHQKKwlkZXBlbmRzIG9uIEJSMl9hcm0gfHwgQlIyX2FybWViIHx8IEJSMl9taXBzIHx8IEJSMl9taXBzZWwgfHwgQlIyX21pcHM2NCB8fCBcCisJCUJSMl9taXBzNjRlbCB8fCBCUjJfcG93ZXJwYyB8fCBCUjJfc2ggfHwgQlIyX3NoNjQgfHwgQlIyX2kzODYgfHwgQlIyX3g4Nl82NAorCWhlbHAKKwkgIEMgQVBJIHRvIGRldGVybWluZSB0aGUgY2FsbC1jaGFpbiBvZiBhIHByb2dyYW0uCisKKwkgIGh0dHA6Ly93d3cubm9uZ251Lm9yZy9saWJ1bndpbmQvaW5kZXguaHRtbAorCitjb21tZW50ICJsaWJ1bndpbmQgbmVlZHMgYSB1Y2xpYmMgc25hcHNob3Qgb3IgKGUpZ2xpYmMgdG9vbGNoYWluIHcvIHRocmVhZHMiCisJZGVwZW5kcyBvbiBCUjJfYXJtIHx8IEJSMl9hcm1lYiB8fCBCUjJfbWlwcyB8fCBCUjJfbWlwc2VsIHx8IEJSMl9taXBzNjQgfHwgXAorCQlCUjJfbWlwczY0ZWwgfHwgQlIyX3Bvd2VycGMgfHwgQlIyX3NoIHx8IEJSMl9zaDY0IHx8IEJSMl9pMzg2IHx8IEJSMl94ODZfNjQKKwlkZXBlbmRzIG9uICFCUjJfVE9PTENIQUlOX0hBU19USFJFQURTIHx8ICEoQlIyX1VDTElCQ19WRVJTSU9OX1NOQVBTSE9UIHx8IEJSMl9UT09MQ0hBSU5fVVNFU19HTElCQykKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGlidW53aW5kL2xpYnVud2luZC0wMDAxLWRpc2FibGUtdGVzdHMucGF0Y2ggYi9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQtMDAwMS1kaXNhYmxlLXRlc3RzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDc1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQtMDAwMS1kaXNhYmxlLXRlc3RzLnBhdGNoCkBAIC0wLDAgKzEsMzIgQEAKK0Rpc2FibGUgYnVpbGRpbmcgb2YgdGVzdHMKKworbGlidW53aW5kIHRlc3RzIGRvIG5vdCBidWlsZCB3aXRoIHVDbGliYywgc28gd2UgZGlzYWJsZSB0aGVtLgorCitTaWduZWQtb2ZmLWJ5OiBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4KKworSW5kZXg6IGIvTWFrZWZpbGUuYW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBhL01ha2VmaWxlLmFtCisrKysgYi9NYWtlZmlsZS5hbQorQEAgLTM2LDcgKzM2LDcgQEAKKyAKKyBub2Rpc3RfaW5jbHVkZV9IRUFERVJTID0gaW5jbHVkZS9saWJ1bndpbmQtY29tbW9uLmgKKyAKKy1TVUJESVJTID0gc3JjIHRlc3RzIGRvYworK1NVQkRJUlMgPSBzcmMgZG9jCisgCisgbm9pbnN0X0hFQURFUlMgPSBpbmNsdWRlL2R3YXJmLmggaW5jbHVkZS9kd2FyZl9pLmggaW5jbHVkZS9kd2FyZi1laC5oCVwKKyAJaW5jbHVkZS9jb21waWxlci5oIGluY2x1ZGUvbGlidW53aW5kX2kuaCBpbmNsdWRlL21lbXBvb2wuaAlcCitJbmRleDogYi9NYWtlZmlsZS5pbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIGEvTWFrZWZpbGUuaW4KKysrKyBiL01ha2VmaWxlLmluCitAQCAtMzEzLDcgKzMxMyw3IEBACisgCSQoYW1fX2FwcGVuZF83KSAkKGFtX19hcHBlbmRfOCkgJChhbV9fYXBwZW5kXzkpIFwKKyAJJChhbV9fYXBwZW5kXzEwKQorIG5vZGlzdF9pbmNsdWRlX0hFQURFUlMgPSBpbmNsdWRlL2xpYnVud2luZC1jb21tb24uaAorLVNVQkRJUlMgPSBzcmMgdGVzdHMgZG9jCisrU1VCRElSUyA9IHNyYyBkb2MKKyBub2luc3RfSEVBREVSUyA9IGluY2x1ZGUvZHdhcmYuaCBpbmNsdWRlL2R3YXJmX2kuaCBpbmNsdWRlL2R3YXJmLWVoLmgJXAorIAlpbmNsdWRlL2NvbXBpbGVyLmggaW5jbHVkZS9saWJ1bndpbmRfaS5oIGluY2x1ZGUvbWVtcG9vbC5oCVwKKyAJaW5jbHVkZS9yZW1vdGUuaAkJCQkJCVwKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbGlidW53aW5kL2xpYnVud2luZC0wMDAyLUFkZC1BT19SRVFVSVJFX0NBUy10by1maXgtYnVpbGQtb24tQVJNLXY2LnBhdGNoIGIvcGFja2FnZS9saWJ1bndpbmQvbGlidW53aW5kLTAwMDItQWRkLUFPX1JFUVVJUkVfQ0FTLXRvLWZpeC1idWlsZC1vbi1BUk0tdjYucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzN2VkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvbGlidW53aW5kL2xpYnVud2luZC0wMDAyLUFkZC1BT19SRVFVSVJFX0NBUy10by1maXgtYnVpbGQtb24tQVJNLXY2LnBhdGNoCkBAIC0wLDAgKzEsNTYgQEAKK0Zyb20gMjQ0ODRlODBiM2UzMjljOWVkZWUxOTk1ZTEwMmY4NjEyZWVkYjc5YyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorRGF0ZTogVHVlLCAxMyBNYXkgMjAxNCAyMzozMjoyNyArMDIwMAorU3ViamVjdDogW1BBVENIXSBBZGQgQU9fUkVRVUlSRV9DQVMgdG8gZml4IGJ1aWxkIG9uIEFSTSA8IHY2CisKK0FSTSBlYXJsaWVyIHRoYW4gQVJNdjYsIHN1Y2ggYXMgQVJNdjQgYW5kIEFSTXY1IGRvIG5vdCBwcm92aWRlCitvcHRpbWl6ZSBhdG9taWMgb3BlcmF0aW9ucyBpbiBsaWJhdG9taWNfb3BzLiBTaW5jZSBsaWJ1bndpbmQgaXMgdXNpbmcKK3N1Y2ggb3BlcmF0aW9ucywgaXQgc2hvdWxkIGRlZmluZSBBT19SRVFVSVJFX0NBUyBiZWZvcmUgaW5jbHVkaW5nCis8YXRvbWljX29wcy5oPiBzbyB0aGF0IGxpYmF0b21pY19vcHMga25vd3MgaXQgc2hvdWxkIHVzZSBlbXVsYXRlZAorYXRvbWljIG9wZXJhdGlvbnMgaW5zdGVhZCAoZXZlbiB0aG91Z2ggdGhleSBhcmUgb2J2aW91c2x5IGEgbG90IG1vcmUKK2V4cGVuc2l2ZSkuCisKK0Fsc28sIHdoaWxlIHJlYWwgYXRvbWljIG9wZXJhdGlvbnMgYXJlIGFsbCBpbmxpbmUgZnVuY3Rpb25zIGFuZAordGhlcmVmb3JlIGxpbmtpbmcgYWdhaW5zdCBsaWJhdG9taWNfb3BzIHdhcyBub3QgcmVxdWlyZWQsIHRoZSBlbXVsYXRlZAorYXRvbWljIG9wZXJhdGlvbnMgYWN0dWFsbHkgcmVxdWlyZSBsaW5raW5nIGFnYWluc3QgbGliYXRvbWljX29wcywgc28KK3RoZSBjb21tZW50ZWQgQUNfQ0hFQ0tfTElCIHRlc3QgaW4gYWNpbmNsdWRlLm00IGlzIHVuY29tbWVudGVkIHRvIG1ha2UKK3N1cmUgd2UgbGluayBhZ2FpbnN0IGxpYmF0b21pY19vcHMuCisKK1NpZ25lZC1vZmYtYnk6IFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorLS0tCisgYWNpbmNsdWRlLm00ICAgICAgICAgIHwgOCArLS0tLS0tLQorIGluY2x1ZGUvbGlidW53aW5kX2kuaCB8IDEgKworIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCA3IGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00CitpbmRleCA0OTdmN2MyLi45YzE1YWYxIDEwMDY0NAorLS0tIGEvYWNpbmNsdWRlLm00CisrKysgYi9hY2luY2x1ZGUubTQKK0BAIC0yMiwxMSArMjIsNSBAQCBmaV0pCisgQUNfREVGVU4oW0NIRUNLX0FUT01JQ19PUFNdLAorIFtkbmwgQ2hlY2sgd2hldGhlciB0aGUgc3lzdGVtIGhhcyB0aGUgYXRvbWljX29wcyBwYWNrYWdlIGluc3RhbGxlZC4KKyAgIEFDX0NIRUNLX0hFQURFUlMoYXRvbWljX29wcy5oKQorLSMKKy0jIERvbid0IGxpbmsgYWdhaW5zdCBsaWJhdG9taWNfb3BzIGZvciBub3cuICBXZSBkb24ndCB3YW50IGxpYnVud2luZAorLSMgdG8gZGVwZW5kIG9uIGxpYmF0b21pY19vcHMuc28uICBGb3J0dW5hdGVseSwgbm9uZSBvZiB0aGUgcGxhdGZvcm1zCistIyB3ZSBjYXJlIGFib3V0IHNvIGZhciBuZWVkIGxpYmF0b21pY19vcHMuYSAoZXZlcnl0aGluZyBpcyBkb25lIHZpYQorLSMgaW5saW5lIG1hY3JvcykuCistIworLSMgIEFDX0NIRUNLX0xJQihhdG9taWNfb3BzLCBtYWluKQorKyAgQUNfQ0hFQ0tfTElCKGF0b21pY19vcHMsIG1haW4pCisgXSkKK2RpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnVud2luZF9pLmggYi9pbmNsdWRlL2xpYnVud2luZF9pLmgKK2luZGV4IDIzZjYxNWUuLmRlYWJkZmQgMTAwNjQ0CistLS0gYS9pbmNsdWRlL2xpYnVud2luZF9pLmgKKysrKyBiL2luY2x1ZGUvbGlidW53aW5kX2kuaAorQEAgLTk1LDYgKzk1LDcgQEAgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworIAkocHRocmVhZF9tdXRleF91bmxvY2sgIT0gTlVMTCA/IHB0aHJlYWRfbXV0ZXhfdW5sb2NrIChsKSA6IDApCisgCisgI2lmZGVmIEhBVkVfQVRPTUlDX09QU19ICisrIyBkZWZpbmUgQU9fUkVRVUlSRV9DQVMKKyAjIGluY2x1ZGUgPGF0b21pY19vcHMuaD4KKyBzdGF0aWMgaW5saW5lIGludAorIGNtcHhjaGdfcHRyICh2b2lkICphZGRyLCB2b2lkICpvbGQsIHZvaWQgKm5ldykKKy0tIAorMS45LjIKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJ1bndpbmQvbGlidW53aW5kLTAwMDMtTGluay1saWJ1bndpbmQtdG8tbGliZ2NjX3MtcmF0aGVyLXRoYW4tbGliZ2NjLnBhdGNoIGIvcGFja2FnZS9saWJ1bndpbmQvbGlidW53aW5kLTAwMDMtTGluay1saWJ1bndpbmQtdG8tbGliZ2NjX3MtcmF0aGVyLXRoYW4tbGliZ2NjLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQtMDAwMy1MaW5rLWxpYnVud2luZC10by1saWJnY2Nfcy1yYXRoZXItdGhhbi1saWJnY2MucGF0Y2gKQEAgLTAsMCArMSw0MSBAQAorRnJvbSBmMTY4NDM3OWRmYWY4MDE4ZDVkNGMxOTQ1ZTI5MmE1NmQwZmFiMjQ1IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KK0RhdGU6IEZyaSwgMjcgSnVuIDIwMTQgMDg6NDA6MzMgKzAyMDAKK1N1YmplY3Q6IFtQQVRDSF0gTGluayBsaWJ1bndpbmQgdG8gbGliZ2NjX3MgcmF0aGVyIHRoYW4gbGliZ2NjCisKK0ZvciBzb21lIGFyY2hpdGVjdHVyZXMsIC1sZ2NjIGFuZCAtbGdjY19zIGFyZSBub3QgZXF1aXZhbGVudC4gT24gQVJNIGZvcgorZXhhbXBsZSwgbGliZ2NjX3Muc28uMSBjb250YWlucyBzb21lIHN5bWJvbHMgbmVlZGVkIGJ5IGxpYnVud2luZCB3aGljaAorYXJlIG5vdCBwcmVzZW50IGluIGxpYmdjYy4KKworVGhpcyBjYXVzZXMgdGhlIGZvbGxvd2luZyBsaW5rIGVycm9yIHdoZW4gYnVpbGRpbmcgdGhlIFguT3JnIFggc2VydmVyCit3aXRoIGxpYnVud2luZCBzdXBwb3J0OgorCisJICBDQ0xEICAgICBYb3JnCisJL3Vzci9saWIvbGlidW53aW5kLnNvOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBfX2FlYWJpX3Vud2luZF9jcHBfcHIwJworCS91c3IvbGliL2xpYnVud2luZC5zbzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgX19hZWFiaV91bndpbmRfY3BwX3ByMScKKworTGlua2luZyBhZ2FpbnN0IGxpYmdjY19zIGV4cGxpY2l0bHkgc29sdmVzIHRoaXMgcHJvYmxlbS4KKworU2lnbmVkLW9mZi1ieTogVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4KK1t5YW5uLm1vcmluLjE5OThAZnJlZS5mcjogYmFja3BvcnQgdG8gbGlidW53aW5kIDEuMV0KK1NpZ25lZC1vZmYtYnk6ICJZYW5uIEUuIE1PUklOIiA8eWFubi5tb3Jpbi4xOTk4QGZyZWUuZnI+CistLS0KKyBjb25maWd1cmUuYWMgfCAyICstCisgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCisKK2RpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKK2luZGV4IDRlMmZkMjMuLmE3N2NmMDEgMTAwNjQ0CistLS0gYS9jb25maWd1cmUuYWMKKysrKyBiL2NvbmZpZ3VyZS5hYworQEAgLTI1OCw3ICsyNTgsNyBAQCBlbHNlCisgCisgaWYgdGVzdCB4JEdDQyA9IHh5ZXMgLWEgeCRpbnRlbF9jb21waWxlciAhPSB4eWVzOyB0aGVuCisgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtZmV4Y2VwdGlvbnMgLVdhbGwgLVdzaWduLWNvbXBhcmUiCistICBMSUJDUlRTPSItbGdjYyIKKysgIExJQkNSVFM9Ii1sZ2NjX3MiCisgZmkKKyBBQ19NU0dfUkVTVUxUKFskaW50ZWxfY29tcGlsZXJdKQorIAorLS0gCisxLjkuMQorCmRpZmYgLS1naXQgYS9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQuaGFzaCBiL3BhY2thZ2UvbGlidW53aW5kL2xpYnVud2luZC5oYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzQ3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQuaGFzaApAQCAtMCwwICsxLDIgQEAKKyMgTG9jYWxseSBjYWxjdWxhdGVkIGFmdGVyIGNoZWNraW5nIHBncCBzaWduYXR1cmUKK3NoYTI1Ngk5ZGZlMGZjYWUyYTg2NmRlOWQzOTQyYzY2OTk1ZTRiNDYwMjMwNDQ2ODg3ZGJkYWIzMDJkNDFhOGFlZThkMDlhICBsaWJ1bndpbmQtMS4xLnRhci5negpkaWZmIC0tZ2l0IGEvcGFja2FnZS9saWJ1bndpbmQvbGlidW53aW5kLm1rIGIvcGFja2FnZS9saWJ1bndpbmQvbGlidW53aW5kLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGEzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlL2xpYnVud2luZC9saWJ1bndpbmQubWsKQEAgLTAsMCArMSwxNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbGlidW53aW5kCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitMSUJVTldJTkRfVkVSU0lPTiA9IDEuMQorTElCVU5XSU5EX1NJVEUgPSBodHRwOi8vZG93bmxvYWQuc2F2YW5uYWguZ251Lm9yZy9yZWxlYXNlcy9saWJ1bndpbmQKK0xJQlVOV0lORF9JTlNUQUxMX1NUQUdJTkcgPSBZRVMKK0xJQlVOV0lORF9BVVRPUkVDT05GID0gWUVTCisKK2lmZXEgKCQoQlIyX1BBQ0tBR0VfTElCQVRPTUlDX09QUykseSkKK0xJQlVOV0lORF9ERVBFTkRFTkNJRVMgPSBsaWJhdG9taWNfb3BzCitlbmRpZgorCiskKGV2YWwgJChjYWxsIEFVVE9UQVJHRVRTKSkKZGlmZiAtLWdpdCBhL3BhY2thZ2UvbG9ja2ZpbGUtcHJvZ3MvbG9ja2ZpbGUtcHJvZ3MtMDAwMS1DaGFuZ2UtdGhlLWRlZmF1bHQtcmV0cnktY291bnQtdG8tMTgwLnBhdGNoIGIvcGFja2FnZS9sb2NrZmlsZS1wcm9ncy9sb2NrZmlsZS1wcm9ncy0wMDAxLUNoYW5nZS10aGUtZGVmYXVsdC1yZXRyeS1jb3VudC10by0xODAucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjMGEyMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UvbG9ja2ZpbGUtcHJvZ3MvbG9ja2ZpbGUtcHJvZ3MtMDAwMS1DaGFuZ2UtdGhlLWRlZmF1bHQtcmV0cnktY291bnQtdG8tMTgwLnBhdGNoCkBAIC0wLDAgKzEsMjcgQEAKK0Zyb20gY2VjNmQwYTcwN2YyNDk3MTY1ZjcxY2ZkNDFmNTA1NjY3YmJkMTU5MyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFJpY2hhcmQgRnJhbmtlbCA8cm9mcmFua2VsQGdvb2dsZS5jb20+CitEYXRlOiBXZWQsIDE0IERlYyAyMDE2IDE4OjIzOjMwIC0wNTAwCitTdWJqZWN0OiBbUEFUQ0hdIENoYW5nZSB0aGUgZGVmYXVsdCByZXRyeS1jb3VudCB0byAxODAuCisKK1RoaXMgbWFpbnRhaW5zIHRoZSBkZWZhdWx0IHRpbWVvdXQgb2YgMTgwIHNlY29uZHMsIG5vdyB0aGF0IEdGaWJlcidzCitsaWJsb2NrZmlsZSB1c2VzIGNvbnN0YW50IDFzIHJldHJpZXMgcmF0aGVyIHRoYW4gbGluZWFyIGJhY2tvZmYuCistLS0KKyBsb2NrZmlsZS1wcm9ncy5jIHwgMiArLQorIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQorCitkaWZmIC0tZ2l0IGEvbG9ja2ZpbGUtcHJvZ3MuYyBiL2xvY2tmaWxlLXByb2dzLmMKK2luZGV4IGI4Zjk1ODYuLmQ2NzViNGUgMTAwNjQ0CistLS0gYS9sb2NrZmlsZS1wcm9ncy5jCisrKysgYi9sb2NrZmlsZS1wcm9ncy5jCitAQCAtMzAsNyArMzAsNyBAQAorIHN0YXRpYyBjb25zdCBjaGFyICphY3Rpb24gPSBOVUxMOworIHN0YXRpYyBjaGFyICp0YXJnZXRfZmlsZSA9IE5VTEw7Cisgc3RhdGljIGludCByZXRyeV9jb3VudF9zcGVjaWZpZWQgPSAwOworLXN0YXRpYyBpbnQgcmV0cnlfY291bnQgPSA5OyAvKiBUaGlzIHdpbGwgYmUgYSBtYXhpbXVtIG9mIDMgbWludXRlcyAqLworK3N0YXRpYyBpbnQgcmV0cnlfY291bnQgPSAxODA7IC8qIFRoaXMgd2lsbCBiZSBhIG1heGltdW0gb2YgMyBtaW51dGVzICovCisgc3RhdGljIGludCB0b3VjaGxvY2tfb25lc2hvdCA9IDA7Cisgc3RhdGljIGludCB1c2VfcGlkID0gMDsKKyAKKy0tIAorMi44LjAucmMzLjIyNi5nMzlkNDAyMAorCmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC9tdl9hcHAubWsgYi9wYWNrYWdlL212X2FwcC9tdl9hcHAubWsKaW5kZXggMWRjYTQ1Zi4uNTUxMTg4YSAxMDA2NDQKLS0tIGEvcGFja2FnZS9tdl9hcHAvbXZfYXBwLm1rCisrKyBiL3BhY2thZ2UvbXZfYXBwL212X2FwcC5tawpAQCAtMjAsNyArMjAsMTUgQEAKIAkJY3AgLWYgICQoQEQpL3Rvb2xzL29tY2lfdG9vbCAkKFRBUkdFVF9ESVIpL3Vzci9iaW4vOyBcCiAJZmkKIAlta2RpciAtcCAkKFRBUkdFVF9ESVIpL2V0Yy94bWxfcGFyYW1zCi0JY3AgLWZwUCBwYWNrYWdlL212X2FwcC94bWxfcGFyYW1zLyogJChUQVJHRVRfRElSKS9ldGMveG1sX3BhcmFtcy8KKworCSMgQ29weSBvdmVyIHNoYXJlZCBYTUwgZmlsZXMKKwljcCAtZnBQIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvKi54bWwgJChUQVJHRVRfRElSKS9ldGMveG1sX3BhcmFtcy8KKworCSMgQ29weSBvdmVyIHBsYXRmb3JtIHNwZWNpZmljIFhNTCBmaWxlcworCWNwIC1mcFAgcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUueG1sLiQoQlIyX1RBUkdFVF9HRU5FUklDX1BMQVRGT1JNX05BTUUpICQoVEFSR0VUX0RJUikvZXRjL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbAorCWNwIC1mcFAgcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2Vwb24ueG1sLiQoQlIyX1RBUkdFVF9HRU5FUklDX1BMQVRGT1JNX05BTUUpICQoVEFSR0VUX0RJUikvZXRjL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9lcG9uLnhtbAorCWNwIC1mcFAgcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2dwb24ueG1sLiQoQlIyX1RBUkdFVF9HRU5FUklDX1BMQVRGT1JNX05BTUUpICQoVEFSR0VUX0RJUikvZXRjL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbAorCiBlbmRlZgogCiAkKGV2YWwgJChjYWxsIEdFTlRBUkdFVFMpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9lb2FtX3htbF9jZmdfZmlsZS54bWwgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL2VvYW1feG1sX2NmZ19maWxlLnhtbAppbmRleCA1NzQ4OGIyLi4xYmQyMTJiIDEwMDY0NAotLS0gYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL2VvYW1feG1sX2NmZ19maWxlLnhtbAorKysgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL2VvYW1feG1sX2NmZ19maWxlLnhtbApAQCAtOCw2ICs4LDcgQEAKICAgICA8b2FtX3NvZnR2ZXJfZnJvbV94bWw+MDwvb2FtX3NvZnR2ZXJfZnJvbV94bWw+DQogICA8L09OVV9TTj4NCiANCisNCiAgIDwhLS0gIE1hbmFnZW1lbnQgb2YgbG9vcCBkZXRlY3Rpb24gIDEgPSBkaXNhY3RpdmF0ZWQsIDIgPSBhY3RpdmF0ZWQgICAtLT4NCiAgIDxPTlVfTE9PUERFVEVDVD4NCiAgICAgPHBvcnQgaWQ9IjEiIGxvb3BkZXRlY3Q9IjEiLz4NCkBAIC0xNjgsNSArMTY5LDEwIEBACiAgICAgICA8TExJRCBpZD0iNyIgbnVtPSIwIiAvPg0KICAgICA8L09BTV9UWF9xdWV1ZT4NCiAgIDwvT05VX09BTV9RVUVVRT4NCisgIDxPQU1fVkxBTl9NT0RFX0FVWElMSUFSWT4NCisgICAgPCEtLSAgT0FNIGRvd25zdHJlYW0gdHJhbnNwYXJlbnQgdmlkIHdoaWNoIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdW50YWdnZWQgcGFja2V0cyBpbiBzd2l0Y2ggLS0+DQorICAgIDwhLS0gIFRoZSB2aWQgd2lsbCBiZSBhZGRlZCBmb3IgdW50YWdnZWQgcGFja2V0cyBieSBQTkMgcnVsZSBhbmQgYmUgc3RyaXBwZWQgaW4gc3dpdGNoIHRyYW5zcGFyZW50IG1vZGUgcG9ydCAtLT4NCisgICAgPG9hbV9kb3duc3RyZWFtX3RyYW5zcGFyZW50X3ZpZD4yOTk5PC9vYW1fZG93bnN0cmVhbV90cmFuc3BhcmVudF92aWQ+DQorICA8L09BTV9WTEFOX01PREVfQVVYSUxJQVJZPg0KIA0KIDwvY25mZz4NCmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL2kyY194bWxfY2ZnX2ZpbGUueG1sIGIvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9pMmNfeG1sX2NmZ19maWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEyYmZhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9pMmNfeG1sX2NmZ19maWxlLnhtbApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGNuZmc+CisgICAgPEkyQ19DT05GSUc+CisgICAgICAgIDwhLS0gIFdoZXRoZXIgdGhlIHRyYW5zY2VpdmVyIGNhbiB1c2UgaTJjIGJsb2NrIHJlYWQgb3IgY2hhcmFjdGVyIHJlYWQgMC1hdXRvbWF0aWMsIDEtcmVhZCBieXRlLCAyLXJlYWQgYmxvY2sgLS0+CisgICAgICAgIDxpMmNfeHZyX3JlYWRfbW9kZT4yPC9pMmNfeHZyX3JlYWRfbW9kZT4KKyAgICA8L0kyQ19DT05GSUc+Cis8L2NuZmc+CmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29tY2lfeG1sX2NmZ19maWxlLnRtcGwueG1sIGIvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9vbWNpX3htbF9jZmdfZmlsZS50bXBsLnhtbAppbmRleCBjYzE1MDRjLi5kOGQxZDBmIDEwMDY0NAotLS0gYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29tY2lfeG1sX2NmZ19maWxlLnRtcGwueG1sCisrKyBiL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb21jaV94bWxfY2ZnX2ZpbGUudG1wbC54bWwKQEAgLTc4LDE0ICs3OCwxNyBAQAogCiAgICAgICAgIDwhLS0gIFRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG5vbiBPTUNJIFQtQ09OVC4gVXN1YWxseSB0Y29udElkID0gMSAoMHg4MDAxLCAweDgwMDIuLiBudW1iZXJpbmcpICAtLT4KICAgICAgICAgPCEtLSAgT2NjYXNpb25hbGx5IHRjb250SWQgPSAwICgweDgwMDAsIDB4ODAwMS4uIG51bWJlcmluZykgaXMgdXNlZC4gIC0tPgotICAgICAgICA8Zmlyc3ROb25PbWNpVGNvbnRJbmZvIHRjb250SWQ9IjAiIC8+Ci0KKyAgICAgICAgPGZpcnN0Tm9uT21jaVRjb250SW5mbyB0Y29udElkPSIxIiAvPgorICAgICAgICAKICAgICAgICAgPCEtLSAgV2hldGhlciBoYXMgcHJpb3JpdHkgZm9yIElQdnggTUMgZmlsdGVyLCB0cnVlOiB0aGUgSVB2eCBNQyBmaWx0ZXIgc2V0IGJ5IE9MVCBoYXMgaGlnaGVyIHByaW9yaXR5LiAgLS0+CiAgICAgICAgIDxpcE1jRmlsdGVyUHJpICAgICAgIGVuYWJsZWQ9InRydWUiICAvPgotCisgICAgICAgIAogICAgICAgICA8IS0tICBPTUNJIGZyYW1lIGNhcHR1cmUgaW4gVkJTIGZvcm1hdCAgLS0+CiAgICAgICAgIDxvbWNpQ2VsbENhcCAgICAgICBlbmFibGVkPSJ0cnVlIiAgLz4KIAorICAgICAgICA8IS0tICBPTUNJIGNyZWF0ZXMgUE9OVGNBZGFwdGVyLUcgTUVzIC0tPgorICAgICAgICA8Y3JlYXRlUG9uVGNBZGFwdGVyRyBlbmFibGVkPSJmYWxzZSIgIC8+CisKICAgICAgICAgPCEtLSBUaGUgU1cgZG93bmxvYWQgd2luZG93IHNpemU6IHRoZSB2YWx1ZSBwcm9wb3NlZCBieSB0aGUgT05UIGluIHRoZSBTVyBEb3dubG9hZCB3aW5kb3cgc2l6ZSBuZWdvdGlhdGlvbiAgICAtLT4KICAgICAgICAgPHN3RG93bmxvYWRXaW5kb3dTaXplIHdpbmRvd1NpemU9IjIzMiIgIC8+CiAgICAgPC9PTUNJX01JQj4KZGlmZiAtLWdpdCBhL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbCBiL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbC5nZmx0MTEwCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbApyZW5hbWUgdG8gcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUueG1sLmdmbHQxMTAKaW5kZXggNjM2Zjc3Ni4uMTY3ZTI4YSAxMDA2NDQKLS0tIGEvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy9vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUueG1sCisrKyBiL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbC5nZmx0MTEwCkBAIC0xODUsNiArMTg1LDE0IEBACiAgICAgICAgIDwhLS1CYXR0ZXJ5IGJhY2t1cCBzdXBwb3J0IGNhcGFiaWxpdHk6IEJZVEUuICAgICAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgPCEtLTA6IGRvIG5vdCBzdXBwb3J0IGJhdHRlcnkgYmFja3VwLCAxOiBzdXBwb3J0IGJhdHRlcnkgYmFja3VwIC0tPgogICAgICAgICA8YXR0cmliIG5hbWU9IkJhdHRlcnkgYmFja3VwIHN1cHBvcnQgY2FwYWJpbGl0eSIgdmFsdWU9IjAiIC8+CisKKyAgICAgICAgPCEtLURvd25zdHJlYW0gbXVsdGljYXN0IGNoYW5uZWw6IFVJTlQzMi4gICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICA8IS0tMDogZnJvbSBtdWx0aWNhc3QgbWFjIGFkZHJlc3MgY2hhbm5lbCwgMTogZnJvbSBtdWx0aWNhc3QgZ2VtcG9ydCBjaGFubmVsLS0+CisgICAgICAgIDxhdHRyaWIgbmFtZT0iRG93bnN0cmVhbSBtdWx0aWNhc3QgY2hhbm5lbCIgdmFsdWU9IjEiIC8+CisKKyAgICAgICAgPCEtLUlHTVBWMSBtZXNzYWdlcyBkaXNjYXJkOiBVSU5UMzIuICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLTA6IGZvcndhcmQgaWdtcHYxIG1lc3NhZ2VzLCAxOiBkaXNjYXJkIGlnbXB2MSBtZXNzYWdlcy0tPgorICAgICAgICA8YXR0cmliIG5hbWU9IklHTVBWMSBtZXNzYWdlcyBkaXNjYXJkIiB2YWx1ZT0iMSIgLz4KICAgICA8L0NhcGFiaWxpdHk+CiAKICAgICA8UXVldWU+CmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29udV9wcm9maWxlX3htbF9jZmdfZmlsZS54bWwgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29udV9wcm9maWxlX3htbF9jZmdfZmlsZS54bWwuZ2ZsdDQwMApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggODglCmNvcHkgZnJvbSBwYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29udV9wcm9maWxlX3htbF9jZmdfZmlsZS54bWwKY29weSB0byBwYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29udV9wcm9maWxlX3htbF9jZmdfZmlsZS54bWwuZ2ZsdDQwMAppbmRleCA2MzZmNzc2Li5jMDM1YTA0Ci0tLSBhL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbAorKysgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL29udV9wcm9maWxlX3htbF9jZmdfZmlsZS54bWwuZ2ZsdDQwMApAQCAtNjEsMTcgKzYxLDE4IEBACiAKICAgICA8Q2FwYWJpbGl0eT4KICAgICAgICAgPCEtLU9OVSB0eXBlOiBVSU5UMzIuICAgICAtLT4KLSAgICAgICAgPCEtLTA6U0ZVLCAxOkhHVSwgMjpTQlUsIDM6Q0JVLCA0Ok1EVSwgNTpNVFUsIDY6MUZFKzFQT1RTIFNGVSwgNzpNaXhlZCBIR1UgLS0+Ci0gICAgICAgIDxhdHRyaWIgbmFtZT0iT05VIHR5cGUiIHZhbHVlPSIwIiAvPgorICAgICAgICA8IS0tMDpTRlUsIDE6SEdVLCAyOlNCVSwgMzpDQlUsIDQ6TURVLCA1Ok1UVSwgNjoxRkUrMVBPVFMgU0ZVLCA3Ok1peGVkIEhHVSwgODoxR0UrMVNHTUlJIEJyaWRnZSAtLT4KKyAgICAgICAgPGF0dHJpYiBuYW1lPSJPTlUgdHlwZSIgdmFsdWU9IjgiIC8+CiAKICAgICAgICAgPCEtLSAgMT1NVl9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0ggICAyPU1WX1BPTl9XQU5fRzBfSU5UX1NXSVRDSCAgICAgIDM9TVZfUE9OX1dBTl9HMV9MQU5fRzBfSU5UX1NXSVRDSCAgND1NVl9HMF9XQU5fRzFfSU5UX1NXSVRDSAogICAgICAgICAgICAgICA1PU1WX0cxX1dBTl9HMF9JTlRfU1dJVENIICAgICAgICAgIDY9TVZfUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENIICAgNz1NVl9QT05fRzBfV0FOX0cxX0lOVF9TV0lUQ0ggICAgICA4PU1WX1BPTl9XQU5fRFVBTF9NQUNfRVhUX1NXSVRDSAogICAgICAgICAgICAgICA5PU1WX1BPTl9XQU5fRzFfTU5HX0VYVF9TV0lUQ0ggICAgIDEwPU1WX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlQgICAgMTE9TVZfUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCAgICAgICAxMj1NVl9QT05fRzFfV0FOX0cwX1NJTkdMRV9QT1JUCi0gICAgICAgICAgICAgIDEzPU1WX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQgICAgMTQ9TVZfUE9OX1dBTl9HMF9HMV9MUEJLICAgICAgICAxNT1NVl9QT05fV0FOX0cwX0cxX0RVQUxfTEFOIC0tPgotICAgICAgICA8YXR0cmliIG5hbWU9IkNvbXBsZXggcHJvZmlsZSIgdmFsdWU9IjEwIiAvPgorICAgICAgICAgICAgICAxMz1NVl9QT05fRzBfV0FOX0cxX1NJTkdMRV9QT1JUICAgIDE0PU1WX1BPTl9XQU5fRzBfRzFfTFBCSyAgICAgICAgMTU9TVZfUE9OX1dBTl9HMF9HMV9EVUFMX0xBTiAJCTE2PU1WX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlRfU0dNSUkKKyAgICAgICAgICAgICAgMTc9TVZfUE9OX0cxX1NHTUlJX1dBTl9HMF9TSU5HTEVfUE9SVCAtLT4KKyAgICAgICAgPGF0dHJpYiBuYW1lPSJDb21wbGV4IHByb2ZpbGUiIHZhbHVlPSIxNyIgLz4KIAogICAgICAgICA8IS0tIGFjdGl2ZV93YW4gICAgMD1HTUFDMCAxPUdNQUMxIDI9UE1BQyAtLT4KLSAgICAgICAgPGF0dHJpYiBuYW1lPSJBY3RpdmUgd2FuIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPGF0dHJpYiBuYW1lPSJBY3RpdmUgd2FuIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgCiAgICAgICAgIDwhLS0gc3dpdGNoIHBvcnQgdG8gYXBwbGlhY2F0aW9uIHBvcnQoc3RhcnQgZnJvbSAxKSBtYXBwaW5nIC0tPgogICAgICAgICA8YXR0cmliIG5hbWU9IlN3aXRjaCBwb3J0IDAiIHZhbHVlPSIxIiAvPgpAQCAtMTU2LDE0ICsxNTcsMTQgQEAKICAgICAgICAgPGF0dHJpYiBuYW1lPSJJUHY2IHN1cHBvcnQgY2FwYWJpbGl0eSIgdmFsdWU9IjAiIC8+CiAKICAgICAgICAgPCEtLVBvd2VyIGNvbnRyb2wgc3VwcG9ydCBjYXBhYmlsaXR5OiBCWVRFLiAgICAgICAtLT4KLSAgICAgICAgPCEtLTCjumRvbid0IHN1cHBvcnQgT05VIHBvd2VyIHN1cHBseSBjb250cm9sCi0gICAgICAgICAgICAxo7pTdXBwb3J0IE9OVSBUeCBwb3dlciBzdXBwbHkgY29udHJvbCBvbmx5LgotICAgICAgICAgICAgMqO6U3VwcG9ydCBib3RoIFR4IGFuZCBSeCBwb3dlciBzdXBwbHkgY29udHJvbC4tLT4KKyAgICAgICAgPCEtLTDvv73vv71kb24ndCBzdXBwb3J0IE9OVSBwb3dlciBzdXBwbHkgY29udHJvbAorICAgICAgICAgICAgMe+/ve+/vVN1cHBvcnQgT05VIFR4IHBvd2VyIHN1cHBseSBjb250cm9sIG9ubHkuCisgICAgICAgICAgICAy77+977+9U3VwcG9ydCBib3RoIFR4IGFuZCBSeCBwb3dlciBzdXBwbHkgY29udHJvbC4tLT4KICAgICAgICAgPGF0dHJpYiBuYW1lPSJQb3dlciBjb250cm9sIHN1cHBvcnQgY2FwYWJpbGl0eSIgdmFsdWU9IjIiIC8+CiAKICAgICAgICAgPCEtLVNMQSBzdXBwb3J0IGNhcGFiaWxpdHk6IEJZVEUuICAgICAtLT4KLSAgICAgICAgPCEtLTGjumRvbid0IHN1cHBvcnQgU2VydmljZSBTTEGjuwotICAgICAgICAgIDItOKO6U3VwcG9ydCBTZXJ2aWNlIFNMQSBmdW5jdGlvbqOsCisgICAgICAgIDwhLS0x77+977+9ZG9uJ3Qgc3VwcG9ydCBTZXJ2aWNlIFNMQe+/ve+/vQorICAgICAgICAgIDItOO+/ve+/vVN1cHBvcnQgU2VydmljZSBTTEEgZnVuY3Rpb27vv73vv70KICAgICAgICAgICBUaGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2VydmljZXMgdGhlIE9OVSBzdXBwb3J0ZWQuIC0tPgogICAgICAgICA8YXR0cmliIG5hbWU9IlNMQSBzdXBwb3J0IGNhcGFiaWxpdHkiIHZhbHVlPSI0IiAvPgogCkBAIC0xODUsNiArMTg2LDE0IEBACiAgICAgICAgIDwhLS1CYXR0ZXJ5IGJhY2t1cCBzdXBwb3J0IGNhcGFiaWxpdHk6IEJZVEUuICAgICAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgPCEtLTA6IGRvIG5vdCBzdXBwb3J0IGJhdHRlcnkgYmFja3VwLCAxOiBzdXBwb3J0IGJhdHRlcnkgYmFja3VwIC0tPgogICAgICAgICA8YXR0cmliIG5hbWU9IkJhdHRlcnkgYmFja3VwIHN1cHBvcnQgY2FwYWJpbGl0eSIgdmFsdWU9IjAiIC8+CisKKyAgICAgICAgPCEtLURvd25zdHJlYW0gbXVsdGljYXN0IGNoYW5uZWw6IFVJTlQzMi4gICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICA8IS0tMDogZnJvbSBtdWx0aWNhc3QgbWFjIGFkZHJlc3MgY2hhbm5lbCwgMTogZnJvbSBtdWx0aWNhc3QgZ2VtcG9ydCBjaGFubmVsLS0+CisgICAgICAgIDxhdHRyaWIgbmFtZT0iRG93bnN0cmVhbSBtdWx0aWNhc3QgY2hhbm5lbCIgdmFsdWU9IjAiIC8+CisKKyAgICAgICAgPCEtLUlHTVBWMSBtZXNzYWdlcyBkaXNjYXJkOiBVSU5UMzIuICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLTA6IGZvcndhcmQgaWdtcHYxIG1lc3NhZ2VzLCAxOiBkaXNjYXJkIGlnbXB2MSBtZXNzYWdlcy0tPgorICAgICAgICA8YXR0cmliIG5hbWU9IklHTVBWMSBtZXNzYWdlcyBkaXNjYXJkIiB2YWx1ZT0iMSIgLz4KICAgICA8L0NhcGFiaWxpdHk+CiAKICAgICA8UXVldWU+CmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwuZ2ZsdDExMApzaW1pbGFyaXR5IGluZGV4IDkzJQpjb3B5IGZyb20gcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2Vwb24ueG1sCmNvcHkgdG8gcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2Vwb24ueG1sLmdmbHQxMTAKaW5kZXggZjMwZGE2OS4uYzA5YmMxYyAxMDA2NDQKLS0tIGEvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2Vwb24ueG1sCisrKyBiL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9lcG9uLnhtbC5nZmx0MTEwCkBAIC0zOTEsOSArMzkxLDkgQEAKICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX01OR01UX0RTIC0tPgogICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjAwIiB0eXBlPSIwIiBzaXplPSIwMSIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjEiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19NQUNfTEVBUk4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDEiIHR5cGU9IjAiIHNpemU9IjUiICBjbnRyX2dycD0iMyIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjAxIiB0eXBlPSIwIiBzaXplPSIwMCIgIGNudHJfZ3JwPSIzIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DUFVfV0FOX0xQQktfVVMgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDIiIHR5cGU9IjAiIHNpemU9IjUiICAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwMiIgdHlwZT0iMCIgc2l6ZT0iMDAiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTlVNX1ZMQU5fVEFHUyAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwMyIgdHlwZT0iMCIgc2l6ZT0iMDkiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfRFNfTE9BRF9CQUxBTkNFIC0tPgpAQCAtNDA0LDUwICs0MDQsNTIgQEAKICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNiIgdHlwZT0iMCIgc2l6ZT0iMTMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTE9PUF9ERVRfVVMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDciIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0RST1BfUFJFQ0VERU5DRSAtLT4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iMDQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTDJfTUFJTiAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iNjQiICBjbnRyX2dycD0iMSIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA5IiB0eXBlPSIwIiBzaXplPSI2NCIgIGNudHJfZ3JwPSIxIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19FVEhfVFlQRSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOSIgdHlwZT0iMCIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMiIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIyIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JR01QIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIwNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjAiIHNpemU9IjA2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTUNfRFMgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMiIgdHlwZT0iMSIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9NQUlOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEyIiB0eXBlPSIxIiBzaXplPSI2NCIgIGNudHJfZ3JwPSIzIiAgbHVfbWFzaz0iMCIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjEiIHNpemU9IjY0IiAgY250cl9ncnA9IjMiICBsdV9tYXNrPSIwIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjAiIHNpemU9IjEyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNCIgdHlwZT0iMCIgc2l6ZT0iMTIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfVFRMIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE0IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfUFJPVE8gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNiIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9GUkFHIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE2IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTciIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTEVOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE3IiB0eXBlPSIwIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTkggLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTDRfTUNfRFMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTkiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTDRfTUNfRFMgLS0+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjAyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMDIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9MNCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMTciICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIyIiB0eXBlPSIxIiBzaXplPSIxNyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X0hPUEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjIiIHR5cGU9IjEiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMyIgdHlwZT0iMSIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19TSVAgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjMiIHR5cGU9IjEiIHNpemU9IjA4IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNCIgdHlwZT0iMSIgc2l6ZT0iMDgiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9HRU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjQiIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTUNfRFMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjUiIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfRElQIC0tPgorICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19EUyAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNiIgdHlwZT0iMSIgc2l6ZT0iMzIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9ESVAgLS0+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjciIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0NOTV9JUFY0X1BSRSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNyIgdHlwZT0iMSIgc2l6ZT0iMzYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI4IiB0eXBlPSIxIiBzaXplPSIzNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DTk1fTUFJTiAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyOCIgdHlwZT0iMCIgc2l6ZT0iNDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI5IiB0eXBlPSIwIiBzaXplPSI0MyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DQVRDSF9BTEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjkiIHR5cGU9IjAiIHNpemU9IjAxIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIzMCIgdHlwZT0iMCIgc2l6ZT0iMDEiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgPC9yYW5nZV9wYXJhbWV0ZXJzPgogICAgICAgICAgICAgPCEtLSAgMCA9IGRyb3AsIDEgPSAgdHJhcCB0byBDUFUgICAgLS0+CiAgICAgICAgICAgICA8Y2F0Y2hfYWxsX3BrdF9hY3Rpb24+MTwvY2F0Y2hfYWxsX3BrdF9hY3Rpb24+CmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwuZ2ZsdDQwMApzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBwYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwKcmVuYW1lIHRvIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9lcG9uLnhtbC5nZmx0NDAwCmluZGV4IGYzMGRhNjkuLjUxYWMyNTIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9lcG9uLnhtbAorKysgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZXBvbi54bWwuZ2ZsdDQwMApAQCAtNCw4ICs0LDEwIEBACiAgICAgICAgICAgICAgICA8IS0tICAxPVRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0ggICAyPVRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0ggICAgICAzPVRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENIICA0PVRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSAogICAgICAgICAgICAgICAgICAgICAgNT1UUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0ggICAgICAgICAgNj1UUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENIICAgNz1UUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENIICAgICAgOD1UUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENICiAgICAgICAgICAgICAgICAgICAgICA5PVRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENIICAgICAxMD1UUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVCAgICAxMT1UUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCAgICAgICAxMj1UUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVAotICAgICAgICAgICAgICAgICAgICAgMTM9VFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQgICAgMTQ9VFBNX1BPTl9XQU5fRzBfRzFfTFBCSyAgICAxNT1UUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTiAtLT4KLSAgICAgICAgPHByb2ZpbGU+MTA8L3Byb2ZpbGU+CisgICAgICAgICAgICAgICAgICAgICAxMz1UUE1fUE9OX0cwX1dBTl9HMV9TSU5HTEVfUE9SVCAgICAxND1UUE1fUE9OX1dBTl9HMF9HMV9MUEJLICAgICAgICAxNT1UUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTiAJICAxNj1UUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVF9TR01JSQorICAgICAgICAgICAgICAgICAgICAgMTc9VFBNX1BPTl9HMV9TR01JSV9XQU5fRzBfU0lOR0xFX1BPUlQKKyAgICAgICAgICAgICAgIC0tPgorICAgICAgICA8cHJvZmlsZT4xNzwvcHJvZmlsZT4KICAgICAgICAgPCEtLSBzcmMgICAgMCkgVFBNX1NSQ19QT1JUX1VOSV8wCiAgICAgICAgICAgICAgICAgICAgIDEpIFRQTV9TUkNfUE9SVF9VTklfMQogICAgICAgICAgICAgICAgICAgICAuLi4KQEAgLTIwLDcgKzIyLDcgQEAKICAgICAgICAgICAgIDxwb3J0IGlkPSIwIiBzcmNfcG9ydD0iMCIvPgogICAgICAgICA8L2dtYWNfcG9ydHM+CiAgICAgICAgIDwhLS0gYWN0aXZlX3dhbiAgICAwPVRQTV9FTlVNX0dNQUNfMCAxPVRQTV9FTlVNX0dNQUNfMSAyPVRQTV9FTlVNX1BNQUMgLS0+Ci0gICAgICAgIDxhY3RpdmVfd2FuPjI8L2FjdGl2ZV93YW4+CisgICAgICAgIDxhY3RpdmVfd2FuPjE8L2FjdGl2ZV93YW4+CiAgICAgPC9ldGhfY29tcGxleF9jb25maWc+CiAKICAgICA8dHJhZmZpY19zZXR0aW5nPgpAQCAtNDA0LDUwICs0MDYsNTIgQEAKICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNiIgdHlwZT0iMCIgc2l6ZT0iMTMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTE9PUF9ERVRfVVMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDciIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0RST1BfUFJFQ0VERU5DRSAtLT4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iMDQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTDJfTUFJTiAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iNjQiICBjbnRyX2dycD0iMSIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA5IiB0eXBlPSIwIiBzaXplPSI2NCIgIGNudHJfZ3JwPSIxIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19FVEhfVFlQRSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOSIgdHlwZT0iMCIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMiIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIyIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JR01QIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIwNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjAiIHNpemU9IjA2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTUNfRFMgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMiIgdHlwZT0iMSIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9NQUlOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEyIiB0eXBlPSIxIiBzaXplPSI2NCIgIGNudHJfZ3JwPSIzIiAgbHVfbWFzaz0iMCIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjEiIHNpemU9IjY0IiAgY250cl9ncnA9IjMiICBsdV9tYXNrPSIwIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjAiIHNpemU9IjEyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNCIgdHlwZT0iMCIgc2l6ZT0iMTIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfVFRMIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE0IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfUFJPVE8gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNiIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9GUkFHIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE2IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTciIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTEVOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE3IiB0eXBlPSIwIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTkggLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTDRfTUNfRFMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTkiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTDRfTUNfRFMgLS0+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjAyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMDIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9MNCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMTciICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIyIiB0eXBlPSIxIiBzaXplPSIxNyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X0hPUEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjIiIHR5cGU9IjEiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMyIgdHlwZT0iMSIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19TSVAgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjMiIHR5cGU9IjEiIHNpemU9IjA4IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNCIgdHlwZT0iMSIgc2l6ZT0iMDgiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9HRU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjQiIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTUNfRFMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjUiIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KLSAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfRElQIC0tPgorICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19EUyAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNiIgdHlwZT0iMSIgc2l6ZT0iMzIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9ESVAgLS0+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjciIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0NOTV9JUFY0X1BSRSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNyIgdHlwZT0iMSIgc2l6ZT0iMzYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI4IiB0eXBlPSIxIiBzaXplPSIzNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DTk1fTUFJTiAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyOCIgdHlwZT0iMCIgc2l6ZT0iNDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI5IiB0eXBlPSIwIiBzaXplPSI0MyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DQVRDSF9BTEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjkiIHR5cGU9IjAiIHNpemU9IjAxIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIzMCIgdHlwZT0iMCIgc2l6ZT0iMDEiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgPC9yYW5nZV9wYXJhbWV0ZXJzPgogICAgICAgICAgICAgPCEtLSAgMCA9IGRyb3AsIDEgPSAgdHJhcCB0byBDUFUgICAgLS0+CiAgICAgICAgICAgICA8Y2F0Y2hfYWxsX3BrdF9hY3Rpb24+MTwvY2F0Y2hfYWxsX3BrdF9hY3Rpb24+CmRpZmYgLS1naXQgYS9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZ3Bvbi54bWwgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZ3Bvbi54bWwuZ2ZsdDExMApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBwYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZ3Bvbi54bWwKcmVuYW1lIHRvIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbC5nZmx0MTEwCmluZGV4IDAyNzQzYTMuLmI4ZjMwYTAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbAorKysgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZ3Bvbi54bWwuZ2ZsdDExMApAQCAtNTMyLDYxICs1MzIsNjMgQEAKICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX01BQ19MRUFSTiAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwMSIgdHlwZT0iMCIgc2l6ZT0iMCIgICBjbnRyX2dycD0iMyIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfQ1BVX1dBTl9MUEJLX1VTIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjAyIiB0eXBlPSIwIiBzaXplPSI1IiAgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDIiIHR5cGU9IjAiIHNpemU9IjA4IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX05VTV9WTEFOX1RBR1MgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDMiIHR5cGU9IjAiIHNpemU9IjA5IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0RTX0xPQURfQkFMQU5DRSAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNCIgdHlwZT0iMCIgc2l6ZT0iMDAiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTVVMVElfTFBCSyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNSIgdHlwZT0iMCIgc2l6ZT0iMjAiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA1IiB0eXBlPSIwIiBzaXplPSIxMCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19WSVJUX1VOSSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNiIgdHlwZT0iMCIgc2l6ZT0iMTMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA2IiB0eXBlPSIwIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19MT09QX0RFVF9VUyAtLT4KICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNyIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfRFJPUF9QUkVDRURFTkNFIC0tPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA4IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19MMl9NQUlOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA4IiB0eXBlPSIwIiBzaXplPSIxNTQiIGNudHJfZ3JwPSIxIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDkiIHR5cGU9IjAiIHNpemU9IjE5NiIgY250cl9ncnA9IjEiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0VUSF9UWVBFIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA5IiB0eXBlPSIwIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIyIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTAiIHR5cGU9IjAiIHNpemU9IjE2IiAgY250cl9ncnA9IjIiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lHTVAgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTAiIHR5cGU9IjAiIHNpemU9IjA2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMSIgdHlwZT0iMCIgc2l6ZT0iMDYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9NQ19EUyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMSIgdHlwZT0iMSIgc2l6ZT0iMjQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEyIiB0eXBlPSIxIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY0X01BSU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTIiIHR5cGU9IjEiIHNpemU9IjY0IiAgY250cl9ncnA9IjMiICBsdV9tYXNrPSIwIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMyIgdHlwZT0iMSIgc2l6ZT0iNjQiICBjbnRyX2dycD0iMyIgIGx1X21hc2s9IjAiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9UQ1BfRkxBRyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMyIgdHlwZT0iMCIgc2l6ZT0iMTIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE0IiB0eXBlPSIwIiBzaXplPSIxMiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19UVEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTQiIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNSIgdHlwZT0iMCIgc2l6ZT0iMDQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9QUk9UTyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNSIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE2IiB0eXBlPSIwIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY0X0ZSQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTYiIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNyIgdHlwZT0iMCIgc2l6ZT0iMDQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9MRU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTciIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxOCIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9OSCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxOCIgdHlwZT0iMSIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE5IiB0eXBlPSIxIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X0w0X01DX0RTIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE5IiB0eXBlPSIxIiBzaXplPSIyNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjAiIHR5cGU9IjEiIHNpemU9IjAyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMDIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9MNCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMSIgdHlwZT0iMSIgc2l6ZT0iMTciICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIyIiB0eXBlPSIxIiBzaXplPSIxNyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X0hPUEwgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjIiIHR5cGU9IjEiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMyIgdHlwZT0iMSIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19TSVAgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjMiIHR5cGU9IjEiIHNpemU9IjA4IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNCIgdHlwZT0iMSIgc2l6ZT0iMDgiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9HRU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjQiIHR5cGU9IjEiIHNpemU9IjIyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNSIgdHlwZT0iMSIgc2l6ZT0iMjIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9NQ19EUyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNSIgdHlwZT0iMSIgc2l6ZT0iMzIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI2IiB0eXBlPSIxIiBzaXplPSIzMiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X0RJUCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNiIgdHlwZT0iMSIgc2l6ZT0iMjIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI3IiB0eXBlPSIxIiBzaXplPSIyMiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19DTk1fSVBWNF9QUkUgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjciIHR5cGU9IjEiIHNpemU9IjAiICAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyOCIgdHlwZT0iMSIgc2l6ZT0iMCIgICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfQ05NX01BSU4gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjgiIHR5cGU9IjAiIHNpemU9IjAiICAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyOSIgdHlwZT0iMCIgc2l6ZT0iMCIgICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfQ0FUQ0hfQUxMIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI5IiB0eXBlPSIwIiBzaXplPSIwMSIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMzAiIHR5cGU9IjAiIHNpemU9IjAxIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgIDwvcmFuZ2VfcGFyYW1ldGVycz4KICAgICAgICAgICAgIDwhLS0gIDAgPSBkcm9wLCAxID0gIHRyYXAgdG8gQ1BVICAgIC0tPgogICAgICAgICAgICAgPGNhdGNoX2FsbF9wa3RfYWN0aW9uPjE8L2NhdGNoX2FsbF9wa3RfYWN0aW9uPgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2dwb24ueG1sIGIvcGFja2FnZS9tdl9hcHAveG1sX3BhcmFtcy90cG1feG1sX2NmZ19maWxlX2dwb24ueG1sLmdmbHQ0MDAKc2ltaWxhcml0eSBpbmRleCA5MSUKY29weSBmcm9tIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbApjb3B5IHRvIHBhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbC5nZmx0NDAwCmluZGV4IDAyNzQzYTMuLjIyMGE2ZTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UvbXZfYXBwL3htbF9wYXJhbXMvdHBtX3htbF9jZmdfZmlsZV9ncG9uLnhtbAorKysgYi9wYWNrYWdlL212X2FwcC94bWxfcGFyYW1zL3RwbV94bWxfY2ZnX2ZpbGVfZ3Bvbi54bWwuZ2ZsdDQwMApAQCAtNCw4ICs0LDEwIEBACiAgICAgICAgICAgICAgICA8IS0tICAxPVRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0ggICAyPVRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0ggICAgICAzPVRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENIICA0PVRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSAogICAgICAgICAgICAgICAgICAgICAgNT1UUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0ggICAgICAgICAgNj1UUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENIICAgNz1UUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENIICAgICAgOD1UUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENICiAgICAgICAgICAgICAgICAgICAgICA5PVRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENIICAgICAxMD1UUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVCAgICAxMT1UUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCAgICAgICAxMj1UUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVAotICAgICAgICAgICAgICAgICAgICAgMTM9VFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQgICAgMTQ9VFBNX1BPTl9XQU5fRzBfRzFfTFBCSyAgICAgICAgMTU9VFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4gLS0+Ci0gICAgICAgIDxwcm9maWxlPjEwPC9wcm9maWxlPgorICAgICAgICAgICAgICAgICAgICAgMTM9VFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQgICAgMTQ9VFBNX1BPTl9XQU5fRzBfRzFfTFBCSyAgICAgICAgMTU9VFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4gCSAgMTY9VFBNX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlRfU0dNSUkKKyAgICAgICAgICAgICAgICAgICAgIDE3PVRQTV9QT05fRzFfU0dNSUlfV0FOX0cwX1NJTkdMRV9QT1JUCisgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPHByb2ZpbGU+MTc8L3Byb2ZpbGU+CiAgICAgICAgIDwhLS0gc3JjICAgIDApIFRQTV9TUkNfUE9SVF9VTklfMAogICAgICAgICAgICAgICAgICAgICAxKSBUUE1fU1JDX1BPUlRfVU5JXzEKICAgICAgICAgICAgICAgICAgICAgLi4uCkBAIC0yMCw3ICsyMiw3IEBACiAgICAgICAgICAgICA8cG9ydCBpZD0iMCIgc3JjX3BvcnQ9IjAiLz4KICAgICAgICAgPC9nbWFjX3BvcnRzPgogICAgICAgICA8IS0tIGFjdGl2ZV93YW4gICAgMD1UUE1fRU5VTV9HTUFDXzAgMT1UUE1fRU5VTV9HTUFDXzEgMj1UUE1fRU5VTV9QTUFDIC0tPgotICAgICAgICA8YWN0aXZlX3dhbj4yPC9hY3RpdmVfd2FuPgorICAgICAgICA8YWN0aXZlX3dhbj4xPC9hY3RpdmVfd2FuPgogICAgIDwvZXRoX2NvbXBsZXhfY29uZmlnPgogCiAgICAgPHRyYWZmaWNfc2V0dGluZz4KQEAgLTE3OSwxMyArMTgxLDEzIEBACiAgICAgICAgICAgICAgICAgPCEtLSAgVW5kZWZpbmVkIHF1ZXVlcyB3aWxsIG5vdCBiZSBjcmVhdGVkIGluIGhhcmR3YXJlIC0tPgogICAgICAgICAgICAgICAgIDxxdWV1ZV9tYXA+CiAgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iMCIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjAiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSIxIiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIzIiBvd25lcl9xX251bT0iMCIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjEiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjIiIG93bmVyX3FfbnVtPSIwIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iMiIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjEiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSIzIiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIzIiBvd25lcl9xX251bT0iMSIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjMiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjIiIG93bmVyX3FfbnVtPSIxIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iNCIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjIiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSI1IiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIzIiBvd25lcl9xX251bT0iMiIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjUiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjIiIG93bmVyX3FfbnVtPSIyIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iNiIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjMiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSI3IiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIzIiBvd25lcl9xX251bT0iMyIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjciIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjIiIG93bmVyX3FfbnVtPSIzIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CiAgICAgICAgICAgICAgICAgPC9xdWV1ZV9tYXA+CiAgICAgICAgICAgICA8L3R4X21vZD4KICAgICAgICAgICAgIDwhLS0gaWQgIDogMCA9IEdNQUMwLCAxID0gR01BQzEsIDIgPSBQTUFDXzAsIDMgPSBQTUFDXzEsIDQgPSBQTUFDXzIsIDUgPSBQTUFDXzMsICAtLT4KQEAgLTE5OCw4ICsyMDAsMTQgQEAKICAgICAgICAgICAgICAgICA8IS0tICBzaXplIDogcXVldWUgc2l6ZSBtdXN0IGJlID4wICAgLS0+CiAgICAgICAgICAgICAgICAgPCEtLSAgVW5kZWZpbmVkIHF1ZXVlcyB3aWxsIG5vdCBiZSBjcmVhdGVkIGluIGhhcmR3YXJlIC0tPgogICAgICAgICAgICAgICAgIDxxdWV1ZV9tYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iMCIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjAiIHNpemU9IjEwMjQiIHdlaWdodD0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSIxIiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIxIiBvd25lcl9xX251bT0iMCIgc2l6ZT0iMTAyNCIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjAiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjAiIG93bmVyX3FfbnVtPSIwIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CisgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iMSIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMSIgb3duZXJfcV9udW09IjAiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSIyIiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIwIiBvd25lcl9xX251bT0iMSIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjMiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjEiIG93bmVyX3FfbnVtPSIxIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CisgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iNCIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMCIgb3duZXJfcV9udW09IjIiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHF1ZXVlIGlkPSI1IiBzY2hlZF9tZXRob2Q9IjAiIG93bmVyPSIxIiBvd25lcl9xX251bT0iMiIgc2l6ZT0iMDI1NiIgd2VpZ2h0PSIwIiAvPgorICAgICAgICAgICAgICAgICAgICA8cXVldWUgaWQ9IjYiIHNjaGVkX21ldGhvZD0iMCIgb3duZXI9IjAiIG93bmVyX3FfbnVtPSIzIiBzaXplPSIwMjU2IiB3ZWlnaHQ9IjAiIC8+CisgICAgICAgICAgICAgICAgICAgIDxxdWV1ZSBpZD0iNyIgc2NoZWRfbWV0aG9kPSIwIiBvd25lcj0iMSIgb3duZXJfcV9udW09IjMiIHNpemU9IjAyNTYiIHdlaWdodD0iMCIgLz4KICAgICAgICAgICAgICAgICA8L3F1ZXVlX21hcD4KICAgICAgICAgICAgIDwvdHhfbW9kPgogICAgICAgICAgICAgPCEtLSBpZCAgOiAwID0gR01BQzAsIDEgPSBHTUFDMSwgMiA9IFBNQUNfMCwgMyA9IFBNQUNfMSwgNCA9IFBNQUNfMiwgNSA9IFBNQUNfMywgIC0tPgpAQCAtNDg2LDkgKzQ5NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIDxjaGFpbiBpZD0iNCIgdHlwZT0iNSIgbnVtPSI2IiAvPgogICAgICAgICAgICAgICAgICAgICA8Y2hhaW4gaWQ9IjUiIHR5cGU9IjYiIG51bT0iMTcwIiAvPgogICAgICAgICAgICAgICAgICAgICA8Y2hhaW4gaWQ9IjYiIHR5cGU9IjciIG51bT0iNDA5NiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGNoYWluIGlkPSI3IiB0eXBlPSI4IiBudW09IjI0IiAvPgorICAgICAgICAgICAgICAgICAgICA8Y2hhaW4gaWQ9IjciIHR5cGU9IjgiIG51bT0iMTYiIC8+CiAgICAgICAgICAgICAgICAgICAgIDxjaGFpbiBpZD0iOCIgdHlwZT0iOSIgbnVtPSI2NCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGNoYWluIGlkPSI5IiB0eXBlPSIxMCIgbnVtPSIyNCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGNoYWluIGlkPSI5IiB0eXBlPSIxMCIgbnVtPSIxNiIgLz4KICAgICAgICAgICAgIDwvY2hhaW5fcGFyYW1ldGVycz4KICAgICAgICAgICAgIDx1ZHBfY2hlY2tzdW1fdXNlX2luaXQ+MDwvdWRwX2NoZWNrc3VtX3VzZV9pbml0PgogICAgICAgICAgICAgPHVkcF9jaGVja3N1bV9jYWxjPjA8L3VkcF9jaGVja3N1bV9jYWxjPgpAQCAtNTQzLDUwICs1NTEsNTIgQEAKICAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwNiIgdHlwZT0iMCIgc2l6ZT0iMTMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTE9PUF9ERVRfVVMgLS0+CiAgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMDciIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0RST1BfUFJFQ0VERU5DRSAtLT4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iMDQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfTDJfTUFJTiAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOCIgdHlwZT0iMCIgc2l6ZT0iMTU0IiBjbnRyX2dycD0iMSIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjA5IiB0eXBlPSIwIiBzaXplPSIxNTQiIGNudHJfZ3JwPSIxIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19FVEhfVFlQRSAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIwOSIgdHlwZT0iMCIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMiIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIyIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JR01QIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEwIiB0eXBlPSIwIiBzaXplPSIwNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjAiIHNpemU9IjA2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTUNfRFMgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTEiIHR5cGU9IjEiIHNpemU9IjI0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxMiIgdHlwZT0iMSIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9NQUlOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjEyIiB0eXBlPSIxIiBzaXplPSI2NCIgIGNudHJfZ3JwPSIzIiAgbHVfbWFzaz0iMCIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjEiIHNpemU9IjY0IiAgY250cl9ncnA9IjMiICBsdV9tYXNrPSIwIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfVENQX0ZMQUcgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTMiIHR5cGU9IjAiIHNpemU9IjEyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNCIgdHlwZT0iMCIgc2l6ZT0iMTIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfVFRMIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE0IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfUFJPVE8gLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTUiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxNiIgdHlwZT0iMCIgc2l6ZT0iMDMiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNF9GUkFHIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE2IiB0eXBlPSIwIiBzaXplPSIwNCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTciIHR5cGU9IjAiIHNpemU9IjA0IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjRfTEVOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjE3IiB0eXBlPSIwIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjAiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTkggLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMTgiIHR5cGU9IjEiIHNpemU9IjE2IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxOSIgdHlwZT0iMSIgc2l6ZT0iMTYiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9MNF9NQ19EUyAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIxOSIgdHlwZT0iMSIgc2l6ZT0iMjQiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIwIiB0eXBlPSIxIiBzaXplPSIxNiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICAgICAgPCEtLSAgVFBNX1BOQ19JUFY2X1RDUF9GTEFHIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIwIiB0eXBlPSIxIiBzaXplPSIwMiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjEiIHR5cGU9IjEiIHNpemU9IjAyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTDQgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjEiIHR5cGU9IjEiIHNpemU9IjE3IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyMiIgdHlwZT0iMSIgc2l6ZT0iMTciICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9IT1BMIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIyIiB0eXBlPSIxIiBzaXplPSIwMyIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjMiIHR5cGU9IjEiIHNpemU9IjAzIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTUNfU0lQIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjIzIiB0eXBlPSIxIiBzaXplPSIwOCIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjQiIHR5cGU9IjEiIHNpemU9IjA4IiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfR0VOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI0IiB0eXBlPSIxIiBzaXplPSIyMiIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjUiIHR5cGU9IjEiIHNpemU9IjIyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0lQVjZfTUNfRFMgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjUiIHR5cGU9IjEiIHNpemU9IjMyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNiIgdHlwZT0iMSIgc2l6ZT0iMzIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfSVBWNl9ESVAgLS0+Ci0gICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjYiIHR5cGU9IjEiIHNpemU9IjIyIiAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KKyAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyNyIgdHlwZT0iMSIgc2l6ZT0iMjIiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgogICAgICAgICAgICAgICAgIDwhLS0gIFRQTV9QTkNfQ05NX0lQVjRfUFJFIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI3IiB0eXBlPSIxIiBzaXplPSIwIiAgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjgiIHR5cGU9IjEiIHNpemU9IjAiICAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0NOTV9NQUlOIC0tPgotICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjI4IiB0eXBlPSIwIiBzaXplPSIwIiAgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CisgICAgICAgICAgICAgICAgPHJhbmdlIG51bT0iMjkiIHR5cGU9IjAiIHNpemU9IjAiICAgY250cl9ncnA9IjAiICBsdV9tYXNrPSIxIiBtaW5fcmVzZXRfbGV2ZWwgPSAiMCIgLz4KICAgICAgICAgICAgICAgICA8IS0tICBUUE1fUE5DX0NBVENIX0FMTCAtLT4KLSAgICAgICAgICAgICAgICA8cmFuZ2UgbnVtPSIyOSIgdHlwZT0iMCIgc2l6ZT0iMDEiICBjbnRyX2dycD0iMCIgIGx1X21hc2s9IjEiIG1pbl9yZXNldF9sZXZlbCA9ICIwIiAvPgorICAgICAgICAgICAgICAgIDxyYW5nZSBudW09IjMwIiB0eXBlPSIwIiBzaXplPSIwMSIgIGNudHJfZ3JwPSIwIiAgbHVfbWFzaz0iMSIgbWluX3Jlc2V0X2xldmVsID0gIjAiIC8+CiAgICAgICAgICAgICA8L3JhbmdlX3BhcmFtZXRlcnM+CiAgICAgICAgICAgICA8IS0tICAwID0gZHJvcCwgMSA9ICB0cmFwIHRvIENQVSAgICAtLT4KICAgICAgICAgICAgIDxjYXRjaF9hbGxfcGt0X2FjdGlvbj4xPC9jYXRjaF9hbGxfcGt0X2FjdGlvbj4KZGlmZiAtLWdpdCBhL3BhY2thZ2Uvb3BlbnNzbC9vcGVuc3NsLWNoYWNoYTIwX3BvbHkxMzA1X2JvcmluZ3NzbC5wYXRjaCBiL3BhY2thZ2Uvb3BlbnNzbC9vcGVuc3NsLWNoYWNoYTIwX3BvbHkxMzA1X2JvcmluZ3NzbC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdkOThlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS9vcGVuc3NsL29wZW5zc2wtY2hhY2hhMjBfcG9seTEzMDVfYm9yaW5nc3NsLnBhdGNoCkBAIC0wLDAgKzEsMTM4MSBAQAorZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9Db25maWd1cmUgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvQ29uZmlndXJlCistLS0gb3BlbnNzbC0xLjAuMmovQ29uZmlndXJlCTIwMTYtMDktMjYgMDU6NDk6MDcuMDAwMDAwMDAwIC0wNDAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvQ29uZmlndXJlCTIwMTYtMTEtMzAgMTA6MTU6NTQuODI3MDcyNDUwIC0wNTAwCitAQCAtMTUwLDI1ICsxNTAsMjUgQEAKKyBteSAkYml0czE9IlRISVJUWV9UV09fQklUICI7CisgbXkgJGJpdHMyPSJTSVhUWV9GT1VSX0JJVCAiOworIAorLW15ICR4ODZfYXNtPSJ4ODZjcHVpZC5vOmJuLTU4Ni5vIGNvLTU4Ni5vIHg4Ni1tb250Lm8geDg2LWdmMm0ubzo6ZGVzLTU4Ni5vIGNyeXB0NTg2Lm86YWVzLTU4Ni5vIHZwYWVzLXg4Ni5vIGFlc25pLXg4Ni5vOmJmLTU4Ni5vOm1kNS01ODYubzpzaGExLTU4Ni5vIHNoYTI1Ni01ODYubyBzaGE1MTItNTg2Lm86Y2FzdC01ODYubzpyYzQtNTg2Lm86cm1kLTU4Ni5vOnJjNS01ODYubzp3cF9ibG9jay5vIHdwLW1teC5vOmNtbGwteDg2Lm86Z2hhc2gteDg2Lm86IjsKKytteSAkeDg2X2FzbT0ieDg2Y3B1aWQubzpibi01ODYubyBjby01ODYubyB4ODYtbW9udC5vIHg4Ni1nZjJtLm86OmRlcy01ODYubyBjcnlwdDU4Ni5vOmFlcy01ODYubyB2cGFlcy14ODYubyBhZXNuaS14ODYubzpiZi01ODYubzptZDUtNTg2Lm86c2hhMS01ODYubyBzaGEyNTYtNTg2Lm8gc2hhNTEyLTU4Ni5vOmNhc3QtNTg2Lm86cmM0LTU4Ni5vOnJtZC01ODYubzpyYzUtNTg2Lm86d3BfYmxvY2subyB3cC1tbXgubzpjbWxsLXg4Ni5vOmdoYXNoLXg4Ni5vOjoiOworIAorIG15ICR4ODZfZWxmX2FzbT0iJHg4Nl9hc206ZWxmIjsKKyAKKy1teSAkeDg2XzY0X2FzbT0ieDg2XzY0Y3B1aWQubzp4ODZfNjQtZ2NjLm8geDg2XzY0LW1vbnQubyB4ODZfNjQtbW9udDUubyB4ODZfNjQtZ2YybS5vIHJzYXpfZXhwLm8gcnNhei14ODZfNjQubyByc2F6LWF2eDIubzplY3BfbmlzdHoyNTYubyBlY3BfbmlzdHoyNTYteDg2XzY0Lm86OmFlcy14ODZfNjQubyB2cGFlcy14ODZfNjQubyBic2Flcy14ODZfNjQubyBhZXNuaS14ODZfNjQubyBhZXNuaS1zaGExLXg4Nl82NC5vIGFlc25pLXNoYTI1Ni14ODZfNjQubyBhZXNuaS1tYi14ODZfNjQubzo6bWQ1LXg4Nl82NC5vOnNoYTEteDg2XzY0Lm8gc2hhMjU2LXg4Nl82NC5vIHNoYTUxMi14ODZfNjQubyBzaGExLW1iLXg4Nl82NC5vIHNoYTI1Ni1tYi14ODZfNjQubzo6cmM0LXg4Nl82NC5vIHJjNC1tZDUteDg2XzY0Lm86Ojp3cC14ODZfNjQubzpjbWxsLXg4Nl82NC5vIGNtbGxfbWlzYy5vOmdoYXNoLXg4Nl82NC5vIGFlc25pLWdjbS14ODZfNjQubzoiOworLW15ICRpYTY0X2FzbT0iaWE2NGNwdWlkLm86Ym4taWE2NC5vIGlhNjQtbW9udC5vOjo6YWVzX2NvcmUubyBhZXNfY2JjLm8gYWVzLWlhNjQubzo6bWQ1LWlhNjQubzpzaGExLWlhNjQubyBzaGEyNTYtaWE2NC5vIHNoYTUxMi1pYTY0Lm86OnJjNC1pYTY0Lm8gcmM0X3NrZXkubzo6Ojo6Z2hhc2gtaWE2NC5vOjp2b2lkIjsKKy1teSAkc3BhcmN2OV9hc209InNwYXJjdjljYXAubyBzcGFyY2NwdWlkLm86Ym4tc3BhcmN2OS5vIHNwYXJjdjktbW9udC5vIHNwYXJjdjlhLW1vbnQubyB2aXMzLW1vbnQubyBzcGFyY3Q0LW1vbnQubyBzcGFyY3Y5LWdmMm0ubzo6ZGVzX2VuYy1zcGFyYy5vIGZjcnlwdF9iLm8gZGVzdDQtc3BhcmN2OS5vOmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1zcGFyY3Y5Lm8gYWVzdDQtc3BhcmN2OS5vOjptZDUtc3BhcmN2OS5vOnNoYTEtc3BhcmN2OS5vIHNoYTI1Ni1zcGFyY3Y5Lm8gc2hhNTEyLXNwYXJjdjkubzo6Ojo6OmNhbWVsbGlhLm8gY21sbF9taXNjLm8gY21sbF9jYmMubyBjbWxsdDQtc3BhcmN2OS5vOmdoYXNoLXNwYXJjdjkubzo6dm9pZCI7CistbXkgJHNwYXJjdjhfYXNtPSI6c3BhcmN2OC5vOjpkZXNfZW5jLXNwYXJjLm8gZmNyeXB0X2Iubzo6Ojo6Ojo6Ojo6Ojp2b2lkIjsKKy1teSAkYWxwaGFfYXNtPSJhbHBoYWNwdWlkLm86Ym5fYXNtLm8gYWxwaGEtbW9udC5vOjo6Ojo6c2hhMS1hbHBoYS5vOjo6Ojo6OmdoYXNoLWFscGhhLm86OnZvaWQiOworLW15ICRtaXBzNjRfYXNtPSI6Ym4tbWlwcy5vIG1pcHMtbW9udC5vOjo6YWVzX2NiYy5vIGFlcy1taXBzLm86OjpzaGExLW1pcHMubyBzaGEyNTYtbWlwcy5vIHNoYTUxMi1taXBzLm86Ojo6Ojo6OiI7CisrbXkgJHg4Nl82NF9hc209Ing4Nl82NGNwdWlkLm86eDg2XzY0LWdjYy5vIHg4Nl82NC1tb250Lm8geDg2XzY0LW1vbnQ1Lm8geDg2XzY0LWdmMm0ubyByc2F6X2V4cC5vIHJzYXoteDg2XzY0Lm8gcnNhei1hdngyLm86ZWNwX25pc3R6MjU2Lm8gZWNwX25pc3R6MjU2LXg4Nl82NC5vOjphZXMteDg2XzY0Lm8gdnBhZXMteDg2XzY0Lm8gYnNhZXMteDg2XzY0Lm8gYWVzbmkteDg2XzY0Lm8gYWVzbmktc2hhMS14ODZfNjQubyBhZXNuaS1zaGEyNTYteDg2XzY0Lm8gYWVzbmktbWIteDg2XzY0Lm86Om1kNS14ODZfNjQubzpzaGExLXg4Nl82NC5vIHNoYTI1Ni14ODZfNjQubyBzaGE1MTIteDg2XzY0Lm8gc2hhMS1tYi14ODZfNjQubyBzaGEyNTYtbWIteDg2XzY0Lm86OnJjNC14ODZfNjQubyByYzQtbWQ1LXg4Nl82NC5vOjo6d3AteDg2XzY0Lm86Y21sbC14ODZfNjQubyBjbWxsX21pc2MubzpnaGFzaC14ODZfNjQubyBhZXNuaS1nY20teDg2XzY0Lm86OiI7CisrbXkgJGlhNjRfYXNtPSJpYTY0Y3B1aWQubzpibi1pYTY0Lm8gaWE2NC1tb250Lm86OjphZXNfY29yZS5vIGFlc19jYmMubyBhZXMtaWE2NC5vOjptZDUtaWE2NC5vOnNoYTEtaWE2NC5vIHNoYTI1Ni1pYTY0Lm8gc2hhNTEyLWlhNjQubzo6cmM0LWlhNjQubyByYzRfc2tleS5vOjo6OjpnaGFzaC1pYTY0Lm86Ojp2b2lkIjsKKytteSAkc3BhcmN2OV9hc209InNwYXJjdjljYXAubyBzcGFyY2NwdWlkLm86Ym4tc3BhcmN2OS5vIHNwYXJjdjktbW9udC5vIHNwYXJjdjlhLW1vbnQubyB2aXMzLW1vbnQubyBzcGFyY3Q0LW1vbnQubyBzcGFyY3Y5LWdmMm0ubzo6ZGVzX2VuYy1zcGFyYy5vIGZjcnlwdF9iLm8gZGVzdDQtc3BhcmN2OS5vOmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1zcGFyY3Y5Lm8gYWVzdDQtc3BhcmN2OS5vOjptZDUtc3BhcmN2OS5vOnNoYTEtc3BhcmN2OS5vIHNoYTI1Ni1zcGFyY3Y5Lm8gc2hhNTEyLXNwYXJjdjkubzo6Ojo6OmNhbWVsbGlhLm8gY21sbF9taXNjLm8gY21sbF9jYmMubyBjbWxsdDQtc3BhcmN2OS5vOmdoYXNoLXNwYXJjdjkubzo6OnZvaWQiOworK215ICRzcGFyY3Y4X2FzbT0iOnNwYXJjdjgubzo6ZGVzX2VuYy1zcGFyYy5vIGZjcnlwdF9iLm86Ojo6Ojo6Ojo6Ojo6OnZvaWQiOworK215ICRhbHBoYV9hc209ImFscGhhY3B1aWQubzpibl9hc20ubyBhbHBoYS1tb250Lm86Ojo6OjpzaGExLWFscGhhLm86Ojo6Ojo6Z2hhc2gtYWxwaGEubzo6OnZvaWQiOworK215ICRtaXBzNjRfYXNtPSI6Ym4tbWlwcy5vIG1pcHMtbW9udC5vOjo6YWVzX2NiYy5vIGFlcy1taXBzLm86OjpzaGExLW1pcHMubyBzaGEyNTYtbWlwcy5vIHNoYTUxMi1taXBzLm86Ojo6Ojo6OjoiOworIG15ICRtaXBzMzJfYXNtPSRtaXBzNjRfYXNtOyAkbWlwczMyX2FzbSA9fiBzL1xzKnNoYTUxMlwtbWlwc1wuby8vOworLW15ICRzMzkweF9hc209InMzOTB4Y2FwLm8gczM5MHhjcHVpZC5vOmJuLXMzOTB4Lm8gczM5MHgtbW9udC5vIHMzOTB4LWdmMm0ubzo6OmFlcy1zMzkweC5vIGFlcy1jdHIubyBhZXMteHRzLm86OjpzaGExLXMzOTB4Lm8gc2hhMjU2LXMzOTB4Lm8gc2hhNTEyLXMzOTB4Lm86OnJjNC1zMzkweC5vOjo6OjpnaGFzaC1zMzkweC5vOiI7CistbXkgJGFybXY0X2FzbT0iYXJtY2FwLm8gYXJtdjRjcHVpZC5vOmJuX2FzbS5vIGFybXY0LW1vbnQubyBhcm12NC1nZjJtLm86OjphZXNfY2JjLm8gYWVzLWFybXY0Lm8gYnNhZXMtYXJtdjcubyBhZXN2OC1hcm14Lm86OjpzaGExLWFybXY0LWxhcmdlLm8gc2hhMjU2LWFybXY0Lm8gc2hhNTEyLWFybXY0Lm86Ojo6Ojo6Z2hhc2gtYXJtdjQubyBnaGFzaHY4LWFybXgubzo6dm9pZCI7CistbXkgJGFhcmNoNjRfYXNtPSJhcm1jYXAubyBhcm02NGNwdWlkLm8gbWVtX2Nsci5vOjo6OmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlc3Y4LWFybXgubzo6OnNoYTEtYXJtdjgubyBzaGEyNTYtYXJtdjgubyBzaGE1MTItYXJtdjgubzo6Ojo6OjpnaGFzaHY4LWFybXgubzoiOworLW15ICRwYXJpc2MxMV9hc209InBhcmlzY2lkLm86Ym5fYXNtLm8gcGFyaXNjLW1vbnQubzo6OmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1wYXJpc2Mubzo6OnNoYTEtcGFyaXNjLm8gc2hhMjU2LXBhcmlzYy5vIHNoYTUxMi1wYXJpc2Mubzo6cmM0LXBhcmlzYy5vOjo6OjpnaGFzaC1wYXJpc2Mubzo6MzIiOworLW15ICRwYXJpc2MyMF9hc209InBhcmlzY2lkLm86cGEtcmlzYzJXLm8gcGFyaXNjLW1vbnQubzo6OmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1wYXJpc2Mubzo6OnNoYTEtcGFyaXNjLm8gc2hhMjU2LXBhcmlzYy5vIHNoYTUxMi1wYXJpc2Mubzo6cmM0LXBhcmlzYy5vOjo6OjpnaGFzaC1wYXJpc2Mubzo6NjQiOworLW15ICRwcGM2NF9hc209InBwY2NwdWlkLm8gcHBjY2FwLm86Ym4tcHBjLm8gcHBjLW1vbnQubyBwcGM2NC1tb250Lm86OjphZXNfY29yZS5vIGFlc19jYmMubyBhZXMtcHBjLm8gdnBhZXMtcHBjLm8gYWVzcDgtcHBjLm86OjpzaGExLXBwYy5vIHNoYTI1Ni1wcGMubyBzaGE1MTItcHBjLm8gc2hhMjU2cDgtcHBjLm8gc2hhNTEycDgtcHBjLm86Ojo6Ojo6Z2hhc2hwOC1wcGMubzoiOworK215ICRzMzkweF9hc209InMzOTB4Y2FwLm8gczM5MHhjcHVpZC5vOmJuLXMzOTB4Lm8gczM5MHgtbW9udC5vIHMzOTB4LWdmMm0ubzo6OmFlcy1zMzkweC5vIGFlcy1jdHIubyBhZXMteHRzLm86OjpzaGExLXMzOTB4Lm8gc2hhMjU2LXMzOTB4Lm8gc2hhNTEyLXMzOTB4Lm86OnJjNC1zMzkweC5vOjo6OjpnaGFzaC1zMzkweC5vOjoiOworK215ICRhcm12NF9hc209ImFybWNhcC5vIGFybXY0Y3B1aWQubzpibl9hc20ubyBhcm12NC1tb250Lm8gYXJtdjQtZ2YybS5vOjo6YWVzX2NiYy5vIGFlcy1hcm12NC5vIGJzYWVzLWFybXY3Lm8gYWVzdjgtYXJteC5vOjo6c2hhMS1hcm12NC1sYXJnZS5vIHNoYTI1Ni1hcm12NC5vIHNoYTUxMi1hcm12NC5vOjo6Ojo6OmdoYXNoLWFybXY0Lm8gZ2hhc2h2OC1hcm14Lm86Ojp2b2lkIjsKKytteSAkYWFyY2g2NF9hc209ImFybWNhcC5vIGFybTY0Y3B1aWQubyBtZW1fY2xyLm86Ojo6YWVzX2NvcmUubyBhZXNfY2JjLm8gYWVzdjgtYXJteC5vOjo6c2hhMS1hcm12OC5vIHNoYTI1Ni1hcm12OC5vIHNoYTUxMi1hcm12OC5vOjo6Ojo6OmdoYXNodjgtYXJteC5vOjoiOworK215ICRwYXJpc2MxMV9hc209InBhcmlzY2lkLm86Ym5fYXNtLm8gcGFyaXNjLW1vbnQubzo6OmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1wYXJpc2Mubzo6OnNoYTEtcGFyaXNjLm8gc2hhMjU2LXBhcmlzYy5vIHNoYTUxMi1wYXJpc2Mubzo6cmM0LXBhcmlzYy5vOjo6OjpnaGFzaC1wYXJpc2Mubzo6OjMyIjsKKytteSAkcGFyaXNjMjBfYXNtPSJwYXJpc2NpZC5vOnBhLXJpc2MyVy5vIHBhcmlzYy1tb250Lm86OjphZXNfY29yZS5vIGFlc19jYmMubyBhZXMtcGFyaXNjLm86OjpzaGExLXBhcmlzYy5vIHNoYTI1Ni1wYXJpc2MubyBzaGE1MTItcGFyaXNjLm86OnJjNC1wYXJpc2Mubzo6Ojo6Z2hhc2gtcGFyaXNjLm86Ojo2NCI7CisrbXkgJHBwYzY0X2FzbT0icHBjY3B1aWQubyBwcGNjYXAubzpibi1wcGMubyBwcGMtbW9udC5vIHBwYzY0LW1vbnQubzo6OmFlc19jb3JlLm8gYWVzX2NiYy5vIGFlcy1wcGMubyB2cGFlcy1wcGMubyBhZXNwOC1wcGMubzo6OnNoYTEtcHBjLm8gc2hhMjU2LXBwYy5vIHNoYTUxMi1wcGMubyBzaGEyNTZwOC1wcGMubyBzaGE1MTJwOC1wcGMubzo6Ojo6OjpnaGFzaHA4LXBwYy5vOjoiOworIG15ICRwcGMzMl9hc209JHBwYzY0X2FzbTsKKy1teSAkbm9fYXNtPSI6Ojo6Ojo6Ojo6Ojo6Ojo6dm9pZCI7CisrbXkgJG5vX2FzbT0iOjo6Ojo6Ojo6Ojo6Ojo6Ojp2b2lkIjsKKyAKKyAjIEFzIGZvciAkQlNEdGhyZWFkcy4gSWRlYSBpcyB0byBtYWludGFpbiAiY29sbGVjdGl2ZSIgc2V0IG9mIGZsYWdzLAorICMgd2hpY2ggd291bGQgY292ZXIgYWxsIEJTRCBmbGF2b3JzLiAtcHRocmVhZCBhcHBsaWVzIHRvIHRoZW0gYWxsLCAKK0BAIC0xNzksNyArMTc5LDcgQEAKKyAjIHNlZW1zIHRvIGJlIHN1ZmZpY2llbnQ/CisgbXkgJEJTRHRocmVhZHM9Ii1wdGhyZWFkIC1EX1RIUkVBRF9TQUZFIC1EX1JFRU5UUkFOVCI7CisgCistI2NvbmZpZy1zdHJpbmcJJGNjIDogJGNmbGFncyA6ICR1bmlzdGQgOiAkdGhyZWFkX2NmbGFnIDogJHN5c19pZCA6ICRsZmxhZ3MgOiAkYm5fb3BzIDogJGNwdWlkX29iaiA6ICRibl9vYmogOiAkZWNfb2JqIDogJGRlc19vYmogOiAkYWVzX29iaiA6ICRiZl9vYmogOiAkbWQ1X29iaiA6ICRzaGExX29iaiA6ICRjYXN0X29iaiA6ICRyYzRfb2JqIDogJHJtZDE2MF9vYmogOiAkcmM1X29iaiA6ICR3cF9vYmogOiAkY21sbF9vYmogOiAkbW9kZXNfb2JqIDogJGVuZ2luZXNfb2JqIDogJGRzb19zY2hlbWUgOiAkc2hhcmVkX3RhcmdldCA6ICRzaGFyZWRfY2ZsYWcgOiAkc2hhcmVkX2xkZmxhZyA6ICRzaGFyZWRfZXh0ZW5zaW9uIDogJHJhbmxpYiA6ICRhcmZsYWdzIDogJG11bHRpbGliCisrI2NvbmZpZy1zdHJpbmcJJGNjIDogJGNmbGFncyA6ICR1bmlzdGQgOiAkdGhyZWFkX2NmbGFnIDogJHN5c19pZCA6ICRsZmxhZ3MgOiAkYm5fb3BzIDogJGNwdWlkX29iaiA6ICRibl9vYmogOiAkZWNfb2JqIDogJGRlc19vYmogOiAkYWVzX29iaiA6ICRiZl9vYmogOiAkbWQ1X29iaiA6ICRzaGExX29iaiA6ICRjYXN0X29iaiA6ICRyYzRfb2JqIDogJHJtZDE2MF9vYmogOiAkcmM1X29iaiA6ICR3cF9vYmogOiAkY21sbF9vYmogOiAkbW9kZXNfb2JqIDogJGNoYXBvbHlfb2JqIDogJGVuZ2luZXNfb2JqIDogJGRzb19zY2hlbWUgOiAkc2hhcmVkX3RhcmdldCA6ICRzaGFyZWRfY2ZsYWcgOiAkc2hhcmVkX2xkZmxhZyA6ICRzaGFyZWRfZXh0ZW5zaW9uIDogJHJhbmxpYiA6ICRhcmZsYWdzIDogJG11bHRpbGliCisgCisgbXkgJXRhYmxlPSgKKyAjIEZpbGUgJ1RBQkxFJyAoY3JlYXRlZCBieSAnbWFrZSBUQUJMRScpIGNvbnRhaW5zIHRoZSBkYXRhIGZyb20gdGhpcyBsaXN0LAorQEAgLTcxMyw2ICs3MTMsNyBAQAorIG15ICRpZHhfd3Bfb2JqID0gJGlkeCsrOworIG15ICRpZHhfY21sbF9vYmogPSAkaWR4Kys7CisgbXkgJGlkeF9tb2Rlc19vYmogPSAkaWR4Kys7CisrbXkgJGlkeF9jaGFwb2x5X29iaiA9ICRpZHgrKzsKKyBteSAkaWR4X2VuZ2luZXNfb2JqID0gJGlkeCsrOworIG15ICRpZHhfcGVybGFzbV9zY2hlbWUgPSAkaWR4Kys7CisgbXkgJGlkeF9kc29fc2NoZW1lID0gJGlkeCsrOworQEAgLTEyMzksNiArMTI0MCw3IEBACisgbXkgJHdwX29iaiA9ICRmaWVsZHNbJGlkeF93cF9vYmpdOworIG15ICRjbWxsX29iaiA9ICRmaWVsZHNbJGlkeF9jbWxsX29ial07CisgbXkgJG1vZGVzX29iaiA9ICRmaWVsZHNbJGlkeF9tb2Rlc19vYmpdOworK215ICRjaGFwb2x5X29iaj0gJGZpZWxkc1skaWR4X2NoYXBvbHlfb2JqXTsKKyBteSAkZW5naW5lc19vYmogPSAkZmllbGRzWyRpZHhfZW5naW5lc19vYmpdOworIG15ICRwZXJsYXNtX3NjaGVtZSA9ICRmaWVsZHNbJGlkeF9wZXJsYXNtX3NjaGVtZV07CisgbXkgJGRzb19zY2hlbWUgPSAkZmllbGRzWyRpZHhfZHNvX3NjaGVtZV07CitAQCAtMTQwNyw3ICsxNDA5LDggQEAKKyAJeworIAkkY3B1aWRfb2JqPSRibl9vYmo9JGVjX29iaj0KKyAJJGRlc19vYmo9JGFlc19vYmo9JGJmX29iaj0kY2FzdF9vYmo9JHJjNF9vYmo9JHJjNV9vYmo9JGNtbGxfb2JqPQorLQkkbW9kZXNfb2JqPSRzaGExX29iaj0kbWQ1X29iaj0kcm1kMTYwX29iaj0kd3Bfb2JqPSRlbmdpbmVzX29iaj0iIjsKKysJJG1vZGVzX29iaj0kc2hhMV9vYmo9JG1kNV9vYmo9JHJtZDE2MF9vYmo9JHdwX29iaj0kZW5naW5lc19vYmo9CisrCSRjaGFwb2x5X29iaj0iIjsKKyAJfQorIAorIGlmICghJG5vX3NoYXJlZCkKK0BAIC0xNjIyLDYgKzE2MjUsMTAgQEAKKyAJeworIAkkY2ZsYWdzLj0iIC1ERUNQX05JU1RaMjU2X0FTTSI7CisgCX0KKytpZiAoJGNoYXBvbHlfb2JqID1+IC9jaGFjaGEyMF9wb2x5MTMwNS8pCisrCXsKKysJJGNmbGFncy49IiAtRENIQVBPTFlfQVNNIjsKKysJfQorIAorICMgIlN0cmluZ2lmeSIgdGhlIEMgZmxhZ3Mgc3RyaW5nLiAgVGhpcyBwZXJtaXRzIGl0IHRvIGJlIG1hZGUgcGFydCBvZiBhIHN0cmluZworICMgYW5kIHdvcmtzIGFzIHdlbGwgb24gY29tbWFuZCBsaW5lcy4KK0BAIC0xNzUxLDYgKzE3NTgsNyBAQAorIAlzL15XUF9BU01fT0JKPS4qJC9XUF9BU01fT0JKPSAkd3Bfb2JqLzsKKyAJcy9eQ01MTF9FTkM9LiokL0NNTExfRU5DPSAkY21sbF9vYmovOworIAlzL15NT0RFU19BU01fT0JKLj0qJC9NT0RFU19BU01fT0JKPSAkbW9kZXNfb2JqLzsKKysJcy9eQ0hBUE9MWV9BU009LiokL0NIQVBPTFlfQVNNPSAkY2hhcG9seV9vYmovOworIAlzL15FTkdJTkVTX0FTTV9PQkouPSokL0VOR0lORVNfQVNNX09CSj0gJGVuZ2luZXNfb2JqLzsKKyAJcy9eUEVSTEFTTV9TQ0hFTUU9LiokL1BFUkxBU01fU0NIRU1FPSAkcGVybGFzbV9zY2hlbWUvOworIAlzL15QUk9DRVNTT1I9LiovUFJPQ0VTU09SPSAkcHJvY2Vzc29yLzsKK0BAIC0xODEyLDYgKzE4MjAsNyBAQAorIHByaW50ICJSTUQxNjBfT0JKX0FTTT0kcm1kMTYwX29ialxuIjsKKyBwcmludCAiQ01MTF9FTkMgICAgICA9JGNtbGxfb2JqXG4iOworIHByaW50ICJNT0RFU19PQkogICAgID0kbW9kZXNfb2JqXG4iOworK3ByaW50ICJDSEFQT0xZX0FTTSAgID0kY2hhcG9seV9vYmpcbiI7CisgcHJpbnQgIkVOR0lORVNfT0JKICAgPSRlbmdpbmVzX29ialxuIjsKKyBwcmludCAiUFJPQ0VTU09SICAgICA9JHByb2Nlc3NvclxuIjsKKyBwcmludCAiUkFOTElCICAgICAgICA9JHJhbmxpYlxuIjsKK0BAIC0yMDkzLDcgKzIxMDIsNyBAQAorIAkgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIiR2ZXJzaW9uXFwwIgorIAkgICAgLy8gT3B0aW9uYWw6CisgCSAgICAvL1ZBTFVFICJDb21tZW50cyIsICJcXDAiCistCSAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0ICCpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiBDb3B5cmlnaHQgqSAxOTk1LTE5OTggRXJpYyBBLiBZb3VuZywgVGltIEouIEh1ZHNvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cXDAiCisrCSAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0ICDvv70gMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuIENvcHlyaWdodCDvv70gMTk5NS0xOTk4IEVyaWMgQS4gWW91bmcsIFRpbSBKLiBIdWRzb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFwwIgorIAkgICAgLy9WQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIlxcMCIKKyAJICAgIC8vVkFMVUUgIlByaXZhdGVCdWlsZCIsICJcXDAiCisgCSAgICAvL1ZBTFVFICJTcGVjaWFsQnVpbGQiLCAiXFwwIgorQEAgLTIyMTEsNyArMjIyMCw3IEBACisgCW15ICgkY2MsICRjZmxhZ3MsICR1bmlzdGQsICR0aHJlYWRfY2ZsYWcsICRzeXNfaWQsICRsZmxhZ3MsCisgCSAgICAkYm5fb3BzLCAkY3B1aWRfb2JqLCAkYm5fb2JqLCAkZWNfb2JqLCAkZGVzX29iaiwgJGFlc19vYmosICRiZl9vYmosCisgCSAgICAkbWQ1X29iaiwgJHNoYTFfb2JqLCAkY2FzdF9vYmosICRyYzRfb2JqLCAkcm1kMTYwX29iaiwKKy0JICAgICRyYzVfb2JqLCAkd3Bfb2JqLCAkY21sbF9vYmosICRtb2Rlc19vYmosICRlbmdpbmVzX29iaiwKKysJICAgICRyYzVfb2JqLCAkd3Bfb2JqLCAkY21sbF9vYmosICRtb2Rlc19vYmosICRjaGFwb2x5X29iaiwgJGVuZ2luZXNfb2JqLAorIAkgICAgJHBlcmxhc21fc2NoZW1lLCAkZHNvX3NjaGVtZSwgJHNoYXJlZF90YXJnZXQsICRzaGFyZWRfY2ZsYWcsCisgCSAgICAkc2hhcmVkX2xkZmxhZywgJHNoYXJlZF9leHRlbnNpb24sICRyYW5saWIsICRhcmZsYWdzLCAkbXVsdGlsaWIpPQorIAlzcGxpdCgvXHMqOlxzKi8sJHRhYmxleyR0YXJnZXR9IC4gIjoiIHggMzAgLCAtMSk7CitAQCAtMjI0MSw2ICsyMjUwLDcgQEAKKyBcJHdwX29iaiAgICAgICA9ICR3cF9vYmoKKyBcJGNtbGxfb2JqICAgICA9ICRjbWxsX29iagorIFwkbW9kZXNfb2JqICAgID0gJG1vZGVzX29iagorK1wkY2hhcG9seV9vYmogID0gJGNoYXBvbHlfb2JqCisgXCRlbmdpbmVzX29iaiAgPSAkZW5naW5lc19vYmoKKyBcJHBlcmxhc21fc2NoZW1lID0gJHBlcmxhc21fc2NoZW1lCisgXCRkc29fc2NoZW1lICAgPSAkZHNvX3NjaGVtZQorZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvY2hhY2hhMjAuYyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvY2hhY2hhMjAuYworLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9jaGFjaGEyMF9wb2x5MTMwNS9jaGFjaGEyMC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2NoYWNoYTIwX3BvbHkxMzA1L2NoYWNoYTIwLmMJMjAxNi0xMS0zMCAxNTozOToxMy41OTE4MDcyMDggLTA1MDAKK0BAIC0wLDAgKzEsMTE5IEBACisrLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorKyAqCisrICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisrICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisrICoKKysgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKysgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisrICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisrICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisrICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKysgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworKworKy8qIEFkYXB0ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbiwgZXN0cmVhbSBjb2RlIGJ5IEQuIEJlcm5zdGVpbi4gKi8KKysKKysjaW5jbHVkZSAiY2hhY2hhMjBwb2x5MTMwNS5oIgorKworKyNpbmNsdWRlIDxhc3NlcnQuaD4KKysjaW5jbHVkZSA8c3RyaW5nLmg+CisrCisrI2RlZmluZSBVOFRPMzJfTElUVExFKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKyAgKCgodWludDMyX3QpKChwKVswXSkpIHwgKCh1aW50MzJfdCkoKHApWzFdKSA8PCA4KSB8IFwKKysgICAoKHVpbnQzMl90KSgocClbMl0pIDw8IDE2KSB8ICgodWludDMyX3QpKChwKVszXSkgPDwgMjQpKQorKworKy8qIHNpZ21hIGNvbnRhaW5zIHRoZSBDaGFDaGEgY29uc3RhbnRzLCB3aGljaCBoYXBwZW4gdG8gYmUgYW4gQVNDSUkgc3RyaW5nLiAqLworK3N0YXRpYyBjb25zdCB1aW50OF90IHNpZ21hWzE2XSA9IHsgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJyAnLCAnMycsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicsICctJywgJ2InLCAneScsICd0JywgJ2UnLCAnICcsICdrJyB9OworKworKyNkZWZpbmUgUk9UQVRFKHYsIG4pICgoKHYpIDw8IChuKSkgfCAoKHYpID4+ICgzMiAtIChuKSkpKQorKworKyNkZWZpbmUgVTMyVE84X0xJVFRMRShwLCB2KSAgICBcCisrICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKysgICAgKHApWzBdID0gKHYgPj4gMCkgJiAweGZmOyAgXAorKyAgICAocClbMV0gPSAodiA+PiA4KSAmIDB4ZmY7ICBcCisrICAgIChwKVsyXSA9ICh2ID4+IDE2KSAmIDB4ZmY7IFwKKysgICAgKHApWzNdID0gKHYgPj4gMjQpICYgMHhmZjsgXAorKyAgfQorKworKy8qIFFVQVJURVJST1VORCB1cGRhdGVzIGEsIGIsIGMsIGQgd2l0aCBhIENoYUNoYSAicXVhcnRlciIgcm91bmQuICovCisrI2RlZmluZSBRVUFSVEVSUk9VTkQoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgXAorKyAgeFthXSArPSB4W2JdOyB4W2RdID0gUk9UQVRFKHhbZF0gXiB4W2FdLCAxNik7IFwKKysgIHhbY10gKz0geFtkXTsgeFtiXSA9IFJPVEFURSh4W2JdIF4geFtjXSwgMTIpOyBcCisrICB4W2FdICs9IHhbYl07IHhbZF0gPSBST1RBVEUoeFtkXSBeIHhbYV0sICA4KTsgXAorKyAgeFtjXSArPSB4W2RdOyB4W2JdID0gUk9UQVRFKHhbYl0gXiB4W2NdLCAgNyk7CisrCisrLyogY2hhY2hhX2NvcmUgcGVyZm9ybXMgMjAgcm91bmRzIG9mIENoYUNoYSBvbiB0aGUgaW5wdXQgd29yZHMgaW4KKysgKiB8aW5wdXR8IGFuZCB3cml0ZXMgdGhlIDY0IG91dHB1dCBieXRlcyB0byB8b3V0cHV0fC4gKi8KKytzdGF0aWMgdm9pZCBjaGFjaGFfY29yZSh1aW50OF90IG91dHB1dFs2NF0sIGNvbnN0IHVpbnQzMl90IGlucHV0WzE2XSkgeworKyAgdWludDMyX3QgeFsxNl07CisrICBpbnQgaTsKKysKKysgIG1lbWNweSh4LCBpbnB1dCwgc2l6ZW9mKHVpbnQzMl90KSAqIDE2KTsKKysgIGZvciAoaSA9IDIwOyBpID4gMDsgaSAtPSAyKSB7CisrICAgIFFVQVJURVJST1VORCgwLCA0LCA4LCAxMikKKysgICAgUVVBUlRFUlJPVU5EKDEsIDUsIDksIDEzKQorKyAgICBRVUFSVEVSUk9VTkQoMiwgNiwgMTAsIDE0KQorKyAgICBRVUFSVEVSUk9VTkQoMywgNywgMTEsIDE1KQorKyAgICBRVUFSVEVSUk9VTkQoMCwgNSwgMTAsIDE1KQorKyAgICBRVUFSVEVSUk9VTkQoMSwgNiwgMTEsIDEyKQorKyAgICBRVUFSVEVSUk9VTkQoMiwgNywgOCwgMTMpCisrICAgIFFVQVJURVJST1VORCgzLCA0LCA5LCAxNCkKKysgIH0KKysKKysgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisrICAgIHhbaV0gKz0gaW5wdXRbaV07CisrICB9CisrICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworKyAgICBVMzJUTzhfTElUVExFKG91dHB1dCArIDQgKiBpLCB4W2ldKTsKKysgIH0KKyt9CisrCisrdm9pZCBDUllQVE9fY2hhY2hhXzIwKHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sCisrICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qga2V5WzMyXSwgY29uc3QgdWludDhfdCBub25jZVsxMl0sCisrICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50ZXIpIHsKKysgIGFzc2VydCghYnVmZmVyc19hbGlhcyhvdXQsIGluX2xlbiwgaW4sIGluX2xlbikgfHwgaW4gPT0gb3V0KTsKKysKKysgIHVpbnQzMl90IGlucHV0WzE2XTsKKysgIHVpbnQ4X3QgYnVmWzY0XTsKKysgIHNpemVfdCB0b2RvLCBpOworKworKyAgaW5wdXRbMF0gPSBVOFRPMzJfTElUVExFKHNpZ21hICsgMCk7CisrICBpbnB1dFsxXSA9IFU4VE8zMl9MSVRUTEUoc2lnbWEgKyA0KTsKKysgIGlucHV0WzJdID0gVThUTzMyX0xJVFRMRShzaWdtYSArIDgpOworKyAgaW5wdXRbM10gPSBVOFRPMzJfTElUVExFKHNpZ21hICsgMTIpOworKworKyAgaW5wdXRbNF0gPSBVOFRPMzJfTElUVExFKGtleSArIDApOworKyAgaW5wdXRbNV0gPSBVOFRPMzJfTElUVExFKGtleSArIDQpOworKyAgaW5wdXRbNl0gPSBVOFRPMzJfTElUVExFKGtleSArIDgpOworKyAgaW5wdXRbN10gPSBVOFRPMzJfTElUVExFKGtleSArIDEyKTsKKysKKysgIGlucHV0WzhdID0gVThUTzMyX0xJVFRMRShrZXkgKyAxNik7CisrICBpbnB1dFs5XSA9IFU4VE8zMl9MSVRUTEUoa2V5ICsgMjApOworKyAgaW5wdXRbMTBdID0gVThUTzMyX0xJVFRMRShrZXkgKyAyNCk7CisrICBpbnB1dFsxMV0gPSBVOFRPMzJfTElUVExFKGtleSArIDI4KTsKKysKKysgIGlucHV0WzEyXSA9IGNvdW50ZXI7CisrICBpbnB1dFsxM10gPSBVOFRPMzJfTElUVExFKG5vbmNlICsgMCk7CisrICBpbnB1dFsxNF0gPSBVOFRPMzJfTElUVExFKG5vbmNlICsgNCk7CisrICBpbnB1dFsxNV0gPSBVOFRPMzJfTElUVExFKG5vbmNlICsgOCk7CisrCisrICB3aGlsZSAoaW5fbGVuID4gMCkgeworKyAgICB0b2RvID0gc2l6ZW9mKGJ1Zik7CisrICAgIGlmIChpbl9sZW4gPCB0b2RvKSB7CisrICAgICAgdG9kbyA9IGluX2xlbjsKKysgICAgfQorKworKyAgICBjaGFjaGFfY29yZShidWYsIGlucHV0KTsKKysgICAgZm9yIChpID0gMDsgaSA8IHRvZG87IGkrKykgeworKyAgICAgIG91dFtpXSA9IGluW2ldIF4gYnVmW2ldOworKyAgICB9CisrCisrICAgIG91dCArPSB0b2RvOworKyAgICBpbiArPSB0b2RvOworKyAgICBpbl9sZW4gLT0gdG9kbzsKKysKKysgICAgaW5wdXRbMTJdKys7CisrICB9CisrfQorZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvY2hhY2hhMjBwb2x5MTMwNS5oIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9jaGFjaGEyMF9wb2x5MTMwNS9jaGFjaGEyMHBvbHkxMzA1LmgKKy0tLSBvcGVuc3NsLTEuMC4yai9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvY2hhY2hhMjBwb2x5MTMwNS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2NoYWNoYTIwX3BvbHkxMzA1L2NoYWNoYTIwcG9seTEzMDUuaAkyMDE2LTExLTMwIDE1OjM4OjA5Ljk4Nzk2MDYwNSAtMDUwMAorQEAgLTAsMCArMSw2OSBAQAorKy8qIENvcHlyaWdodCAoYykgMjAxNCwgR29vZ2xlIEluYy4KKysgKgorKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKysgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorKyAqCisrICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisrICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKysgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisrICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKysKKysjaWZuZGVmIE9QRU5TU0xfSEVBREVSX1BPTFkxMzA1X0gKKysjZGVmaW5lIE9QRU5TU0xfSEVBREVSX1BPTFkxMzA1X0gKKysKKysjaW5jbHVkZSA8c3RkaW50Lmg+CisrI2luY2x1ZGUgPHN0ZGRlZi5oPgorKyNpbmNsdWRlIDxzdHJpbmcuaD4KKysjaW5jbHVkZSAiY3J5cHRvLmgiCisrCisrI2lmZGVmICBfX2NwbHVzcGx1cworK2V4dGVybiAiQyIgeworKyNlbmRpZgorKworKworK3R5cGVkZWYgdWludDhfdCBwb2x5MTMwNV9zdGF0ZVs1MTJdOworKworKy8qIENSWVBUT19wb2x5MTMwNV9pbml0IHNldHMgdXAgfHN0YXRlfCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBhbgorKyAqIGF1dGhlbnRpY2F0aW9uIHRhZyB3aXRoIHRoZSBvbmUtdGltZSBrZXkgfGtleXwuIE5vdGUgdGhhdCB8a2V5fCBpcyBhCisrICogb25lLXRpbWUga2V5IGFuZCB0aGVyZWZvcmUgdGhlcmUgaXMgbm8gYHJlc2V0JyBtZXRob2QgYmVjYXVzZSB0aGF0IHdvdWxkCisrICogZW5hYmxlIHNldmVyYWwgbWVzc2FnZXMgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoIHRoZSBzYW1lIGtleS4gKi8KKyt2b2lkIENSWVBUT19wb2x5MTMwNV9pbml0KHBvbHkxMzA1X3N0YXRlKiBzdGF0ZSwgY29uc3QgdWludDhfdCBrZXlbMzJdKTsKKysKKysvKiBDUllQVE9fcG9seTEzMDVfdXBkYXRlIHByb2Nlc3NlcyB8aW5fbGVufCBieXRlcyBmcm9tIHxpbnwuIEl0IGNhbiBiZSBjYWxsZWQKKysgKiB6ZXJvIG9yIG1vcmUgdGltZXMgYWZ0ZXIgcG9seTEzMDVfaW5pdC4gKi8KKyt2b2lkIENSWVBUT19wb2x5MTMwNV91cGRhdGUocG9seTEzMDVfc3RhdGUqIHN0YXRlLCBjb25zdCB1aW50OF90KiBpbiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbik7CisrCisrLyogQ1JZUFRPX3BvbHkxMzA1X2ZpbmlzaCBjb21wbGV0ZXMgdGhlIHBvbHkxMzA1IGNhbGN1bGF0aW9uIGFuZCB3cml0ZXMgYSAxNgorKyAqIGJ5dGUgYXV0aGVudGljYXRpb24gdGFnIHRvIHxtYWN8LiBUaGUgfG1hY3wgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUKKysgKiBhbGlnbmVkLiAqLworK3ZvaWQgQ1JZUFRPX3BvbHkxMzA1X2ZpbmlzaChwb2x5MTMwNV9zdGF0ZSogc3RhdGUsIHVpbnQ4X3QgbWFjWzE2XSk7CisrCisrLyogQ1JZUFRPX2NoYWNoYV8yMCBlbmNyeXB0cyB8aW5fbGVufCBieXRlcyBmcm9tIHxpbnwgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZAorKyAqIG5vbmNlIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB8b3V0fC4gSWYgfGlufCBhbmQgfG91dHwgYWxpYXMsIHRoZXkgbXVzdCBiZQorKyAqIGVxdWFsLiBUaGUgaW5pdGlhbCBibG9jayBjb3VudGVyIGlzIHNwZWNpZmllZCBieSB8Y291bnRlcnwuICovCisrdm9pZCBDUllQVE9fY2hhY2hhXzIwKHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sCisrICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbl9sZW4sIGNvbnN0IHVpbnQ4X3Qga2V5WzMyXSwKKysgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBub25jZVsxMl0sIHVpbnQzMl90IGNvdW50ZXIpOworKworKy8qIGJ1ZmZlcnNfYWxpYXMgcmV0dXJucyBvbmUgaWYgfGF8IGFuZCB8YnwgYWxpYXMgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLworK3N0YXRpYyBpbmxpbmUgaW50IGJ1ZmZlcnNfYWxpYXMoY29uc3QgdWludDhfdCAqYSwgc2l6ZV90IGFfbGVuLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYiwgc2l6ZV90IGJfbGVuKSB7CisrICAvKiBDYXN0IHxhfCBhbmQgfGJ8IHRvIGludGVnZXJzLiBJbiBDLCBwb2ludGVyIGNvbXBhcmlzb25zIGJldHdlZW4gdW5yZWxhdGVkCisrICAgKiBvYmplY3RzIGFyZSB1bmRlZmluZWQgd2hlcmVhcyBwb2ludGVyIHRvIGludGVnZXIgY29udmVyc2lvbnMgYXJlIG1lcmVseQorKyAgICogaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gV2UgYXNzdW1lIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGl0IGluIGEgc2FuZQorKyAgICogd2F5LiAqLworKyAgdWludHB0cl90IGFfdSA9ICh1aW50cHRyX3QpYTsKKysgIHVpbnRwdHJfdCBiX3UgPSAodWludHB0cl90KWI7CisrICByZXR1cm4gYV91ICsgYV9sZW4gPiBiX3UgJiYgYl91ICsgYl9sZW4gPiBhX3U7CisrfQorKworKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorK30gIC8qIGV4dGVybiBDICovCisrI2VuZGlmCisrCisrI2VuZGlmICAvKiBPUEVOU1NMX0hFQURFUl9QT0xZMTMwNV9IICovCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9jaGFjaGEyMF9wb2x5MTMwNS9NYWtlZmlsZSBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvTWFrZWZpbGUKKy0tLSBvcGVuc3NsLTEuMC4yai9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvTWFrZWZpbGUJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvTWFrZWZpbGUJMjAxNi0xMS0zMCAwOTo1Mzo0My43Mzg0NDExOTYgLTA1MDAKK0BAIC0wLDAgKzEsODAgQEAKKysjCisrIyBjcnlwdG8vY2hhY2hhMjBwb2x5MTMwNS9NYWtlZmlsZQorKyMKKysKKytESVI9CWNoYWNoYTIwcG9seTEzMDUKKytUT1A9CS4uLy4uCisrQ0M9CWNjCisrSU5DTFVERVM9IC1JLi4gLUkkKFRPUCkgLUkuLi8uLi9pbmNsdWRlCisrQ0ZMQUc9LWcKKytNQUtFRklMRT0JTWFrZWZpbGUKKytBUj0JCWFyIHIKKysKKytDRkxBR1M9ICQoSU5DTFVERVMpICQoQ0ZMQUcpCisrQVNGTEFHUz0gJChJTkNMVURFUykgJChBU0ZMQUcpCisrQUZMQUdTPSAkKEFTRkxBR1MpCisrCisrR0VORVJBTD1NYWtlZmlsZQorK1RFU1Q9CisrQVBQUz0KKysKKytMSUI9JChUT1ApL2xpYmNyeXB0by5hCisrTElCU1JDPSBjaGFjaGEyMC5jIHBvbHkxMzA1LmMKKytMSUJPQko9IGNoYWNoYTIwLm8gcG9seTEzMDUubyAkKENIQVBPTFlfQVNNKQorKworK1NSQz0gJChMSUJTUkMpCisrCisrRVhIRUFERVI9IGNoYWNoYTIwcG9seTEzMDUuaAorK0hFQURFUj0gJChFWEhFQURFUikKKysKKytBTEw9ICAgICQoR0VORVJBTCkgJChTUkMpICQoSEVBREVSKQorKworK3RvcDoKKysJKGNkIC4uLy4uOyAkKE1BS0UpIERJUlM9Y3J5cHRvIFNESVJTPSQoRElSKSBzdWJfYWxsKQorKworK2FsbDoJbGliCisrCisrbGliOgkkKExJQk9CSikKKysJJChBUikgJChMSUIpICQoTElCT0JKKQorKwkkKFJBTkxJQikgJChMSUIpIHx8IGVjaG8gTmV2ZXIgbWluZC4KKysJQHRvdWNoIGxpYgorKworK2ZpbGVzOgorKwkkKFBFUkwpICQoVE9QKS91dGlsL2ZpbGVzLnBsIE1ha2VmaWxlID4+ICQoVE9QKS9NSU5GTworKworK2xpbmtzOgorKwlAJChQRVJMKSAkKFRPUCkvdXRpbC9ta2xpbmsucGwgLi4vLi4vaW5jbHVkZS9vcGVuc3NsICQoRVhIRUFERVIpCisrCUAkKFBFUkwpICQoVE9QKS91dGlsL21rbGluay5wbCAuLi8uLi90ZXN0ICQoVEVTVCkKKysJQCQoUEVSTCkgJChUT1ApL3V0aWwvbWtsaW5rLnBsIC4uLy4uL2FwcHMgJChBUFBTKQorKworK2luc3RhbGw6CisrCUBbIC1uICIkKElOU1RBTExUT1ApIiBdICMgc2hvdWxkIGJlIHNldCBieSB0b3AgTWFrZWZpbGUuLi4KKysJQGhlYWRlcmxpc3Q9IiQoRVhIRUFERVIpIjsgZm9yIGkgaW4gJCRoZWFkZXJsaXN0IDsgXAorKwlkbyAgXAorKwkoY3AgJCRpICQoSU5TVEFMTF9QUkVGSVgpJChJTlNUQUxMVE9QKS9pbmNsdWRlL29wZW5zc2wvJCRpOyBcCisrCWNobW9kIDY0NCAkKElOU1RBTExfUFJFRklYKSQoSU5TVEFMTFRPUCkvaW5jbHVkZS9vcGVuc3NsLyQkaSApOyBcCisrCWRvbmU7CisrCisrdGFnczoKKysJY3RhZ3MgJChTUkMpCisrCisrdGVzdHM6CisrCisrbGludDoKKysJbGludCAtRExJTlQgJChJTkNMVURFUykgJChTUkMpPmZsdWZmCisrCisrZGVwZW5kOgorKwlAWyAtbiAiJChNQUtFREVQRU5EKSIgXSAjIHNob3VsZCBiZSBzZXQgYnkgdXBwZXIgTWFrZWZpbGUuLi4KKysJJChNQUtFREVQRU5EKSAtLSAkKENGTEFHKSAkKElOQ0xVREVTKSAkKERFUEZMQUcpIC0tICQoUFJPR1MpICQoTElCU1JDKQorKworK2RjbGVhbjoKKysJJChQRVJMKSAtcGUgJ2lmICgvXiMgRE8gTk9UIERFTEVURSBUSElTIExJTkUvKSB7cHJpbnQ7IGV4aXQoMCk7fScgJChNQUtFRklMRSkgPk1ha2VmaWxlLm5ldworKwltdiAtZiBNYWtlZmlsZS5uZXcgJChNQUtFRklMRSkKKysKKytjbGVhbjoKKysJcm0gLWYgKi5zICoubyAqLm9iaiBsaWIgdGFncyBjb3JlIC5wdXJlIC5uZnMqICoub2xkICouYmFrIGZsdWZmCisrCisrIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorKworK2NoYWNoYTIwLm86IC4uLy4uL2luY2x1ZGUvb3BlbnNzbC9jaGFjaGEyMHBvbHkxMzA1LmggY2hhY2hhMjAuYworK3BvbHkxMzA1Lm86IC4uLy4uL2luY2x1ZGUvb3BlbnNzbC9jaGFjaGEyMHBvbHkxMzA1LmggcG9seTEzMDUuYworZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvcG9seTEzMDUuYyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vY2hhY2hhMjBfcG9seTEzMDUvcG9seTEzMDUuYworLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9jaGFjaGEyMF9wb2x5MTMwNS9wb2x5MTMwNS5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2NoYWNoYTIwX3BvbHkxMzA1L3BvbHkxMzA1LmMJMjAxNi0xMS0zMCAxMDo1Njo1OC4wMDA4NTM2NzYgLTA1MDAKK0BAIC0wLDAgKzEsMzA2IEBACisrLyogQ29weXJpZ2h0IChjKSAyMDE0LCBHb29nbGUgSW5jLgorKyAqCisrICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisrICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisrICoKKysgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKysgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisrICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisrICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisrICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKysgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworKworKy8qIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcG9seTEzMDUgaXMgYnkgQW5kcmV3IE1vb24KKysgKiAoaHR0cHM6Ly9naXRodWIuY29tL2Zsb29keWJlcnJ5L3BvbHkxMzA1LWRvbm5hKSBhbmQgcmVsZWFzZWQgYXMgcHVibGljCisrICogZG9tYWluLiAqLworKworKyNpbmNsdWRlICJjaGFjaGEyMHBvbHkxMzA1LmgiCisrCisrI2luY2x1ZGUgPHN0cmluZy5oPgorKworKyNpZiAhZGVmaW5lZChCX0VORElBTikKKysvKiBXZSBjYW4gYXNzdW1lIGxpdHRsZS1lbmRpYW4uICovCisrc3RhdGljIHVpbnQzMl90IFU4VE8zMl9MRShjb25zdCB1aW50OF90ICptKSB7CisrICB1aW50MzJfdCByOworKyAgbWVtY3B5KCZyLCBtLCBzaXplb2YocikpOworKyAgcmV0dXJuIHI7CisrfQorKworK3N0YXRpYyB2b2lkIFUzMlRPOF9MRSh1aW50OF90ICptLCB1aW50MzJfdCB2KSB7IG1lbWNweShtLCAmdiwgc2l6ZW9mKHYpKTsgfQorKyNlbHNlCisrc3RhdGljIHVpbnQzMl90IFU4VE8zMl9MRShjb25zdCB1aW50OF90ICptKSB7CisrICByZXR1cm4gKHVpbnQzMl90KW1bMF0gfCAodWludDMyX3QpbVsxXSA8PCA4IHwgKHVpbnQzMl90KW1bMl0gPDwgMTYgfAorKyAgICAgICAgICh1aW50MzJfdCltWzNdIDw8IDI0OworK30KKysKKytzdGF0aWMgdm9pZCBVMzJUTzhfTEUodWludDhfdCAqbSwgdWludDMyX3QgdikgeworKyAgbVswXSA9IHY7CisrICBtWzFdID0gdiA+PiA4OworKyAgbVsyXSA9IHYgPj4gMTY7CisrICBtWzNdID0gdiA+PiAyNDsKKyt9CisrI2VuZGlmCisrCisrc3RhdGljIHVpbnQ2NF90IG11bDMyeDMyXzY0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsgcmV0dXJuICh1aW50NjRfdClhICogYjsgfQorKworK3N0cnVjdCBwb2x5MTMwNV9zdGF0ZV9zdCB7CisrICB1aW50MzJfdCByMCwgcjEsIHIyLCByMywgcjQ7CisrICB1aW50MzJfdCBzMSwgczIsIHMzLCBzNDsKKysgIHVpbnQzMl90IGgwLCBoMSwgaDIsIGgzLCBoNDsKKysgIHVpbnQ4X3QgYnVmWzE2XTsKKysgIHVuc2lnbmVkIGludCBidWZfdXNlZDsKKysgIHVpbnQ4X3Qga2V5WzE2XTsKKyt9OworKworK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvbHkxMzA1X3N0YXRlX3N0ICpwb2x5MTMwNV9hbGlnbmVkX3N0YXRlKAorKyAgICBwb2x5MTMwNV9zdGF0ZSAqc3RhdGUpIHsKKysgIHJldHVybiAoc3RydWN0IHBvbHkxMzA1X3N0YXRlX3N0ICopKCgodWludHB0cl90KXN0YXRlICsgNjMpICYgfjYzKTsKKyt9CisrCisrLyogcG9seTEzMDVfYmxvY2tzIHVwZGF0ZXMgfHN0YXRlfCBnaXZlbiBzb21lIGFtb3VudCBvZiBpbnB1dCBkYXRhLiBUaGlzCisrICogZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGggYSB8bGVufCB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IGF0IHRoZQorKyAqIGVuZCBvZiB0aGUgZGF0YS4gT3RoZXJ3aXNlIHRoZSBpbnB1dCBtdXN0IGJlIGJ1ZmZlcmVkIGludG8gMTYgYnl0ZSBibG9ja3MuICovCisrc3RhdGljIHZvaWQgcG9seTEzMDVfdXBkYXRlKHN0cnVjdCBwb2x5MTMwNV9zdGF0ZV9zdCAqc3RhdGUsIGNvbnN0IHVpbnQ4X3QgKmluLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7CisrICB1aW50MzJfdCB0MCwgdDEsIHQyLCB0MzsKKysgIHVpbnQ2NF90IHRbNV07CisrICB1aW50MzJfdCBiOworKyAgdWludDY0X3QgYzsKKysgIHNpemVfdCBqOworKyAgdWludDhfdCBtcFsxNl07CisrCisrICBpZiAobGVuIDwgMTYpIHsKKysgICAgZ290byBwb2x5MTMwNV9kb25uYV9hdG1vc3QxNWJ5dGVzOworKyAgfQorKworK3BvbHkxMzA1X2Rvbm5hXzE2Ynl0ZXM6CisrICB0MCA9IFU4VE8zMl9MRShpbik7CisrICB0MSA9IFU4VE8zMl9MRShpbiArIDQpOworKyAgdDIgPSBVOFRPMzJfTEUoaW4gKyA4KTsKKysgIHQzID0gVThUTzMyX0xFKGluICsgMTIpOworKworKyAgaW4gKz0gMTY7CisrICBsZW4gLT0gMTY7CisrCisrICBzdGF0ZS0+aDAgKz0gdDAgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDEgKz0gKCgoKHVpbnQ2NF90KXQxIDw8IDMyKSB8IHQwKSA+PiAyNikgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDIgKz0gKCgoKHVpbnQ2NF90KXQyIDw8IDMyKSB8IHQxKSA+PiAyMCkgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDMgKz0gKCgoKHVpbnQ2NF90KXQzIDw8IDMyKSB8IHQyKSA+PiAxNCkgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDQgKz0gKHQzID4+IDgpIHwgKDEgPDwgMjQpOworKworK3BvbHkxMzA1X2Rvbm5hX211bDoKKysgIHRbMF0gPSBtdWwzMngzMl82NChzdGF0ZS0+aDAsIHN0YXRlLT5yMCkgKyBtdWwzMngzMl82NChzdGF0ZS0+aDEsIHN0YXRlLT5zNCkgKworKyAgICAgICAgIG11bDMyeDMyXzY0KHN0YXRlLT5oMiwgc3RhdGUtPnMzKSArIG11bDMyeDMyXzY0KHN0YXRlLT5oMywgc3RhdGUtPnMyKSArCisrICAgICAgICAgbXVsMzJ4MzJfNjQoc3RhdGUtPmg0LCBzdGF0ZS0+czEpOworKyAgdFsxXSA9IG11bDMyeDMyXzY0KHN0YXRlLT5oMCwgc3RhdGUtPnIxKSArIG11bDMyeDMyXzY0KHN0YXRlLT5oMSwgc3RhdGUtPnIwKSArCisrICAgICAgICAgbXVsMzJ4MzJfNjQoc3RhdGUtPmgyLCBzdGF0ZS0+czQpICsgbXVsMzJ4MzJfNjQoc3RhdGUtPmgzLCBzdGF0ZS0+czMpICsKKysgICAgICAgICBtdWwzMngzMl82NChzdGF0ZS0+aDQsIHN0YXRlLT5zMik7CisrICB0WzJdID0gbXVsMzJ4MzJfNjQoc3RhdGUtPmgwLCBzdGF0ZS0+cjIpICsgbXVsMzJ4MzJfNjQoc3RhdGUtPmgxLCBzdGF0ZS0+cjEpICsKKysgICAgICAgICBtdWwzMngzMl82NChzdGF0ZS0+aDIsIHN0YXRlLT5yMCkgKyBtdWwzMngzMl82NChzdGF0ZS0+aDMsIHN0YXRlLT5zNCkgKworKyAgICAgICAgIG11bDMyeDMyXzY0KHN0YXRlLT5oNCwgc3RhdGUtPnMzKTsKKysgIHRbM10gPSBtdWwzMngzMl82NChzdGF0ZS0+aDAsIHN0YXRlLT5yMykgKyBtdWwzMngzMl82NChzdGF0ZS0+aDEsIHN0YXRlLT5yMikgKworKyAgICAgICAgIG11bDMyeDMyXzY0KHN0YXRlLT5oMiwgc3RhdGUtPnIxKSArIG11bDMyeDMyXzY0KHN0YXRlLT5oMywgc3RhdGUtPnIwKSArCisrICAgICAgICAgbXVsMzJ4MzJfNjQoc3RhdGUtPmg0LCBzdGF0ZS0+czQpOworKyAgdFs0XSA9IG11bDMyeDMyXzY0KHN0YXRlLT5oMCwgc3RhdGUtPnI0KSArIG11bDMyeDMyXzY0KHN0YXRlLT5oMSwgc3RhdGUtPnIzKSArCisrICAgICAgICAgbXVsMzJ4MzJfNjQoc3RhdGUtPmgyLCBzdGF0ZS0+cjIpICsgbXVsMzJ4MzJfNjQoc3RhdGUtPmgzLCBzdGF0ZS0+cjEpICsKKysgICAgICAgICBtdWwzMngzMl82NChzdGF0ZS0+aDQsIHN0YXRlLT5yMCk7CisrCisrICBzdGF0ZS0+aDAgPSAodWludDMyX3QpdFswXSAmIDB4M2ZmZmZmZjsKKysgIGMgPSAodFswXSA+PiAyNik7CisrICB0WzFdICs9IGM7CisrICBzdGF0ZS0+aDEgPSAodWludDMyX3QpdFsxXSAmIDB4M2ZmZmZmZjsKKysgIGIgPSAodWludDMyX3QpKHRbMV0gPj4gMjYpOworKyAgdFsyXSArPSBiOworKyAgc3RhdGUtPmgyID0gKHVpbnQzMl90KXRbMl0gJiAweDNmZmZmZmY7CisrICBiID0gKHVpbnQzMl90KSh0WzJdID4+IDI2KTsKKysgIHRbM10gKz0gYjsKKysgIHN0YXRlLT5oMyA9ICh1aW50MzJfdCl0WzNdICYgMHgzZmZmZmZmOworKyAgYiA9ICh1aW50MzJfdCkodFszXSA+PiAyNik7CisrICB0WzRdICs9IGI7CisrICBzdGF0ZS0+aDQgPSAodWludDMyX3QpdFs0XSAmIDB4M2ZmZmZmZjsKKysgIGIgPSAodWludDMyX3QpKHRbNF0gPj4gMjYpOworKyAgc3RhdGUtPmgwICs9IGIgKiA1OworKworKyAgaWYgKGxlbiA+PSAxNikgeworKyAgICBnb3RvIHBvbHkxMzA1X2Rvbm5hXzE2Ynl0ZXM7CisrICB9CisrCisrLyogZmluYWwgYnl0ZXMgKi8KKytwb2x5MTMwNV9kb25uYV9hdG1vc3QxNWJ5dGVzOgorKyAgaWYgKCFsZW4pIHsKKysgICAgcmV0dXJuOworKyAgfQorKworKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisrICAgIG1wW2pdID0gaW5bal07CisrICB9CisrICBtcFtqKytdID0gMTsKKysgIGZvciAoOyBqIDwgMTY7IGorKykgeworKyAgICBtcFtqXSA9IDA7CisrICB9CisrICBsZW4gPSAwOworKworKyAgdDAgPSBVOFRPMzJfTEUobXAgKyAwKTsKKysgIHQxID0gVThUTzMyX0xFKG1wICsgNCk7CisrICB0MiA9IFU4VE8zMl9MRShtcCArIDgpOworKyAgdDMgPSBVOFRPMzJfTEUobXAgKyAxMik7CisrCisrICBzdGF0ZS0+aDAgKz0gdDAgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDEgKz0gKCgoKHVpbnQ2NF90KXQxIDw8IDMyKSB8IHQwKSA+PiAyNikgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDIgKz0gKCgoKHVpbnQ2NF90KXQyIDw8IDMyKSB8IHQxKSA+PiAyMCkgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDMgKz0gKCgoKHVpbnQ2NF90KXQzIDw8IDMyKSB8IHQyKSA+PiAxNCkgJiAweDNmZmZmZmY7CisrICBzdGF0ZS0+aDQgKz0gKHQzID4+IDgpOworKworKyAgZ290byBwb2x5MTMwNV9kb25uYV9tdWw7CisrfQorKworK3ZvaWQgQ1JZUFRPX3BvbHkxMzA1X2luaXQocG9seTEzMDVfc3RhdGUgKnN0YXRlcCwgY29uc3QgdWludDhfdCBrZXlbMzJdKSB7CisrICBzdHJ1Y3QgcG9seTEzMDVfc3RhdGVfc3QgKnN0YXRlID0gcG9seTEzMDVfYWxpZ25lZF9zdGF0ZShzdGF0ZXApOworKyAgdWludDMyX3QgdDAsIHQxLCB0MiwgdDM7CisrCisrICB0MCA9IFU4VE8zMl9MRShrZXkgKyAwKTsKKysgIHQxID0gVThUTzMyX0xFKGtleSArIDQpOworKyAgdDIgPSBVOFRPMzJfTEUoa2V5ICsgOCk7CisrICB0MyA9IFU4VE8zMl9MRShrZXkgKyAxMik7CisrCisrICAvKiBwcmVjb21wdXRlIG11bHRpcGxpZXJzICovCisrICBzdGF0ZS0+cjAgPSB0MCAmIDB4M2ZmZmZmZjsKKysgIHQwID4+PSAyNjsKKysgIHQwIHw9IHQxIDw8IDY7CisrICBzdGF0ZS0+cjEgPSB0MCAmIDB4M2ZmZmYwMzsKKysgIHQxID4+PSAyMDsKKysgIHQxIHw9IHQyIDw8IDEyOworKyAgc3RhdGUtPnIyID0gdDEgJiAweDNmZmMwZmY7CisrICB0MiA+Pj0gMTQ7CisrICB0MiB8PSB0MyA8PCAxODsKKysgIHN0YXRlLT5yMyA9IHQyICYgMHgzZjAzZmZmOworKyAgdDMgPj49IDg7CisrICBzdGF0ZS0+cjQgPSB0MyAmIDB4MDBmZmZmZjsKKysKKysgIHN0YXRlLT5zMSA9IHN0YXRlLT5yMSAqIDU7CisrICBzdGF0ZS0+czIgPSBzdGF0ZS0+cjIgKiA1OworKyAgc3RhdGUtPnMzID0gc3RhdGUtPnIzICogNTsKKysgIHN0YXRlLT5zNCA9IHN0YXRlLT5yNCAqIDU7CisrCisrICAvKiBpbml0IHN0YXRlICovCisrICBzdGF0ZS0+aDAgPSAwOworKyAgc3RhdGUtPmgxID0gMDsKKysgIHN0YXRlLT5oMiA9IDA7CisrICBzdGF0ZS0+aDMgPSAwOworKyAgc3RhdGUtPmg0ID0gMDsKKysKKysgIHN0YXRlLT5idWZfdXNlZCA9IDA7CisrICBtZW1jcHkoc3RhdGUtPmtleSwga2V5ICsgMTYsIHNpemVvZihzdGF0ZS0+a2V5KSk7CisrfQorKworK3ZvaWQgQ1JZUFRPX3BvbHkxMzA1X3VwZGF0ZShwb2x5MTMwNV9zdGF0ZSAqc3RhdGVwLCBjb25zdCB1aW50OF90ICppbiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluX2xlbikgeworKyAgdW5zaWduZWQgaW50IGk7CisrICBzdHJ1Y3QgcG9seTEzMDVfc3RhdGVfc3QgKnN0YXRlID0gcG9seTEzMDVfYWxpZ25lZF9zdGF0ZShzdGF0ZXApOworKworKyAgaWYgKHN0YXRlLT5idWZfdXNlZCkgeworKyAgICB1bnNpZ25lZCB0b2RvID0gMTYgLSBzdGF0ZS0+YnVmX3VzZWQ7CisrICAgIGlmICh0b2RvID4gaW5fbGVuKSB7CisrICAgICAgdG9kbyA9ICh1bnNpZ25lZClpbl9sZW47CisrICAgIH0KKysgICAgZm9yIChpID0gMDsgaSA8IHRvZG87IGkrKykgeworKyAgICAgIHN0YXRlLT5idWZbc3RhdGUtPmJ1Zl91c2VkICsgaV0gPSBpbltpXTsKKysgICAgfQorKyAgICBzdGF0ZS0+YnVmX3VzZWQgKz0gdG9kbzsKKysgICAgaW5fbGVuIC09IHRvZG87CisrICAgIGluICs9IHRvZG87CisrCisrICAgIGlmIChzdGF0ZS0+YnVmX3VzZWQgPT0gMTYpIHsKKysgICAgICBwb2x5MTMwNV91cGRhdGUoc3RhdGUsIHN0YXRlLT5idWYsIDE2KTsKKysgICAgICBzdGF0ZS0+YnVmX3VzZWQgPSAwOworKyAgICB9CisrICB9CisrCisrICBpZiAoaW5fbGVuID49IDE2KSB7CisrICAgIHNpemVfdCB0b2RvID0gaW5fbGVuICYgfjB4ZjsKKysgICAgcG9seTEzMDVfdXBkYXRlKHN0YXRlLCBpbiwgdG9kbyk7CisrICAgIGluICs9IHRvZG87CisrICAgIGluX2xlbiAmPSAweGY7CisrICB9CisrCisrICBpZiAoaW5fbGVuKSB7CisrICAgIGZvciAoaSA9IDA7IGkgPCBpbl9sZW47IGkrKykgeworKyAgICAgIHN0YXRlLT5idWZbaV0gPSBpbltpXTsKKysgICAgfQorKyAgICBzdGF0ZS0+YnVmX3VzZWQgPSAodW5zaWduZWQpaW5fbGVuOworKyAgfQorK30KKysKKyt2b2lkIENSWVBUT19wb2x5MTMwNV9maW5pc2gocG9seTEzMDVfc3RhdGUgKnN0YXRlcCwgdWludDhfdCBtYWNbMTZdKSB7CisrICBzdHJ1Y3QgcG9seTEzMDVfc3RhdGVfc3QgKnN0YXRlID0gcG9seTEzMDVfYWxpZ25lZF9zdGF0ZShzdGF0ZXApOworKyAgdWludDY0X3QgZjAsIGYxLCBmMiwgZjM7CisrICB1aW50MzJfdCBnMCwgZzEsIGcyLCBnMywgZzQ7CisrICB1aW50MzJfdCBiLCBuYjsKKysKKysKKysKKysKKysKKysKKysKKysKKysgIGlmIChzdGF0ZS0+YnVmX3VzZWQpIHsKKysgICAgcG9seTEzMDVfdXBkYXRlKHN0YXRlLCBzdGF0ZS0+YnVmLCBzdGF0ZS0+YnVmX3VzZWQpOworKyAgfQorKworKyAgYiA9IHN0YXRlLT5oMCA+PiAyNjsKKysgIHN0YXRlLT5oMCA9IHN0YXRlLT5oMCAmIDB4M2ZmZmZmZjsKKysgIHN0YXRlLT5oMSArPSBiOworKyAgYiA9IHN0YXRlLT5oMSA+PiAyNjsKKysgIHN0YXRlLT5oMSA9IHN0YXRlLT5oMSAmIDB4M2ZmZmZmZjsKKysgIHN0YXRlLT5oMiArPSBiOworKyAgYiA9IHN0YXRlLT5oMiA+PiAyNjsKKysgIHN0YXRlLT5oMiA9IHN0YXRlLT5oMiAmIDB4M2ZmZmZmZjsKKysgIHN0YXRlLT5oMyArPSBiOworKyAgYiA9IHN0YXRlLT5oMyA+PiAyNjsKKysgIHN0YXRlLT5oMyA9IHN0YXRlLT5oMyAmIDB4M2ZmZmZmZjsKKysgIHN0YXRlLT5oNCArPSBiOworKyAgYiA9IHN0YXRlLT5oNCA+PiAyNjsKKysgIHN0YXRlLT5oNCA9IHN0YXRlLT5oNCAmIDB4M2ZmZmZmZjsKKysgIHN0YXRlLT5oMCArPSBiICogNTsKKysKKysgIGcwID0gc3RhdGUtPmgwICsgNTsKKysgIGIgPSBnMCA+PiAyNjsKKysgIGcwICY9IDB4M2ZmZmZmZjsKKysgIGcxID0gc3RhdGUtPmgxICsgYjsKKysgIGIgPSBnMSA+PiAyNjsKKysgIGcxICY9IDB4M2ZmZmZmZjsKKysgIGcyID0gc3RhdGUtPmgyICsgYjsKKysgIGIgPSBnMiA+PiAyNjsKKysgIGcyICY9IDB4M2ZmZmZmZjsKKysgIGczID0gc3RhdGUtPmgzICsgYjsKKysgIGIgPSBnMyA+PiAyNjsKKysgIGczICY9IDB4M2ZmZmZmZjsKKysgIGc0ID0gc3RhdGUtPmg0ICsgYiAtICgxIDw8IDI2KTsKKysKKysgIGIgPSAoZzQgPj4gMzEpIC0gMTsKKysgIG5iID0gfmI7CisrICBzdGF0ZS0+aDAgPSAoc3RhdGUtPmgwICYgbmIpIHwgKGcwICYgYik7CisrICBzdGF0ZS0+aDEgPSAoc3RhdGUtPmgxICYgbmIpIHwgKGcxICYgYik7CisrICBzdGF0ZS0+aDIgPSAoc3RhdGUtPmgyICYgbmIpIHwgKGcyICYgYik7CisrICBzdGF0ZS0+aDMgPSAoc3RhdGUtPmgzICYgbmIpIHwgKGczICYgYik7CisrICBzdGF0ZS0+aDQgPSAoc3RhdGUtPmg0ICYgbmIpIHwgKGc0ICYgYik7CisrCisrICBmMCA9ICgoc3RhdGUtPmgwKSB8IChzdGF0ZS0+aDEgPDwgMjYpKSArICh1aW50NjRfdClVOFRPMzJfTEUoJnN0YXRlLT5rZXlbMF0pOworKyAgZjEgPSAoKHN0YXRlLT5oMSA+PiA2KSB8IChzdGF0ZS0+aDIgPDwgMjApKSArCisrICAgICAgICh1aW50NjRfdClVOFRPMzJfTEUoJnN0YXRlLT5rZXlbNF0pOworKyAgZjIgPSAoKHN0YXRlLT5oMiA+PiAxMikgfCAoc3RhdGUtPmgzIDw8IDE0KSkgKworKyAgICAgICAodWludDY0X3QpVThUTzMyX0xFKCZzdGF0ZS0+a2V5WzhdKTsKKysgIGYzID0gKChzdGF0ZS0+aDMgPj4gMTgpIHwgKHN0YXRlLT5oNCA8PCA4KSkgKworKyAgICAgICAodWludDY0X3QpVThUTzMyX0xFKCZzdGF0ZS0+a2V5WzEyXSk7CisrCisrICBVMzJUTzhfTEUoJm1hY1swXSwgZjApOworKyAgZjEgKz0gKGYwID4+IDMyKTsKKysgIFUzMlRPOF9MRSgmbWFjWzRdLCBmMSk7CisrICBmMiArPSAoZjEgPj4gMzIpOworKyAgVTMyVE84X0xFKCZtYWNbOF0sIGYyKTsKKysgIGYzICs9IChmMiA+PiAzMik7CisrICBVMzJUTzhfTEUoJm1hY1sxMl0sIGYzKTsKKyt9CitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9ldnAvY19hbGxjLmMgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2V2cC9jX2FsbGMuYworLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9ldnAvY19hbGxjLmMJMjAxNi0wOS0yNiAwNTo0OTowNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vZXZwL2NfYWxsYy5jCTIwMTYtMTEtMzAgMDk6NDI6MzEuMTUyMTU4OTM3IC0wNTAwCitAQCAtMjM4LDQgKzIzOCw4IEBACisgICAgIEVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2NhbWVsbGlhXzI1Nl9jYmMsICJDQU1FTExJQTI1NiIpOworICAgICBFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9jYW1lbGxpYV8yNTZfY2JjLCAiY2FtZWxsaWEyNTYiKTsKKyAjZW5kaWYKKysKKysjaWZuZGVmIE9QRU5TU0xfTk9fQ0hBQ0hBX1BPTFkKKysgICAgRVZQX2FkZF9jaXBoZXIoRVZQX2NoYWNoYTIwX3BvbHkxMzA1KCkpOworKyNlbmRpZgorIH0KK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovY3J5cHRvL2V2cC9lX2NoYWNoYTIwX3BvbHkxMzA1LmMgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2V2cC9lX2NoYWNoYTIwX3BvbHkxMzA1LmMKKy0tLSBvcGVuc3NsLTEuMC4yai9jcnlwdG8vZXZwL2VfY2hhY2hhMjBfcG9seTEzMDUuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9ldnAvZV9jaGFjaGEyMF9wb2x5MTMwNS5jCTIwMTYtMTItMDEgMTA6MjY6MzkuMTU2NDg5NTAzIC0wNTAwCitAQCAtMCwwICsxLDI1MiBAQAorKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisrICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMTQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisrICoKKysgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKysgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKysgKiBhcmUgbWV0OgorKyAqCisrICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKysgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisrICoKKysgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKysgKiAgICBkaXN0cmlidXRpb24uCisrICoKKysgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKysgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKysgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisrICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorKyAqCisrICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisrICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKysgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisrICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorKyAqCisrICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisrICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKysgKgorKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKysgKiAgICBhY2tub3dsZWRnbWVudDoKKysgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisrICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisrICoKKysgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKysgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisrICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisrICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKysgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisrICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisrICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisrICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKysgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisrICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKysgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisrICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKysgKgorKyAqLworKworKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisrI2lmbmRlZiBPUEVOU1NMX05PX0NIQUNIQV9QT0xZCisrIyBpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorKyMgaW5jbHVkZSA8b3BlbnNzbC9jaGFjaGEyMHBvbHkxMzA1Lmg+CisrCisrI2RlZmluZSBGSUxMX0JVRkZFUiAoKHNpemVfdCkxMjgpCisrCisrI2RlZmluZSBQT0xZMTMwNV9UQUdfTEVOIDE2CisrCisrdHlwZWRlZiBzdHJ1Y3QgeworKyAgICB1aW50OF90ICAgICAgICBrZXlbMzJdOworKyAgICB1aW50OF90ICAgICAgICBpdlsxMl07CisrICAgIHVpbnQ4X3QgICAgICAgIG5vbmNlWzEyXTsKKysgICAgdWludDhfdCAgICAgICAgYWFkW0VWUF9BRUFEX1RMUzFfQUFEX0xFTl07CisrICAgIHNpemVfdCAgICAgICAgIGFhZF9sOyAvLyBTaG91bGQgYWx3YXlzIGJlIEVWUF9BRUFEX1RMUzFfQUFEX0xFTgorKyAgICB1bnNpZ25lZCAgICAgICB2YWxpZDoxOworK30gRVZQX0NIQUNIQTIwX1BPTFkxMzA1X0NUWDsKKysKKytzdGF0aWMgaW50IEVWUF9jaGFjaGEyMF9wb2x5MTMwNV9pbml0KEVWUF9DSVBIRVJfQ1RYICpjdHgsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpCisreworKyAgICBFVlBfQ0hBQ0hBMjBfUE9MWTEzMDVfQ1RYICphZWFkX2N0eCA9IGN0eC0+Y2lwaGVyX2RhdGE7CisrICAgIG1lbWNweShhZWFkX2N0eC0+a2V5LCBrZXksIDMyKTsKKysgICAgbWVtY3B5KGFlYWRfY3R4LT5pdiwgaXYsIDEyKTsKKysgICAgbWVtY3B5KGFlYWRfY3R4LT5ub25jZSwgaXYsIDEyKTsKKysgICAgYWVhZF9jdHgtPnZhbGlkID0gMDsKKysgICAgcmV0dXJuIDE7CisrfQorKworKworK3N0YXRpYyB2b2lkIHBvbHkxMzA1X3VwZGF0ZV9sZW5ndGgocG9seTEzMDVfc3RhdGUgKnBvbHkxMzA1LCBzaXplX3QgZGF0YV9sZW4pIHsKKysgIHVpbnQ4X3QgbGVuZ3RoX2J5dGVzWzhdOworKyAgdW5zaWduZWQgaTsKKysKKysgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobGVuZ3RoX2J5dGVzKTsgaSsrKSB7CisrICAgIGxlbmd0aF9ieXRlc1tpXSA9IGRhdGFfbGVuOworKyAgICBkYXRhX2xlbiA+Pj0gODsKKysgIH0KKysKKysgIENSWVBUT19wb2x5MTMwNV91cGRhdGUocG9seTEzMDUsIGxlbmd0aF9ieXRlcywgc2l6ZW9mKGxlbmd0aF9ieXRlcykpOworK30KKysKKyt0eXBlZGVmIHZvaWQgKCphZWFkX3BvbHkxMzA1X3VwZGF0ZSkocG9seTEzMDVfc3RhdGUgKmN0eCwgY29uc3QgdWludDhfdCAqYWQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZF9sZW4sIGNvbnN0IHVpbnQ4X3QgKmNpcGhlcnRleHQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaXBoZXJ0ZXh0X2xlbik7CisrCisrLyogYWVhZF9wb2x5MTMwNSBmaWxscyB8dGFnfCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgZm9yIHRoZSBnaXZlbgorKyAqIGlucHV0cywgdXNpbmcgfHVwZGF0ZXwgdG8gY29udHJvbCB0aGUgb3JkZXIgYW5kIGZvcm1hdCB0aGF0IHRoZSBpbnB1dHMgYXJlCisrICogc2lnbmVkL2F1dGhlbnRpY2F0ZWQuICovCisrc3RhdGljIHZvaWQgYWVhZF9wb2x5MTMwNShhZWFkX3BvbHkxMzA1X3VwZGF0ZSB1cGRhdGUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRhZ1tQT0xZMTMwNV9UQUdfTEVOXSwKKysgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSEFDSEEyMF9QT0xZMTMwNV9DVFggKmMyMF9jdHgsCisrICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5vbmNlWzEyXSwgY29uc3QgdWludDhfdCAqYWQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRfbGVuLCBjb25zdCB1aW50OF90ICpjaXBoZXJ0ZXh0LAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNpcGhlcnRleHRfbGVuKSB7CisrICB1aW50OF90IHBvbHkxMzA1X2tleVszMl07CisrICBtZW1zZXQocG9seTEzMDVfa2V5LCAwLCBzaXplb2YocG9seTEzMDVfa2V5KSk7CisrICBDUllQVE9fY2hhY2hhXzIwKHBvbHkxMzA1X2tleSwgcG9seTEzMDVfa2V5LCBzaXplb2YocG9seTEzMDVfa2V5KSwKKysgICAgICAgICAgICAgICAgICAgYzIwX2N0eC0+a2V5LCBub25jZSwgMCk7CisrICBwb2x5MTMwNV9zdGF0ZSBjdHg7CisrICBDUllQVE9fcG9seTEzMDVfaW5pdCgmY3R4LCBwb2x5MTMwNV9rZXkpOworKyAgdXBkYXRlKCZjdHgsIGFkLCBhZF9sZW4sIGNpcGhlcnRleHQsIGNpcGhlcnRleHRfbGVuKTsKKysgIENSWVBUT19wb2x5MTMwNV9maW5pc2goJmN0eCwgdGFnKTsKKyt9CisrCisrc3RhdGljIHZvaWQgcG9seTEzMDVfdXBkYXRlX3BhZGRlZF8xNihwb2x5MTMwNV9zdGF0ZSAqcG9seTEzMDUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pIHsKKysgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhZGRpbmdbMTZdID0geyAwIH07IC8qIFBhZGRpbmcgaXMgYWxsIHplcm9zLiAqLworKworKyAgQ1JZUFRPX3BvbHkxMzA1X3VwZGF0ZShwb2x5MTMwNSwgZGF0YSwgZGF0YV9sZW4pOworKyAgaWYgKGRhdGFfbGVuICUgMTYgIT0gMCkgeworKyAgICBDUllQVE9fcG9seTEzMDVfdXBkYXRlKHBvbHkxMzA1LCBwYWRkaW5nLCBzaXplb2YocGFkZGluZykgLSAoZGF0YV9sZW4gJSAxNikpOworKyAgfQorK30KKysKKytzdGF0aWMgdm9pZCBwb2x5MTMwNV91cGRhdGUocG9seTEzMDVfc3RhdGUgKmN0eCwgY29uc3QgdWludDhfdCAqYWQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZF9sZW4sIGNvbnN0IHVpbnQ4X3QgKmNpcGhlcnRleHQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaXBoZXJ0ZXh0X2xlbikgeworKyAgcG9seTEzMDVfdXBkYXRlX3BhZGRlZF8xNihjdHgsIGFkLCBhZF9sZW4pOworKyAgcG9seTEzMDVfdXBkYXRlX3BhZGRlZF8xNihjdHgsIGNpcGhlcnRleHQsIGNpcGhlcnRleHRfbGVuKTsKKysgIHBvbHkxMzA1X3VwZGF0ZV9sZW5ndGgoY3R4LCBhZF9sZW4pOworKyAgcG9seTEzMDVfdXBkYXRlX2xlbmd0aChjdHgsIGNpcGhlcnRleHRfbGVuKTsKKyt9CisrCisrc3RhdGljIGludCBFVlBfY2hhY2hhMjBfcG9seTEzMDVfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmwpCisreworKyAgICBFVlBfQ0hBQ0hBMjBfUE9MWTEzMDVfQ1RYICphZWFkX2N0eCA9IGN0eC0+Y2lwaGVyX2RhdGE7CisrICAgIGNvbnN0IHVpbnQ2NF90IGluX2xlbl82NCA9IGlubDsKKysKKysgICAgaWYgKCFhZWFkX2N0eC0+dmFsaWQpCisrICAgICAgICByZXR1cm4gMDsKKysKKysgICAgaWYgKGlubCA8IFBPTFkxMzA1X1RBR19MRU4pCisrICAgICAgICByZXR1cm4gLTE7CisrCisrICAgIGlmIChpbl9sZW5fNjQgPj0gKFVJTlQ2NF9DKDEpIDw8IDMyKSAqIDY0IC0gNjQpIHsKKysgICAgICAgIHJldHVybiAtMTsKKysgICAgfQorKworKyAgICBpbmwgLT0gUE9MWTEzMDVfVEFHX0xFTjsKKysgICAgaWYgKCFjdHgtPmVuY3J5cHQpIHsKKysgICAgICAgIHVpbnQ4X3QgdGFnW1BPTFkxMzA1X1RBR19MRU5dOworKyAgICAgICAgYWVhZF9wb2x5MTMwNShwb2x5MTMwNV91cGRhdGUsIHRhZywgYWVhZF9jdHgsIGFlYWRfY3R4LT5ub25jZSwKKysgICAgICAgICAgICAgICAgICAgICAgYWVhZF9jdHgtPmFhZCwgYWVhZF9jdHgtPmFhZF9sLCBpbiwgaW5sKTsKKysgICAgICAgIGlmIChDUllQVE9fbWVtY21wKHRhZywgaW4gKyBpbmwsIFBPTFkxMzA1X1RBR19MRU4pICE9IDApIHsKKysgICAgICAgICAgICAgT1BFTlNTTF9jbGVhbnNlKG91dCwgaW5sKTsKKysgICAgICAgICAgICAgcmV0dXJuIC0xOworKyAgICAgICAgfQorKyAgICAgICAgQ1JZUFRPX2NoYWNoYV8yMChvdXQsIGluLCBpbmwsIGFlYWRfY3R4LT5rZXksIGFlYWRfY3R4LT5ub25jZSwgMSk7CisrICAgIH0KKysKKysKKysgICAgaWYgKGN0eC0+ZW5jcnlwdCkgeworKyAgICAgICAgQ1JZUFRPX2NoYWNoYV8yMChvdXQsIGluLCBpbmwsIGFlYWRfY3R4LT5rZXksIGFlYWRfY3R4LT5ub25jZSwgMSk7CisrICAgICAgICB1aW50OF90IHRhZ1tQT0xZMTMwNV9UQUdfTEVOXTsKKysgICAgICAgIGFlYWRfcG9seTEzMDUocG9seTEzMDVfdXBkYXRlLCB0YWcsIGFlYWRfY3R4LCBhZWFkX2N0eC0+bm9uY2UsCisrICAgICAgICAgICAgICAgICAgICAgIGFlYWRfY3R4LT5hYWQsIGFlYWRfY3R4LT5hYWRfbCwgb3V0LCBpbmwpOworKworKyAgICAgICAgbWVtY3B5KG91dCArIGlubCwgdGFnLCBQT0xZMTMwNV9UQUdfTEVOKTsKKysgICAgfQorKworKyAgICBhZWFkX2N0eC0+dmFsaWQgPSAwOworKworKyAgICBpZiAoY3R4LT5lbmNyeXB0KSB7CisrICAgICAgICByZXR1cm4gaW5sICsgUE9MWTEzMDVfVEFHX0xFTjsKKysgICAgfSBlbHNlIHsgLyogRGVjcnlwdGlvbiAqLworKyAgICAgICAgcmV0dXJuIGlubDsKKysgICAgfQorK30KKysKKysKKytzdGF0aWMgaW50IEVWUF9jaGFjaGEyMF9wb2x5MTMwNV9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCisreworKyAgICByZXR1cm4gMTsKKyt9CisrCisrCisrc3RhdGljIGludCBFVlBfY2hhY2hhMjBfcG9seTEzMDVfY3RybChFVlBfQ0lQSEVSX0NUWCAqY3R4LAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyKQorK3sKKysgICAgRVZQX0NIQUNIQTIwX1BPTFkxMzA1X0NUWCAqYWVhZF9jdHggPSBjdHgtPmNpcGhlcl9kYXRhOworKyAgICBzd2l0Y2ggKHR5cGUpIHsKKysgICAgICAgIGNhc2UgRVZQX0NUUkxfQUVBRF9UTFMxX0FBRDoKKysgICAgICAgICAgICAvKiBTYXZlIHRoZSBBQUQgZm9yIGxhdGVyIHVzZSAqLworKyAgICAgICAgICAgIGlmIChhcmcgIT0gRVZQX0FFQURfVExTMV9BQURfTEVOKQorKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKysgICAgICAgICAgICBtZW1jcHkoYWVhZF9jdHgtPmFhZCwgcHRyLCBhcmcpOworKyAgICAgICAgICAgIGFlYWRfY3R4LT5hYWRfbCA9IGFyZzsKKysgICAgICAgICAgICBtZW1jcHkoYWVhZF9jdHgtPm5vbmNlLCBhZWFkX2N0eC0+aXYsIHNpemVvZihhZWFkX2N0eC0+bm9uY2UpKTsKKysgICAgICAgICAgICBpbnQgeG9yX2luZGV4OworKyAgICAgICAgICAgIGZvcih4b3JfaW5kZXg9MDsgeG9yX2luZGV4IDwgODsgKyt4b3JfaW5kZXgpIHsKKysgICAgICAgICAgICAgIGFlYWRfY3R4LT5ub25jZVs0ICsgeG9yX2luZGV4XSBePSBhZWFkX2N0eC0+YWFkW3hvcl9pbmRleF07CisrICAgICAgICAgICAgfQorKyAgICAgICAgICAgIC8qIElmIGRlY3J5cHRpbmcgZml4IGxlbmd0aCBmb3IgdGFnICovCisrICAgICAgICAgICAgaWYgKCFjdHgtPmVuY3J5cHQpIHsKKysgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbiA9IChhZWFkX2N0eC0+YWFkW2FyZy0yXSA8PCA4KSB8CisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWFkX2N0eC0+YWFkW2FyZy0xXTsKKysgICAgICAgICAgICAgICAgbGVuIC09IFBPTFkxMzA1X1RBR19MRU47CisrICAgICAgICAgICAgICAgIGFlYWRfY3R4LT5hYWRbYXJnLTJdID0gbGVuID4+IDg7CisrICAgICAgICAgICAgICAgIGFlYWRfY3R4LT5hYWRbYXJnLTFdID0gbGVuICYgMHhmZjsKKysgICAgICAgICAgICB9CisrICAgICAgICAgICAgYWVhZF9jdHgtPnZhbGlkID0gMTsKKysgICAgICAgICAgICByZXR1cm4gUE9MWTEzMDVfVEFHX0xFTjsKKysgICAgICAgIGRlZmF1bHQ6CisrICAgICAgICAgICAgcmV0dXJuIC0xOworKyAgICB9CisrfQorKworKworKyNkZWZpbmUgQ1VTVE9NX0ZMQUdTICAgIChcCisrICAgICAgICAgIEVWUF9DSVBIX0NVU1RPTV9JViB8IEVWUF9DSVBIX0ZMQUdfQ1VTVE9NX0NJUEhFUiBcCisrICAgICAgICB8IEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQgIFwKKysgICAgICAgIHwgRVZQX0NJUEhfQ1VTVE9NX0NPUFkpCisrCisrCisrc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgY2hhY2hhMjBfcG9seTEzMDUgPSB7CisrICAgIE5JRF9jaGFjaGEyMF9wb2x5MTMwNSwKKysgICAgMSwgICAgLyogYmxvY2sgc2l6ZSwgc29ydGEgKi8KKysgICAgMzIsICAgLyoga2V5IGxlbiAqLworKyAgICAxMiwgICAvKiBpdiBsZW4gKi8KKysgICAgQ1VTVE9NX0ZMQUdTfEVWUF9DSVBIX0ZMQUdfQUVBRF9DSVBIRVIsICAgIC8qIGZsYWdzICovCisrICAgIEVWUF9jaGFjaGEyMF9wb2x5MTMwNV9pbml0LAorKyAgICBFVlBfY2hhY2hhMjBfcG9seTEzMDVfY2lwaGVyLAorKyAgICBFVlBfY2hhY2hhMjBfcG9seTEzMDVfY2xlYW51cCwKKysgICAgc2l6ZW9mKEVWUF9DSEFDSEEyMF9QT0xZMTMwNV9DVFgpLCAgICAgICAgIC8qIGN0eCBzaXplICovCisrICAgIE5VTEwsCisrICAgIE5VTEwsCisrICAgIEVWUF9jaGFjaGEyMF9wb2x5MTMwNV9jdHJsLAorKyAgICBOVUxMCisrICAgIH07CisrCisrCisrY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NoYWNoYTIwX3BvbHkxMzA1KHZvaWQpCisreyByZXR1cm4gJmNoYWNoYTIwX3BvbHkxMzA1OyB9CisrI2VuZGlmCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9ldnAvZXZwLmggb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2V2cC9ldnAuaAorLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9ldnAvZXZwLmgJMjAxNi0wOS0yNiAwNTo0OTowNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vZXZwL2V2cC5oCTIwMTYtMTEtMzAgMDk6NDM6MDIuNjc2MDc4MTc4IC0wNTAwCitAQCAtOTAyLDYgKzkwMiwxMCBAQAorIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX29mYih2b2lkKTsKKyAjIGVuZGlmCisgCisrIyBpZm5kZWYgT1BFTlNTTF9OT19DSEFDSEFfUE9MWQorK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jaGFjaGEyMF9wb2x5MTMwNSh2b2lkKTsKKysjIGVuZGlmCisrCisgdm9pZCBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYodm9pZCk7Cisgdm9pZCBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mKHZvaWQpOworIAorZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9jcnlwdG8vZXZwL01ha2VmaWxlIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9ldnAvTWFrZWZpbGUKKy0tLSBvcGVuc3NsLTEuMC4yai9jcnlwdG8vZXZwL01ha2VmaWxlCTIwMTYtMDktMjYgMDU6NDk6NDEuMDAwMDAwMDAwIC0wNDAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvY3J5cHRvL2V2cC9NYWtlZmlsZQkyMDE2LTExLTMwIDA5OjQzOjIwLjg1NjAzMTYwNCAtMDUwMAorQEAgLTI5LDcgKzI5LDggQEAKKyAJY19hbGwuYyBjX2FsbGMuYyBjX2FsbGQuYyBldnBfbGliLmMgYmlvX29rLmMgXAorIAlldnBfcGtleS5jIGV2cF9wYmUuYyBwNV9jcnB0LmMgcDVfY3JwdDIuYyBcCisgCWVfb2xkLmMgcG1ldGhfbGliLmMgcG1ldGhfZm4uYyBwbWV0aF9nbi5jIG1fc2lndmVyLmMgXAorLQllX2Flc19jYmNfaG1hY19zaGExLmMgZV9hZXNfY2JjX2htYWNfc2hhMjU2LmMgZV9yYzRfaG1hY19tZDUuYworKwllX2Flc19jYmNfaG1hY19zaGExLmMgZV9hZXNfY2JjX2htYWNfc2hhMjU2LmMgZV9yYzRfaG1hY19tZDUuYyBcCisrCWVfY2hhY2hhMjBfcG9seTEzMDUuYworIAorIExJQk9CSj0JZW5jb2RlLm8gZGlnZXN0Lm8gZXZwX2VuYy5vIGV2cF9rZXkubyBldnBfYWNuZi5vIGV2cF9jbmYubyBcCisgCWVfZGVzLm8gZV9iZi5vIGVfaWRlYS5vIGVfZGVzMy5vIGVfY2FtZWxsaWEub1wKK0BAIC00Miw3ICs0Myw4IEBACisgCWNfYWxsLm8gY19hbGxjLm8gY19hbGxkLm8gZXZwX2xpYi5vIGJpb19vay5vIFwKKyAJZXZwX3BrZXkubyBldnBfcGJlLm8gcDVfY3JwdC5vIHA1X2NycHQyLm8gXAorIAllX29sZC5vIHBtZXRoX2xpYi5vIHBtZXRoX2ZuLm8gcG1ldGhfZ24ubyBtX3NpZ3Zlci5vIFwKKy0JZV9hZXNfY2JjX2htYWNfc2hhMS5vIGVfYWVzX2NiY19obWFjX3NoYTI1Ni5vIGVfcmM0X2htYWNfbWQ1Lm8KKysJZV9hZXNfY2JjX2htYWNfc2hhMS5vIGVfYWVzX2NiY19obWFjX3NoYTI1Ni5vIGVfcmM0X2htYWNfbWQ1Lm8gXAorKwllX2NoYWNoYTIwX3BvbHkxMzA1Lm8KKyAKKyBTUkM9ICQoTElCU1JDKQorIAorQEAgLTc5MywzICs3OTUsNSBAQAorIHBtZXRoX2xpYi5vOiAuLi8uLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi8uLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCisgcG1ldGhfbGliLm86IC4uLy4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIC4uL2FzbjEvYXNuMV9sb2NsLmggLi4vY3J5cHRsaWIuaAorIHBtZXRoX2xpYi5vOiBldnBfbG9jbC5oIHBtZXRoX2xpYi5jCisrZV9jaGFjaGEyMF9wb2x5MTMwNS5vOiAuLi8uLi9pbmNsdWRlL29wZW5zc2wvY2hhY2hhMjBwb2x5MTMwNS5oCisrZV9jaGFjaGEyMF9wb2x5MTMwNS5vOiBlX2NoYWNoYTIwX3BvbHkxMzA1LmMKK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovY3J5cHRvL29iamVjdHMvb2JqX2RhdC5oIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29ial9kYXQuaAorLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9vYmplY3RzL29ial9kYXQuaAkyMDE2LTA5LTI2IDA1OjQ5OjM0LjAwMDAwMDAwMCAtMDQwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29ial9kYXQuaAkyMDE2LTExLTMwIDExOjA3OjA0LjIwMzM0NTkxOCAtMDUwMAorQEAgLTYyLDkgKzYyLDkgQEAKKyAgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICAqLworIAorLSNkZWZpbmUgTlVNX05JRCA5NTgKKy0jZGVmaW5lIE5VTV9TTiA5NTEKKy0jZGVmaW5lIE5VTV9MTiA5NTEKKysjZGVmaW5lIE5VTV9OSUQgOTU5CisrI2RlZmluZSBOVU1fU04gOTUyCisrI2RlZmluZSBOVU1fTE4gOTUyCisgI2RlZmluZSBOVU1fT0JKIDg5MAorIAorIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGx2YWx1ZXNbNjI1NV09eworQEAgLTI1MTQsNiArMjUxNCw3IEBACisgCU5JRF9qdXJpc2RpY3Rpb25TdGF0ZU9yUHJvdmluY2VOYW1lLDExLCYobHZhbHVlc1s2MjMyXSksMH0sCisgeyJqdXJpc2RpY3Rpb25DIiwianVyaXNkaWN0aW9uQ291bnRyeU5hbWUiLAorIAlOSURfanVyaXNkaWN0aW9uQ291bnRyeU5hbWUsMTEsJihsdmFsdWVzWzYyNDNdKSwwfSwKKyt7IkNIQUNIQTIwLVBPTFkxMzA1IiwiY2hhY2hhMjAtcG9seTEzMDUiLE5JRF9jaGFjaGEyMF9wb2x5MTMwNSwwLE5VTEwsMH0sCisgfTsKKyAKKyBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNuX29ianNbTlVNX1NOXT17CitAQCAtMjU3NCw2ICsyNTc1LDcgQEAKKyAxMTAsCS8qICJDQVNUNS1DRkIiICovCisgMTA5LAkvKiAiQ0FTVDUtRUNCIiAqLworIDExMSwJLyogIkNBU1Q1LU9GQiIgKi8KKys5NTgsCS8qICJDSEFDSEEyMC1QT0xZMTMwNSIgKi8KKyA4OTQsCS8qICJDTUFDIiAqLworIDEzLAkvKiAiQ04iICovCisgMTQxLAkvKiAiQ1JMUmVhc29uIiAqLworQEAgLTM3MjgsNiArMzczMCw3IEBACisgNjc3LAkvKiAiY2VydGljb20tYXJjIiAqLworIDUxNywJLyogImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiICovCisgODgzLAkvKiAiY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCIgKi8KKys5NTgsCS8qICJjaGFjaGEyMC1wb2x5MTMwNSIgKi8KKyA1NCwJLyogImNoYWxsZW5nZVBhc3N3b3JkIiAqLworIDQwNywJLyogImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIgKi8KKyAzOTUsCS8qICJjbGVhcmFuY2UiICovCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9vYmplY3RzL29iamVjdHMudHh0IG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29iamVjdHMudHh0CistLS0gb3BlbnNzbC0xLjAuMmovY3J5cHRvL29iamVjdHMvb2JqZWN0cy50eHQJMjAxNi0wOS0yNiAwNTo0OTowNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLnR4dAkyMDE2LTExLTMwIDA5OjQ0OjQ5LjE2NzgwNTM3NCAtMDUwMAorQEAgLTEyOTQsNiArMTI5NCw3IEBACisgCQkJOiBBRVMtMTI4LUNCQy1ITUFDLVNIQTI1Ngk6IGFlcy0xMjgtY2JjLWhtYWMtc2hhMjU2CisgCQkJOiBBRVMtMTkyLUNCQy1ITUFDLVNIQTI1Ngk6IGFlcy0xOTItY2JjLWhtYWMtc2hhMjU2CisgCQkJOiBBRVMtMjU2LUNCQy1ITUFDLVNIQTI1Ngk6IGFlcy0yNTYtY2JjLWhtYWMtc2hhMjU2CisrICAgICAgICAgICAgOiBDSEFDSEEyMC1QT0xZMTMwNSAgICAgICAgIDogY2hhY2hhMjAtcG9seTEzMDUKKyAKKyBJU08tVVMgMTAwNDYgMiAxCTogZGhwdWJsaWNudW1iZXIJCTogWDkuNDIgREgKKyAKK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovY3J5cHRvL29iamVjdHMvb2JqX21hYy5oIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29ial9tYWMuaAorLS0tIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9vYmplY3RzL29ial9tYWMuaAkyMDE2LTA5LTI2IDA1OjQ5OjMzLjAwMDAwMDAwMCAtMDQwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29ial9tYWMuaAkyMDE2LTExLTMwIDA5OjQ0OjI3LjEyNzg2MTgzNCAtMDUwMAorQEAgLTQwNDcsNiArNDA0NywxMCBAQAorICNkZWZpbmUgTE5fYWVzXzI1Nl9jYmNfaG1hY19zaGEyNTYgICAgICAgICAgICAgICJhZXMtMjU2LWNiYy1obWFjLXNoYTI1NiIKKyAjZGVmaW5lIE5JRF9hZXNfMjU2X2NiY19obWFjX3NoYTI1NiAgICAgICAgICAgICA5NTAKKyAKKysjZGVmaW5lIFNOX2NoYWNoYTIwX3BvbHkxMzA1ICAgICAgICAgICAgIkNIQUNIQTIwLVBPTFkxMzA1IgorKyNkZWZpbmUgTE5fY2hhY2hhMjBfcG9seTEzMDUgICAgICAgICAgICAiY2hhY2hhMjAtcG9seTEzMDUiCisrI2RlZmluZSBOSURfY2hhY2hhMjBfcG9seTEzMDUgICAgICAgICAgIDk1OAorKworICNkZWZpbmUgU05fZGhwdWJsaWNudW1iZXIgICAgICAgICAgICAgICAiZGhwdWJsaWNudW1iZXIiCisgI2RlZmluZSBMTl9kaHB1YmxpY251bWJlciAgICAgICAgICAgICAgICJYOS40MiBESCIKKyAjZGVmaW5lIE5JRF9kaHB1YmxpY251bWJlciAgICAgICAgICAgICAgOTIwCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL2NyeXB0by9vYmplY3RzL29ial9tYWMubnVtIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL2NyeXB0by9vYmplY3RzL29ial9tYWMubnVtCistLS0gb3BlbnNzbC0xLjAuMmovY3J5cHRvL29iamVjdHMvb2JqX21hYy5udW0JMjAxNi0wOS0yNiAwNTo0OTozMi4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9jcnlwdG8vb2JqZWN0cy9vYmpfbWFjLm51bQkyMDE2LTExLTMwIDA5OjQ0OjM3LjE3NTgzNjA5MyAtMDUwMAorQEAgLTk1NSwzICs5NTUsNCBAQAorIGp1cmlzZGljdGlvbkxvY2FsaXR5TmFtZQkJOTU1CisganVyaXNkaWN0aW9uU3RhdGVPclByb3ZpbmNlTmFtZQkJOTU2CisganVyaXNkaWN0aW9uQ291bnRyeU5hbWUJCTk1NworK2NoYWNoYTIwX3BvbHkxMzA1CQk5NTgKK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovTWFrZWZpbGUub3JnIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL01ha2VmaWxlLm9yZworLS0tIG9wZW5zc2wtMS4wLjJqL01ha2VmaWxlLm9yZwkyMDE2LTA5LTI2IDA1OjQ5OjA3LjAwMDAwMDAwMCAtMDQwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL01ha2VmaWxlLm9yZwkyMDE2LTExLTMwIDEwOjE2OjA4LjQwMzAzODAyMCAtMDUwMAorQEAgLTEwMyw2ICsxMDMsNyBAQAorIENNTExfRU5DPQorIE1PREVTX0FTTV9PQko9CisgRU5HSU5FU19BU01fT0JKPQorK0NIQVBPTFlfQVNNPQorIFBFUkxBU01fU0NIRU1FPQorIAorICMgS1JCNSBzdHVmZgorQEAgLTE0OSw3ICsxNTAsNyBAQAorIAlibiBlYyByc2EgZHNhIGVjZHNhIGRoIGVjZGggZHNvIGVuZ2luZSBcCisgCWJ1ZmZlciBiaW8gc3RhY2sgbGhhc2ggcmFuZCBlcnIgXAorIAlldnAgYXNuMSBwZW0geDUwOSB4NTA5djMgY29uZiB0eHRfZGIgcGtjczcgcGtjczEyIGNvbXAgb2NzcCB1aSBrcmI1IFwKKy0JY21zIHBxdWV1ZSB0cyBqcGFrZSBzcnAgc3RvcmUgY21hYworKwljbXMgcHF1ZXVlIHRzIGpwYWtlIHNycCBzdG9yZSBjbWFjIGNoYWNoYTIwX3BvbHkxMzA1CisgIyBrZWVwIGluIG1pbmQgdGhhdCB0aGUgYWJvdmUgbGlzdCBpcyBhZGp1c3RlZCBieSAuL0NvbmZpZ3VyZQorICMgYWNjb3JkaW5nIHRvIG5vLXh4eCBhcmd1bWVudHMuLi4KKyAKK0BAIC0yNDAsNiArMjQxLDcgQEAKKyAJCUZJUFNMSUJESVI9JyR7RklQU0xJQkRJUn0nCQkJXAorIAkJRklQU0RJUj0nJHtGSVBTRElSfScJCQkJXAorIAkJRklQU0NBTkxJQj0iJCR7RklQU0NBTkxJQjotJChGSVBTQ0FOTElCKX0iCVwKKysJCUNIQVBPTFlfQVNNPSckKENIQVBPTFlfQVNNKScgXAorIAkJVEhJUz0kJHtUSElTOi0kQH0gTUFLRUZJTEU9TWFrZWZpbGUgTUFLRU9WRVJSSURFUz0KKyAjIE1BS0VPVkVSUklERVM9IGVmZmVjdGl2ZWx5ICJlcXVhbGl6ZXMiIEdOVS1pc2ggYW5kIFN5c1YtaXNoIG1ha2UgZmxhdm9ycywKKyAjIHdoaWNoIGluIHR1cm4gZWxpbWluYXRlcyBhbWJpZ3VpdGllcyBpbiB2YXJpYWJsZSB0cmVhdG1lbnQgd2l0aCAtZS4KK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovc3NsL3MzX2xpYi5jIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL3NzbC9zM19saWIuYworLS0tIG9wZW5zc2wtMS4wLjJqL3NzbC9zM19saWIuYwkyMDE2LTA5LTI2IDA1OjQ5OjA3LjAwMDAwMDAwMCAtMDQwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL3NzbC9zM19saWIuYwkyMDE2LTExLTMwIDA5OjQ2OjAxLjcxNTYxOTUzNSAtMDUwMAorQEAgLTI5NDUsNiArMjk0NSw2NSBAQAorICAgICAgMjU2fSwKKyAjZW5kaWYKKyAKKysjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19DSEFDSEFfUE9MWSkKKysgICAgLyogUkZDIGNpcGhlcnMgKi8KKysgICAgeworKyAgICAgMSwKKysgICAgIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1LAorKyAgICAgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSwKKysgICAgIFNTTF9rRUNESEUsCisrICAgICBTU0xfYVJTQSwKKysgICAgIFNTTF9DSEFDSEEyMFBPTFkxMzA1LAorKyAgICAgU1NMX0FFQUQsCisrICAgICBTU0xfVExTVjFfMiwKKysgICAgIFNTTF9ISUdILAorKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2IHwgVExTMV9QUkZfU0hBMjU2LAorKyAgICAgMjU2LAorKyAgICAgMjU2LAorKyAgICAgfSwKKysgICAgeworKyAgICAgMSwKKysgICAgIFRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUsCisrICAgICBUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUsCisrICAgICBTU0xfa0VDREhFLAorKyAgICAgU1NMX2FFQ0RTQSwKKysgICAgIFNTTF9DSEFDSEEyMFBPTFkxMzA1LAorKyAgICAgU1NMX0FFQUQsCisrICAgICBTU0xfVExTVjFfMiwKKysgICAgIFNTTF9ISUdILAorKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2IHwgVExTMV9QUkZfU0hBMjU2LAorKyAgICAgMjU2LAorKyAgICAgMjU2LAorKyAgICAgfSwKKysgICAgeworKyAgICAgMSwKKysgICAgIFRMUzFfVFhUX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSwKKysgICAgIFRMUzFfQ0tfREhFX1JTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1LAorKyAgICAgU1NMX2tESEUsCisrICAgICBTU0xfYVJTQSwKKysgICAgIFNTTF9DSEFDSEEyMFBPTFkxMzA1LAorKyAgICAgU1NMX0FFQUQsCisrICAgICBTU0xfVExTVjFfMiwKKysgICAgIFNTTF9ISUdILAorKyAgICAgU1NMX0hBTkRTSEFLRV9NQUNfU0hBMjU2IHwgVExTMV9QUkZfU0hBMjU2LAorKyAgICAgMjU2LAorKyAgICAgMjU2LAorKyAgICAgfSwKKysgICAgeworKyAgICAgMSwKKysgICAgIFRMUzFfVFhUX1BTS19XSVRIX0NIQUNIQTIwX1BPTFkxMzA1LAorKyAgICAgVExTMV9DS19QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSwKKysgICAgIFNTTF9rUFNLLAorKyAgICAgU1NMX2FQU0ssCisrICAgICBTU0xfQ0hBQ0hBMjBQT0xZMTMwNSwKKysgICAgIFNTTF9BRUFELAorKyAgICAgU1NMX1RMU1YxXzIsCisrICAgICBTU0xfSElHSCwKKysgICAgIFNTTF9IQU5EU0hBS0VfTUFDX1NIQTI1NiB8IFRMUzFfUFJGX1NIQTI1NiwKKysgICAgIDI1NiwKKysgICAgIDI1NiwKKysgICAgIH0sCisrI2VuZGlmCisgLyogZW5kIG9mIGxpc3QgKi8KKyB9OworIAorQEAgLTQwOTAsNiArNDE0OSw3IEBACisgICAgIGludCBpLCBpaSwgb2s7CisgICAgIENFUlQgKmNlcnQ7CisgICAgIHVuc2lnbmVkIGxvbmcgYWxnX2ssIGFsZ19hLCBtYXNrX2ssIG1hc2tfYSwgZW1hc2tfaywgZW1hc2tfYTsKKysgICAgaW50IHVzZV9jaGFjaGEgPSAwOworIAorICAgICAvKiBMZXQncyBzZWUgd2hpY2ggY2lwaGVycyB3ZSBjYW4gc3VwcG9ydCAqLworICAgICBjZXJ0ID0gcy0+Y2VydDsKK0BAIC00MTE5LDEzICs0MTc5LDIwIEBACisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVwOiVzXG4iLCAodm9pZCAqKWMsIGMtPm5hbWUpOworICAgICB9CisgI2VuZGlmCistCisrcmV0cnk6CisgICAgIGlmIChzLT5vcHRpb25zICYgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSB8fCB0bHMxX3N1aXRlYihzKSkgeworICAgICAgICAgcHJpbyA9IHNydnI7CisgICAgICAgICBhbGxvdyA9IGNsbnQ7CisrICAgICAgICAvKiBVc2UgQ2hhQ2hhMjArUG9seTEzMDUgaWZmIGl0J3MgY2xpZW50J3MgbW9zdCBwcmVmZXJyZWQgY2lwaGVyIHN1aXRlICovCisrICAgICAgICBpZiAoc2tfU1NMX0NJUEhFUl9udW0oY2xudCkgPiAwKSB7CisrICAgICAgICAgICAgYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoY2xudCwgMCk7CisrICAgICAgICAgICAgaWYgKGMtPmFsZ29yaXRobV9lbmMgPT0gU1NMX0NIQUNIQTIwUE9MWTEzMDUpCisrICAgICAgICAgICAgICAgIHVzZV9jaGFjaGEgPSAxOworKyAgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgICAgcHJpbyA9IGNsbnQ7CisgICAgICAgICBhbGxvdyA9IHNydnI7CisrICAgICAgICB1c2VfY2hhY2hhID0gMTsKKyAgICAgfQorIAorICAgICB0bHMxX3NldF9jZXJ0X3ZhbGlkaXR5KHMpOworQEAgLTQxMzcsNiArNDIwNCwxMCBAQAorICAgICAgICAgaWYgKChjLT5hbGdvcml0aG1fc3NsICYgU1NMX1RMU1YxXzIpICYmICFTU0xfVVNFX1RMUzFfMl9DSVBIRVJTKHMpKQorICAgICAgICAgICAgIGNvbnRpbnVlOworIAorKyAgICAgICAgLyogU2tpcCBDaGFDaGEgdW5sZXNzIHRvcCBjbGllbnQgcHJpb3JpdHkgKi8KKysgICAgICAgIGlmIChjLT5hbGdvcml0aG1fZW5jID09IFNTTF9DSEFDSEEyMFBPTFkxMzA1ICYmICF1c2VfY2hhY2hhKQorKyAgICAgICAgICAgIGNvbnRpbnVlOworKworICAgICAgICAgc3NsX3NldF9jZXJ0X21hc2tzKGNlcnQsIGMpOworICAgICAgICAgbWFza19rID0gY2VydC0+bWFza19rOworICAgICAgICAgbWFza19hID0gY2VydC0+bWFza19hOworQEAgLTQyMTYsNiArNDI4NywxNCBAQAorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICB9CisrCisrICAgIGlmIChyZXQgPT0gTlVMTCAmJiAhdXNlX2NoYWNoYSkgeworKyAgICAgICAgLyogSWYgbm8gc2hhcmVkIGNpcGhlciB3YXMgZm91bmQgZHVlIHRvIHNvbWUgdW51c3VhbCBwcmVmZXJlbmNlcywgdHJ5CisrICAgICAgICAgKiBhZ2FpbiB3aXRoIENIQUNIQSBlbmFibGVkIGV2ZW4gaWYgbm90IHRvcCBwcmlvcml0eSAqLworKyAgICAgICAgdXNlX2NoYWNoYSA9IDE7CisrICAgICAgICBnb3RvIHJldHJ5OworKyAgICB9CisrCisgICAgIHJldHVybiAocmV0KTsKKyB9CisgCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL3NzbC9zc2xfY2lwaC5jIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL3NzbC9zc2xfY2lwaC5jCistLS0gb3BlbnNzbC0xLjAuMmovc3NsL3NzbF9jaXBoLmMJMjAxNi0wOS0yNiAwNTo0OTowNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9zc2wvc3NsX2NpcGguYwkyMDE2LTExLTMwIDA5OjQ3OjA1LjA4NzQ1Nzg1NSAtMDUwMAorQEAgLTE2NCwxMSArMTY0LDEyIEBACisgI2RlZmluZSBTU0xfRU5DX1NFRURfSURYICAgICAgICAxMQorICNkZWZpbmUgU1NMX0VOQ19BRVMxMjhHQ01fSURYICAgMTIKKyAjZGVmaW5lIFNTTF9FTkNfQUVTMjU2R0NNX0lEWCAgIDEzCistI2RlZmluZSBTU0xfRU5DX05VTV9JRFggICAgICAgICAxNAorKyNkZWZpbmUgU1NMX0VOQ19DSEFDSEEyMFBPTFkxMzA1X0lEWCAgICAgICAgMTQKKysjZGVmaW5lIFNTTF9FTkNfTlVNX0lEWCAgICAgICAgIDE1CisgCisgc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgKnNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX05VTV9JRFhdID0geworICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorLSAgICBOVUxMLCBOVUxMCisrICAgIE5VTEwsIE5VTEwsIE5VTEwKKyB9OworIAorICNkZWZpbmUgU1NMX0NPTVBfTlVMTF9JRFggICAgICAgMAorQEAgLTMxNSw2ICszMTYsNyBAQAorICAgICB7MCwgU1NMX1RYVF9DQU1FTExJQTI1NiwgMCwgMCwgMCwgU1NMX0NBTUVMTElBMjU2LCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICAgezAsIFNTTF9UWFRfQ0FNRUxMSUEsIDAsIDAsIDAsIFNTTF9DQU1FTExJQTEyOCB8IFNTTF9DQU1FTExJQTI1NiwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDB9LAorKyAgICB7MCwgU1NMX1RYVF9DSEFDSEEyMCwgMCwgMCwgMCwgU1NMX0NIQUNIQTIwUE9MWTEzMDUsIDAsIDAsIDAsIDAsIDAsIDB9LAorIAorICAgICAvKiBNQUMgYWxpYXNlcyAqLworICAgICB7MCwgU1NMX1RYVF9NRDUsIDAsIDAsIDAsIDAsIFNTTF9NRDUsIDAsIDAsIDAsIDAsIDB9LAorQEAgLTQzMSw2ICs0MzMsOSBAQAorICAgICBzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19BRVMyNTZHQ01fSURYXSA9CisgICAgICAgICBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShTTl9hZXNfMjU2X2djbSk7CisgCisrICAgIHNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX0NIQUNIQTIwUE9MWTEzMDVfSURYXSA9CisrICAgICAgICBFVlBfY2hhY2hhMjBfcG9seTEzMDUoKTsKKysKKyAgICAgc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9NRDVfSURYXSA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKFNOX21kNSk7CisgICAgIHNzbF9tYWNfc2VjcmV0X3NpemVbU1NMX01EX01ENV9JRFhdID0KKyAgICAgICAgIEVWUF9NRF9zaXplKHNzbF9kaWdlc3RfbWV0aG9kc1tTU0xfTURfTUQ1X0lEWF0pOworQEAgLTU4MSw2ICs1ODYsOSBAQAorICAgICBjYXNlIFNTTF9BRVMyNTZHQ006CisgICAgICAgICBpID0gU1NMX0VOQ19BRVMyNTZHQ01fSURYOworICAgICAgICAgYnJlYWs7CisrICAgIGNhc2UgU1NMX0NIQUNIQTIwUE9MWTEzMDU6CisrICAgICAgICBpID0gU1NMX0VOQ19DSEFDSEEyMFBPTFkxMzA1X0lEWDsKKysgICAgICAgIGJyZWFrOworICAgICBkZWZhdWx0OgorICAgICAgICAgaSA9IC0xOworICAgICAgICAgYnJlYWs7CitAQCAtODA1LDYgKzgxMyw5IEBACisgICAgICAgICAoc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfR09TVDg5X0lEWF0gPT0KKyAgICAgICAgICBOVUxMKSA/IFNTTF9lR09TVDI4MTQ3ODlDTlQgOiAwOworICAgICAqZW5jIHw9IChzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19TRUVEX0lEWF0gPT0gTlVMTCkgPyBTU0xfU0VFRCA6IDA7CisrICAgICplbmMgfD0KKysgICAgICAgIChzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19DSEFDSEEyMFBPTFkxMzA1X0lEWF0gPT0KKysgICAgICAgICBOVUxMKSA/IFNTTF9DSEFDSEEyMFBPTFkxMzA1IDogMDsKKyAKKyAgICAgKm1hYyB8PSAoc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9NRDVfSURYXSA9PSBOVUxMKSA/IFNTTF9NRDUgOiAwOworICAgICAqbWFjIHw9IChzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX1NIQTFfSURYXSA9PSBOVUxMKSA/IFNTTF9TSEExIDogMDsKK0BAIC0xODI0LDYgKzE4MzUsOSBAQAorICAgICBjYXNlIFNTTF9lR09TVDI4MTQ3ODlDTlQ6CisgICAgICAgICBlbmMgPSAiR09TVDg5KDI1NikiOworICAgICAgICAgYnJlYWs7CisrICAgIGNhc2UgU1NMX0NIQUNIQTIwUE9MWTEzMDU6CisrICAgICAgICBlbmMgPSAiQ2hhQ2hhMjAtUG9seTEzMDUiOworKyAgICAgICAgYnJlYWs7CisgICAgIGRlZmF1bHQ6CisgICAgICAgICBlbmMgPSAidW5rbm93biI7CisgICAgICAgICBicmVhazsKK2RpZmYgLU5hdXIgb3BlbnNzbC0xLjAuMmovc3NsL3NzbC5oIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL3NzbC9zc2wuaAorLS0tIG9wZW5zc2wtMS4wLjJqL3NzbC9zc2wuaAkyMDE2LTA5LTI2IDA1OjQ5OjA3LjAwMDAwMDAwMCAtMDQwMAorKysrIG9wZW5zc2wtMS4wLjJqLWNoYWNoYS1iL3NzbC9zc2wuaAkyMDE2LTExLTMwIDA5OjQ2OjEyLjAxOTU5MzE0MiAtMDUwMAorQEAgLTI5Nyw2ICsyOTcsNyBAQAorICMgZGVmaW5lIFNTTF9UWFRfQ0FNRUxMSUExMjggICAgICJDQU1FTExJQTEyOCIKKyAjIGRlZmluZSBTU0xfVFhUX0NBTUVMTElBMjU2ICAgICAiQ0FNRUxMSUEyNTYiCisgIyBkZWZpbmUgU1NMX1RYVF9DQU1FTExJQSAgICAgICAgIkNBTUVMTElBIgorKyMgZGVmaW5lIFNTTF9UWFRfQ0hBQ0hBMjAgICAgICAgICJDSEFDSEEyMCIKKyAKKyAjIGRlZmluZSBTU0xfVFhUX01ENSAgICAgICAgICAgICAiTUQ1IgorICMgZGVmaW5lIFNTTF9UWFRfU0hBMSAgICAgICAgICAgICJTSEExIgorZGlmZiAtTmF1ciBvcGVuc3NsLTEuMC4yai9zc2wvc3NsX2xvY2wuaCBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9zc2wvc3NsX2xvY2wuaAorLS0tIG9wZW5zc2wtMS4wLjJqL3NzbC9zc2xfbG9jbC5oCTIwMTYtMDktMjYgMDU6NDk6MDcuMDAwMDAwMDAwIC0wNDAwCisrKysgb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvc3NsL3NzbF9sb2NsLmgJMjAxNi0xMS0zMCAwOTo0NzoyMS4zMjc0MTY0NTMgLTA1MDAKK0BAIC0zNTQsNiArMzU0LDcgQEAKKyAjIGRlZmluZSBTU0xfU0VFRCAgICAgICAgICAgICAgICAweDAwMDAwODAwTAorICMgZGVmaW5lIFNTTF9BRVMxMjhHQ00gICAgICAgICAgIDB4MDAwMDEwMDBMCisgIyBkZWZpbmUgU1NMX0FFUzI1NkdDTSAgICAgICAgICAgMHgwMDAwMjAwMEwKKysjIGRlZmluZSBTU0xfQ0hBQ0hBMjBQT0xZMTMwNSAgICAweDAwMDgwMDAwTCAgLyogVmFsdWUgZnJvbSBvcGVuc3NsICovCisgCisgIyBkZWZpbmUgU1NMX0FFUyAgICAgICAgICAgICAgICAgKFNTTF9BRVMxMjh8U1NMX0FFUzI1NnxTU0xfQUVTMTI4R0NNfFNTTF9BRVMyNTZHQ00pCisgIyBkZWZpbmUgU1NMX0NBTUVMTElBICAgICAgICAgICAgKFNTTF9DQU1FTExJQTEyOHxTU0xfQ0FNRUxMSUEyNTYpCitkaWZmIC1OYXVyIG9wZW5zc2wtMS4wLjJqL3NzbC90bHMxLmggb3BlbnNzbC0xLjAuMmotY2hhY2hhLWIvc3NsL3RsczEuaAorLS0tIG9wZW5zc2wtMS4wLjJqL3NzbC90bHMxLmgJMjAxNi0wOS0yNiAwNTo0OTowNy4wMDAwMDAwMDAgLTA0MDAKKysrKyBvcGVuc3NsLTEuMC4yai1jaGFjaGEtYi9zc2wvdGxzMS5oCTIwMTYtMTEtMzAgMDk6NDc6NDAuNzQzMzY2OTUwIC0wNTAwCitAQCAtNTYzLDYgKzU2MywxNSBAQAorICMgZGVmaW5lIFRMUzFfQ0tfRUNESF9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgICAgICAgIDB4MDMwMEMwMzEKKyAjIGRlZmluZSBUTFMxX0NLX0VDREhfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ICAgICAgICAweDAzMDBDMDMyCisgCisrLyogQ2hhQ2hhMjAtUG9seTEzMDUgY2lwaGVyc3VpdGVzIGZyb20gUkZDICovCisrIyBkZWZpbmUgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgMHgwMzAwQ0NBOAorKyMgZGVmaW5lIFRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgIDB4MDMwMENDQTkKKysjIGRlZmluZSBUTFMxX0NLX0RIRV9SU0FfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgICAweDAzMDBDQ0FBCisrIyBkZWZpbmUgVExTMV9DS19QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgICAgICAgMHgwMzAwQ0NBQgorKyMgZGVmaW5lIFRMUzFfQ0tfRUNESEVfUFNLX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUgICAgICAgIDB4MDMwMENDQUMKKysjIGRlZmluZSBUTFMxX0NLX0RIRV9QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgICAweDAzMDBDQ0FECisrIyBkZWZpbmUgVExTMV9DS19SU0FfUFNLX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUgICAgICAgICAgMHgwMzAwQ0NBRQorKworIC8qCisgICogWFhYICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbGVydDogKyAqIE9sZGVyIHZlcnNpb25zIG9mIE9wZW5TU0wgZ2F2ZQorICAqIHNvbWUgREhFIGNpcGhlcnMgbmFtZXMgd2l0aCAiRURIIiArICogaW5zdGVhZCBvZiAiREhFIi4gIEdvaW5nIGZvcndhcmQsIHdlCitAQCAtNzEzLDYgKzcyMiwxNSBAQAorICMgZGVmaW5lIFRMUzFfVFhUX0VDREhfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ICAgICAgICJFQ0RILVJTQS1BRVMxMjgtR0NNLVNIQTI1NiIKKyAjIGRlZmluZSBUTFMxX1RYVF9FQ0RIX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCAgICAgICAiRUNESC1SU0EtQUVTMjU2LUdDTS1TSEEzODQiCisgCisrLyogQ2hhY2hhMjAtUG9seTEzMDUgY2lwaGVyc3VpdGVzIGZyb20gUkZDICovCisrIyBkZWZpbmUgVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUgICAgICAgIkVDREhFLVJTQS1DSEFDSEEyMC1QT0xZMTMwNSIKKysjIGRlZmluZSBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1ICAgICAiRUNESEUtRUNEU0EtQ0hBQ0hBMjAtUE9MWTEzMDUiCisrIyBkZWZpbmUgVExTMV9UWFRfREhFX1JTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1ICAgICAgICAgIkRIRS1SU0EtQ0hBQ0hBMjAtUE9MWTEzMDUiCisrIyBkZWZpbmUgVExTMV9UWFRfUFNLX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUgICAgICAgICAgICAgIlBTSy1DSEFDSEEyMC1QT0xZMTMwNSIKKysjIGRlZmluZSBUTFMxX1RYVF9FQ0RIRV9QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAiRUNESEUtUFNLLUNIQUNIQTIwLVBPTFkxMzA1IgorKyMgZGVmaW5lIFRMUzFfVFhUX0RIRV9QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgICJESEUtUFNLLUNIQUNIQTIwLVBPTFkxMzA1IgorKyMgZGVmaW5lIFRMUzFfVFhUX1JTQV9QU0tfV0lUSF9DSEFDSEEyMF9QT0xZMTMwNSAgICAgICAgICJSU0EtUFNLLUNIQUNIQTIwLVBPTFkxMzA1IgorKworICMgZGVmaW5lIFRMU19DVF9SU0FfU0lHTiAgICAgICAgICAgICAgICAgMQorICMgZGVmaW5lIFRMU19DVF9EU1NfU0lHTiAgICAgICAgICAgICAgICAgMgorICMgZGVmaW5lIFRMU19DVF9SU0FfRklYRURfREggICAgICAgICAgICAgMwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9vcGVuc3NsL29wZW5zc2wubWsgYi9wYWNrYWdlL29wZW5zc2wvb3BlbnNzbC5tawppbmRleCAxMDMxMTE5Li4wNDM1NGFkIDEwMDY0NAotLS0gYS9wYWNrYWdlL29wZW5zc2wvb3BlbnNzbC5taworKysgYi9wYWNrYWdlL29wZW5zc2wvb3BlbnNzbC5tawpAQCAtNCw3ICs0LDcgQEAKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotT1BFTlNTTF9WRVJTSU9OID0gMS4wLjJhCitPUEVOU1NMX1ZFUlNJT04gPSAxLjAuMmoKIE9QRU5TU0xfU0lURSA9IGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlCiBPUEVOU1NMX0lOU1RBTExfU1RBR0lORyA9IFlFUwogT1BFTlNTTF9ERVBFTkRFTkNJRVMgPSB6bGliCkBAIC0zOCw2ICszOCw5IEBACiBpZmVxICgkKEFSQ0gpLHg4Nl82NCkKIAlPUEVOU1NMX1RBUkdFVF9BUkNIID0geDg2XzY0CiBlbmRpZgoraWZlcSAoJChBUkNIKSxtaXBzZWwpCisgICAgICAgT1BFTlNTTF9UQVJHRVRfQVJDSCA9IG1pcHMzMgorZW5kaWYKIAogIyBXb3JrYXJvdW5kIGZvciBidWcgIzM0NDUKIGlmZXEgKCQoQlIyX3g4Nl9pMzg2KSx5KQpAQCAtNTUsNyArNTgsNiBAQAogCQkJLS1saWJkaXI9bGliIFwKIAkJCXRocmVhZHMgXAogCQkJc2hhcmVkIFwKLQkJCW5vLWlkZWEgXAogCQkJbm8tcmM1IFwKIAkJCWVuYWJsZS1jYW1lbGxpYSBcCiAJCQllbmFibGUtbWRjMiBcCmRpZmYgLS1naXQgYS9wYWNrYWdlL3F1YWxjb21tX3N3aXRjaC9xdWFsY29tbV9zd2l0Y2gubWsgYi9wYWNrYWdlL3F1YWxjb21tX3N3aXRjaC9xdWFsY29tbV9zd2l0Y2gubWsKaW5kZXggOWRiMDQ4Yi4uMWE0NTk3NyAxMDA2NDQKLS0tIGEvcGFja2FnZS9xdWFsY29tbV9zd2l0Y2gvcXVhbGNvbW1fc3dpdGNoLm1rCisrKyBiL3BhY2thZ2UvcXVhbGNvbW1fc3dpdGNoL3F1YWxjb21tX3N3aXRjaC5tawpAQCAtMzUsNiArMzUsMTAgQEAKIAkJQ0ZMQUdTPSIkKFRBUkdFVF9DRkxBR1MpIC1mUElDIC1ESFNMX1NUQU5EQUxPTkcgLUkkKFNUQUdJTkdfRElSKS91c3IvaW5jbHVkZS9weXRob24yLjcgXAogCQkgICAgLUkkKEBEKS9pbmNsdWRlIC1JJChMSU5VWF9ESVIpL2luY2x1ZGUgLUwkKEBEKS9idWlsZC9iaW4iIFwKIAkJJChIT1NUX0RJUikvdXNyL2Jpbi9weXRob24gc2V0dXAucHkgYnVpbGQKKworCUNDPSIkKFRBUkdFVF9DQykiIFwKKwkJQ0ZMQUdTPSIkKFRBUkdFVF9DRkxBR1MpIC1ESFNMX1NUQU5EQUxPTkcgLUkkKEBEKS9pbmNsdWRlIC1JJChMSU5VWF9ESVIpL2luY2x1ZGUgLUwkKEBEKS9idWlsZC9iaW4iIFwKKwkJJChNQUtFKSAtQyAkKEBEKS9nb29nbGUvcWNhODNYWGQKIGVuZGVmCiAKIGRlZmluZSBRVUFMQ09NTV9TV0lUQ0hfSU5TVEFMTF9TVEFHSU5HX0NNRFMKZGlmZiAtLWdpdCBhL3BhY2thZ2UvcnN5bmMvQ29uZmlnLmluIGIvcGFja2FnZS9yc3luYy9Db25maWcuaW4KaW5kZXggMGYzMzc3NC4uZGMxMjVlYyAxMDA2NDQKLS0tIGEvcGFja2FnZS9yc3luYy9Db25maWcuaW4KKysrIGIvcGFja2FnZS9yc3luYy9Db25maWcuaW4KQEAgLTEsNCArMSw1IEBACiBjb25maWcgQlIyX1BBQ0tBR0VfUlNZTkMKKwlzZWxlY3QgQlIyX1BBQ0tBR0VfQVRUUgogCWJvb2wgInJzeW5jIgogCWhlbHAKIAkgIEZpbGUgdHJhbnNmZXIgcHJvZ3JhbSB0byBrZWVwIHJlbW90ZSBmaWxlcyBpbiBzeW5jLgpkaWZmIC0tZ2l0IGEvcGFja2FnZS9zaW1wbGVyYW1mcy9oZWxwZXJzLnNoIGIvcGFja2FnZS9zaW1wbGVyYW1mcy9oZWxwZXJzLnNoCmluZGV4IDExMzkwOTQuLjIyY2EwYWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2Uvc2ltcGxlcmFtZnMvaGVscGVycy5zaAorKysgYi9wYWNrYWdlL3NpbXBsZXJhbWZzL2hlbHBlcnMuc2gKQEAgLTQ4LDcgKzQ4LDYgQEAKICAgTkZTUk9PVD0KICAgVUJJX01URD0KICAgSU5JVD0KLSAgREVCVUc9CiAgIElQPQogCiAgIHNldCAkKGNhdCAvcHJvYy9jbWRsaW5lKQpAQCAtNjEsNyArNjAsNiBAQAogICAgICAgbmZzcm9vdCkgTkZTUk9PVD0kdmFsdWUgOzsKICAgICAgIHViaS5tdGQpIFVCSV9NVEQ9JHZhbHVlIDs7CiAgICAgICBpbml0KSBJTklUPSR2YWx1ZSA7OwotICAgICAgZGVidWd8bG9naW4pIERFQlVHPTEgOzsKICAgICAgIGlwKSBJUD0kdmFsdWUgOzsKICAgICBlc2FjCiAgIGRvbmUKZGlmZiAtLWdpdCBhL3BhY2thZ2Uvc2ltcGxlcmFtZnMvaW5pdCBiL3BhY2thZ2Uvc2ltcGxlcmFtZnMvaW5pdAppbmRleCBhZjc5OTU1Li5kYTM1ODQyIDEwMDc1NQotLS0gYS9wYWNrYWdlL3NpbXBsZXJhbWZzL2luaXQKKysrIGIvcGFja2FnZS9zaW1wbGVyYW1mcy9pbml0CkBAIC0yMiwxMCArMjIsMTIgQEAKICAgWyAtZSAiJGQiIF0gJiYgaW5zbW9kICRkCiBkb25lCiAKLSMgTW91bnQgL3Jvb3RmcworIyBNb3VudCAvcm9vdGZzIGFuZCBwb3NzaWJseSBzZXQgSU5JVAogLiAvbW91bnRzLXJvb3QgfHwgZGllICJjb3VsZG4ndCBtb3VudCByb290IGZpbGVzeXN0ZW1zIgogCi0jIHJlYWRfY21kbGluZSB3YXMgcnVuIGJ5IC9tb3VudHMtcm9vdCwgcG9zc2libHkgc2V0dGluZyBJTklUCisjIFJ1biBhbnl0aGluZyB0aGF0IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgaW5pdAorIyBQYXNzIGluIHBhdGhzIGZvciAkUExBVEZPUk0gYW5kICRERUJVRworL3ByZWluaXQgIi9yb290ZnMvZXRjL3BsYXRmb3JtIiAiL3Jvb3Rmcy90bXAvREVCVUciCiAKIGxvZyAnTG9va2luZyBmb3IgaW5pdCBpbiByb290ZnMuICBUbyBieXBhc3MgdGhpcywgdXNlIGluaXQ9L2Jpbi9zaCcKIGZvciBpbml0IGluICIkSU5JVCIgL3NiaW4vaW5pdCAvbGludXhyYyAvYmluL3NoOyBkbwpkaWZmIC0tZ2l0IGEvcGFja2FnZS9zaW1wbGVyYW1mcy9tb3VudHMtcm9vdCBiL3BhY2thZ2Uvc2ltcGxlcmFtZnMvbW91bnRzLXJvb3QKaW5kZXggMmFjNWE4Ny4uNWE2OWUxYSAxMDA3NTUKLS0tIGEvcGFja2FnZS9zaW1wbGVyYW1mcy9tb3VudHMtcm9vdAorKysgYi9wYWNrYWdlL3NpbXBsZXJhbWZzL21vdW50cy1yb290CkBAIC0yODksNiArMjg5LDQgQEAKICMgc2V0IHVwLgogWyAtbiAiJE5GU1JPT1QiIF0gJiYgZWNobyBORlMgPi9yb290ZnMvdG1wL05GUwogCi1bIC1uICIkREVCVUciIF0gJiYgZWNobyBERUJVRyA+L3Jvb3Rmcy90bXAvREVCVUcKLQogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9zaW1wbGVyYW1mcy9zaW1wbGVyYW1mcy5tayBiL3BhY2thZ2Uvc2ltcGxlcmFtZnMvc2ltcGxlcmFtZnMubWsKaW5kZXggYzg4MzgyOS4uMTU0Yjk2NSAxMDA2NDQKLS0tIGEvcGFja2FnZS9zaW1wbGVyYW1mcy9zaW1wbGVyYW1mcy5taworKysgYi9wYWNrYWdlL3NpbXBsZXJhbWZzL3NpbXBsZXJhbWZzLm1rCkBAIC02MSw3ICs2MSwxNSBAQAogCQlwYWNrYWdlL3NpbXBsZXJhbWZzL21vdW50cy1zeXMgXAogCQlwYWNrYWdlL3NpbXBsZXJhbWZzL21vdW50cy1yb290IFwKIAkJcGFja2FnZS9zaW1wbGVyYW1mcy9oZWxwZXJzLnNoIFwKKwkJZnMvc2tlbGV0b24vc2Jpbi9wcmVpbml0IFwKIAkJJChARCkvZnMvCisKKwkjIG5lZWRlZCB0byBydW4gcHJlLWluaXQKKwlsbiAtZiBcCisJCWZzL3NrZWxldG9uL2Jpbi91cGRhdGUtbXRkLWxpbmtzIFwKKwkJJChARCkvLi4vZ29vZ2xlX3BsYXRmb3JtLUhFQUQvaG52cmFtL2hudnJhbSBcCisJCSQoQEQpL2ZzL3NiaW4KKwogCWxuIC1mIHBhY2thZ2Uvc2ltcGxlcmFtZnMvZnN0YWIgJChARCkvZnMvZXRjCiAJbG4gLXMgbGliICQoQEQpL2ZzL2xpYjY0CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS1maXgtYXJtLWJhZC1zeXNjYWxsLnBhdGNoIGIvcGFja2FnZS9zdHJhY2Uvc3RyYWNlLWZpeC1hcm0tYmFkLXN5c2NhbGwucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzE0NGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZS9zdHJhY2Uvc3RyYWNlLWZpeC1hcm0tYmFkLXN5c2NhbGwucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0tLS0gYS9zeXNjYWxsLmMKLSsrKyBiL3N5c2NhbGwuYwotQEAgLTEwMTYsNiArMTAxNiwxNSBAQCBzdHJ1Y3QgdGNiICp0Y3A7Ci0gCQkvKgotIAkJICogTm90ZTogd2Ugb25seSBkZWFsIHdpdGggb25seSAzMi1iaXQgQ1BVcyBoZXJlLgotIAkJICovCi0rCi0rCQlpZiAoISh0Y3AtPmZsYWdzICYgVENCX0lOU1lTQ0FMTCkgJiYKLSsJCSAgICAodGNwLT5mbGFncyAmIFRDQl9XQUlURVhFQ1ZFKSkgewotKwkJCS8qIGNhdWdodCBhIGZha2Ugc3lzY2FsbCBmcm9tIHRoZSBleGVjdmUncyBleGl0ICovCi0rCQkJdGNwLT5mbGFncyAmPSB+VENCX1dBSVRFWEVDVkU7Ci0rCQkJcmV0dXJuIDA7Ci0rCQl9Ci0rIAotKwotIAkJaWYgKHJlZ3MuQVJNX2Nwc3IgJiAweDIwKSB7Ci0gCQkJLyoKLSAJCQkgKiBHZXQgdGhlIFRodW1iLW1vZGUgc3lzdGVtIGNhbGwgbnVtYmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlL3N0cmFjZS9zdHJhY2UtZml4LWRpc2FibGVkLWxhcmdlZmlsZS1zeXNjYWxscy5wYXRjaCBiL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS1maXgtZGlzYWJsZWQtbGFyZ2VmaWxlLXN5c2NhbGxzLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmJjZjk2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS1maXgtZGlzYWJsZWQtbGFyZ2VmaWxlLXN5c2NhbGxzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLS0tIGEvc3lzY2FsbC5jCi0rKysgYi9zeXNjYWxsLmMKLUBAIC0xMjUsNiArMTI1LDE4IEBACi0gI2RlZmluZSBUUCBUUkFDRV9QUk9DRVNTCi0gI2RlZmluZSBUUyBUUkFDRV9TSUdOQUwKLSAKLSsjaWZuZGVmIEhBVkVfU1RBVEZTNjQKLSsvKgotKyAqIFVnbHkgaGFja3MgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBMRlMKLSsgKi8KLSsKLSsjZGVmaW5lIHN5c190cnVuY2F0ZTY0ICBzeXNfdHJ1bmNhdGUKLSsjZGVmaW5lIHN5c19mdHJ1bmNhdGU2NCBzeXNfZnRydW5jYXRlCi0rI2RlZmluZSBzeXNfZ2V0ZGVudHM2NCAgc3lzX2dldGRlbnRzCi0rI2RlZmluZSBzeXNfc3RhdGZzNjQgICAgc3lzX3N0YXRmcwotKyNkZWZpbmUgc3lzX2ZzdGF0ZnM2NCAgIHN5c19mc3RhdGZzCi0rI2VuZGlmCi0rCi0gc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNlbnQgc3lzZW50MFtdID0gewotICNpbmNsdWRlICJzeXNjYWxsZW50LmgiCi0gfTsKZGlmZiAtLWdpdCBhL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS1zdGF0NjQucGF0Y2ggYi9wYWNrYWdlL3N0cmFjZS9zdHJhY2Utc3RhdDY0LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRkMThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS1zdGF0NjQucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1Gcm9tIDM0YzE2ZDcyMjFlNzkyNjAyZTY0MmE3MTg0ZGYwNjMwOGM5OTA5NWUgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBBdmVyeSBQZW5uYXJ1biA8YXBlbndhcnJAZ21haWwuY29tPgotRGF0ZTogVHVlLCAyMSBNYXkgMjAxMyAwMDo0NDo1OCAtMDQwMAotU3ViamVjdDogW1BBVENIXSBGaXggeDg2XzY0IGRlZmluZXMuCi0KLVRoaXMgZml4ZXMgY29tcGlsYXRpb24gd2l0aCBnY2MtNC41LjMgb24gZ2xpYmMtMi45LgotLS0tCi0gZmlsZS5jIHwgICAgMiArLQotIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQotCi1kaWZmIC0tZ2l0IGEvZmlsZS5jIGIvZmlsZS5jCi1pbmRleCA4NTQ1NDhmLi45YjQxZmIzIDEwMDY0NAotLS0tIGEvZmlsZS5jCi0rKysgYi9maWxlLmMKLUBAIC0xMDA3LDcgKzEwMDcsNyBAQCBwcmludHN0YXQoc3RydWN0IHRjYiAqdGNwLCBsb25nIGFkZHIpCi0gfQotICNlbmRpZgkvKiAhSEFWRV9MT05HX0xPTkdfT0ZGX1QgKi8KLSAKLS0jaWYgIWRlZmluZWQgSEFWRV9TVEFUNjQgJiYgZGVmaW5lZCBMSU5VWCAmJiBkZWZpbmVkIFg4Nl82NAotKyNpZiBkZWZpbmVkIEhBVkVfU1RBVDY0ICYmIGRlZmluZWQgbGludXggJiYgZGVmaW5lZCBfX3g4Nl82NAotIC8qCi0gICogTGludXggeDg2XzY0IGhhcyB1bmlmaWVkIGBzdHJ1Y3Qgc3RhdCcgYnV0IGl0cyBpMzg2IGJpYXJjaCBuZWVkcwotICAqIGBzdHJ1Y3Qgc3RhdDY0Jy4gIEl0cyA8YXNtLWkzODYvc3RhdC5oPiBkZWZpbml0aW9uIGV4cGVjdHMgMzItYml0IGBsb25nJy4KLS0tIAotMS43LjkuZGlydHkKLQpkaWZmIC0tZ2l0IGEvcGFja2FnZS9zdHJhY2Uvc3RyYWNlLXVuZGVmLUNUTF9QUk9DLnBhdGNoIGIvcGFja2FnZS9zdHJhY2Uvc3RyYWNlLXVuZGVmLUNUTF9QUk9DLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQxOTk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS11bmRlZi1DVExfUFJPQy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS0tLSBhL3N5c3RlbS5jCi0rKysgYi9zeXN0ZW0uYwotQEAgLTE2MTQsNyArMTYxNCw5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGxhdCBzeXNjdGxfcm9vdFtdID0KLSAJeyBDVExfS0VSTiwgIkNUTF9LRVJOIiB9LAotIAl7IENUTF9WTSwgIkNUTF9WTSIgfSwKLSAJeyBDVExfTkVULCAiQ1RMX05FVCIgfSwKLSsjaWZkZWYgQ1RMX1BST0MKLSAJeyBDVExfUFJPQywgIkNUTF9QUk9DIiB9LAotKyNlbmRpZgotIAl7IENUTF9GUywgIkNUTF9GUyIgfSwKLSAJeyBDVExfREVCVUcsICJDVExfREVCVUciIH0sCi0gCXsgQ1RMX0RFViwgIkNUTF9ERVYiIH0sCmRpZmYgLS1naXQgYS9wYWNrYWdlL3N0cmFjZS9zdHJhY2UubWsgYi9wYWNrYWdlL3N0cmFjZS9zdHJhY2UubWsKaW5kZXggMzI1MTBmZi4uZWI5YzZjNyAxMDA2NDQKLS0tIGEvcGFja2FnZS9zdHJhY2Uvc3RyYWNlLm1rCisrKyBiL3BhY2thZ2Uvc3RyYWNlL3N0cmFjZS5tawpAQCAtNCw4ICs0LDggQEAKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotU1RSQUNFX1ZFUlNJT04gPSA0LjUuMjAKLVNUUkFDRV9TT1VSQ0UgPSBzdHJhY2UtJChTVFJBQ0VfVkVSU0lPTikudGFyLmJ6MgorU1RSQUNFX1ZFUlNJT04gPSA0LjE0CitTVFJBQ0VfU09VUkNFID0gc3RyYWNlLSQoU1RSQUNFX1ZFUlNJT04pLnRhci54egogU1RSQUNFX1NJVEUgPSBodHRwOi8vJChCUjJfU09VUkNFRk9SR0VfTUlSUk9SKS5kbC5zb3VyY2Vmb3JnZS5uZXQvc291cmNlZm9yZ2Uvc3RyYWNlCiAKIGlmbmVxICgkKEJSMl9QQUNLQUdFX0xJQkFJTyksKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS90Y3BkdW1wL3RjcGR1bXAubWsgYi9wYWNrYWdlL3RjcGR1bXAvdGNwZHVtcC5tawppbmRleCBlOTI4MjA2Li40ZTc4MWFjIDEwMDY0NAotLS0gYS9wYWNrYWdlL3RjcGR1bXAvdGNwZHVtcC5taworKysgYi9wYWNrYWdlL3RjcGR1bXAvdGNwZHVtcC5tawpAQCAtMTEsNyArMTEsOCBAQAogVENQRFVNUF9TT1VSQ0UgPSB0Y3BkdW1wLSQoVENQRFVNUF9WRVJTSU9OKS50YXIuZ3oKIFRDUERVTVBfQ09ORl9FTlYgPSBhY19jdl9saW51eF92ZXJzPTIgY3Jvc3NfY29tcGlsaW5nPXkgdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbz1jcm9zcwogVENQRFVNUF9DT05GX09QVCA9IC0td2l0aG91dC1jcnlwdG8gXAotCQkkKGlmICQoQlIyX1BBQ0tBR0VfVENQRFVNUF9TTUIpLC0tZW5hYmxlLXNtYiwtLWRpc2FibGUtc21iKQorCQkgICAtLWVuYWJsZS1pcHY2IFwKKwkJICAgJChpZiAkKEJSMl9QQUNLQUdFX1RDUERVTVBfU01CKSwtLWVuYWJsZS1zbWIsLS1kaXNhYmxlLXNtYikKIAogVENQRFVNUF9ERVBFTkRFTkNJRVMgPSB6bGliIGxpYnBjYXAKIApkaWZmIC0tZ2l0IGEvcGFja2FnZS90cm91c2Vycy90cm91c2Vycy5tayBiL3BhY2thZ2UvdHJvdXNlcnMvdHJvdXNlcnMubWsKaW5kZXggZGM3Y2VhOC4uNzNhMTBjNiAxMDA2NDQKLS0tIGEvcGFja2FnZS90cm91c2Vycy90cm91c2Vycy5taworKysgYi9wYWNrYWdlL3Ryb3VzZXJzL3Ryb3VzZXJzLm1rCkBAIC05LDUxICs5LDEyIEBACiBUUk9VU0VSU19BVVRPUkVDT05GID0gWUVTCiBUUk9VU0VSU19JTlNUQUxMX1NUQUdJTkcgPSBZRVMKIFRST1VTRVJTX0lOU1RBTExfVEFSR0VUID0gWUVTCi1UUk9VU0VSU19JTlNUQUxMX1NUQUdJTkdfT1BUID0gREVTVERJUj0kJHtTVEFHSU5HX0RJUn0gYWxsCi1UUk9VU0VSU19JTlNUQUxMX1RBUkdFVF9PUFQgPSBERVNURElSPSQke1RBUkdFVF9ESVJ9IGFsbAotVFJPVVNFUlNfVU5JTlNUQUxMX1NUQUdJTkdfT1BUID0gREVTVERJUj0kJHtTVEFHSU5HX0RJUn0gY2xlYW4KLVRST1VTRVJTX1VOSU5TVEFMTF9UQVJHRVRfT1BUID0gREVTVERJUj0kJHtUQVJHRVRfRElSfSBjbGVhbgorVFJPVVNFUlNfQ09ORl9PUFQgPSAtLWRpc2FibGUtdXNlcmNoZWNrCiBUUk9VU0VSU19ERVBFTkRFTkNJRVMgPSBvcGVuc3NsIGhvc3QtcGtnLWNvbmZpZwogCi1kZWZpbmUgVFJPVVNFUlNfSU5TVEFMTF9TVEFHSU5HX0NNRFMKLQkkKElOU1RBTEwpIC1kICQoU1RBR0lOR19ESVIpL3Vzci9pbmNsdWRlL3Rzcy8KLQkkKElOU1RBTEwpIC1tIDA2NDQgLXQgJChTVEFHSU5HX0RJUikvdXNyL2luY2x1ZGUvdHNzLyAkKEBEKS9zcmMvaW5jbHVkZS90c3MvKgotCSQoSU5TVEFMTCkgLWQgJChTVEFHSU5HX0RJUikvdXNyL2luY2x1ZGUvdHJvdXNlcnMvCi0JJChJTlNUQUxMKSAtbSAwNjQ0IC10ICQoU1RBR0lOR19ESVIpL3Vzci9pbmNsdWRlL3Ryb3VzZXJzLyAkKEBEKS9zcmMvaW5jbHVkZS90cm91c2Vycy8qCi0JJChJTlNUQUxMKSAtRCAtbSAwNzU1ICQoQEQpL3NyYy90c3BpLy5saWJzL2xpYnRzcGkuc28uMS4yLjAgXAotCQkkKFNUQUdJTkdfRElSKS91c3IvbGliLwotCWxuIC1mcyBsaWJ0c3BpLnNvLjEuMi4wIFwKLQkJJChTVEFHSU5HX0RJUikvdXNyL2xpYi9saWJ0c3BpLnNvLjEKLQlsbiAtZnMgbGlidHNwaS5zby4xIFwKLQkJJChTVEFHSU5HX0RJUikvdXNyL2xpYi9saWJ0c3BpLnNvCi1lbmRlZgotCi1kZWZpbmUgVFJPVVNFUlNfSU5TVEFMTF9UQVJHRVRfQ01EUwotCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSAkKEBEKS9zcmMvdGNzZC90Y3NkIFwKLQkJJChUQVJHRVRfRElSKS91c3IvYmluLwotCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSAkKEBEKS9kaXN0L3Rjc2QuY29uZiBcCi0JCSQoVEFSR0VUX0RJUikvZXRjLwotCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSAkKEBEKS9zcmMvdHNwaS8ubGlicy9saWJ0c3BpLnNvLjEuMi4wIFwKLQkJJChUQVJHRVRfRElSKS91c3IvbGliLwotCWxuIC1mcyBsaWJ0c3BpLnNvLjEuMi4wIFwKLQkJJChUQVJHRVRfRElSKS91c3IvbGliL2xpYnRzcGkuc28uMQotCSQoSU5TVEFMTCkgLUQgLW0gMDc1NSAkKEBEKS9zcmMvdHNwaS8ubGlicy9saWJ0c3BpLmEgXAotCQkkKFRBUkdFVF9ESVIpL3Vzci9saWIvCi1lbmRlZgotCi1kZWZpbmUgVFJPVVNFUlNfVU5JTlNUQUxMX1NUQUdJTkdfQ01EUwotCSQoUk0pIC1yICQoU1RBR0lOR19ESVIpL3Vzci9pbmNsdWRlL3Ryb3VzZXJzLwotCSQoUk0pIC1yICQoU1RBR0lOR19ESVIpL3Vzci9pbmNsdWRlL3Rzcy8KLQkkKFJNKSAkKFNUQUdJTkdfRElSKS91c3IvbGliL2xpYnRzcGkuc28uMS4yLjAKLQkkKFJNKSAkKFNUQUdJTkdfRElSKS91c3IvbGliL2xpYnRzcGkuc28uMQotCSQoUk0pICQoU1RBR0lOR19ESVIpL3Vzci9saWIvbGlidHNwaS5zbwotZW5kZWYKLQotZGVmaW5lIFRST1VTRVJTX1VOSU5TVEFMTF9UQVJHRVRfQ01EUwotCSQoUk0pICQoVEFSR0VUX0RJUikvdXNyL2Jpbi90Y3NkCi0JJChSTSkgJChUQVJHRVRfRElSKS9ldGMvdGNzZC5jb25mCi0JJChSTSkgJChUQVJHRVRfRElSKS91c3IvbGliL2xpYnRzcGkuc28uMS4yLjAKLQkkKFJNKSAkKFRBUkdFVF9ESVIpL3Vzci9saWIvbGlidHNwaS5zby4xCi1lbmRlZgorSE9TVF9UUk9VU0VSU19BVVRPUkVDT05GID0gWUVTCitIT1NUX1RST1VTRVJTX0NPTkZfT1BUID0gLS1kaXNhYmxlLXVzZXJjaGVjaworSE9TVF9UUk9VU0VSU19ERVBFTkRFTkNJRVMgPSBob3N0LXBrZy1jb25maWcKIAogJChldmFsICQoY2FsbCBBVVRPVEFSR0VUUykpCiskKGV2YWwgJChjYWxsIEFVVE9UQVJHRVRTLGhvc3QpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZS93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5tayBiL3BhY2thZ2Uvd3BhX3N1cHBsaWNhbnQvd3BhX3N1cHBsaWNhbnQubWsKaW5kZXggMGZmNzI3Yi4uMzc2Mjc3MCAxMDA2NDQKLS0tIGEvcGFja2FnZS93cGFfc3VwcGxpY2FudC93cGFfc3VwcGxpY2FudC5taworKysgYi9wYWNrYWdlL3dwYV9zdXBwbGljYW50L3dwYV9zdXBwbGljYW50Lm1rCkBAIC0xOSw3ICsxOSw3IEBACiBXUEFfU1VQUExJQ0FOVF9DT05GSUdfU0VUID0KIAogV1BBX1NVUFBMSUNBTlRfQ09ORklHX0VOQUJMRSA9IFwKLQlDT05GSUdfRUxPT1BfRVBPTEwJXAorCUNPTkZJR19FTE9PUF9QT0xMCVwKIAlDT05GSUdfSUVFRTgwMjExQUMJXAogCUNPTkZJR19JRUVFODAyMTFOCVwKIAlDT05GSUdfSUVFRTgwMjExUglcCmRpZmYgLS1naXQgYS9zdXBwb3J0L3NjcmlwdHMvaXMtZ2l0LnNoIGIvc3VwcG9ydC9zY3JpcHRzL2lzLWdpdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzk5YTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zY3JpcHRzL2lzLWdpdC5zaApAQCAtMCwwICsxLDUgQEAKKyMhL2Jpbi9zaAorCitpZiBbICEgLWQgLi4vLmdpdC9tb2R1bGVzIF07IHRoZW4KKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zY3JpcHRzL2lzLXJlcG8uc2ggYi9zdXBwb3J0L3NjcmlwdHMvaXMtcmVwby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDExNzgxCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zY3JpcHRzL2lzLXJlcG8uc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKKworaWYgWyAhIC1kIC4uLy5yZXBvIF07IHRoZW4KKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zY3JpcHRzL3Bvc3RidWlsZC5zaCBiL3N1cHBvcnQvc2NyaXB0cy9wb3N0YnVpbGQuc2gKaW5kZXggMTE0MjNjZS4uZDBhOGU5NCAxMDA3NTUKLS0tIGEvc3VwcG9ydC9zY3JpcHRzL3Bvc3RidWlsZC5zaAorKysgYi9zdXBwb3J0L3NjcmlwdHMvcG9zdGJ1aWxkLnNoCkBAIC0xLDQgKzEsNCBAQAotIyEvYmluL3NoCisjIS9iaW4vYmFzaAogc2V0IC14CiBzZXQgLWUKIFRBUkdFVF9ESVI9JDEKQEAgLTE5LDM2ICsxOSwyMSBAQAogCiAjIEdlbmVyYXRlIC9ldGMvbWFuaWZlc3QsIC9ldGMvdmVyc2lvbiwgL2V0Yy9zb2Z0d2FyZWRhdGUKIHJtIC1mICIkVEFSR0VUX0RJUi9ldGMvbWFuaWZlc3QiCi1pZiBbIC1kIC4uLy5yZXBvIF07IHRoZW4KKworaWYgc3VwcG9ydC9zY3JpcHRzL2lzLXJlcG8uc2g7IHRoZW4KICAgcmVwbyAtLW5vLXBhZ2VyIG1hbmlmZXN0IC1yIC1vICIkVEFSR0VUX0RJUi9ldGMvbWFuaWZlc3QiCi0gIEZPUkFMTD0icmVwbyBmb3JhbGwgLWMiCi1lbGlmIFsgLWQgLi4vLmdpdC9tb2R1bGVzIF07IHRoZW4KK2VsaWYgc3VwcG9ydC9zY3JpcHRzL2lzLWdpdC5zaDsgdGhlbgogICAoIGNkIC4uICYmCiAgICAgZWNobyAtbiAnY29tbWl0aWQgJyAmJgogICAgIGdpdCBkZXNjcmliZSAtLW5vLWFiYnJldiAtLWFsd2F5cwogICApID4iJFRBUkdFVF9ESVIvZXRjL21hbmlmZXN0IgotICBGT1JBTEw9ImdpdCBzdWJtb2R1bGUgLS1xdWlldCBmb3JlYWNoIgogZWxzZQotICBlY2hvICJDYW4ndCBmaW5kIHJlcG8gb3IgZ2l0LXN1Ym1vZHVsZXMgdG9wLiAgQWJvcnRpbmcuIiA+JjIKLSAgZXhpdCA5OQorICBlY2hvICJFUlJPUjogTm8gdmVyc2lvbiBjb250cm9sIGZvbGRlciBmb3VuZCIgPiYyCisgIGV4aXQgMTsKIGZpCi0jIFRPRE8oYXBlbndhcnIpOiBJZiB3ZSB1c2UgZ2l0LXN1Ym1vZHVsZXMsIHdlIGNhbiBqdXN0IGNoZWNrIHRoZSB0b3AgbGV2ZWwuCi0jICAgVGhlIGdpdC1zdWJtb2R1bGVzIHN1cGVycHJvamVjdCBjb21taXQgaWQgaXMgZW5vdWdoIHRvIGlkZW50aWZ5Ci0jICAgZXZlcnl0aGluZyBhYm91dCBhbGwgaW5jbHVkZWQgc3VicHJvamVjdHMuICBCdXQgZm9yIG5vdywganVzdCBkbyBpdAotIyAgIHRoZSBzYW1lIHdpdGggYm90aCByZXBvIGFuZCBzdWJtb2R1bGVzLgotdGFnbmFtZT0kKGdpdCBkZXNjcmliZSkKLXRhZ2FiYnJldj0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj0wKQotdHJlZV9zdGF0ZT0kKGdpdCByZXYtbGlzdCAiJHRhZ2FiYnJldiIuLkhFQUQpCi1pZiBbIC1uICIkdHJlZV9zdGF0ZSIgXTsgdGhlbgotICAjIFRyZWUgaGFzIGNvbW1pdHMgc2luY2UgbGFzdCB0YWcsIHJlYnVpbGQgdGhlIGltYWdlIG5hbWUKLSAgY291bnQ9JChjZCAuLiAmJgotICAgICAgICAgICAgICRGT1JBTEwgImdpdCByZXYtbGlzdCAnJHRhZ2FiYnJldicuLkhFQUQgMj4vZGV2L251bGwiIHwKLSAgICAgICAgICAgICB3YyAtbCkKLSAgdmVyc2lvbj0iJFBMQVRGT1JNX1BSRUZJWC0ke3RhZ2FiYnJldiMqLX0tJGNvdW50LSR7dGFnbmFtZSMjKi19IgotZWxzZQotICB2ZXJzaW9uPSIkUExBVEZPUk1fUFJFRklYLSR7dGFnbmFtZSMqLX0iCi1maQotZWNobyAtbiAiJHZlcnNpb24iID4iJFRBUkdFVF9ESVIvZXRjL3ZlcnNpb24iIDI+L2Rldi9udWxsCisKK3ZlcnNpb249JChzdXBwb3J0L3NjcmlwdHMvdmVyc2lvbi5zaCAiJFRBUkdFVF9ESVIvLi4iKQorZWNobyAtbiAiJFBMQVRGT1JNX1BSRUZJWCR2ZXJzaW9uIiA+IiRUQVJHRVRfRElSL2V0Yy92ZXJzaW9uIiAyPi9kZXYvbnVsbAogZWNobyAtbiAiZmliZXJvcyIgPiIkVEFSR0VUX0RJUi9ldGMvb3MiIDI+L2Rldi9udWxsCiAKIGlmIFsgIiRQUk9EIiAhPSAieSIgXTsgdGhlbgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zY3JpcHRzL3ZlcnNpb24uc2ggYi9zdXBwb3J0L3NjcmlwdHMvdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjhlNTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3VwcG9ydC9zY3JpcHRzL3ZlcnNpb24uc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIFJldHVybnMgY3VycmVudCB2ZXJzaW9uIGJlaW5nIGJ1aWx0LCB3aXRob3V0IGxlYWRpbmcgcGxhdGZvcm0gc3RyaW5nCisjIEZvciBleC4gIi00OC1wcmUxLXRlc3QtcmVsLTczOS1nZjFkNjM0OSIKKworT1VUUFVUX0RJUj0iJDEiCitpZiBbIC1uICIkT1VUUFVUX0RJUiIgLWEgLXIgIiRPVVRQVVRfRElSL2ZvcmNlX3ZlcnNpb24iIF07IHRoZW4KKyAgZWNobyAtbiAiLSIgJiYgY2F0ICIkT1VUUFVUX0RJUi9mb3JjZV92ZXJzaW9uIgorICBleGl0CitmaQorCitpZiBzdXBwb3J0L3NjcmlwdHMvaXMtcmVwby5zaDsgdGhlbgorICBGT1JBTEw9InJlcG8gZm9yYWxsIC1jIgorZWxpZiBzdXBwb3J0L3NjcmlwdHMvaXMtZ2l0LnNoOyB0aGVuCisgIEZPUkFMTD0iZ2l0IHN1Ym1vZHVsZSAtLXF1aWV0IGZvcmVhY2giCitlbHNlCisgIGVjaG8gIkVSUk9SOiBObyB2ZXJzaW9uIGNvbnRyb2wgZm9sZGVyIGZvdW5kIiA+JjIKKyAgZXhpdCAxOworZmkKKworIyBUT0RPKGFwZW53YXJyKTogSWYgd2UgdXNlIGdpdC1zdWJtb2R1bGVzLCB3ZSBjYW4ganVzdCBjaGVjayB0aGUgdG9wIGxldmVsLgorIyAgIFRoZSBnaXQtc3VibW9kdWxlcyBzdXBlcnByb2plY3QgY29tbWl0IGlkIGlzIGVub3VnaCB0byBpZGVudGlmeQorIyAgIGV2ZXJ5dGhpbmcgYWJvdXQgYWxsIGluY2x1ZGVkIHN1YnByb2plY3RzLiAgQnV0IGZvciBub3csIGp1c3QgZG8gaXQKKyMgICB0aGUgc2FtZSB3aXRoIGJvdGggcmVwbyBhbmQgc3VibW9kdWxlcy4KK3RhZ25hbWU9JChnaXQgZGVzY3JpYmUpCit0YWdhYmJyZXY9JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9MCkKK3RyZWVfc3RhdGU9JChnaXQgcmV2LWxpc3QgIiR0YWdhYmJyZXYiLi5IRUFEKQoraWYgWyAtbiAiJHRyZWVfc3RhdGUiIF07IHRoZW4KKyAgIyBUcmVlIGhhcyBjb21taXRzIHNpbmNlIGxhc3QgdGFnLCByZWJ1aWxkIHRoZSBpbWFnZSBuYW1lCisgIGNvdW50PSQoY2QgLi4gJiYKKyAgICAkRk9SQUxMICJnaXQgcmV2LWxpc3QgJyR0YWdhYmJyZXYnLi5IRUFEIDI+L2Rldi9udWxsIiB8CisgICAgd2MgLWwpCisgIHZlcnNpb249Ii0ke3RhZ2FiYnJldiMqLX0tJGNvdW50LSR7dGFnbmFtZSMjKi19IgorZWxzZQorICB2ZXJzaW9uPSItJHt0YWduYW1lIyotfSIKK2ZpCitlY2hvICIkdmVyc2lvbiIKZGlmZiAtLWdpdCBhL3Rvb2xjaGFpbi9nb2xhbmcvZ29sYW5nLm1rIGIvdG9vbGNoYWluL2dvbGFuZy9nb2xhbmcubWsKaW5kZXggNTlmZGUzMi4uZTkwNTczYyAxMDA2NDQKLS0tIGEvdG9vbGNoYWluL2dvbGFuZy9nb2xhbmcubWsKKysrIGIvdG9vbGNoYWluL2dvbGFuZy9nb2xhbmcubWsKQEAgLTEsMTUgKzEsMTQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKLSMgZ29sYW5nIDEuNi4yIC0gaHR0cHM6Ly9nby5nb29nbGVzb3VyY2UuY29tL2dvLysvZ28xLjYuMgorIyBnb2xhbmcgMS43LjQgLSBodHRwczovL2dvLmdvb2dsZXNvdXJjZS5jb20vZ28vKy9nbzEuNy40CiAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1HT0xBTkdfVkVSU0lPTiA9IDU3ZTQ1OWUwMmI0YjAxNTY3ZjkyNTQyZjkyY2Q5YWZkZTIwOWUxOTMKK0dPTEFOR19WRVJTSU9OID0gNmIzNjUzNWNmMzgyYmNlODQ1ZGQyZDI3MjI3NmU3YmEzNTBiMGM2YgogR09MQU5HX1NJVEUgPSBodHRwczovL2dvLmdvb2dsZXNvdXJjZS5jb20vZ28KIEdPTEFOR19TSVRFX01FVEhPRCA9IGdpdAogR09MQU5HX0RFUEVOREVOQ0lFUyA9IGhvc3QtZ29sYW5nX2Jvb3RzdHJhcAogCi1HT0xBTkdfUkVMRUFTRSA9IDEuNi4yCi1HT0xBTkdfR09ST09UID0gJChIT1NUX0RJUikvdXNyL2xpYi9nb2xhbmctJChHT0xBTkdfUkVMRUFTRSkKK0dPTEFOR19HT1JPT1QgPSAkKEhPU1RfRElSKS91c3IvbGliL2dvbGFuZwogCiBpZmVxICgiYXJtIiwkKEJSMl9BUkNIKSkKIEdPTEFOR19HT0FSQ0ggPSBhcm0KQEAgLTMwLDExICsyOSwzNSBAQAogCiAjIEdvIHBhY2thZ2VzIHNob3VsZCBleHBvcnQgJChHT0xBTkdfRU5WKSB0byBjbGVhciBHbyBzZXR0aW5ncyBmcm9tIHRoZQogIyBob3N0IGVudmlyb25tZW50LgotR09MQU5HX0VOViA9IFBBVEg9JChUQVJHRVRfUEFUSCkgR09ST09UPSQoR09MQU5HX0dPUk9PVCkgR09QQVRIPSQoQlVJTERfRElSKS9nb19wa2dzIFwKLQlHT0FSQ0g9JChHT0xBTkdfR09BUkNIKSBDQz0kKFRBUkdFVF9DQ19OT0NDQUNIRSkgQ1hYPSQoVEFSR0VUX0NYWF9OT0NDQUNIRSkKK0dPTEFOR19FTlYgPSBQQVRIPSQoVEFSR0VUX1BBVEgpIFwKKwkgICAgIEdPQVJDSD0kKEdPTEFOR19HT0FSQ0gpIFwKKwkgICAgIEdPQklOPSBcCisJICAgICBHT0VYRT0gXAorCSAgICAgR09QQVRIPSIkKEJVSUxEX0RJUikvZ29fcGtncyIgXAorCSAgICAgR09SQUNFPSBcCisJICAgICBHT1JPT1Q9IiQoR09MQU5HX0dPUk9PVCkiIFwKKwkgICAgIEdPVE9PTERJUj0gXAorCSAgICAgQ0M9IiQoVEFSR0VUX0NDX05PQ0NBQ0hFKSIgXAorCSAgICAgQ1hYPSIkKFRBUkdFVF9DWFhfTk9DQ0FDSEUpIiBcCisJICAgICBDR09fQ0ZMQUdTPSIkKFRBUkdFVF9DRkxBR1MpIiBcCisJICAgICBDR09fQ1hYRkxBR1M9IiQoVEFSR0VUX0NYWEZMQUdTKSIgXAorCSAgICAgQ0dPX0VOQUJMRUQ9IiQoR09MQU5HX0NHT19FTkFCTEVEKSIgXAorCSAgICAgQ0dPX0xERkxBR1M9IiQoVEFSR0VUX0xERkxBR1MpIgogCi1IT1NUX0dPTEFOR19FTlYgPSBQQVRIPSQoVEFSR0VUX1BBVEgpIEdPUk9PVD0kKEdPTEFOR19HT1JPT1QpIEdPUEFUSD0kKEJVSUxEX0RJUikvZ29fcGtncyBcCi0JR09BUkNIPSBDQz0kKEhPU1RDQ19OT0NDQUNIRSkgQ1hYPSQoSE9TVENYWF9OT0NDQUNIRSkgQ0dPX0VOQUJMRUQ9JChHT0xBTkdfQ0dPX0VOQUJMRUQpCitIT1NUX0dPTEFOR19FTlYgPSBQQVRIPSQoVEFSR0VUX1BBVEgpIFwKKwkJICBHT0FSQ0g9IFwKKwkJICBHT0JJTj0gXAorCQkgIEdPRVhFPSBcCisJCSAgR09QQVRIPSIkKEJVSUxEX0RJUikvZ29fcGtncyIgXAorCQkgIEdPUkFDRT0gXAorCQkgIEdPUk9PVD0iJChHT0xBTkdfR09ST09UKSIgXAorCQkgIEdPVE9PTERJUj0gXAorCQkgIENDPSIkKEhPU1RDQ19OT0NDQUNIRSkiIFwKKwkJICBDWFg9IiQoSE9TVENYWF9OT0NDQUNIRSkiIFwKKwkJICBDR09fQ0ZMQUdTPSIkKEhPU1RfQ0ZMQUdTKSIgXAorCQkgIENHT19DWFhGTEFHUz0iJChIT1NUX0NYWEZMQUdTKSIgXAorCQkgIENHT19FTkFCTEVEPSIkKEdPTEFOR19DR09fRU5BQkxFRCkiIFwKKwkJICBDR09fTERGTEFHUz0iJChIT1NUX0xERkxBR1MpIgogCiBkZWZpbmUgSE9TVF9HT0xBTkdfQlVJTERfQ01EUwogCWV4cG9ydCBQQVRIPSQoVEFSR0VUX1BBVEgpIDsgXApAQCAtNTUsOCArNzgsOCBAQAogZGVmaW5lIEhPU1RfR09MQU5HX0lOU1RBTExfQ01EUwogCSQoSU5TVEFMTCkgLWQgLW0gMDc1NSAiJChHT0xBTkdfR09ST09UKSIKIAljcCAtYSAiJChARCkiLyogIiQoR09MQU5HX0dPUk9PVCkvIgotCWxuIC1zZlQgIi4uL2xpYi9nb2xhbmctJChHT0xBTkdfUkVMRUFTRSkvYmluL2dvIiAiJChIT1NUX0RJUikvdXNyL2Jpbi9nbyIKLQlsbiAtc2ZUICIuLi9saWIvZ29sYW5nLSQoR09MQU5HX1JFTEVBU0UpL2Jpbi9nb2ZtdCIgIiQoSE9TVF9ESVIpL3Vzci9iaW4vZ29mbXQiCisJbG4gLXNmVCAiLi4vbGliL2dvbGFuZy9iaW4vZ28iICIkKEhPU1RfRElSKS91c3IvYmluL2dvIgorCWxuIC1zZlQgIi4uL2xpYi9nb2xhbmcvYmluL2dvZm10IiAiJChIT1NUX0RJUikvdXNyL2Jpbi9nb2ZtdCIKIGVuZGVmCiAKIGRlZmluZSBIT1NUX0dPTEFOR19DTEVBTl9DTURTCmRpZmYgLS1naXQgYS90b29sY2hhaW4vZ29sYW5nX2Jvb3RzdHJhcC9nb2xhbmdfYm9vdHN0cmFwLm1rIGIvdG9vbGNoYWluL2dvbGFuZ19ib290c3RyYXAvZ29sYW5nX2Jvb3RzdHJhcC5tawppbmRleCA2MjVhMzM4Li5kMmUyYjMwIDEwMDY0NAotLS0gYS90b29sY2hhaW4vZ29sYW5nX2Jvb3RzdHJhcC9nb2xhbmdfYm9vdHN0cmFwLm1rCisrKyBiL3Rvb2xjaGFpbi9nb2xhbmdfYm9vdHN0cmFwL2dvbGFuZ19ib290c3RyYXAubWsKQEAgLTcsOCArNyw3IEBACiBHT0xBTkdfQk9PVFNUUkFQX1NJVEUgPSBodHRwczovL2dvLmdvb2dsZXNvdXJjZS5jb20vZ28KIEdPTEFOR19CT09UU1RSQVBfU0lURV9NRVRIT0QgPSBnaXQKIAotR09MQU5HX0JPT1RTVFJBUF9SRUxFQVNFID0gMS40LjIKLUdPTEFOR19CT09UU1RSQVBfR09ST09UID0gJChIT1NUX0RJUikvdXNyL2xpYi9nb2xhbmctJChHT0xBTkdfQk9PVFNUUkFQX1JFTEVBU0UpCitHT0xBTkdfQk9PVFNUUkFQX0dPUk9PVCA9ICQoSE9TVF9ESVIpL3Vzci9saWIvZ29sYW5nLWJvb3RzdHJhcAogCiBpZmVxICgiYXJtIiwkKEJSMl9BUkNIKSkKIEdPTEFOR19CT09UU1RSQVBfR09BUkNIID0gYXJtCkBAIC0yNiw2ICsyNSw4IEBACiBkZWZpbmUgSE9TVF9HT0xBTkdfQk9PVFNUUkFQX0JVSUxEX0NNRFMKIAlleHBvcnQgUEFUSD0kKFRBUkdFVF9QQVRIKSA7IFwKIAljZCAiJChARCkvc3JjIiAmJiBcCisJR09CSU49IFwKKwlHT0VYRT0gXAogCUdPUEFUSD0gXAogCUdPUk9PVD0gXAogCUdPUk9PVF9GSU5BTD0iJChHT0xBTkdfQk9PVFNUUkFQX0dPUk9PVCkiIFwK