ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCAyOWYwOTNhLi45M2Q5ZDQ0IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC03NSw2ICs3NSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgUEVSU0lTVEVOVF9BQ1RJVklUWSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUEVSU0lTVEVOVF9BQ1RJVklUWSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST0NFU1NfT1VUR09JTkdfQ0FMTFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTEVOREFSIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9DQUxMX0xPRyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfQ09OVEFDVFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfRlJBTUVfQlVGRkVSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0ZSQU1FX0JVRkZFUiI7CkBAIC0xMjEsNiArMTIyLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0FLRV9MT0NLID0gImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9BUE5fU0VUVElOR1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0FQTl9TRVRUSU5HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTExfTE9HID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NPTlRBQ1RTID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DT05UQUNUUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9HU0VSVklDRVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0dTRVJWSUNFUyI7CkBAIC0yNjg2LDEzICsyNjg4LDIwIEBACiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBkZXByZWNhdGVkIGJvb2xlYW4gc2hvd0RpYWxvZyhpbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZShhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZyb21DaGlsZChhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZyb21DaGlsZChhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBhbmRyb2lkLm9zLkJ1bmRsZSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoYW5kcm9pZC5hcHAuRnJhZ21lbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoYW5kcm9pZC5hcHAuRnJhZ21lbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydEFjdGl2aXR5SWZOZWVkZWQoYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRBY3Rpdml0eUlmTmVlZGVkKGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlckZvclJlc3VsdChhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgaW50LCBpbnQpIHRocm93cyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXIsIGludCwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBpbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpIHRocm93cyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyRnJvbUNoaWxkKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgaW50LCBpbnQpIHRocm93cyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyRnJvbUNoaWxkKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgaW50LCBpbnQsIGFuZHJvaWQub3MuQnVuZGxlKSB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgZGVwcmVjYXRlZCB2b2lkIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRTZWFyY2goamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbiwgYW5kcm9pZC5vcy5CdW5kbGUsIGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgZGVwcmVjYXRlZCB2b2lkIHN0b3BNYW5hZ2luZ0N1cnNvcihhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHRha2VLZXlFdmVudHMoYm9vbGVhbik7CkBAIC0zMzE4LDcgKzMzMjcsOSBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGcmFnbWVudChhbmRyb2lkLmFwcC5GcmFnbWVudCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VXNlclZpc2libGVIaW50KGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoYW5kcm9pZC52aWV3LlZpZXcpOwogICB9CiAKQEAgLTUxNDcsOSArNTE1OCwxMiBAQAogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgZGVwcmVjYXRlZCB2b2lkIHNldFdhbGxwYXBlcihhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBkZXByZWNhdGVkIHZvaWQgc2V0V2FsbHBhcGVyKGphdmEuaW8uSW5wdXRTdHJlYW0pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEFjdGl2aXRpZXMoYW5kcm9pZC5jb250ZW50LkludGVudFtdKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRBY3Rpdml0aWVzKGFuZHJvaWQuY29udGVudC5JbnRlbnRbXSwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRJbnN0cnVtZW50YXRpb24oYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlciwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBpbnQsIGludCkgdGhyb3dzIGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlciwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBpbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpIHRocm93cyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBzdGFydFNlcnZpY2UoYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3BTZXJ2aWNlKGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmJpbmRTZXJ2aWNlKGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbik7CkBAIC01MjcyLDkgKzUyODYsMTIgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0V2FsbHBhcGVyKGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0V2FsbHBhcGVyKGphdmEuaW8uSW5wdXRTdHJlYW0pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXRpZXMoYW5kcm9pZC5jb250ZW50LkludGVudFtdKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKGFuZHJvaWQuY29udGVudC5JbnRlbnRbXSwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRJbnN0cnVtZW50YXRpb24oYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlciwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBpbnQsIGludCkgdGhyb3dzIGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlciwgYW5kcm9pZC5jb250ZW50LkludGVudCwgaW50LCBpbnQsIGludCwgYW5kcm9pZC5vcy5CdW5kbGUpIHRocm93cyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSBzdGFydFNlcnZpY2UoYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHN0b3BTZXJ2aWNlKGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1bmJpbmRTZXJ2aWNlKGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbik7CkBAIC0xMDg3NCw2ICsxMDg5MSw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoamF2YS5pby5GaWxlRGVzY3JpcHRvciwgbG9uZywgbG9uZykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldERpc3BsYXkoYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRMb29waW5nKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROZXh0TWVkaWFQbGF5ZXIoYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIoYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0T25Db21wbGV0aW9uTGlzdGVuZXIoYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE9uRXJyb3JMaXN0ZW5lcihhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcik7CkBAIC0xOTkyNCw5ICsxOTk0MiwxMiBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRXYWxscGFwZXIoYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRXYWxscGFwZXIoamF2YS5pby5JbnB1dFN0cmVhbSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdGllcyhhbmRyb2lkLmNvbnRlbnQuSW50ZW50W10pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXRpZXMoYW5kcm9pZC5jb250ZW50LkludGVudFtdLCBhbmRyb2lkLm9zLkJ1bmRsZSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoYW5kcm9pZC5jb250ZW50LkludGVudCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoYW5kcm9pZC5jb250ZW50LkludGVudCwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBzdGFydEluc3RydW1lbnRhdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQsIGludCwgaW50KSB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBpbnQsIGludCwgaW50LCBhbmRyb2lkLm9zLkJ1bmRsZSkgdGhyb3dzIGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbjsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIHN0YXJ0U2VydmljZShhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RvcFNlcnZpY2UoYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHVuYmluZFNlcnZpY2UoYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uKTsKQEAgLTI2MzU2LDYgKzI2Mzc3LDcgQEAKICAgICBjdG9yIHB1YmxpYyBFZGdlRWZmZWN0KGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZHJhdyhhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGZpbmlzaCgpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5SZWN0IGdldEJvdW5kcygpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uQWJzb3JiKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uUHVsbChmbG9hdCk7CkBAIC0yNjQ4Nyw2ICsyNjUwOSw3IEBACiAgICAgY3RvciBwdWJsaWMgRnJhbWVMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIGJvb2xlYW4gZ2V0Q29uc2lkZXJHb25lQ2hpbGRyZW5XaGVuTWVhc3VyaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEZvcmVncm91bmQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRGb3JlZ3JvdW5kR3Jhdml0eSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRNZWFzdXJlQWxsQ2hpbGRyZW4oKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiwgaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKQEAgLTI2NzE1LDYgKzI2NzM4LDcgQEAKICAgICBjdG9yIHB1YmxpYyBMaW5lYXJMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIExpbmVhckxheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4KCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERpdmlkZXJEcmF3YWJsZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldERpdmlkZXJQYWRkaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRTaG93RGl2aWRlcnMoKTsKQEAgLTI3MTM5LDYgKzI3MTYzLDcgQEAKICAgICBjdG9yIHB1YmxpYyBSZWxhdGl2ZUxheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CiAgICAgY3RvciBwdWJsaWMgUmVsYXRpdmVMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIFJlbGF0aXZlTGF5b3V0KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEdyYXZpdHkoKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiwgaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0R3Jhdml0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsR3Jhdml0eShpbnQpOwpkaWZmIC0tZ2l0IGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YSBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKaW5kZXggZGEzOGRmMS4uYzE1YzQ5ZiAxMDA2NDQKLS0tIGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQorKysgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCkBAIC01NywxNiArNTcsMTMgQEAKICAgICBwcml2YXRlIGludCBtTmV4dEFyZzsKICAgICBwcml2YXRlIFN0cmluZyBtQ3VyQXJnRGF0YTsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVidWdPcHRpb24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtU3RhcnRGbGFncyA9IDA7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0T3B0aW9uID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wT3B0aW9uID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9wZW5nbFRyYWNlT3B0aW9uID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGludCBtUmVwZWF0ID0gMDsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9maWxlRmlsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVByb2ZpbGVBdXRvU3RvcDsKIAogICAgIC8vIFRoZXNlIGFyZSBtYWdpYyBzdHJpbmdzIHVuZGVyc3Rvb2QgYnkgdGhlIEVjbGlwc2UgcGx1Z2luLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQVRBTF9FUlJPUl9DT0RFID0gIkVycm9yIHR5cGUgMSI7CkBAIC0xNTAsMTAgKzE0Nyw5IEBACiAgICAgICAgIEludGVudCBiYXNlSW50ZW50ID0gaW50ZW50OwogICAgICAgICBib29sZWFuIGhhc0ludGVudEluZm8gPSBmYWxzZTsKIAotICAgICAgICBtRGVidWdPcHRpb24gPSBmYWxzZTsKKyAgICAgICAgbVN0YXJ0RmxhZ3MgPSAwOwogICAgICAgICBtV2FpdE9wdGlvbiA9IGZhbHNlOwogICAgICAgICBtU3RvcE9wdGlvbiA9IGZhbHNlOwotICAgICAgICBtT3BlbmdsVHJhY2VPcHRpb24gPSBmYWxzZTsKICAgICAgICAgbVJlcGVhdCA9IDA7CiAgICAgICAgIG1Qcm9maWxlRmlsZSA9IG51bGw7CiAgICAgICAgIFVyaSBkYXRhID0gbnVsbDsKQEAgLTI5NywyMSArMjkzLDIxIEBACiAgICAgICAgICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGRhdGEsIHR5cGUpOwogICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLUQiKSkgewotICAgICAgICAgICAgICAgIG1EZWJ1Z09wdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgbVN0YXJ0RmxhZ3MgfD0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0ZMQUdfREVCVUc7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi1XIikpIHsKICAgICAgICAgICAgICAgICBtV2FpdE9wdGlvbiA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi1QIikpIHsKICAgICAgICAgICAgICAgICBtUHJvZmlsZUZpbGUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKLSAgICAgICAgICAgICAgICBtUHJvZmlsZUF1dG9TdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU3RhcnRGbGFncyB8PSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19BVVRPX1NUT1BfUFJPRklMRVI7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tc3RhcnQtcHJvZmlsZXIiKSkgewogICAgICAgICAgICAgICAgIG1Qcm9maWxlRmlsZSA9IG5leHRBcmdSZXF1aXJlZCgpOwotICAgICAgICAgICAgICAgIG1Qcm9maWxlQXV0b1N0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU3RhcnRGbGFncyAmPSB+QWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0ZMQUdfQVVUT19TVE9QX1BST0ZJTEVSOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItUiIpKSB7CiAgICAgICAgICAgICAgICAgbVJlcGVhdCA9IEludGVnZXIucGFyc2VJbnQobmV4dEFyZ1JlcXVpcmVkKCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItUyIpKSB7CiAgICAgICAgICAgICAgICAgbVN0b3BPcHRpb24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLW9wZW5nbC10cmFjZSIpKSB7Ci0gICAgICAgICAgICAgICAgbU9wZW5nbFRyYWNlT3B0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU3RhcnRGbGFncyB8PSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19PUEVOR0xfVFJBQ0VTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBVbmtub3duIG9wdGlvbjogIiArIG9wdCk7CiAgICAgICAgICAgICAgICAgc2hvd1VzYWdlKCk7CkBAIC00NTAsNjQgKzQ0Niw2MCBAQAogICAgICAgICAgICAgaW50IHJlczsKICAgICAgICAgICAgIGlmIChtV2FpdE9wdGlvbikgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1BbS5zdGFydEFjdGl2aXR5QW5kV2FpdChudWxsLCBpbnRlbnQsIG1pbWVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIDAsIG51bGwsIG51bGwsIDAsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z09wdGlvbiwgbU9wZW5nbFRyYWNlT3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9maWxlRmlsZSwgZmQsIG1Qcm9maWxlQXV0b1N0b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIDAsIG1TdGFydEZsYWdzLCBtUHJvZmlsZUZpbGUsIGZkLCBudWxsKTsKICAgICAgICAgICAgICAgICByZXMgPSByZXN1bHQucmVzdWx0OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXMgPSBtQW0uc3RhcnRBY3Rpdml0eShudWxsLCBpbnRlbnQsIG1pbWVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdPcHRpb24sIG1PcGVuZ2xUcmFjZU9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9maWxlRmlsZSwgZmQsIG1Qcm9maWxlQXV0b1N0b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgMCwgbVN0YXJ0RmxhZ3MsIG1Qcm9maWxlRmlsZSwgZmQsIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbVdhaXRPcHRpb24gPyBTeXN0ZW0ub3V0IDogU3lzdGVtLmVycjsKICAgICAgICAgICAgIGJvb2xlYW4gbGF1bmNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHN3aXRjaCAocmVzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1VDQ0VTUzoKICAgICAgICAgICAgICAgICAgICAgbGF1bmNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1dJVENIRVNfQ0FOQ0VMRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1dJVENIRVNfQ0FOQ0VMRUQ6CiAgICAgICAgICAgICAgICAgICAgIGxhdW5jaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IEFjdGl2aXR5IG5vdCBzdGFydGVkIGJlY2F1c2UgdGhlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY3VycmVudCBhY3Rpdml0eSBpcyBiZWluZyBrZXB0IGZvciB0aGUgdXNlci4iKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0RFTElWRVJFRF9UT19UT1A6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfREVMSVZFUkVEX1RPX1RPUDoKICAgICAgICAgICAgICAgICAgICAgbGF1bmNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogQWN0aXZpdHkgbm90IHN0YXJ0ZWQsIGludGVudCBoYXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlZW4gZGVsaXZlcmVkIHRvIGN1cnJlbnRseSBydW5uaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0b3AtbW9zdCBpbnN0YW5jZS4iKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1JFVFVSTl9JTlRFTlRfVE9fQ0FMTEVSOgorICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1JFVFVSTl9JTlRFTlRfVE9fQ0FMTEVSOgogICAgICAgICAgICAgICAgICAgICBsYXVuY2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCBiZWNhdXNlIGludGVudCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlciIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfVEFTS19UT19GUk9OVDoKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9UQVNLX1RPX0ZST05UOgogICAgICAgICAgICAgICAgICAgICBsYXVuY2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCwgaXRzIGN1cnJlbnQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRhc2sgaGFzIGJlZW4gYnJvdWdodCB0byB0aGUgZnJvbnQiKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0lOVEVOVF9OT1RfUkVTT0xWRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfSU5URU5UX05PVF9SRVNPTFZFRDoKICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBBY3Rpdml0eSBub3Qgc3RhcnRlZCwgdW5hYmxlIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXNvbHZlICIgKyBpbnRlbnQudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9DTEFTU19OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0xBU1NfTk9UX0ZPVU5EOgogICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihOT19DTEFTU19FUlJPUl9DT0RFKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIkVycm9yOiBBY3Rpdml0eSBjbGFzcyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0Q29tcG9uZW50KCkudG9TaG9ydFN0cmluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRk9SV0FSRF9BTkRfUkVRVUVTVF9DT05GTElDVDoKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9GT1JXQVJEX0FORF9SRVFVRVNUX0NPTkZMSUNUOgogICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6IEFjdGl2aXR5IG5vdCBzdGFydGVkLCB5b3UgcmVxdWVzdGVkIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJib3RoIGZvcndhcmQgYW5kIHJlY2VpdmUgaXRzIHJlc3VsdCIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ6CiAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogQWN0aXZpdHkgbm90IHN0YXJ0ZWQsIHlvdSBkbyBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgaXQuIik7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggZjI2NzQ3Yi4uZTQxYjY2NiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTQsOSArMTQsOSBAQAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAotICAgICAgICBleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCisJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2ltYWdlcyBcCiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC00MCw3ICs0MCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC02NCw3ICs2NCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC04OSw3ICs4OSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC0xMTMsNyArMTEzLDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtMTYyLDcgKzE2Miw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCmRpZmYgLS1naXQgYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9BbmRyb2lkLm1rIGIvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvQW5kcm9pZC5tawppbmRleCA3ZDA4YThjLi45ZjkyMzMwIDEwMDY0NAotLS0gYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L0FuZHJvaWQubWsKQEAgLTgsMTAgKzgsNyBAQAogbmF0aXZlID0gJChMT0NBTF9QQVRIKS8uLi8uLi8uLi8uLi9uYXRpdmUKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChiYXNlKS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZSBcCi0JJChiYXNlKS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAogCSQoYmFzZSkvc2VydmljZXMvc2Vuc29yc2VydmljZSBcCi0JJChiYXNlKS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAogCSQobmF0aXZlKS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlciBcCiAJJChKTklfSF9JTkNMVURFKQogCkBAIC0xOSw5ICsxNiw2IEBACiAJbGliYW5kcm9pZF9ydW50aW1lIFwKIAlsaWJzZW5zb3JzZXJ2aWNlIFwKIAlsaWJzdXJmYWNlZmxpbmdlciBcCi0JbGliYXVkaW9mbGluZ2VyIFwKLSAgICBsaWJjYW1lcmFzZXJ2aWNlIFwKLSAgICBsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAogICAgIGxpYmlucHV0IFwKIAlsaWJ1dGlscyBcCiAJbGliYmluZGVyIFwKZGlmZiAtLWdpdCBhL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L3N5c3RlbV9pbml0LmNwcCBiL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L3N5c3RlbV9pbml0LmNwcAppbmRleCBiZmJjMTM4Li43NDVjMzRhIDEwMDY0NAotLS0gYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9zeXN0ZW1faW5pdC5jcHAKKysrIGIvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvc3lzdGVtX2luaXQuY3BwCkBAIC0xNSwxMCArMTUsNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8U3VyZmFjZUZsaW5nZXIuaD4KLSNpbmNsdWRlIDxBdWRpb0ZsaW5nZXIuaD4KLSNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8TWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8U2Vuc29yU2VydmljZS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCmluZGV4IDBmMmFhNDYuLmRjMTJhY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCkBAIC0zMTY2LDQyICszMTY2LDYwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2FtZSBhcyBjYWxsaW5nIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCwgQnVuZGxlKX0KKyAgICAgKiB3aXRoIG5vIG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElmID49IDAsIHRoaXMgY29kZSB3aWxsIGJlIHJldHVybmVkIGluCisgICAgICogICAgICAgICAgICAgICAgICAgIG9uQWN0aXZpdHlSZXN1bHQoKSB3aGVuIHRoZSBhY3Rpdml0eSBleGl0cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKgorICAgICAqIEBzZWUgI3N0YXJ0QWN0aXZpdHkgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIHJlcXVlc3RDb2RlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMYXVuY2ggYW4gYWN0aXZpdHkgZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIGEgcmVzdWx0IHdoZW4gaXQgZmluaXNoZWQuCiAgICAgICogV2hlbiB0aGlzIGFjdGl2aXR5IGV4aXRzLCB5b3VyCiAgICAgICogb25BY3Rpdml0eVJlc3VsdCgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiByZXF1ZXN0Q29kZS4gCiAgICAgICogVXNpbmcgYSBuZWdhdGl2ZSByZXF1ZXN0Q29kZSBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIAogICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eX0gKHRoZSBhY3Rpdml0eSBpcyBub3QgbGF1bmNoZWQgYXMgYSBzdWItYWN0aXZpdHkpLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBJbnRlbnQgcHJvdG9jb2xzCiAgICAgICogdGhhdCBhcmUgZGVmaW5lZCB0byByZXR1cm4gYSByZXN1bHQuICBJbiBvdGhlciBwcm90b2NvbHMgKHN1Y2ggYXMKICAgICAgKiB7QGxpbmsgSW50ZW50I0FDVElPTl9NQUlOfSBvciB7QGxpbmsgSW50ZW50I0FDVElPTl9WSUVXfSksIHlvdSBtYXkKICAgICAgKiBub3QgZ2V0IHRoZSByZXN1bHQgd2hlbiB5b3UgZXhwZWN0LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhY3Rpdml0eSB5b3UKICAgICAgKiBhcmUgbGF1bmNoaW5nIHVzZXMgdGhlIHNpbmdsZVRhc2sgbGF1bmNoIG1vZGUsIGl0IHdpbGwgbm90IHJ1biBpbiB5b3VyCiAgICAgICogdGFzayBhbmQgdGh1cyB5b3Ugd2lsbCBpbW1lZGlhdGVseSByZWNlaXZlIGEgY2FuY2VsIHJlc3VsdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPkFzIGEgc3BlY2lhbCBjYXNlLCBpZiB5b3UgY2FsbCBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KCkgd2l0aCBhIHJlcXVlc3RDb2RlIAogICAgICAqID49IDAgZHVyaW5nIHRoZSBpbml0aWFsIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpL29uUmVzdW1lKCkgb2YgeW91cgogICAgICAqIGFjdGl2aXR5LCB0aGVuIHlvdXIgd2luZG93IHdpbGwgbm90IGJlIGRpc3BsYXllZCB1bnRpbCBhIHJlc3VsdCBpcyAKICAgICAgKiByZXR1cm5lZCBiYWNrIGZyb20gdGhlIHN0YXJ0ZWQgYWN0aXZpdHkuICBUaGlzIGlzIHRvIGF2b2lkIHZpc2libGUgCiAgICAgICogZmxpY2tlcmluZyB3aGVuIHJlZGlyZWN0aW5nIHRvIGFub3RoZXIgYWN0aXZpdHkuIAotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhpcyBtZXRob2QgdGhyb3dzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbn0KICAgICAgKiBpZiB0aGVyZSB3YXMgbm8gQWN0aXZpdHkgZm91bmQgdG8gcnVuIHRoZSBnaXZlbiBJbnRlbnQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCiAgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElmID49IDAsIHRoaXMgY29kZSB3aWxsIGJlIHJldHVybmVkIGluCiAgICAgICogICAgICAgICAgICAgICAgICAgIG9uQWN0aXZpdHlSZXN1bHQoKSB3aGVuIHRoZSBhY3Rpdml0eSBleGl0cy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvdyB0aGUgQWN0aXZpdHkgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICogTWF5IGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMuCisgICAgICoKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogCisgICAgICoKICAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5IAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGlmIChtUGFyZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CiAgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5leGVjU3RhcnRBY3Rpdml0eSgKICAgICAgICAgICAgICAgICAgICAgdGhpcywgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbVRva2VuLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICBpZiAoYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1NYWluVGhyZWFkLnNlbmRBY3Rpdml0eVJlc3VsdCgKICAgICAgICAgICAgICAgICAgICAgbVRva2VuLCBtRW1iZWRkZWRJRCwgcmVxdWVzdENvZGUsIGFyLmdldFJlc3VsdENvZGUoKSwKQEAgLTMyMTgsMTEgKzMyMzYsMzkgQEAKICAgICAgICAgICAgICAgICBtU3RhcnRlZEFjdGl2aXR5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QYXJlbnQuc3RhcnRBY3Rpdml0eUZyb21DaGlsZCh0aGlzLCBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGFyZW50LnN0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5vdGUgd2Ugd2FudCB0byBnbyB0aHJvdWdoIHRoaXMgbWV0aG9kIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCBtYXkgaGF2ZSBvdmVycmlkZGVuIGl0LgorICAgICAgICAgICAgICAgIG1QYXJlbnQuc3RhcnRBY3Rpdml0eUZyb21DaGlsZCh0aGlzLCBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LAorICAgICAqIEludGVudCwgaW50LCBpbnQsIGludCwgQnVuZGxlKX0gd2l0aCBubyBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUgSW50ZW50U2VuZGVyIHRvIGxhdW5jaC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgSWYgPj0gMCwgdGhpcyBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdCgpIHdoZW4gdGhlIGFjdGl2aXR5IGV4aXRzLgorICAgICAqIEBwYXJhbSBmaWxsSW5JbnRlbnQgSWYgbm9uLW51bGwsIHRoaXMgd2lsbCBiZSBwcm92aWRlZCBhcyB0aGUKKyAgICAgKiBpbnRlbnQgcGFyYW1ldGVyIHRvIHtAbGluayBJbnRlbnRTZW5kZXIjc2VuZEludGVudH0uCisgICAgICogQHBhcmFtIGZsYWdzTWFzayBJbnRlbnQgZmxhZ3MgaW4gdGhlIG9yaWdpbmFsIEludGVudFNlbmRlciB0aGF0IHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gY2hhbmdlLgorICAgICAqIEBwYXJhbSBmbGFnc1ZhbHVlcyBEZXNpcmVkIHZhbHVlcyBmb3IgYW55IGJpdHMgc2V0IGluCisgICAgICogPHZhcj5mbGFnc01hc2s8L3Zhcj4KKyAgICAgKiBAcGFyYW0gZXh0cmFGbGFncyBBbHdheXMgc2V0IHRvIDAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHQoSW50ZW50U2VuZGVyIGludGVudCwgaW50IHJlcXVlc3RDb2RlLAorICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncykKKyAgICAgICAgICAgIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KGludGVudCwgcmVxdWVzdENvZGUsIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLAorICAgICAgICAgICAgICAgIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LCBidXQgYWxsb3dpbmcgeW91CiAgICAgICogdG8gdXNlIGEgSW50ZW50U2VuZGVyIHRvIGRlc2NyaWJlIHRoZSBhY3Rpdml0eSB0byBiZSBzdGFydGVkLiAgSWYKICAgICAgKiB0aGUgSW50ZW50U2VuZGVyIGlzIGZvciBhbiBhY3Rpdml0eSwgdGhhdCBhY3Rpdml0eSB3aWxsIGJlIHN0YXJ0ZWQKQEAgLTMyNDEsMjEgKzMyODcsMjkgQEAKICAgICAgKiBAcGFyYW0gZmxhZ3NWYWx1ZXMgRGVzaXJlZCB2YWx1ZXMgZm9yIGFueSBiaXRzIHNldCBpbgogICAgICAqIDx2YXI+ZmxhZ3NNYXNrPC92YXI+CiAgICAgICogQHBhcmFtIGV4dHJhRmxhZ3MgQWx3YXlzIHNldCB0byAwLgorICAgICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG93IHRoZSBBY3Rpdml0eSBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgKiBNYXkgYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBJbnRlbnQgZmlsbEluSW50ZW50LCBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIGludCBleHRyYUZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQsIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywgaW50IGV4dHJhRmxhZ3MsCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1QYXJlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHRJbm5lcihpbnRlbnQsIHJlcXVlc3RDb2RlLCBmaWxsSW5JbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzaywgZmxhZ3NWYWx1ZXMsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCB0aGlzLCBvcHRpb25zKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QYXJlbnQuc3RhcnRJbnRlbnRTZW5kZXJGcm9tQ2hpbGQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgZmlsbEluSW50ZW50LCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzLCBvcHRpb25zKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdGUgd2Ugd2FudCB0byBnbyB0aHJvdWdoIHRoaXMgY2FsbCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAgICAvLyBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCBtYXkgaGF2ZSBvdmVycmlkZGVuIHRoZSBtZXRob2QuCiAgICAgICAgICAgICBtUGFyZW50LnN0YXJ0SW50ZW50U2VuZGVyRnJvbUNoaWxkKHRoaXMsIGludGVudCwgcmVxdWVzdENvZGUsCiAgICAgICAgICAgICAgICAgICAgIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLCBmbGFnc1ZhbHVlcywgZXh0cmFGbGFncyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHRJbm5lcihJbnRlbnRTZW5kZXIgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBJbnRlbnQgZmlsbEluSW50ZW50LCBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIEFjdGl2aXR5IGFjdGl2aXR5KQorICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBBY3Rpdml0eSBhY3Rpdml0eSwKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKQogICAgICAgICAgICAgdGhyb3dzIEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUgPSBudWxsOwpAQCAtMzI2Niw4ICszMzIwLDggQEAKICAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdHlJbnRlbnRTZW5kZXIobU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgaW50ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbEluSW50ZW50LCByZXNvbHZlZFR5cGUsIG1Ub2tlbiwgYWN0aXZpdHkubUVtYmVkZGVkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmxhZ3NNYXNrLCBmbGFnc1ZhbHVlcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBvcHRpb25zKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0NBTkNFTEVEKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24uY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgbnVsbCk7CkBAIC0zMjg2LDYgKzMzNDAsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjc3RhcnRBY3Rpdml0eShJbnRlbnQsIEJ1bmRsZSl9IHdpdGggbm8gb3B0aW9ucworICAgICAqIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKgorICAgICAqIEBzZWUge0BsaW5rICNzdGFydEFjdGl2aXR5KEludGVudCwgQnVuZGxlKX0KKyAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMYXVuY2ggYSBuZXcgYWN0aXZpdHkuICBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgd2hlbgogICAgICAqIHRoZSBhY3Rpdml0eSBleGl0cy4gIFRoaXMgaW1wbGVtZW50YXRpb24gb3ZlcnJpZGVzIHRoZSBiYXNlIHZlcnNpb24sCiAgICAgICogcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0CkBAIC0zMjk4LDE0ICszMzY4LDM5IEBACiAgICAgICogaWYgdGhlcmUgd2FzIG5vIEFjdGl2aXR5IGZvdW5kIHRvIHJ1biB0aGUgZ2l2ZW4gSW50ZW50LgogICAgICAqIAogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4gCisgICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciBob3cgdGhlIEFjdGl2aXR5IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAKKyAgICAgKgorICAgICAqIEBzZWUge0BsaW5rICNzdGFydEFjdGl2aXR5KEludGVudCl9CiAgICAgICogQHNlZSAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdCAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIC0xKTsKKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoaW50ZW50LCAtMSwgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3RlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaCB0aGlzIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zIHRoYXQgbWF5IGhhdmUgb3ZlcnJpZGRlbiB0aGUgbWV0aG9kLgorICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdGFydEFjdGl2aXRpZXMoSW50ZW50W10sIEJ1bmRsZSl9IHdpdGggbm8gb3B0aW9ucworICAgICAqIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnRzIFRoZSBpbnRlbnRzIHRvIHN0YXJ0LgorICAgICAqCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHNlZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdGllcyhJbnRlbnRbXSwgQnVuZGxlKX0KKyAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMpIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0aWVzKGludGVudHMsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzMyMSwyMiArMzQxNiwyMyBAQAogICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbnRlbnRzIFRoZSBpbnRlbnRzIHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG93IHRoZSBBY3Rpdml0eSBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgKiBNYXkgYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAgKgorICAgICAqIEBzZWUge0BsaW5rICNzdGFydEFjdGl2aXRpZXMoSW50ZW50W10pfQogICAgICAqIEBzZWUgI3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXRpZXMoSW50ZW50W10gaW50ZW50cykgeworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdGllcyhJbnRlbnRbXSBpbnRlbnRzLCBCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXRpZXModGhpcywgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwKLSAgICAgICAgICAgICAgICBtVG9rZW4sIHRoaXMsIGludGVudHMpOworICAgICAgICAgICAgICAgIG1Ub2tlbiwgdGhpcywgaW50ZW50cywgb3B0aW9ucyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0sIGJ1dCB0YWtpbmcgYSBJbnRlbnRTZW5kZXIKLSAgICAgKiB0byBzdGFydDsgc2VlCi0gICAgICoge0BsaW5rICNzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIsIGludCwgSW50ZW50LCBpbnQsIGludCwgaW50KX0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiBTYW1lIGFzIGNhbGxpbmcge0BsaW5rICNzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIsIEludGVudCwgaW50LCBpbnQsIGludCwgQnVuZGxlKX0KKyAgICAgKiB3aXRoIG5vIG9wdGlvbnMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGludGVudCBUaGUgSW50ZW50U2VuZGVyIHRvIGxhdW5jaC4KICAgICAgKiBAcGFyYW0gZmlsbEluSW50ZW50IElmIG5vbi1udWxsLCB0aGlzIHdpbGwgYmUgcHJvdmlkZWQgYXMgdGhlCkBAIC0zMzUwLDggKzM0NDYsNTggQEAKICAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LAogICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncykKICAgICAgICAgICAgIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KGludGVudCwgLTEsIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLAotICAgICAgICAgICAgICAgIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzKTsKKyAgICAgICAgc3RhcnRJbnRlbnRTZW5kZXIoaW50ZW50LCBmaWxsSW5JbnRlbnQsIGZsYWdzTWFzaywgZmxhZ3NWYWx1ZXMsCisgICAgICAgICAgICAgICAgZXh0cmFGbGFncywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHkoSW50ZW50LCBCdW5kbGUpfSwgYnV0IHRha2luZyBhIEludGVudFNlbmRlcgorICAgICAqIHRvIHN0YXJ0OyBzZWUKKyAgICAgKiB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQsIEJ1bmRsZSl9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBJbnRlbnRTZW5kZXIgdG8gbGF1bmNoLgorICAgICAqIEBwYXJhbSBmaWxsSW5JbnRlbnQgSWYgbm9uLW51bGwsIHRoaXMgd2lsbCBiZSBwcm92aWRlZCBhcyB0aGUKKyAgICAgKiBpbnRlbnQgcGFyYW1ldGVyIHRvIHtAbGluayBJbnRlbnRTZW5kZXIjc2VuZEludGVudH0uCisgICAgICogQHBhcmFtIGZsYWdzTWFzayBJbnRlbnQgZmxhZ3MgaW4gdGhlIG9yaWdpbmFsIEludGVudFNlbmRlciB0aGF0IHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gY2hhbmdlLgorICAgICAqIEBwYXJhbSBmbGFnc1ZhbHVlcyBEZXNpcmVkIHZhbHVlcyBmb3IgYW55IGJpdHMgc2V0IGluCisgICAgICogPHZhcj5mbGFnc01hc2s8L3Zhcj4KKyAgICAgKiBAcGFyYW0gZXh0cmFGbGFncyBBbHdheXMgc2V0IHRvIDAuCisgICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciBob3cgdGhlIEFjdGl2aXR5IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyKEludGVudFNlbmRlciBpbnRlbnQsCisgICAgICAgICAgICBJbnRlbnQgZmlsbEluSW50ZW50LCBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIGludCBleHRyYUZsYWdzLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KGludGVudCwgLTEsIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFnc1ZhbHVlcywgZXh0cmFGbGFncywgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3RlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaCB0aGlzIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zIHRoYXQgbWF5IGhhdmUgb3ZlcnJpZGRlbiB0aGUgbWV0aG9kLgorICAgICAgICAgICAgc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHQoaW50ZW50LCAtMSwgZmlsbEluSW50ZW50LCBmbGFnc01hc2ssCisgICAgICAgICAgICAgICAgICAgIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlJZk5lZWRlZChJbnRlbnQsIGludCwgQnVuZGxlKX0KKyAgICAgKiB3aXRoIG5vIG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElmID49IDAsIHRoaXMgY29kZSB3aWxsIGJlIHJldHVybmVkIGluCisgICAgICogICAgICAgICBvbkFjdGl2aXR5UmVzdWx0KCkgd2hlbiB0aGUgYWN0aXZpdHkgZXhpdHMsIGFzIGRlc2NyaWJlZCBpbgorICAgICAqICAgICAgICAge0BsaW5rICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSWYgYSBuZXcgYWN0aXZpdHkgd2FzIGxhdW5jaGVkIHRoZW4gdHJ1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlCisgICAgICogICAgICAgICBmYWxzZSBpcyByZXR1cm5lZCBhbmQgeW91IG11c3QgaGFuZGxlIHRoZSBJbnRlbnQgeW91cnNlbGYuCisgICAgICoKKyAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5CisgICAgICogQHNlZSAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0QWN0aXZpdHlJZk5lZWRlZChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0QWN0aXZpdHlJZk5lZWRlZChpbnRlbnQsIHJlcXVlc3RDb2RlLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzNzQsNiArMzUyMCw4IEBACiAgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElmID49IDAsIHRoaXMgY29kZSB3aWxsIGJlIHJldHVybmVkIGluCiAgICAgICogICAgICAgICBvbkFjdGl2aXR5UmVzdWx0KCkgd2hlbiB0aGUgYWN0aXZpdHkgZXhpdHMsIGFzIGRlc2NyaWJlZCBpbgogICAgICAqICAgICAgICAge0BsaW5rICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fS4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvdyB0aGUgQWN0aXZpdHkgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICogTWF5IGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMuCiAgICAgICogCiAgICAgICogQHJldHVybiBJZiBhIG5ldyBhY3Rpdml0eSB3YXMgbGF1bmNoZWQgdGhlbiB0cnVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UKICAgICAgKiAgICAgICAgIGZhbHNlIGlzIHJldHVybmVkIGFuZCB5b3UgbXVzdCBoYW5kbGUgdGhlIEludGVudCB5b3Vyc2VsZi4KQEAgLTMzODEsMTcgKzM1MjksMTcgQEAKICAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5CiAgICAgICogQHNlZSAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdAogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0QWN0aXZpdHlJZk5lZWRlZChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydEFjdGl2aXR5SWZOZWVkZWQoSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlLCBCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBpZiAobVBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9SRVRVUk5fSU5URU5UX1RPX0NBTExFUjsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVI7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludGVudC5zZXRBbGxvd0ZkcyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eShtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCwgaW50ZW50LnJlc29sdmVUeXBlSWZOZWVkZWQoZ2V0Q29udGVudFJlc29sdmVyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuLCBtRW1iZWRkZWRJRCwgcmVxdWVzdENvZGUsIHRydWUgLyogb25seUlmTmVlZGVkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub2tlbiwgbUVtYmVkZGVkSUQsIHJlcXVlc3RDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9GTEFHX09OTFlfSUZfTkVFREVELCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBFbXB0eQogICAgICAgICAgICAgfQpAQCAtMzQwOCw3ICszNTU2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBpcyBmaW5pc2hlZCwgbm8gbWF0dGVyIHdoYXQgaGFwcGVucyB0byBpdC4KICAgICAgICAgICAgICAgICBtU3RhcnRlZEFjdGl2aXR5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQgIT0gSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9SRVRVUk5fSU5URU5UX1RPX0NBTExFUjsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgIT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1JFVFVSTl9JTlRFTlRfVE9fQ0FMTEVSOwogICAgICAgICB9CiAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKApAQCAtMzQxNiw2ICszNTY0LDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2FtZSBhcyBjYWxsaW5nIHtAbGluayAjc3RhcnROZXh0TWF0Y2hpbmdBY3Rpdml0eShJbnRlbnQsIEJ1bmRsZSl9IHdpdGgKKyAgICAgKiBubyBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUgaW50ZW50IHRvIGRpc3BhdGNoIHRvIHRoZSBuZXh0IGFjdGl2aXR5LiAgRm9yCisgICAgICogY29ycmVjdCBiZWhhdmlvciwgdGhpcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBJbnRlbnQgdGhhdCBzdGFydGVkCisgICAgICogeW91ciBvd24gYWN0aXZpdHk7IHRoZSBvbmx5IGNoYW5nZXMgeW91IGNhbiBtYWtlIGFyZSB0byB0aGUgZXh0cmFzCisgICAgICogaW5zaWRlIG9mIGl0LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgd2FzIGFub3RoZXIgQWN0aXZpdHkKKyAgICAgKiB0byBzdGFydDogdHJ1ZSBpZiB0aGVyZSB3YXMgYSBuZXh0IGFjdGl2aXR5IHRvIHN0YXJ0LCBmYWxzZSBpZiB0aGVyZQorICAgICAqIHdhc24ndC4gIEluIGdlbmVyYWwsIGlmIHRydWUgaXMgcmV0dXJuZWQgeW91IHdpbGwgdGhlbiB3YW50IHRvIGNhbGwKKyAgICAgKiBmaW5pc2goKSBvbiB5b3Vyc2VsZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoaW50ZW50LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTcGVjaWFsIHZlcnNpb24gb2Ygc3RhcnRpbmcgYW4gYWN0aXZpdHksIGZvciB1c2Ugd2hlbiB5b3UgYXJlIHJlcGxhY2luZwogICAgICAqIG90aGVyIGFjdGl2aXR5IGNvbXBvbmVudHMuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGhhbmQgdGhlIEludGVudCBvZmYKICAgICAgKiB0byB0aGUgbmV4dCBBY3Rpdml0eSB0aGF0IGNhbiBoYW5kbGUgaXQuICBZb3UgdHlwaWNhbGx5IGNhbGwgdGhpcyBpbgpAQCAtMzQyNSwxOCArMzU5MSwyMCBAQAogICAgICAqIGNvcnJlY3QgYmVoYXZpb3IsIHRoaXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgSW50ZW50IHRoYXQgc3RhcnRlZAogICAgICAqIHlvdXIgb3duIGFjdGl2aXR5OyB0aGUgb25seSBjaGFuZ2VzIHlvdSBjYW4gbWFrZSBhcmUgdG8gdGhlIGV4dHJhcwogICAgICAqIGluc2lkZSBvZiBpdC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvdyB0aGUgQWN0aXZpdHkgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICogTWF5IGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMuCiAgICAgICogCiAgICAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgd2FzIGFub3RoZXIgQWN0aXZpdHkKICAgICAgKiB0byBzdGFydDogdHJ1ZSBpZiB0aGVyZSB3YXMgYSBuZXh0IGFjdGl2aXR5IHRvIHN0YXJ0LCBmYWxzZSBpZiB0aGVyZQogICAgICAqIHdhc24ndC4gIEluIGdlbmVyYWwsIGlmIHRydWUgaXMgcmV0dXJuZWQgeW91IHdpbGwgdGhlbiB3YW50IHRvIGNhbGwKICAgICAgKiBmaW5pc2goKSBvbiB5b3Vyc2VsZi4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KEludGVudCBpbnRlbnQsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGlmIChtUGFyZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFsbG93RmRzKGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAuc3RhcnROZXh0TWF0Y2hpbmdBY3Rpdml0eShtVG9rZW4sIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIC5zdGFydE5leHRNYXRjaGluZ0FjdGl2aXR5KG1Ub2tlbiwgaW50ZW50LCBvcHRpb25zKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gRW1wdHkKICAgICAgICAgICAgIH0KQEAgLTM0NDYsNyArMzYxNCwyNSBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAic3RhcnROZXh0TWF0Y2hpbmdBY3Rpdml0eSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBhIHRvcC1sZXZlbCBhY3Rpdml0eSIpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHksIEludGVudCwgaW50LCBCdW5kbGUpfQorICAgICAqIHdpdGggbm8gb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgYWN0aXZpdHkgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5CisgICAgICogQHNlZSAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHkgY2hpbGQsIEludGVudCBpbnRlbnQsCisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eUZyb21DaGlsZChjaGlsZCwgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNoaWxkIGFjdGl2aXR5IG9mIHRoaXMgb25lIGNhbGxzIGl0cyAKICAgICAgKiB7QGxpbmsgI3N0YXJ0QWN0aXZpdHl9IG9yIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdH0gbWV0aG9kLgpAQCAtMzQ1Niw3ICszNjQyLDkgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIGFjdGl2aXR5IG1ha2luZyB0aGUgY2FsbC4KICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCi0gICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuCisgICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciBob3cgdGhlIEFjdGl2aXR5IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgogICAgICAqIAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAgKiAKQEAgLTM0NjQsMTEgKzM2NTIsMTEgQEAKICAgICAgKiBAc2VlICNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHkgY2hpbGQsIEludGVudCBpbnRlbnQsIAotICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAogICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgY2hpbGQsCi0gICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CiAgICAgICAgIGlmIChhciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCiAgICAgICAgICAgICAgICAgbVRva2VuLCBjaGlsZC5tRW1iZWRkZWRJRCwgcmVxdWVzdENvZGUsCkBAIC0zNDc3LDYgKzM2NjUsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYW1lIGFzIGNhbGxpbmcge0BsaW5rICNzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KEZyYWdtZW50LCBJbnRlbnQsIGludCwgQnVuZGxlKX0KKyAgICAgKiB3aXRoIG5vIG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5CisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgSW50ZW50IGludGVudCwgCisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudChmcmFnbWVudCwgaW50ZW50LCByZXF1ZXN0Q29kZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIEZyYWdtZW50IGluIHRoaXMgYWN0aXZpdHkgY2FsbHMgaXRzIAogICAgICAqIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5fSBvciB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdH0KICAgICAgKiBtZXRob2QuCkBAIC0zNDg3LDYgKzM2OTMsOCBAQAogICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgbWFraW5nIHRoZSBjYWxsLgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KICAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG93IHRoZSBBY3Rpdml0eSBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgKiBNYXkgYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucy4KICAgICAgKiAKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCiAgICAgICogCkBAIC0zNDk0LDExICszNzAyLDExIEBACiAgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEludGVudCBpbnRlbnQsIAotICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAogICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgZnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CiAgICAgICAgIGlmIChhciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCiAgICAgICAgICAgICAgICAgbVRva2VuLCBmcmFnbWVudC5tV2hvLCByZXF1ZXN0Q29kZSwKQEAgLTM1MDcsNiArMzcxNSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhbWUgYXMgY2FsbGluZyB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRnJvbUNoaWxkKEFjdGl2aXR5LCBJbnRlbnRTZW5kZXIsCisgICAgICogaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQsIEJ1bmRsZSl9IHdpdGggbm8gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlckZyb21DaGlsZChBY3Rpdml0eSBjaGlsZCwgSW50ZW50U2VuZGVyIGludGVudCwKKyAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSwgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLAorICAgICAgICAgICAgaW50IGV4dHJhRmxhZ3MpCisgICAgICAgICAgICB0aHJvd3MgSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24geworICAgICAgICBzdGFydEludGVudFNlbmRlckZyb21DaGlsZChjaGlsZCwgaW50ZW50LCByZXF1ZXN0Q29kZSwgZmlsbEluSW50ZW50LAorICAgICAgICAgICAgICAgIGZsYWdzTWFzaywgZmxhZ3NWYWx1ZXMsIGV4dHJhRmxhZ3MsIG51bGwpOworICAgIH0KKworICAgIC8qKgogICAgICAqIExpa2Uge0BsaW5rICNzdGFydEFjdGl2aXR5RnJvbUNoaWxkKEFjdGl2aXR5LCBJbnRlbnQsIGludCl9LCBidXQKICAgICAgKiB0YWtpbmcgYSBJbnRlbnRTZW5kZXI7IHNlZQogICAgICAqIHtAbGluayAjc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHQoSW50ZW50U2VuZGVyLCBpbnQsIEludGVudCwgaW50LCBpbnQsIGludCl9CkBAIC0zNTE0LDEwICszNzM0LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXJGcm9tQ2hpbGQoQWN0aXZpdHkgY2hpbGQsIEludGVudFNlbmRlciBpbnRlbnQsCiAgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIEludGVudCBmaWxsSW5JbnRlbnQsIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywKLSAgICAgICAgICAgIGludCBleHRyYUZsYWdzKQorICAgICAgICAgICAgaW50IGV4dHJhRmxhZ3MsIEJ1bmRsZSBvcHRpb25zKQogICAgICAgICAgICAgdGhyb3dzIEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uIHsKICAgICAgICAgc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHRJbm5lcihpbnRlbnQsIHJlcXVlc3RDb2RlLCBmaWxsSW5JbnRlbnQsCi0gICAgICAgICAgICAgICAgZmxhZ3NNYXNrLCBmbGFnc1ZhbHVlcywgY2hpbGQpOworICAgICAgICAgICAgICAgIGZsYWdzTWFzaywgZmxhZ3NWYWx1ZXMsIGNoaWxkLCBvcHRpb25zKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM4NDMsNyArNDA2Myw3IEBACiAgICAgICAgICAgICBkYXRhLnNldEFsbG93RmRzKGZhbHNlKTsKICAgICAgICAgICAgIElJbnRlbnRTZW5kZXIgdGFyZ2V0ID0KICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmdldEludGVudFNlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQUNUSVZJVFlfUkVTVUxULCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQgPT0gbnVsbCA/IG1Ub2tlbiA6IG1QYXJlbnQubVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkSUQsIHJlcXVlc3RDb2RlLCBuZXcgSW50ZW50W10geyBkYXRhIH0sIG51bGwsIGZsYWdzKTsKICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgIT0gbnVsbCA/IG5ldyBQZW5kaW5nSW50ZW50KHRhcmdldCkgOiBudWxsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IDU5YzgwM2UuLmQwNTZiMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTU5LDYgKzU5LDE1NCBAQAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CiAKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgZm9yIElBY3Rpdml0eU1hbmFnZXIuc3RhcnRBY3Rpdml0eTogYW4gZXJyb3Igd2hlcmUgdGhlCisgICAgICogc3RhcnQgaGFkIHRvIGJlIGNhbmNlbGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQ0FOQ0VMRUQgPSAtNjsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBmb3IgSUFjdGl2aXR5TWFuYWdlci5zdGFydEFjdGl2aXR5OiBhbiBlcnJvciB3aGVyZSB0aGUKKyAgICAgKiB0aGluZyBiZWluZyBzdGFydGVkIGlzIG5vdCBhbiBhY3Rpdml0eS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX05PVF9BQ1RJVklUWSA9IC01OworCisgICAgLyoqCisgICAgICogUmVzdWx0IGZvciBJQWN0aXZpdHlNYW5hZ2VyLnN0YXJ0QWN0aXZpdHk6IGFuIGVycm9yIHdoZXJlIHRoZQorICAgICAqIGNhbGxlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc3RhcnQgdGhlIGFjdGl2aXR5LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQgPSAtNDsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBmb3IgSUFjdGl2aXR5TWFuYWdlci5zdGFydEFjdGl2aXR5OiBhbiBlcnJvciB3aGVyZSB0aGUKKyAgICAgKiBjYWxsZXIgaGFzIHJlcXVlc3RlZCBib3RoIHRvIGZvcndhcmQgYSByZXN1bHQgYW5kIHRvIHJlY2VpdmUKKyAgICAgKiBhIHJlc3VsdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0ZPUldBUkRfQU5EX1JFUVVFU1RfQ09ORkxJQ1QgPSAtMzsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBmb3IgSUFjdGl2aXR5TWFuYWdlci5zdGFydEFjdGl2aXR5OiBhbiBlcnJvciB3aGVyZSB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgY2xhc3MgaXMgbm90IGZvdW5kLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQ0xBU1NfTk9UX0ZPVU5EID0gLTI7CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgZm9yIElBY3Rpdml0eU1hbmFnZXIuc3RhcnRBY3Rpdml0eTogYW4gZXJyb3Igd2hlcmUgdGhlCisgICAgICogZ2l2ZW4gSW50ZW50IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBhY3Rpdml0eS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0lOVEVOVF9OT1RfUkVTT0xWRUQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBmb3IgSUFjdGl2aXR5TWFuYXFlci5zdGFydEFjdGl2aXR5OiB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQKKyAgICAgKiBzdWNjZXNzZnVsbHkgYXMgbm9ybWFsLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1VDQ0VTUyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgZm9yIElBY3Rpdml0eU1hbmFxZXIuc3RhcnRBY3Rpdml0eTogdGhlIGNhbGxlciBhc2tlZCB0aGF0IHRoZSBJbnRlbnQgbm90CisgICAgICogYmUgZXhlY3V0ZWQgaWYgaXQgaXMgdGhlIHJlY2lwaWVudCwgYW5kIHRoYXQgaXMgaW5kZWVkIHRoZSBjYXNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIgPSAxOworCisgICAgLyoqCisgICAgICogUmVzdWx0IGZvciBJQWN0aXZpdHlNYW5hcWVyLnN0YXJ0QWN0aXZpdHk6IGFjdGl2aXR5IHdhc24ndCByZWFsbHkgc3RhcnRlZCwgYnV0CisgICAgICogYSB0YXNrIHdhcyBzaW1wbHkgYnJvdWdodCB0byB0aGUgZm9yZWdyb3VuZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RBU0tfVE9fRlJPTlQgPSAyOworCisgICAgLyoqCisgICAgICogUmVzdWx0IGZvciBJQWN0aXZpdHlNYW5hcWVyLnN0YXJ0QWN0aXZpdHk6IGFjdGl2aXR5IHdhc24ndCByZWFsbHkgc3RhcnRlZCwgYnV0CisgICAgICogdGhlIGdpdmVuIEludGVudCB3YXMgZ2l2ZW4gdG8gdGhlIGV4aXN0aW5nIHRvcCBhY3Rpdml0eS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0RFTElWRVJFRF9UT19UT1AgPSAzOworCisgICAgLyoqCisgICAgICogUmVzdWx0IGZvciBJQWN0aXZpdHlNYW5hcWVyLnN0YXJ0QWN0aXZpdHk6IHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGJlY2F1c2UKKyAgICAgKiBhcHAgc3dpdGNoZXMgYXJlIHRlbXBvcmFyaWx5IGNhbmNlbGVkIHRvIGVuc3VyZSB0aGUgdXNlcidzIGxhc3QgcmVxdWVzdAorICAgICAqIChzdWNoIGFzIHByZXNzaW5nIGhvbWUpIGlzIHBlcmZvcm1lZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NXSVRDSEVTX0NBTkNFTEVEID0gNDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIElBY3Rpdml0eU1hbmFxZXIuc3RhcnRBY3Rpdml0eTogZG8gc3BlY2lhbCBzdGFydCBtb2RlIHdoZXJlCisgICAgICogYSBuZXcgYWN0aXZpdHkgaXMgbGF1bmNoZWQgb25seSBpZiBpdCBpcyBuZWVkZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9GTEFHX09OTFlfSUZfTkVFREVEID0gMTw8MDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIElBY3Rpdml0eU1hbmFxZXIuc3RhcnRBY3Rpdml0eTogbGF1bmNoIHRoZSBhcHAgZm9yCisgICAgICogZGVidWdnaW5nLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRkxBR19ERUJVRyA9IDE8PDE7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBJQWN0aXZpdHlNYW5hcWVyLnN0YXJ0QWN0aXZpdHk6IGxhdW5jaCB0aGUgYXBwIGZvcgorICAgICAqIE9wZW5HTCB0cmFjaW5nLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRkxBR19PUEVOR0xfVFJBQ0VTID0gMTw8MjsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIElBY3Rpdml0eU1hbmFxZXIuc3RhcnRBY3Rpdml0eTogaWYgdGhlIGFwcCBpcyBiZWluZworICAgICAqIGxhdW5jaGVkIGZvciBwcm9maWxpbmcsIGF1dG9tYXRpY2FsbHkgc3RvcCB0aGUgcHJvZmlsZXIgb25jZSBkb25lLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRkxBR19BVVRPX1NUT1BfUFJPRklMRVIgPSAxPDwzOworCisgICAgLyoqCisgICAgICogUmVzdWx0IGZvciBJQWN0aXZpdHlNYW5hcWVyLmJyb2FkY2FzdEludGVudDogc3VjY2VzcyEKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9TVUNDRVNTID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc3VsdCBmb3IgSUFjdGl2aXR5TWFuYXFlci5icm9hZGNhc3RJbnRlbnQ6IGF0dGVtcHQgdG8gYnJvYWRjYXN0CisgICAgICogYSBzdGlja3kgaW50ZW50IHdpdGhvdXQgYXBwcm9wcmlhdGUgcGVybWlzc2lvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9TVElDS1lfQ0FOVF9IQVZFX1BFUk1JU1NJT04gPSAtMTsKKworICAgIC8qKgorICAgICAqIFR5cGUgZm9yIElBY3Rpdml0eU1hbmFxZXIuZ2V0SW50ZW50U2VuZGVyOiB0aGlzIFBlbmRpbmdJbnRlbnQgaXMKKyAgICAgKiBmb3IgYSBzZW5kQnJvYWRjYXN0IG9wZXJhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQlJPQURDQVNUID0gMTsKKworICAgIC8qKgorICAgICAqIFR5cGUgZm9yIElBY3Rpdml0eU1hbmFxZXIuZ2V0SW50ZW50U2VuZGVyOiB0aGlzIFBlbmRpbmdJbnRlbnQgaXMKKyAgICAgKiBmb3IgYSBzdGFydEFjdGl2aXR5IG9wZXJhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQUNUSVZJVFkgPSAyOworCisgICAgLyoqCisgICAgICogVHlwZSBmb3IgSUFjdGl2aXR5TWFuYXFlci5nZXRJbnRlbnRTZW5kZXI6IHRoaXMgUGVuZGluZ0ludGVudCBpcworICAgICAqIGZvciBhbiBhY3Rpdml0eSByZXN1bHQgb3BlcmF0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQgPSAzOworCisgICAgLyoqCisgICAgICogVHlwZSBmb3IgSUFjdGl2aXR5TWFuYXFlci5nZXRJbnRlbnRTZW5kZXI6IHRoaXMgUGVuZGluZ0ludGVudCBpcworICAgICAqIGZvciBhIHN0YXJ0U2VydmljZSBvcGVyYXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFTlRfU0VOREVSX1NFUlZJQ0UgPSA0OworCiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCmluZGV4IDdkYWFmN2QuLjczMmQyMTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKQEAgLTExNywyMiArMTE3LDE4IEBACiAgICAgICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgYXBwID0gQXBwbGljYXRpb25UaHJlYWROYXRpdmUuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIFVyaVtdIGdyYW50ZWRVcmlQZXJtaXNzaW9ucyA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheShVcmkuQ1JFQVRPUik7Ci0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUgPSBkYXRhLnJlYWRJbnQoKTsKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKICAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8gPSBkYXRhLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgICAgYm9vbGVhbiBvbmx5SWZOZWVkZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IGRhdGEucmVhZEludCgpICE9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG9wZW5nbFRyYWNlID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIGludCBzdGFydEZsYWdzID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBTdHJpbmcgcHJvZmlsZUZpbGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCA9IGRhdGEucmVhZEludCgpICE9IDAKICAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlciA9IGRhdGEucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBCdW5kbGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpIDogbnVsbDsKICAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXR5KGFwcCwgaW50ZW50LCByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGdyYW50ZWRVcmlQZXJtaXNzaW9ucywgZ3JhbnRlZE1vZGUsIHJlc3VsdFRvLCByZXN1bHRXaG8sCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBvbmx5SWZOZWVkZWQsIGRlYnVnLCBvcGVuZ2xUcmFjZSwKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZpbGUsIHByb2ZpbGVGZCwgYXV0b1N0b3BQcm9maWxlcik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBzdGFydEZsYWdzLAorICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLCBvcHRpb25zKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE0NSwyMiArMTQxLDE4IEBACiAgICAgICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgYXBwID0gQXBwbGljYXRpb25UaHJlYWROYXRpdmUuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIFVyaVtdIGdyYW50ZWRVcmlQZXJtaXNzaW9ucyA9IGRhdGEuY3JlYXRlVHlwZWRBcnJheShVcmkuQ1JFQVRPUik7Ci0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUgPSBkYXRhLnJlYWRJbnQoKTsKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKICAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8gPSBkYXRhLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgICAgYm9vbGVhbiBvbmx5SWZOZWVkZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IGRhdGEucmVhZEludCgpICE9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG9wZW5nbFRyYWNlID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIGludCBzdGFydEZsYWdzID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBTdHJpbmcgcHJvZmlsZUZpbGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCA9IGRhdGEucmVhZEludCgpICE9IDAKICAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlciA9IGRhdGEucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBCdW5kbGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpIDogbnVsbDsKICAgICAgICAgICAgIFdhaXRSZXN1bHQgcmVzdWx0ID0gc3RhcnRBY3Rpdml0eUFuZFdhaXQoYXBwLCBpbnRlbnQsIHJlc29sdmVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBncmFudGVkTW9kZSwgcmVzdWx0VG8sIHJlc3VsdFdobywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIG9ubHlJZk5lZWRlZCwgZGVidWcsIG9wZW5nbFRyYWNlLAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLCBhdXRvU3RvcFByb2ZpbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG8sIHJlc3VsdFdobywgcmVxdWVzdENvZGUsIHN0YXJ0RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVGaWxlLCBwcm9maWxlRmQsIG9wdGlvbnMpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVzdWx0LndyaXRlVG9QYXJjZWwocmVwbHksIDApOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNzMsMTcgKzE2NSwxNSBAQAogICAgICAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkIGFwcCA9IEFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IEludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRUeXBlID0gZGF0YS5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoVXJpLkNSRUFUT1IpOwotICAgICAgICAgICAgaW50IGdyYW50ZWRNb2RlID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBJQmluZGVyIHJlc3VsdFRvID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CiAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvID0gZGF0YS5yZWFkU3RyaW5nKCk7ICAgIAogICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICBib29sZWFuIG9ubHlJZk5lZWRlZCA9IGRhdGEucmVhZEludCgpICE9IDA7Ci0gICAgICAgICAgICBib29sZWFuIGRlYnVnID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIGludCBzdGFydEZsYWdzID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMgPSBkYXRhLnJlYWRJbnQoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgID8gQnVuZGxlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKSA6IG51bGw7CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhcnRBY3Rpdml0eVdpdGhDb25maWcoYXBwLCBpbnRlbnQsIHJlc29sdmVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBncmFudGVkTW9kZSwgcmVzdWx0VG8sIHJlc3VsdFdobywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIG9ubHlJZk5lZWRlZCwgZGVidWcsIGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBzdGFydEZsYWdzLCBjb25maWcsIG9wdGlvbnMpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjA1LDkgKzE5NSwxMSBAQAogICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBpbnQgZmxhZ3NNYXNrID0gZGF0YS5yZWFkSW50KCk7CiAgICAgICAgICAgICBpbnQgZmxhZ3NWYWx1ZXMgPSBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IEJ1bmRsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSkgOiBudWxsOwogICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN0YXJ0QWN0aXZpdHlJbnRlbnRTZW5kZXIoYXBwLCBpbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgIGZpbGxJbkludGVudCwgcmVzb2x2ZWRUeXBlLCByZXN1bHRUbywgcmVzdWx0V2hvLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmxhZ3NNYXNrLCBmbGFnc1ZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBvcHRpb25zKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIxOCw3ICsyMTAsOSBAQAogICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICBJQmluZGVyIGNhbGxpbmdBY3Rpdml0eSA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOwogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IEludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoY2FsbGluZ0FjdGl2aXR5LCBpbnRlbnQpOworICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMgPSBkYXRhLnJlYWRJbnQoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgID8gQnVuZGxlLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKSA6IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoY2FsbGluZ0FjdGl2aXR5LCBpbnRlbnQsIG9wdGlvbnMpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQocmVzdWx0ID8gMSA6IDApOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMjMxLDkgKzEyMjUsMTEgQEAKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKICAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8gPSBkYXRhLnJlYWRTdHJpbmcoKTsgICAgCiAgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUgPSBkYXRhLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUlmTmVlZGVkID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIGludCBzdGFydEZsYWdzID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBCdW5kbGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpIDogbnVsbDsKICAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXR5SW5QYWNrYWdlKHVpZCwgaW50ZW50LCByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBvbmx5SWZOZWVkZWQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRUbywgcmVzdWx0V2hvLCByZXF1ZXN0Q29kZSwgc3RhcnRGbGFncywgb3B0aW9ucyk7CiAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS53cml0ZUludChyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNDEyLDcgKzE0MDgsMTAgQEAKICAgICAgICAgICAgIEludGVudFtdIGludGVudHMgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoSW50ZW50LkNSRUFUT1IpOwogICAgICAgICAgICAgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcyA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXRpZXNJblBhY2thZ2UodWlkLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCByZXN1bHRUbyk7CisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBCdW5kbGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpIDogbnVsbDsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXRpZXNJblBhY2thZ2UodWlkLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRUbywgb3B0aW9ucyk7CiAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS53cml0ZUludChyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNDI2LDcgKzE0MjUsMTAgQEAKICAgICAgICAgICAgIEludGVudFtdIGludGVudHMgPSBkYXRhLmNyZWF0ZVR5cGVkQXJyYXkoSW50ZW50LkNSRUFUT1IpOwogICAgICAgICAgICAgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcyA9IGRhdGEuY3JlYXRlU3RyaW5nQXJyYXkoKTsKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXRpZXMoYXBwLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCByZXN1bHRUbyk7CisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBCdW5kbGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpIDogbnVsbDsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBzdGFydEFjdGl2aXRpZXMoYXBwLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCByZXN1bHRUbywKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CiAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS53cml0ZUludChyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNjE4LDI1ICsxNjIwLDE5IEBACiAgICAgfQogCiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXR5KElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMsIGludCBncmFudGVkTW9kZSwKLSAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8sIFN0cmluZyByZXN1bHRXaG8sCi0gICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIGJvb2xlYW4gb25seUlmTmVlZGVkLAotICAgICAgICAgICAgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBvcGVuZ2xUcmFjZSwgU3RyaW5nIHByb2ZpbGVGaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwcm9maWxlRmQsCi0gICAgICAgICAgICBib29sZWFuIGF1dG9TdG9wUHJvZmlsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVHlwZSwgSUJpbmRlciByZXN1bHRUbywgU3RyaW5nIHJlc3VsdFdobywgaW50IHJlcXVlc3RDb2RlLAorICAgICAgICAgICAgaW50IHN0YXJ0RmxhZ3MsIFN0cmluZyBwcm9maWxlRmlsZSwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYWxsZXIgIT0gbnVsbCA/IGNhbGxlci5hc0JpbmRlcigpIDogbnVsbCk7CiAgICAgICAgIGludGVudC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHJlc29sdmVkVHlwZSk7Ci0gICAgICAgIGRhdGEud3JpdGVUeXBlZEFycmF5KGdyYW50ZWRVcmlQZXJtaXNzaW9ucywgMCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQoZ3JhbnRlZE1vZGUpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHJlc3VsdFRvKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZyhyZXN1bHRXaG8pOwogICAgICAgICBkYXRhLndyaXRlSW50KHJlcXVlc3RDb2RlKTsKLSAgICAgICAgZGF0YS53cml0ZUludChvbmx5SWZOZWVkZWQgPyAxIDogMCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQoZGVidWcgPyAxIDogMCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQob3BlbmdsVHJhY2UgPyAxIDogMCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQoc3RhcnRGbGFncyk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvZmlsZUZpbGUpOwogICAgICAgICBpZiAocHJvZmlsZUZkICE9IG51bGwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CkBAIC0xNjQ0LDcgKzE2NDAsMTIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludChhdXRvU3RvcFByb2ZpbGVyID8gMSA6IDApOworICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDEpOworICAgICAgICAgICAgb3B0aW9ucy53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQogICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFNUQVJUX0FDVElWSVRZX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKICAgICAgICAgaW50IHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQoKTsKQEAgLTE2NTMsMjUgKzE2NTQsMTkgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcHVibGljIFdhaXRSZXN1bHQgc3RhcnRBY3Rpdml0eUFuZFdhaXQoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUsIFVyaVtdIGdyYW50ZWRVcmlQZXJtaXNzaW9ucywgaW50IGdyYW50ZWRNb2RlLAotICAgICAgICAgICAgSUJpbmRlciByZXN1bHRUbywgU3RyaW5nIHJlc3VsdFdobywKLSAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSwgYm9vbGVhbiBvbmx5SWZOZWVkZWQsCi0gICAgICAgICAgICBib29sZWFuIGRlYnVnLCBib29sZWFuIG9wZW5nbFRyYWNlLCBTdHJpbmcgcHJvZmlsZUZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlLCBpbnQgc3RhcnRGbGFncywgU3RyaW5nIHByb2ZpbGVGaWxlLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcHJvZmlsZUZkLCBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbGxlciAhPSBudWxsID8gY2FsbGVyLmFzQmluZGVyKCkgOiBudWxsKTsKICAgICAgICAgaW50ZW50LndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocmVzb2x2ZWRUeXBlKTsKLSAgICAgICAgZGF0YS53cml0ZVR5cGVkQXJyYXkoZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCAwKTsKLSAgICAgICAgZGF0YS53cml0ZUludChncmFudGVkTW9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocmVzdWx0VG8pOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHJlc3VsdFdobyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQocmVxdWVzdENvZGUpOwotICAgICAgICBkYXRhLndyaXRlSW50KG9ubHlJZk5lZWRlZCA/IDEgOiAwKTsKLSAgICAgICAgZGF0YS53cml0ZUludChkZWJ1ZyA/IDEgOiAwKTsKLSAgICAgICAgZGF0YS53cml0ZUludChvcGVuZ2xUcmFjZSA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZUludChzdGFydEZsYWdzKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwcm9maWxlRmlsZSk7CiAgICAgICAgIGlmIChwcm9maWxlRmQgIT0gbnVsbCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKQEAgLTE2NzksNyArMTY3NCwxMiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKICAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50KGF1dG9TdG9wUHJvZmlsZXIgPyAxIDogMCk7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBvcHRpb25zLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CiAgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU1RBUlRfQUNUSVZJVFlfQU5EX1dBSVRfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICBXYWl0UmVzdWx0IHJlc3VsdCA9IFdhaXRSZXN1bHQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHJlcGx5KTsKQEAgLTE2ODgsMjQgKzE2ODgsMjYgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXR5V2l0aENvbmZpZyhJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVHlwZSwgVXJpW10gZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBpbnQgZ3JhbnRlZE1vZGUsCi0gICAgICAgICAgICBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLAotICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlLCBib29sZWFuIG9ubHlJZk5lZWRlZCwKLSAgICAgICAgICAgIGJvb2xlYW4gZGVidWcsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUsIElCaW5kZXIgcmVzdWx0VG8sIFN0cmluZyByZXN1bHRXaG8sCisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIGludCBzdGFydEZsYWdzLCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FsbGVyICE9IG51bGwgPyBjYWxsZXIuYXNCaW5kZXIoKSA6IG51bGwpOwogICAgICAgICBpbnRlbnQud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZyhyZXNvbHZlZFR5cGUpOwotICAgICAgICBkYXRhLndyaXRlVHlwZWRBcnJheShncmFudGVkVXJpUGVybWlzc2lvbnMsIDApOwotICAgICAgICBkYXRhLndyaXRlSW50KGdyYW50ZWRNb2RlKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihyZXN1bHRUbyk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocmVzdWx0V2hvKTsKICAgICAgICAgZGF0YS53cml0ZUludChyZXF1ZXN0Q29kZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQob25seUlmTmVlZGVkID8gMSA6IDApOwotICAgICAgICBkYXRhLndyaXRlSW50KGRlYnVnID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlSW50KHN0YXJ0RmxhZ3MpOwogICAgICAgICBjb25maWcud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG9wdGlvbnMud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KICAgICAgICAgbVJlbW90ZS50cmFuc2FjdChTVEFSVF9BQ1RJVklUWV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgIGludCByZXN1bHQgPSByZXBseS5yZWFkSW50KCk7CkBAIC0xNzE2LDcgKzE3MTgsNyBAQAogICAgIHB1YmxpYyBpbnQgc3RhcnRBY3Rpdml0eUludGVudFNlbmRlcihJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLAogICAgICAgICAgICAgSW50ZW50U2VuZGVyIGludGVudCwgSW50ZW50IGZpbGxJbkludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwKICAgICAgICAgICAgIElCaW5kZXIgcmVzdWx0VG8sIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwKLSAgICAgICAgICAgIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CkBAIC0xNzM0LDYgKzE3MzYsMTIgQEAKICAgICAgICAgZGF0YS53cml0ZUludChyZXF1ZXN0Q29kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQoZmxhZ3NNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludChmbGFnc1ZhbHVlcyk7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBvcHRpb25zLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CiAgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU1RBUlRfQUNUSVZJVFlfSU5URU5UX1NFTkRFUl9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgIGludCByZXN1bHQgPSByZXBseS5yZWFkSW50KCk7CkBAIC0xNzQyLDEyICsxNzUwLDE4IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoSUJpbmRlciBjYWxsaW5nQWN0aXZpdHksCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FsbGluZ0FjdGl2aXR5KTsKICAgICAgICAgaW50ZW50LndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBvcHRpb25zLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CiAgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU1RBUlRfTkVYVF9NQVRDSElOR19BQ1RJVklUWV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgIGludCByZXN1bHQgPSByZXBseS5yZWFkSW50KCk7CkBAIC0zMDc1LDcgKzMwODksNyBAQAogICAgIAogICAgIHB1YmxpYyBpbnQgc3RhcnRBY3Rpdml0eUluUGFja2FnZShpbnQgdWlkLAogICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgSUJpbmRlciByZXN1bHRUbywKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgYm9vbGVhbiBvbmx5SWZOZWVkZWQpCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGludCBzdGFydEZsYWdzLCBCdW5kbGUgb3B0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwpAQCAtMzA4Niw3ICszMTAwLDEzIEBACiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocmVzdWx0VG8pOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHJlc3VsdFdobyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQocmVxdWVzdENvZGUpOwotICAgICAgICBkYXRhLndyaXRlSW50KG9ubHlJZk5lZWRlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZUludChzdGFydEZsYWdzKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG9wdGlvbnMud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KICAgICAgICAgbVJlbW90ZS50cmFuc2FjdChTVEFSVF9BQ1RJVklUWV9JTl9QQUNLQUdFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKICAgICAgICAgaW50IHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQoKTsKQEAgLTMzMzksNyArMzM1OSw4IEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyBpbnQgc3RhcnRBY3Rpdml0aWVzKElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsCi0gICAgICAgICAgICBJbnRlbnRbXSBpbnRlbnRzLCBTdHJpbmdbXSByZXNvbHZlZFR5cGVzLCBJQmluZGVyIHJlc3VsdFRvKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8sCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOwpAQCAtMzM0Nyw2ICszMzY4LDEyIEBACiAgICAgICAgIGRhdGEud3JpdGVUeXBlZEFycmF5KGludGVudHMsIDApOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nQXJyYXkocmVzb2x2ZWRUeXBlcyk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocmVzdWx0VG8pOworICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDEpOworICAgICAgICAgICAgb3B0aW9ucy53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQogICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFNUQVJUX0FDVElWSVRJRVNfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICBpbnQgcmVzdWx0ID0gcmVwbHkucmVhZEludCgpOwpAQCAtMzM1Niw3ICszMzgzLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IHN0YXJ0QWN0aXZpdGllc0luUGFja2FnZShpbnQgdWlkLAotICAgICAgICAgICAgSW50ZW50W10gaW50ZW50cywgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcywgSUJpbmRlciByZXN1bHRUbykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnRlbnRbXSBpbnRlbnRzLCBTdHJpbmdbXSByZXNvbHZlZFR5cGVzLCBJQmluZGVyIHJlc3VsdFRvLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKQEAgLTMzNjQsNiArMzM5MiwxMiBAQAogICAgICAgICBkYXRhLndyaXRlVHlwZWRBcnJheShpbnRlbnRzLCAwKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZ0FycmF5KHJlc29sdmVkVHlwZXMpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHJlc3VsdFRvKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG9wdGlvbnMud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMCk7CisgICAgICAgIH0KICAgICAgICAgbVJlbW90ZS50cmFuc2FjdChTVEFSVF9BQ1RJVklUSUVTX0lOX1BBQ0tBR0VfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOwogICAgICAgICBpbnQgcmVzdWx0ID0gcmVwbHkucmVhZEludCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCAyNjEwZDg3Li4yYTNlMjEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtMTgwMiw3ICsxODAyLDcgQEAKICAgICAgICAgaWYgKGFJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbi5jaGVja1N0YXJ0QWN0aXZpdHlSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0xBU1NfTk9UX0ZPVU5ELCBpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0xBU1NfTk9UX0ZPVU5ELCBpbnRlbnQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhSW5mbzsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IGUzNDhiODcuLjcwNDNhNzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC04NTIsNiArODUyLDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGludGVudCwgQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgaWYgKChpbnRlbnQuZ2V0RmxhZ3MoKSZJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiQ2FsbGluZyBzdGFydEFjdGl2aXR5KCkgZnJvbSBvdXRzaWRlIG9mIGFuIEFjdGl2aXR5ICIKQEAgLTg2MCwxMSArODY1LDE2IEBACiAgICAgICAgIH0KICAgICAgICAgbU1haW5UaHJlYWQuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZXhlY1N0YXJ0QWN0aXZpdHkoCiAgICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwKLSAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnQsIC0xKTsKKyAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnQsIC0xLCBvcHRpb25zKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXRpZXMoSW50ZW50W10gaW50ZW50cykgeworICAgICAgICBzdGFydEFjdGl2aXRpZXMoaW50ZW50cywgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGlmICgoaW50ZW50c1swXS5nZXRGbGFncygpJkludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJDYWxsaW5nIHN0YXJ0QWN0aXZpdGllcygpIGZyb20gb3V0c2lkZSBvZiBhbiBBY3Rpdml0eSAiCkBAIC04NzMsMTMgKzg4MywyMCBAQAogICAgICAgICB9CiAgICAgICAgIG1NYWluVGhyZWFkLmdldEluc3RydW1lbnRhdGlvbigpLmV4ZWNTdGFydEFjdGl2aXRpZXMoCiAgICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwKLSAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnRzKTsKKyAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnRzLCBvcHRpb25zKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LAogICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncykKICAgICAgICAgICAgIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0SW50ZW50U2VuZGVyKGludGVudCwgZmlsbEluSW50ZW50LCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LCBJbnRlbnQgZmlsbEluSW50ZW50LAorICAgICAgICAgICAgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncywgQnVuZGxlIG9wdGlvbnMpCisgICAgICAgICAgICB0aHJvd3MgSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVHlwZSA9IG51bGw7CiAgICAgICAgICAgICBpZiAoZmlsbEluSW50ZW50ICE9IG51bGwpIHsKQEAgLTg4OSw4ICs5MDYsOCBAQAogICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkKICAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eUludGVudFNlbmRlcihtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBpbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsSW5JbnRlbnQsIHJlc29sdmVkVHlwZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZsYWdzTWFzaywgZmxhZ3NWYWx1ZXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0NBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBvcHRpb25zKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0NBTkNFTEVEKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24uY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgbnVsbCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCmluZGV4IDQ5MmZjYzcuLmRhZGM0ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCkBAIC05NjEsMjcgKzk2MSw1NSBAQAogICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbUxvYWRlcnNTdGFydGVkLCB0cnVlKTsKICAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0gb24gdGhlIGZyYWdtZW50J3MKICAgICAgKiBjb250YWluaW5nIEFjdGl2aXR5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGludGVudCkgeworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50LCBCdW5kbGUpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50LCBCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyB0aGlzICsgIiBub3QgYXR0YWNoZWQgdG8gQWN0aXZpdHkiKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCh0aGlzLCBpbnRlbnQsIC0xKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSwgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3RlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaCB0aGlzIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zIHRoYXQgbWF5IGhhdmUgb3ZlcnJpZGRlbiB0aGUgbWV0aG9kLgorICAgICAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCwgaW50KX0gb24gdGhlIGZyYWdtZW50J3MKICAgICAgKiBjb250YWluaW5nIEFjdGl2aXR5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoaW50ZW50LCByZXF1ZXN0Q29kZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCB7QGxpbmsgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCwgQnVuZGxlKX0gb24gdGhlIGZyYWdtZW50J3MKKyAgICAgKiBjb250YWluaW5nIEFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlLCBCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyB0aGlzICsgIiBub3QgYXR0YWNoZWQgdG8gQWN0aXZpdHkiKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZpdHkuc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCh0aGlzLCBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3RlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaCB0aGlzIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zIHRoYXQgbWF5IGhhdmUgb3ZlcnJpZGRlbiB0aGUgbWV0aG9kLgorICAgICAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSwgb3B0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBhY2ViZjU4Li45MzA2YmQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTUwLDU3ICs1MCwyNCBAQAogICoge0BoaWRlfQogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eU1hbmFnZXIgZXh0ZW5kcyBJSW50ZXJmYWNlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5lZCBieSBzdGFydEFjdGl2aXR5KCkgaWYgdGhlIHN0YXJ0IHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGJlY2F1c2UKLSAgICAgKiBhcHAgc3dpdGNoZXMgYXJlIHRlbXBvcmFyaWx5IGNhbmNlbGVkIHRvIGVuc3VyZSB0aGUgdXNlcidzIGxhc3QgcmVxdWVzdAotICAgICAqIChzdWNoIGFzIHByZXNzaW5nIGhvbWUpIGlzIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TV0lUQ0hFU19DQU5DRUxFRCA9IDQ7Ci0gICAgLyoqCi0gICAgICogUmV0dXJuZWQgYnkgc3RhcnRBY3Rpdml0eSgpIGlmIGFuIGFjdGl2aXR5IHdhc24ndCByZWFsbHkgc3RhcnRlZCwgYnV0Ci0gICAgICogdGhlIGdpdmVuIEludGVudCB3YXMgZ2l2ZW4gdG8gdGhlIGV4aXN0aW5nIHRvcCBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9ERUxJVkVSRURfVE9fVE9QID0gMzsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5lZCBieSBzdGFydEFjdGl2aXR5KCkgaWYgYW4gYWN0aXZpdHkgd2Fzbid0IHJlYWxseSBzdGFydGVkLCBidXQKLSAgICAgKiBhIHRhc2sgd2FzIHNpbXBseSBicm91Z2h0IHRvIHRoZSBmb3JlZ3JvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RBU0tfVE9fRlJPTlQgPSAyOwotICAgIC8qKgotICAgICAqIFJldHVybmVkIGJ5IHN0YXJ0QWN0aXZpdHkoKSBpZiB0aGUgY2FsbGVyIGFza2VkIHRoYXQgdGhlIEludGVudCBub3QKLSAgICAgKiBiZSBleGVjdXRlZCBpZiBpdCBpcyB0aGUgcmVjaXBpZW50LCBhbmQgdGhhdCBpcyBpbmRlZWQgdGhlIGNhc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIgPSAxOwotICAgIC8qKgotICAgICAqIEFjdGl2aXR5IHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBhcyBub3JtYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1VDQ0VTUyA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfSU5URU5UX05PVF9SRVNPTFZFRCA9IC0xOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0NMQVNTX05PVF9GT1VORCA9IC0yOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0ZPUldBUkRfQU5EX1JFUVVFU1RfQ09ORkxJQ1QgPSAtMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9QRVJNSVNTSU9OX0RFTklFRCA9IC00OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX05PVF9BQ1RJVklUWSA9IC01OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0NBTkNFTEVEID0gLTY7CiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXR5KElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMsCi0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUsIElCaW5kZXIgcmVzdWx0VG8sIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUlmTmVlZGVkLCBib29sZWFuIGRlYnVnLCBib29sZWFuIG9wZW5nbFRyYWNlLCBTdHJpbmcgcHJvZmlsZUZpbGUsCi0gICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwcm9maWxlRmQsIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIElCaW5kZXIgcmVzdWx0VG8sIFN0cmluZyByZXN1bHRXaG8sCisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUsIGludCBmbGFncywgU3RyaW5nIHByb2ZpbGVGaWxlLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcHJvZmlsZUZkLCBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgV2FpdFJlc3VsdCBzdGFydEFjdGl2aXR5QW5kV2FpdChJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLAotICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgVXJpW10gZ3JhbnRlZFVyaVBlcm1pc3Npb25zLAotICAgICAgICAgICAgaW50IGdyYW50ZWRNb2RlLCBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBib29sZWFuIG9ubHlJZk5lZWRlZCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBvcGVuZ2xUcmFjZSwgU3RyaW5nIHByb2ZpbGVGaWxlLAotICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcHJvZmlsZUZkLCBib29sZWFuIGF1dG9TdG9wUHJvZmlsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlLCBpbnQgZmxhZ3MsIFN0cmluZyBwcm9maWxlRmlsZSwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXR5V2l0aENvbmZpZyhJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLAotICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgVXJpW10gZ3JhbnRlZFVyaVBlcm1pc3Npb25zLAotICAgICAgICAgICAgaW50IGdyYW50ZWRNb2RlLCBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBib29sZWFuIG9ubHlJZk5lZWRlZCwgYm9vbGVhbiBkZWJ1ZywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlLCBpbnQgc3RhcnRGbGFncywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcsCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgaW50IHN0YXJ0QWN0aXZpdHlJbnRlbnRTZW5kZXIoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwKICAgICAgICAgICAgIEludGVudFNlbmRlciBpbnRlbnQsIEludGVudCBmaWxsSW5JbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsCiAgICAgICAgICAgICBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgICAgICAgICBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0TmV4dE1hdGNoaW5nQWN0aXZpdHkoSUJpbmRlciBjYWxsaW5nQWN0aXZpdHksCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgICAgICAgICAgSW50ZW50IGludGVudCwgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgcHVibGljIGJvb2xlYW4gZmluaXNoQWN0aXZpdHkoSUJpbmRlciB0b2tlbiwgaW50IGNvZGUsIEludGVudCBkYXRhKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgdm9pZCBmaW5pc2hTdWJBY3Rpdml0eShJQmluZGVyIHRva2VuLCBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CkBAIC0xMDksOCArNzYsNiBAQAogICAgICAgICAgICAgSUludGVudFJlY2VpdmVyIHJlY2VpdmVyLCBJbnRlbnRGaWx0ZXIgZmlsdGVyLAogICAgICAgICAgICAgU3RyaW5nIHJlcXVpcmVkUGVybWlzc2lvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVjZWl2ZXIoSUludGVudFJlY2VpdmVyIHJlY2VpdmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9TVUNDRVNTID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfU1RJQ0tZX0NBTlRfSEFWRV9QRVJNSVNTSU9OID0gLTE7CiAgICAgcHVibGljIGludCBicm9hZGNhc3RJbnRlbnQoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwgSW50ZW50IGludGVudCwKICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFR5cGUsIElJbnRlbnRSZWNlaXZlciByZXN1bHRUbywgaW50IHJlc3VsdENvZGUsCiAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0RGF0YSwgQnVuZGxlIG1hcCwgU3RyaW5nIHJlcXVpcmVkUGVybWlzc2lvbiwKQEAgLTIwMSwxMCArMTY2LDYgQEAKICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRBY3Rpdml0eUNsYXNzRm9yVG9rZW4oSUJpbmRlciB0b2tlbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VGb3JUb2tlbihJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URU5UX1NFTkRFUl9CUk9BRENBU1QgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQUNUSVZJVFkgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVOVF9TRU5ERVJfQUNUSVZJVFlfUkVTVUxUID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFTlRfU0VOREVSX1NFUlZJQ0UgPSA0OwogICAgIHB1YmxpYyBJSW50ZW50U2VuZGVyIGdldEludGVudFNlbmRlcihpbnQgdHlwZSwKICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgSUJpbmRlciB0b2tlbiwgU3RyaW5nIHJlc3VsdFdobywKICAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSwgSW50ZW50W10gaW50ZW50cywgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcywKQEAgLTMwMiw3ICsyNjMsNyBAQAogICAgIAogICAgIHB1YmxpYyBpbnQgc3RhcnRBY3Rpdml0eUluUGFja2FnZShpbnQgdWlkLAogICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgSUJpbmRlciByZXN1bHRUbywKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgYm9vbGVhbiBvbmx5SWZOZWVkZWQpCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGludCBzdGFydEZsYWdzLCBCdW5kbGUgb3B0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBraWxsQXBwbGljYXRpb25XaXRoVWlkKFN0cmluZyBwa2csIGludCB1aWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CkBAIC0zNDIsOSArMzAzLDExIEBACiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXRpZXMoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwKLSAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgICAgICAgICBJbnRlbnRbXSBpbnRlbnRzLCBTdHJpbmdbXSByZXNvbHZlZFR5cGVzLCBJQmluZGVyIHJlc3VsdFRvLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXRpZXNJblBhY2thZ2UoaW50IHVpZCwKLSAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgICAgICAgICBJbnRlbnRbXSBpbnRlbnRzLCBTdHJpbmdbXSByZXNvbHZlZFR5cGVzLCBJQmluZGVyIHJlc3VsdFRvLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKICAgICBwdWJsaWMgaW50IGdldEZyb250QWN0aXZpdHlTY3JlZW5Db21wYXRNb2RlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9udEFjdGl2aXR5U2NyZWVuQ29tcGF0TW9kZShpbnQgbW9kZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBhMzRlMWQzLi4xNjI5OWRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC0xMzQ2LDYgKzEzNDYsNyBAQAogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCiAgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElkZW50aWZpZXIgZm9yIHRoaXMgcmVxdWVzdCdzIHJlc3VsdDsgbGVzcyB0aGFuIHplcm8gCiAgICAgICogICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjYWxsZXIgaXMgbm90IGV4cGVjdGluZyBhIHJlc3VsdC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbiBvcHRpb25zLgogICAgICAqIAogICAgICAqIEByZXR1cm4gVG8gZm9yY2UgdGhlIHJldHVybiBvZiBhIHBhcnRpY3VsYXIgcmVzdWx0LCByZXR1cm4gYW4gCiAgICAgICogICAgICAgICBBY3Rpdml0eVJlc3VsdCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVzaXJlZCBkYXRhOyBvdGhlcndpc2UKQEAgLTEzNjEsNyArMTM2Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIEFjdGl2aXR5UmVzdWx0IGV4ZWNTdGFydEFjdGl2aXR5KAogICAgICAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgQWN0aXZpdHkgdGFyZ2V0LAotICAgICAgICAgICAgSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIElBcHBsaWNhdGlvblRocmVhZCB3aG9UaHJlYWQgPSAoSUFwcGxpY2F0aW9uVGhyZWFkKSBjb250ZXh0VGhyZWFkOwogICAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTM4Myw4ICsxMzg0LDggQEAKICAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdHkod2hvVGhyZWFkLCBpbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucmVzb2x2ZVR5cGVJZk5lZWRlZCh3aG8uZ2V0Q29udGVudFJlc29sdmVyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgdG9rZW4sIHRhcmdldCAhPSBudWxsID8gdGFyZ2V0Lm1FbWJlZGRlZElEIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubUVtYmVkZGVkSUQgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIDAsIG51bGwsIG51bGwsIG9wdGlvbnMpOwogICAgICAgICAgICAgY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgaW50ZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQpAQCAtMTQwMCw3ICsxNDAxLDcgQEAKICAgICAgKiB7QGhpZGV9CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1N0YXJ0QWN0aXZpdGllcyhDb250ZXh0IHdobywgSUJpbmRlciBjb250ZXh0VGhyZWFkLAotICAgICAgICAgICAgSUJpbmRlciB0b2tlbiwgQWN0aXZpdHkgdGFyZ2V0LCBJbnRlbnRbXSBpbnRlbnRzKSB7CisgICAgICAgICAgICBJQmluZGVyIHRva2VuLCBBY3Rpdml0eSB0YXJnZXQsIEludGVudFtdIGludGVudHMsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIElBcHBsaWNhdGlvblRocmVhZCB3aG9UaHJlYWQgPSAoSUFwcGxpY2F0aW9uVGhyZWFkKSBjb250ZXh0VGhyZWFkOwogICAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTQyNCw3ICsxNDI1LDcgQEAKICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGVzW2ldID0gaW50ZW50c1tpXS5yZXNvbHZlVHlwZUlmTmVlZGVkKHdoby5nZXRDb250ZW50UmVzb2x2ZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5zdGFydEFjdGl2aXRpZXMod2hvVGhyZWFkLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCB0b2tlbik7CisgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdGllcyh3aG9UaHJlYWQsIGludGVudHMsIHJlc29sdmVkVHlwZXMsIHRva2VuLCBvcHRpb25zKTsKICAgICAgICAgICAgIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChyZXN1bHQsIGludGVudHNbMF0pOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICB9CkBAIC0xNDU5LDcgKzE0NjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKICAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgRnJhZ21lbnQgdGFyZ2V0LAotICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlLCBCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgd2hvVGhyZWFkID0gKElBcHBsaWNhdGlvblRocmVhZCkgY29udGV4dFRocmVhZDsKICAgICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTE0ODEsOSArMTQ4Miw4IEBACiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQogICAgICAgICAgICAgICAgIC5zdGFydEFjdGl2aXR5KHdob1RocmVhZCwgaW50ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnJlc29sdmVUeXBlSWZOZWVkZWQod2hvLmdldENvbnRlbnRSZXNvbHZlcigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIDAsIHRva2VuLCB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5tV2hvIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmYWxzZSwgZmFsc2UgLyogZGVidWcgKi8sIGZhbHNlIC8qIG9wZW5nbFRyYWNlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHRhcmdldCAhPSBudWxsID8gdGFyZ2V0Lm1XaG8gOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIDAsIG51bGwsIG51bGwsIG9wdGlvbnMpOwogICAgICAgICAgICAgY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgaW50ZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgfQpAQCAtMTUwMiwxMyArMTUwMiwxMyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHN0YXRpYyB2b2lkIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChpbnQgcmVzLCBPYmplY3QgaW50ZW50KSB7Ci0gICAgICAgIGlmIChyZXMgPj0gSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTKSB7CisgICAgICAgIGlmIChyZXMgPj0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1NVQ0NFU1MpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgc3dpdGNoIChyZXMpIHsKLSAgICAgICAgICAgIGNhc2UgSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9JTlRFTlRfTk9UX1JFU09MVkVEOgotICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0NMQVNTX05PVF9GT1VORDoKKyAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0lOVEVOVF9OT1RfUkVTT0xWRUQ6CisgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9DTEFTU19OT1RfRk9VTkQ6CiAgICAgICAgICAgICAgICAgaWYgKGludGVudCBpbnN0YW5jZW9mIEludGVudCAmJiAoKEludGVudClpbnRlbnQpLmdldENvbXBvbmVudCgpICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBleHBsaWNpdCBhY3Rpdml0eSBjbGFzcyAiCkBAIC0xNTE2LDEzICsxNTE2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBoYXZlIHlvdSBkZWNsYXJlZCB0aGlzIGFjdGl2aXR5IGluIHlvdXIgQW5kcm9pZE1hbmlmZXN0LnhtbD8iKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJObyBBY3Rpdml0eSBmb3VuZCB0byBoYW5kbGUgIiArIGludGVudCk7Ci0gICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9QRVJNSVNTSU9OX0RFTklFRDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk5vdCBhbGxvd2VkIHRvIHN0YXJ0IGFjdGl2aXR5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZW50KTsKLSAgICAgICAgICAgIGNhc2UgSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9GT1JXQVJEX0FORF9SRVFVRVNUX0NPTkZMSUNUOgorICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRk9SV0FSRF9BTkRfUkVRVUVTVF9DT05GTElDVDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiRk9SV0FSRF9SRVNVTFRfRkxBRyB1c2VkIHdoaWxlIGFsc28gcmVxdWVzdGluZyBhIHJlc3VsdCIpOwotICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX05PVF9BQ1RJVklUWToKKyAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX05PVF9BQ1RJVklUWToKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIlBlbmRpbmdJbnRlbnQgaXMgbm90IGFuIGFjdGl2aXR5Iik7CiAgICAgICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9QZW5kaW5nSW50ZW50LmphdmEKaW5kZXggYzk1MDY2Yy4uNTcxOTJjMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1BlbmRpbmdJbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvUGVuZGluZ0ludGVudC5qYXZhCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgICAgIGludGVudC5zZXRBbGxvd0ZkcyhmYWxzZSk7CiAgICAgICAgICAgICBJSW50ZW50U2VuZGVyIHRhcmdldCA9CiAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5nZXRJbnRlbnRTZW5kZXIoCi0gICAgICAgICAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWSwgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcmVxdWVzdENvZGUsIG5ldyBJbnRlbnRbXSB7IGludGVudCB9LAogICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgIT0gbnVsbCA/IG5ldyBTdHJpbmdbXSB7IHJlc29sdmVkVHlwZSB9IDogbnVsbCwgZmxhZ3MpOwogICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gbmV3IFBlbmRpbmdJbnRlbnQodGFyZ2V0KSA6IG51bGw7CkBAIC0yNTYsNyArMjU2LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElJbnRlbnRTZW5kZXIgdGFyZ2V0ID0KICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmdldEludGVudFNlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQUNUSVZJVFksIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCByZXF1ZXN0Q29kZSwgaW50ZW50cywgcmVzb2x2ZWRUeXBlcywgZmxhZ3MpOwogICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gbmV3IFBlbmRpbmdJbnRlbnQodGFyZ2V0KSA6IG51bGw7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgICAgIGludGVudC5zZXRBbGxvd0ZkcyhmYWxzZSk7CiAgICAgICAgICAgICBJSW50ZW50U2VuZGVyIHRhcmdldCA9CiAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5nZXRJbnRlbnRTZW5kZXIoCi0gICAgICAgICAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9CUk9BRENBU1QsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9CUk9BRENBU1QsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCByZXF1ZXN0Q29kZSwgbmV3IEludGVudFtdIHsgaW50ZW50IH0sCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSAhPSBudWxsID8gbmV3IFN0cmluZ1tdIHsgcmVzb2x2ZWRUeXBlIH0gOiBudWxsLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9IG51bGwgPyBuZXcgUGVuZGluZ0ludGVudCh0YXJnZXQpIDogbnVsbDsKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgICAgICAgICAgaW50ZW50LnNldEFsbG93RmRzKGZhbHNlKTsKICAgICAgICAgICAgIElJbnRlbnRTZW5kZXIgdGFyZ2V0ID0KICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmdldEludGVudFNlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX1NFUlZJQ0UsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9TRVJWSUNFLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcmVxdWVzdENvZGUsIG5ldyBJbnRlbnRbXSB7IGludGVudCB9LAogICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgIT0gbnVsbCA/IG5ldyBTdHJpbmdbXSB7IHJlc29sdmVkVHlwZSB9IDogbnVsbCwgZmxhZ3MpOwogICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gbmV3IFBlbmRpbmdJbnRlbnQodGFyZ2V0KSA6IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQppbmRleCBlYjgzZGJjLi40YjMxNTUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQnVsa0N1cnNvckRlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5CdWxrQ3Vyc29yTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTExMywyMCArMTE0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvciBhZGFwdG9yID0gbmV3IEN1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciwgb2JzZXJ2ZXIsIGdldFByb3ZpZGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYmluZGVyID0gYWRhcHRvci5hc0JpbmRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYWRhcHRvci5jb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5maW5kUm93SWRDb2x1bW5JbmRleCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5nZXRDb2x1bW5OYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gd2FudHNBbGxPbk1vdmVDYWxscyA9IGFkYXB0b3IuZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVsa0N1cnNvckRlc2NyaXB0b3IgZCA9IGFkYXB0b3IuZ2V0QnVsa0N1cnNvckRlc2NyaXB0b3IoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJvbmdCaW5kZXIoYmluZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHdhbnRzQWxsT25Nb3ZlQ2FsbHMgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQud3JpdGVUb1BhcmNlbChyZXBseSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZVN0cm9uZ0JpbmRlcihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDApOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zNjksMTIgKzM2NCw5IEBACiAKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOwogCi0gICAgICAgICAgICBJQnVsa0N1cnNvciBidWxrQ3Vyc29yID0gQnVsa0N1cnNvck5hdGl2ZS5hc0ludGVyZmFjZShyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGJ1bGtDdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByb3dDb3VudCA9IHJlcGx5LnJlYWRJbnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgaWRDb2x1bW5Qb3NpdGlvbiA9IHJlcGx5LnJlYWRJbnQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHdhbnRzQWxsT25Nb3ZlQ2FsbHMgPSByZXBseS5yZWFkSW50KCkgIT0gMDsKLSAgICAgICAgICAgICAgICBhZGFwdG9yLmluaXRpYWxpemUoYnVsa0N1cnNvciwgcm93Q291bnQsIGlkQ29sdW1uUG9zaXRpb24sIHdhbnRzQWxsT25Nb3ZlQ2FsbHMpOworICAgICAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQnVsa0N1cnNvckRlc2NyaXB0b3IgZCA9IEJ1bGtDdXJzb3JEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5pbml0aWFsaXplKGQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhZGFwdG9yLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYWRhcHRvciA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCmluZGV4IDBlOWUyNTYuLjE5YTViYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCkBAIC04MTgsNiArODE4LDE5IEBACiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJXYWxscGFwZXIoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjc3RhcnRBY3Rpdml0eShJbnRlbnQsIEJ1bmRsZSl9IHdpdGggbm8gb3B0aW9ucworICAgICAqIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpdml0eSB0byBzdGFydC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHNlZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHkoSW50ZW50LCBCdW5kbGUpfQorICAgICAqIEBzZWUgUGFja2FnZU1hbmFnZXIjcmVzb2x2ZUFjdGl2aXR5CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50KTsKKworICAgIC8qKgogICAgICAqIExhdW5jaCBhIG5ldyBhY3Rpdml0eS4gIFlvdSB3aWxsIG5vdCByZWNlaXZlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB3aGVuCiAgICAgICogdGhlIGFjdGl2aXR5IGV4aXRzLgogICAgICAqCkBAIC04MzIsMTIgKzg0NSwyOCBAQAogICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpdml0eSB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvdyB0aGUgQWN0aXZpdHkgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICogTWF5IGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAgKgorICAgICAqIEBzZWUge0BsaW5rICNzdGFydEFjdGl2aXR5KEludGVudCl9CiAgICAgICogQHNlZSBQYWNrYWdlTWFuYWdlciNyZXNvbHZlQWN0aXZpdHkKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGludGVudCwgQnVuZGxlIG9wdGlvbnMpOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3N0YXJ0QWN0aXZpdGllcyhJbnRlbnRbXSwgQnVuZGxlKX0gd2l0aCBubyBvcHRpb25zCisgICAgICogc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudHMgQW4gYXJyYXkgb2YgSW50ZW50cyB0byBiZSBzdGFydGVkLgorICAgICAqCisgICAgICogQHRocm93cyBBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAc2VlIHtAbGluayAjc3RhcnRBY3Rpdml0aWVzKEludGVudFtdLCBCdW5kbGUpfQorICAgICAqIEBzZWUgUGFja2FnZU1hbmFnZXIjcmVzb2x2ZUFjdGl2aXR5CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMpOwogCiAgICAgLyoqCiAgICAgICogTGF1bmNoIG11bHRpcGxlIG5ldyBhY3Rpdml0aWVzLiAgVGhpcyBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgY2FsbGluZwpAQCAtODU0LDE1ICs4ODMsMzggQEAKICAgICAgKiBsaXN0IG1heSBiZSBvbiBpdCwgc29tZSBub3QpLCBzbyB5b3UgcHJvYmFibHkgd2FudCB0byBhdm9pZCBzdWNoIHNpdHVhdGlvbnMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50cyBBbiBhcnJheSBvZiBJbnRlbnRzIHRvIGJlIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciBob3cgdGhlIEFjdGl2aXR5IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgogICAgICAqCiAgICAgICogQHRocm93cyBBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCiAgICAgICoKKyAgICAgKiBAc2VlIHtAbGluayAjc3RhcnRBY3Rpdml0aWVzKEludGVudFtdKX0KICAgICAgKiBAc2VlIFBhY2thZ2VNYW5hZ2VyI3Jlc29sdmVBY3Rpdml0eQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0QWN0aXZpdGllcyhJbnRlbnRbXSBpbnRlbnRzKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEFjdGl2aXRpZXMoSW50ZW50W10gaW50ZW50cywgQnVuZGxlIG9wdGlvbnMpOwogCiAgICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0sIGJ1dCB0YWtpbmcgYSBJbnRlbnRTZW5kZXIKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjc3RhcnRJbnRlbnRTZW5kZXIoSW50ZW50U2VuZGVyLCBJbnRlbnQsIGludCwgaW50LCBpbnQsIEJ1bmRsZSl9CisgICAgICogd2l0aCBubyBvcHRpb25zIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIEludGVudFNlbmRlciB0byBsYXVuY2guCisgICAgICogQHBhcmFtIGZpbGxJbkludGVudCBJZiBub24tbnVsbCwgdGhpcyB3aWxsIGJlIHByb3ZpZGVkIGFzIHRoZQorICAgICAqIGludGVudCBwYXJhbWV0ZXIgdG8ge0BsaW5rIEludGVudFNlbmRlciNzZW5kSW50ZW50fS4KKyAgICAgKiBAcGFyYW0gZmxhZ3NNYXNrIEludGVudCBmbGFncyBpbiB0aGUgb3JpZ2luYWwgSW50ZW50U2VuZGVyIHRoYXQgeW91CisgICAgICogd291bGQgbGlrZSB0byBjaGFuZ2UuCisgICAgICogQHBhcmFtIGZsYWdzVmFsdWVzIERlc2lyZWQgdmFsdWVzIGZvciBhbnkgYml0cyBzZXQgaW4KKyAgICAgKiA8dmFyPmZsYWdzTWFzazwvdmFyPgorICAgICAqIEBwYXJhbSBleHRyYUZsYWdzIEFsd2F5cyBzZXQgdG8gMC4KKyAgICAgKgorICAgICAqIEBzZWUgI3N0YXJ0QWN0aXZpdHkoSW50ZW50KQorICAgICAqIEBzZWUgI3N0YXJ0SW50ZW50U2VuZGVyKEludGVudFNlbmRlciwgSW50ZW50LCBpbnQsIGludCwgaW50LCBCdW5kbGUpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoSW50ZW50U2VuZGVyIGludGVudCwKKyAgICAgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQsIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywgaW50IGV4dHJhRmxhZ3MpCisgICAgICAgICAgICB0aHJvd3MgSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eShJbnRlbnQsIEJ1bmRsZSl9LCBidXQgdGFraW5nIGEgSW50ZW50U2VuZGVyCiAgICAgICogdG8gc3RhcnQuICBJZiB0aGUgSW50ZW50U2VuZGVyIGlzIGZvciBhbiBhY3Rpdml0eSwgdGhhdCBhY3Rpdml0eSB3aWxsIGJlIHN0YXJ0ZWQKICAgICAgKiBhcyBpZiB5b3UgaGFkIGNhbGxlZCB0aGUgcmVndWxhciB7QGxpbmsgI3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0KICAgICAgKiBoZXJlOyBvdGhlcndpc2UsIGl0cyBhc3NvY2lhdGVkIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIChzdWNoIGFzCkBAIC04NzcsMTAgKzkyOSwxNSBAQAogICAgICAqIEBwYXJhbSBmbGFnc1ZhbHVlcyBEZXNpcmVkIHZhbHVlcyBmb3IgYW55IGJpdHMgc2V0IGluCiAgICAgICogPHZhcj5mbGFnc01hc2s8L3Zhcj4KICAgICAgKiBAcGFyYW0gZXh0cmFGbGFncyBBbHdheXMgc2V0IHRvIDAuCisgICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIGZvciBob3cgdGhlIEFjdGl2aXR5IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgorICAgICAqCisgICAgICogQHNlZSAjc3RhcnRBY3Rpdml0eShJbnRlbnQsIEJ1bmRsZSkKKyAgICAgKiBAc2VlICNzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIsIEludGVudCwgaW50LCBpbnQsIGludCkKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LAotICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncykKLSAgICAgICAgICAgIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQsIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywgaW50IGV4dHJhRmxhZ3MsCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgdGhyb3dzIEludGVudFNlbmRlci5TZW5kSW50ZW50RXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IHRoZSBnaXZlbiBpbnRlbnQgdG8gYWxsIGludGVyZXN0ZWQgQnJvYWRjYXN0UmVjZWl2ZXJzLiAgVGhpcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCmluZGV4IDViYTlkY2MuLjZiOTUwZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKQEAgLTI3NywxNyArMjc3LDM1IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50LCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBtQmFzZS5zdGFydEFjdGl2aXR5KGludGVudCwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMpIHsKICAgICAgICAgbUJhc2Uuc3RhcnRBY3Rpdml0aWVzKGludGVudHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdGllcyhJbnRlbnRbXSBpbnRlbnRzLCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBtQmFzZS5zdGFydEFjdGl2aXRpZXMoaW50ZW50cywgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRJbnRlbnRTZW5kZXIoSW50ZW50U2VuZGVyIGludGVudCwKICAgICAgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQsIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywgaW50IGV4dHJhRmxhZ3MpCiAgICAgICAgICAgICB0aHJvd3MgSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24gewogICAgICAgICBtQmFzZS5zdGFydEludGVudFNlbmRlcihpbnRlbnQsIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLAogICAgICAgICAgICAgICAgIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LAorICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncywKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB0aHJvd3MgSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24geworICAgICAgICBtQmFzZS5zdGFydEludGVudFNlbmRlcihpbnRlbnQsIGZpbGxJbkludGVudCwgZmxhZ3NNYXNrLAorICAgICAgICAgICAgICAgIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzLCBvcHRpb25zKTsKKyAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQppbmRleCBiMjhlZDhkLi5kZDY2OTJjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKQEAgLTMzLDEwICszMywzOSBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Vyc29yIGltcGxlbWVudHMgQ3Jvc3NQcm9jZXNzQ3Vyc29yIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1cnNvciI7CiAKLSAgICBEYXRhU2V0T2JzZXJ2YWJsZSBtRGF0YVNldE9ic2VydmFibGUgPSBuZXcgRGF0YVNldE9ic2VydmFibGUoKTsKLSAgICBDb250ZW50T2JzZXJ2YWJsZSBtQ29udGVudE9ic2VydmFibGUgPSBuZXcgQ29udGVudE9ic2VydmFibGUoKTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5ldmVyIHVwZGF0ZWQgYnkgdGhpcyBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcDxMb25nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBtVXBkYXRlZFJvd3M7CiAKLSAgICBCdW5kbGUgbUV4dHJhcyA9IEJ1bmRsZS5FTVBUWTsKKyAgICBwcm90ZWN0ZWQgaW50IG1Qb3M7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG11c3QgYmUgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgcm93IElEIGNvbHVtbiBieSBhbnkKKyAgICAgKiBzdWJjbGFzcyB0aGF0IHdpc2hlcyB0byBzdXBwb3J0IHVwZGF0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleDsKKworICAgIC8qKgorICAgICAqIElmIHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGlzIG5vdCAtMSB0aGlzIGNvbnRhaW5zIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZgorICAgICAqIHRoZSBjb2x1bW4gYXQge0BsaW5rICNtUm93SWRDb2x1bW5JbmRleH0gZm9yIHRoZSBjdXJyZW50IHJvdyB0aGlzIGN1cnNvciBpcworICAgICAqIHBvaW50aW5nIGF0LgorICAgICAqLworICAgIHByb3RlY3RlZCBMb25nIG1DdXJyZW50Um93SUQ7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2xvc2VkOworICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICBwcml2YXRlIFVyaSBtTm90aWZ5VXJpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVNlbGZPYnNlcnZlckxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBDb250ZW50T2JzZXJ2ZXIgbVNlbGZPYnNlcnZlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGZPYnNlcnZlclJlZ2lzdGVyZWQ7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZhYmxlIG1EYXRhU2V0T2JzZXJ2YWJsZSA9IG5ldyBEYXRhU2V0T2JzZXJ2YWJsZSgpOworICAgIHByaXZhdGUgQ29udGVudE9ic2VydmFibGUgbUNvbnRlbnRPYnNlcnZhYmxlID0gbmV3IENvbnRlbnRPYnNlcnZhYmxlKCk7CisKKyAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzID0gQnVuZGxlLkVNUFRZOwogCiAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAvKiBUaGVzZSBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgKi8KQEAgLTQxNSwzMCArNDQ0LDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbmV2ZXIgdXBkYXRlZCBieSB0aGlzIGNsYXNzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHByb3RlY3RlZCBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1VcGRhdGVkUm93czsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbXVzdCBiZSBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSByb3cgSUQgY29sdW1uIGJ5IGFueQotICAgICAqIHN1YmNsYXNzIHRoYXQgd2lzaGVzIHRvIHN1cHBvcnQgdXBkYXRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IG1Sb3dJZENvbHVtbkluZGV4OwotCi0gICAgcHJvdGVjdGVkIGludCBtUG9zOwotICAgIC8qKgotICAgICAqIElmIHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGlzIG5vdCAtMSB0aGlzIGNvbnRhaW5zIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBjb2x1bW4gYXQge0BsaW5rICNtUm93SWRDb2x1bW5JbmRleH0gZm9yIHRoZSBjdXJyZW50IHJvdyB0aGlzIGN1cnNvciBpcwotICAgICAqIHBvaW50aW5nIGF0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBMb25nIG1DdXJyZW50Um93SUQ7Ci0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIFVyaSBtTm90aWZ5VXJpOwotICAgIHByaXZhdGUgQ29udGVudE9ic2VydmVyIG1TZWxmT2JzZXJ2ZXI7Ci0gICAgZmluYWwgcHJpdmF0ZSBPYmplY3QgbVNlbGZPYnNlcnZlckxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWxmT2JzZXJ2ZXJSZWdpc3RlcmVkOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvckRlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlNWU2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB7QGxpbmsgQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvcn0gdGhhdCBhcmUKKyAqIG5lZWRlZCB0byBpbml0aWFsaXplIGl0cyB7QGxpbmsgQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvcn0gY291bnRlcnBhcnQgb24gdGhlIGNsaWVudCdzIGVuZC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCdWxrQ3Vyc29yRGVzY3JpcHRvciBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJ1bGtDdXJzb3JEZXNjcmlwdG9yPiBDUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QnVsa0N1cnNvckRlc2NyaXB0b3I+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bGtDdXJzb3JEZXNjcmlwdG9yIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBCdWxrQ3Vyc29yRGVzY3JpcHRvciBkID0gbmV3IEJ1bGtDdXJzb3JEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBkLnJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWxrQ3Vyc29yRGVzY3JpcHRvcltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1bGtDdXJzb3JEZXNjcmlwdG9yW3NpemVdOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBJQnVsa0N1cnNvciBjdXJzb3I7CisgICAgcHVibGljIFN0cmluZ1tdIGNvbHVtbk5hbWVzOworICAgIHB1YmxpYyBib29sZWFuIHdhbnRzQWxsT25Nb3ZlQ2FsbHM7CisgICAgcHVibGljIGludCBjb3VudDsKKyAgICBwdWJsaWMgQ3Vyc29yV2luZG93IHdpbmRvdzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgb3V0LndyaXRlU3Ryb25nQmluZGVyKGN1cnNvci5hc0JpbmRlcigpKTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nQXJyYXkoY29sdW1uTmFtZXMpOworICAgICAgICBvdXQud3JpdGVJbnQod2FudHNBbGxPbk1vdmVDYWxscyA/IDEgOiAwKTsKKyAgICAgICAgb3V0LndyaXRlSW50KGNvdW50KTsKKyAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoMSk7CisgICAgICAgICAgICB3aW5kb3cud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICBjdXJzb3IgPSBCdWxrQ3Vyc29yTmF0aXZlLmFzSW50ZXJmYWNlKGluLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIGNvbHVtbk5hbWVzID0gaW4ucmVhZFN0cmluZ0FycmF5KCk7CisgICAgICAgIHdhbnRzQWxsT25Nb3ZlQ2FsbHMgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgY291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgd2luZG93ID0gQ3Vyc29yV2luZG93LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKaW5kZXggNjdjZjBmOC4uZDNjMTFlNzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTcyLDI2ICs3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQ09VTlRfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBjb3VudCgpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMgPSBnZXRDb2x1bW5OYW1lcygpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGNvbHVtbk5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBjb2x1bW5OYW1lcy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nKGNvbHVtbk5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIERFQUNUSVZBVEVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlKCk7CkBAIC0xMjUsMTQgKzEwNSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgV0FOVFNfT05fTU9WRV9UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHJlc3VsdCA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgY2FzZSBHRVRfRVhUUkFTX1RSQU5TQUNUSU9OOiB7CiAgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGdldEV4dHJhcygpOwpAQCAtMjE3LDUyICsxODksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGludCBjb3VudCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbVJlbW90ZS50cmFuc2FjdChDT1VOVF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwotICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IC0xOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IHJlcGx5LnJlYWRJbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRhdGEucmVjeWNsZSgpOwotICAgICAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLQotICAgICAgICAgICAgbVJlbW90ZS50cmFuc2FjdChHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0gICAgICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLQotICAgICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMgPSBudWxsOwotICAgICAgICAgICAgaW50IG51bUNvbHVtbnMgPSByZXBseS5yZWFkSW50KCk7Ci0gICAgICAgICAgICBjb2x1bW5OYW1lcyA9IG5ldyBTdHJpbmdbbnVtQ29sdW1uc107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzW2ldID0gcmVwbHkucmVhZFN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWVzOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICByZXBseS5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CkBAIC0zMTcsMjMgKzI0Myw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRXYW50c0FsbE9uTW92ZUNhbGxzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoV0FOVFNfT05fTU9WRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwotICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0KLSAgICAgICAgICAgIGludCByZXN1bHQgPSByZXBseS5yZWFkSW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9IDA7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtRXh0cmFzID09IG51bGwpIHsKICAgICAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCmluZGV4IDg4NTA0NmIuLjk4YzcwNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKQEAgLTMwLDM0ICszMCwyMyBAQAogCiAgICAgcHJpdmF0ZSBTZWxmQ29udGVudE9ic2VydmVyIG1PYnNlcnZlckJyaWRnZSA9IG5ldyBTZWxmQ29udGVudE9ic2VydmVyKHRoaXMpOwogICAgIHByaXZhdGUgSUJ1bGtDdXJzb3IgbUJ1bGtDdXJzb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvdW50OwogICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYW50c0FsbE9uTW92ZUNhbGxzOworICAgIHByaXZhdGUgaW50IG1Db3VudDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemVzIHRoZSBhZGFwdG9yLgogICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBmaXJzdCB1c2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQnVsa0N1cnNvciBidWxrQ3Vyc29yLCBpbnQgY291bnQsIGludCBpZEluZGV4LAotICAgICAgICAgICAgYm9vbGVhbiB3YW50c0FsbE9uTW92ZUNhbGxzKSB7Ci0gICAgICAgIG1CdWxrQ3Vyc29yID0gYnVsa0N1cnNvcjsKLSAgICAgICAgbUNvbHVtbnMgPSBudWxsOyAgLy8gbGF6aWx5IHJldHJpZXZlZAotICAgICAgICBtQ291bnQgPSBjb3VudDsKLSAgICAgICAgbVJvd0lkQ29sdW1uSW5kZXggPSBpZEluZGV4OwotICAgICAgICBtV2FudHNBbGxPbk1vdmVDYWxscyA9IHdhbnRzQWxsT25Nb3ZlQ2FsbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb2x1bW4gaW5kZXggb2YgIl9pZCIgY29sdW1uLCBvciAtMSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZmluZFJvd0lkQ29sdW1uSW5kZXgoU3RyaW5nW10gY29sdW1uTmFtZXMpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGNvbHVtbk5hbWVzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWVzW2ldLmVxdWFscygiX2lkIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEJ1bGtDdXJzb3JEZXNjcmlwdG9yIGQpIHsKKyAgICAgICAgbUJ1bGtDdXJzb3IgPSBkLmN1cnNvcjsKKyAgICAgICAgbUNvbHVtbnMgPSBkLmNvbHVtbk5hbWVzOworICAgICAgICBtUm93SWRDb2x1bW5JbmRleCA9IERhdGFiYXNlVXRpbHMuZmluZFJvd0lkQ29sdW1uSW5kZXgobUNvbHVtbnMpOworICAgICAgICBtV2FudHNBbGxPbk1vdmVDYWxscyA9IGQud2FudHNBbGxPbk1vdmVDYWxsczsKKyAgICAgICAgbUNvdW50ID0gZC5jb3VudDsKKyAgICAgICAgaWYgKGQud2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFdpbmRvdyhkLndpbmRvdyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY5LDE0ICsxNTgsNiBAQAogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgdGhyb3dJZkN1cnNvcklzQ2xvc2VkKCk7CiAKLSAgICAgICAgaWYgKG1Db2x1bW5zID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUNvbHVtbnMgPSBtQnVsa0N1cnNvci5nZXRDb2x1bW5OYW1lcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGZldGNoIGNvbHVtbiBuYW1lcyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCmluZGV4IDE2NzI3OGEuLjUyNWJlOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKQEAgLTEzMiw2ICsxMzIsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBCdWxrQ3Vyc29yRGVzY3JpcHRvciBnZXRCdWxrQ3Vyc29yRGVzY3JpcHRvcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdGhyb3dJZkN1cnNvcklzQ2xvc2VkKCk7CisKKyAgICAgICAgICAgIEJ1bGtDdXJzb3JEZXNjcmlwdG9yIGQgPSBuZXcgQnVsa0N1cnNvckRlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIGQuY3Vyc29yID0gdGhpczsKKyAgICAgICAgICAgIGQuY29sdW1uTmFtZXMgPSBtQ3Vyc29yLmdldENvbHVtbk5hbWVzKCk7CisgICAgICAgICAgICBkLndhbnRzQWxsT25Nb3ZlQ2FsbHMgPSBtQ3Vyc29yLmdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKTsKKyAgICAgICAgICAgIGQuY291bnQgPSBtQ3Vyc29yLmdldENvdW50KCk7CisgICAgICAgICAgICBkLndpbmRvdyA9IG1DdXJzb3IuZ2V0V2luZG93KCk7CisgICAgICAgICAgICBpZiAoZC53aW5kb3cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdyBiZWNhdXNlIGl0cyByZWZlcmVuY2UgY291bnQgd2lsbCBiZQorICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudGVkIHdoZW4gaXQgaXMgcmV0dXJuZWQgYXMgcGFydCBvZiB0aGUgYmluZGVyIGNhbGwgcmVwbHkgcGFyY2VsLgorICAgICAgICAgICAgICAgIGQud2luZG93LmFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEN1cnNvcldpbmRvdyBnZXRXaW5kb3coaW50IHBvc2l0aW9uKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKQEAgLTE1NywxMCArMTc2LDkgQEAKICAgICAgICAgICAgICAgICBtQ3Vyc29yLmZpbGxXaW5kb3cocG9zaXRpb24sIHdpbmRvdyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgUlBDLgotICAgICAgICAgICAgLy8gVGhlIEJpbmRlciBwcm94eSB3aWxsIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGFnYWluIGFzIHBhcnQgb2Ygd3JpdGluZwotICAgICAgICAgICAgLy8gdGhlIEN1cnNvcldpbmRvdyB0byB0aGUgcmVwbHkgcGFyY2VsIGFzIGEgcmV0dXJuIHZhbHVlLgogICAgICAgICAgICAgaWYgKHdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgd2luZG93IGJlY2F1c2UgaXRzIHJlZmVyZW5jZSBjb3VudCB3aWxsIGJlCisgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50ZWQgd2hlbiBpdCBpcyByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSBiaW5kZXIgY2FsbCByZXBseSBwYXJjZWwuCiAgICAgICAgICAgICAgICAgd2luZG93LmFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB3aW5kb3c7CkBAIC0xNzcsMjQgKzE5NSw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb3VudCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgdGhyb3dJZkN1cnNvcklzQ2xvc2VkKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHRocm93SWZDdXJzb3JJc0Nsb3NlZCgpOwotCi0gICAgICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewpAQCAtMjM3LDE1ICsyMzcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgdGhyb3dJZkN1cnNvcklzQ2xvc2VkKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIENvbnRlbnRPYnNlcnZlciBmcm9tIHRoZSBvYnNlcnZlciBhbmQgcmVnaXN0ZXIgaXQgYXMgYW4gb2JzZXJ2ZXIgb24gdGhlCiAgICAgICogdW5kZXJseWluZyBjdXJzb3IuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKaW5kZXggOTlkMjYwZS4uNDBhNTRjZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQpAQCAtMTM4Niw0ICsxMzg2LDE4IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3VmFsdWVzLCAwLCByZXN1bHQsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCwgbmV3VmFsdWVzLmxlbmd0aCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBjb2x1bW4gaW5kZXggb2YgIl9pZCIgY29sdW1uLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBmaW5kUm93SWRDb2x1bW5JbmRleChTdHJpbmdbXSBjb2x1bW5OYW1lcykgeworICAgICAgICBpbnQgbGVuZ3RoID0gY29sdW1uTmFtZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29sdW1uTmFtZXNbaV0uZXF1YWxzKCJfaWQiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQppbmRleCAwZjQ1MDBhLi5iNTUxMTE2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKQEAgLTQzLDI5ICs0MywxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uTW92ZShpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnNvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvdW50KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgaG9sZGluZyB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBjb2x1bW5zIGluIHRoZQotICAgICAqIGN1cnNvciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGxpc3RlZCBpbiB0aGUgcmVzdWx0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgcmV0dXJuZWQgaW4gdGhpcyBxdWVyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKICAgICBwdWJsaWMgaW50IHJlcXVlcnkoSUNvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAotICAgIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBCdW5kbGUgZ2V0RXh0cmFzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIEJ1bmRsZSByZXNwb25kKEJ1bmRsZSBleHRyYXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CkBAIC03NCwxMyArNTcsMTAgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlc2NyaXB0b3IgPSAiYW5kcm9pZC5jb250ZW50LklCdWxrQ3Vyc29yIjsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NVUlNPUl9XSU5ET1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT047Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT1VOVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFdBTlRTX09OX01PVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0VYVFJBU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBSRVNQT05EX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDTE9TRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDExOworICAgIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVJZX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9OX01PVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0VYVFJBU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVNQT05EX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTsKKyAgICBzdGF0aWMgZmluYWwgaW50IENMT1NFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQppbmRleCA4MmJiMjNlLi5iMjk4OTdlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCkBAIC0xMDUsMTIgKzEwNSw3IEBACiAgICAgICAgIG1RdWVyeSA9IHF1ZXJ5OwogCiAgICAgICAgIG1Db2x1bW5zID0gcXVlcnkuZ2V0Q29sdW1uTmFtZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gTWFrZSBub3RlIG9mIHRoZSByb3cgSUQgY29sdW1uIGluZGV4IGZvciBxdWljayBhY2Nlc3MgdG8gaXQKLSAgICAgICAgICAgIGlmICgiX2lkIi5lcXVhbHMobUNvbHVtbnNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgbVJvd0lkQ29sdW1uSW5kZXggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1Sb3dJZENvbHVtbkluZGV4ID0gRGF0YWJhc2VVdGlscy5maW5kUm93SWRDb2x1bW5JbmRleChtQ29sdW1ucyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCmluZGV4IDI3NzVjN2IuLmFhOTJlZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCkBAIC00MzcsNiArNDM3LDEzIEBACiAgICAgICogaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNhbWVyYSwgb3IgYWNyb3NzIG11bHRpcGxlIHJ1bnMgb2YgdGhlIHNhbWUKICAgICAgKiBwcm9ncmFtLgogICAgICAqCisgICAgICogPHA+SWYgeW91IGFyZSB1c2luZyB0aGUgcHJldmlldyBkYXRhIHRvIGNyZWF0ZSB2aWRlbyBvciBzdGlsbCBpbWFnZXMsCisgICAgICogc3Ryb25nbHkgY29uc2lkZXIgdXNpbmcge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZH0gdG8KKyAgICAgKiBwcm9wZXJseSBpbmRpY2F0ZSBpbWFnZSBjYXB0dXJlIG9yIHJlY29yZGluZyBzdGFydC9zdG9wIHRvIHRoZSB1c2VyLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kCisgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXcKICAgICAgKiBAcGFyYW0gc3VyZmFjZVRleHR1cmUgdGhlIHtAbGluayBTdXJmYWNlVGV4dHVyZX0gdG8gd2hpY2ggdGhlIHByZXZpZXcKICAgICAgKiAgICAgaW1hZ2VzIGFyZSB0byBiZSBzZW50IG9yIG51bGwgdG8gcmVtb3ZlIHRoZSBjdXJyZW50IHByZXZpZXcgc3VyZmFjZQogICAgICAqICAgICB0ZXh0dXJlCkBAIC01MTIsMTMgKzUxOSwxOSBAQAogICAgIHB1YmxpYyBuYXRpdmUgZmluYWwgYm9vbGVhbiBwcmV2aWV3RW5hYmxlZCgpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFsbHMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBldmVyeSBwcmV2aWV3IGZyYW1lIGluIGFkZGl0aW9uCisgICAgICogPHA+SW5zdGFsbHMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBldmVyeSBwcmV2aWV3IGZyYW1lIGluIGFkZGl0aW9uCiAgICAgICogdG8gZGlzcGxheWluZyB0aGVtIG9uIHRoZSBzY3JlZW4uICBUaGUgY2FsbGJhY2sgd2lsbCBiZSByZXBlYXRlZGx5IGNhbGxlZAogICAgICAqIGZvciBhcyBsb25nIGFzIHByZXZpZXcgaXMgYWN0aXZlLiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSwKLSAgICAgKiBldmVuIHdoaWxlIHByZXZpZXcgaXMgbGl2ZS4gIEFueSBvdGhlciBwcmV2aWV3IGNhbGxiYWNrcyBhcmUgb3ZlcnJpZGRlbi4KKyAgICAgKiBldmVuIHdoaWxlIHByZXZpZXcgaXMgbGl2ZS4gIEFueSBvdGhlciBwcmV2aWV3IGNhbGxiYWNrcyBhcmUKKyAgICAgKiBvdmVycmlkZGVuLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIHByZXZpZXcgZGF0YSB0byBjcmVhdGUgdmlkZW8gb3Igc3RpbGwgaW1hZ2VzLAorICAgICAqIHN0cm9uZ2x5IGNvbnNpZGVyIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmR9IHRvCisgICAgICogcHJvcGVybHkgaW5kaWNhdGUgaW1hZ2UgY2FwdHVyZSBvciByZWNvcmRpbmcgc3RhcnQvc3RvcCB0byB0aGUgdXNlci48L3A+CiAgICAgICoKICAgICAgKiBAcGFyYW0gY2IgYSBjYWxsYmFjayBvYmplY3QgdGhhdCByZWNlaXZlcyBhIGNvcHkgb2YgZWFjaCBwcmV2aWV3IGZyYW1lLAogICAgICAqICAgICBvciBudWxsIHRvIHN0b3AgcmVjZWl2aW5nIGNhbGxiYWNrcy4KKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByZXZpZXdDYWxsYmFjayhQcmV2aWV3Q2FsbGJhY2sgY2IpIHsKICAgICAgICAgbVByZXZpZXdDYWxsYmFjayA9IGNiOwpAQCAtNTMwLDEzICs1NDMsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YWxscyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgZm9yIHRoZSBuZXh0IHByZXZpZXcgZnJhbWUgaW4gYWRkaXRpb24KLSAgICAgKiB0byBkaXNwbGF5aW5nIGl0IG9uIHRoZSBzY3JlZW4uICBBZnRlciBvbmUgaW52b2NhdGlvbiwgdGhlIGNhbGxiYWNrIGlzCi0gICAgICogY2xlYXJlZC4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBhbnkgdGltZSwgZXZlbiB3aGVuIHByZXZpZXcgaXMgbGl2ZS4KLSAgICAgKiBBbnkgb3RoZXIgcHJldmlldyBjYWxsYmFja3MgYXJlIG92ZXJyaWRkZW4uCisgICAgICogPHA+SW5zdGFsbHMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciB0aGUgbmV4dCBwcmV2aWV3IGZyYW1lIGluCisgICAgICogYWRkaXRpb24gdG8gZGlzcGxheWluZyBpdCBvbiB0aGUgc2NyZWVuLiAgQWZ0ZXIgb25lIGludm9jYXRpb24sIHRoZQorICAgICAqIGNhbGxiYWNrIGlzIGNsZWFyZWQuIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYW55IHRpbWUsIGV2ZW4gd2hlbgorICAgICAqIHByZXZpZXcgaXMgbGl2ZS4gIEFueSBvdGhlciBwcmV2aWV3IGNhbGxiYWNrcyBhcmUgb3ZlcnJpZGRlbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB5b3UgYXJlIHVzaW5nIHRoZSBwcmV2aWV3IGRhdGEgdG8gY3JlYXRlIHZpZGVvIG9yIHN0aWxsIGltYWdlcywKKyAgICAgKiBzdHJvbmdseSBjb25zaWRlciB1c2luZyB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kfSB0bworICAgICAqIHByb3Blcmx5IGluZGljYXRlIGltYWdlIGNhcHR1cmUgb3IgcmVjb3JkaW5nIHN0YXJ0L3N0b3AgdG8gdGhlIHVzZXIuPC9wPgogICAgICAqCiAgICAgICogQHBhcmFtIGNiIGEgY2FsbGJhY2sgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSBuZXh0IHByZXZpZXcgZnJhbWUsCiAgICAgICogICAgIG9yIG51bGwgdG8gc3RvcCByZWNlaXZpbmcgY2FsbGJhY2tzLgorICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0T25lU2hvdFByZXZpZXdDYWxsYmFjayhQcmV2aWV3Q2FsbGJhY2sgY2IpIHsKICAgICAgICAgbVByZXZpZXdDYWxsYmFjayA9IGNiOwpAQCAtNTQ4LDI0ICs1NjYsMzAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIHNldEhhc1ByZXZpZXdDYWxsYmFjayhib29sZWFuIGluc3RhbGxlZCwgYm9vbGVhbiBtYW51YWxCdWZmZXIpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFsbHMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBldmVyeSBwcmV2aWV3IGZyYW1lLCB1c2luZyBidWZmZXJzCi0gICAgICogc3VwcGxpZWQgd2l0aCB7QGxpbmsgI2FkZENhbGxiYWNrQnVmZmVyKGJ5dGVbXSl9LCBpbiBhZGRpdGlvbiB0bworICAgICAqIDxwPkluc3RhbGxzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgcHJldmlldyBmcmFtZSwgdXNpbmcKKyAgICAgKiBidWZmZXJzIHN1cHBsaWVkIHdpdGgge0BsaW5rICNhZGRDYWxsYmFja0J1ZmZlcihieXRlW10pfSwgaW4gYWRkaXRpb24gdG8KICAgICAgKiBkaXNwbGF5aW5nIHRoZW0gb24gdGhlIHNjcmVlbi4gIFRoZSBjYWxsYmFjayB3aWxsIGJlIHJlcGVhdGVkbHkgY2FsbGVkCi0gICAgICogZm9yIGFzIGxvbmcgYXMgcHJldmlldyBpcyBhY3RpdmUgYW5kIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKiBBbnkgb3RoZXIgcHJldmlldyBjYWxsYmFja3MgYXJlIG92ZXJyaWRkZW4uCisgICAgICogZm9yIGFzIGxvbmcgYXMgcHJldmlldyBpcyBhY3RpdmUgYW5kIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZS4gIEFueSBvdGhlcgorICAgICAqIHByZXZpZXcgY2FsbGJhY2tzIGFyZSBvdmVycmlkZGVuLjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGltcHJvdmUgcHJldmlldyBlZmZpY2llbmN5IGFuZCBmcmFtZQogICAgICAqIHJhdGUgYnkgYWxsb3dpbmcgcHJldmlldyBmcmFtZSBtZW1vcnkgcmV1c2UuICBZb3UgbXVzdCBjYWxsCiAgICAgICoge0BsaW5rICNhZGRDYWxsYmFja0J1ZmZlcihieXRlW10pfSBhdCBzb21lIHBvaW50IC0tIGJlZm9yZSBvciBhZnRlcgotICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2QgLS0gb3Igbm8gY2FsbGJhY2tzIHdpbGwgcmVjZWl2ZWQuCisgICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCAtLSBvciBubyBjYWxsYmFja3Mgd2lsbCByZWNlaXZlZC48L3A+CiAgICAgICoKLSAgICAgKiBUaGUgYnVmZmVyIHF1ZXVlIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIG51bGwKKyAgICAgKiA8cD5UaGUgYnVmZmVyIHF1ZXVlIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIG51bGwKICAgICAgKiBjYWxsYmFjaywge0BsaW5rICNzZXRQcmV2aWV3Q2FsbGJhY2soQ2FtZXJhLlByZXZpZXdDYWxsYmFjayl9IGlzIGNhbGxlZCwKLSAgICAgKiBvciB7QGxpbmsgI3NldE9uZVNob3RQcmV2aWV3Q2FsbGJhY2soQ2FtZXJhLlByZXZpZXdDYWxsYmFjayl9IGlzIGNhbGxlZC4KKyAgICAgKiBvciB7QGxpbmsgI3NldE9uZVNob3RQcmV2aWV3Q2FsbGJhY2soQ2FtZXJhLlByZXZpZXdDYWxsYmFjayl9IGlzCisgICAgICogY2FsbGVkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIHByZXZpZXcgZGF0YSB0byBjcmVhdGUgdmlkZW8gb3Igc3RpbGwgaW1hZ2VzLAorICAgICAqIHN0cm9uZ2x5IGNvbnNpZGVyIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmR9IHRvCisgICAgICogcHJvcGVybHkgaW5kaWNhdGUgaW1hZ2UgY2FwdHVyZSBvciByZWNvcmRpbmcgc3RhcnQvc3RvcCB0byB0aGUgdXNlci48L3A+CiAgICAgICoKICAgICAgKiBAcGFyYW0gY2IgYSBjYWxsYmFjayBvYmplY3QgdGhhdCByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHByZXZpZXcgZnJhbWUsCiAgICAgICogICAgIG9yIG51bGwgdG8gc3RvcCByZWNlaXZpbmcgY2FsbGJhY2tzIGFuZCBjbGVhciB0aGUgYnVmZmVyIHF1ZXVlLgogICAgICAqIEBzZWUgI2FkZENhbGxiYWNrQnVmZmVyKGJ5dGVbXSkKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByZXZpZXdDYWxsYmFja1dpdGhCdWZmZXIoUHJldmlld0NhbGxiYWNrIGNiKSB7CiAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2sgPSBjYjsKQEAgLTgzNCwxMCArODU4LDE1IEBACiAgICAgICogdGhlIGZvY3VzIHBvc2l0aW9uLiBBcHBsaWNhdGlvbnMgbXVzdCBjYWxsIGNhbmNlbEF1dG9Gb2N1cyB0byByZXNldCB0aGUKICAgICAgKiBmb2N1cy48L3A+CiAgICAgICoKKyAgICAgKiA8cD5JZiBhdXRvZm9jdXMgaXMgc3VjY2Vzc2Z1bCwgY29uc2lkZXIgdXNpbmcKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kfSB0byBwcm9wZXJseSBwbGF5IGJhY2sgYW4gYXV0b2ZvY3VzCisgICAgICogc3VjY2VzcyBzb3VuZCB0byB0aGUgdXNlci48L3A+CisgICAgICoKICAgICAgKiBAcGFyYW0gY2IgdGhlIGNhbGxiYWNrIHRvIHJ1bgogICAgICAqIEBzZWUgI2NhbmNlbEF1dG9Gb2N1cygpCiAgICAgICogQHNlZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI3NldEF1dG9FeHBvc3VyZUxvY2soYm9vbGVhbikKICAgICAgKiBAc2VlIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjc2V0QXV0b1doaXRlQmFsYW5jZUxvY2soYm9vbGVhbikKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGF1dG9Gb2N1cyhBdXRvRm9jdXNDYWxsYmFjayBjYikKICAgICB7CkBAIC0xOTA3LDEyICsxOTM2LDEyIEBACiAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignPScpICE9IC0xIHx8IGtleS5pbmRleE9mKCc7JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJLZXkgXCIiICsga2V5ICsgIlwiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICg9IG9yIDspIik7CisgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJz0nKSAhPSAtMSB8fCBrZXkuaW5kZXhPZignOycpICE9IC0xIHx8IGtleS5pbmRleE9mKDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiS2V5IFwiIiArIGtleSArICJcIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoPSBvciA7IG9yIFxcMCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignPScpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzsnKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlZhbHVlIFwiIiArIHZhbHVlICsgIlwiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICg9IG9yIDspIik7CisgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignPScpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzsnKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVmFsdWUgXCIiICsgdmFsdWUgKyAiXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKD0gb3IgOyBvciBcXDApIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueS5qYXZhCmluZGV4IDBlNmQwN2QuLjk2MTIxNTEgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1RlbGVwaG9ueS5qYXZhCkBAIC01OTYsOCArNTk2LDggQEAKICAgICAgICAgICAgICAqIHZhbHVlczo8L3A+CiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogPHVsPgotICAgICAgICAgICAgICogICA8bGk+PGVtPnBkdXM8L2VtPiAtIEFuIE9iamVjdFtdIG9mIGJ5dGVbXXMgY29udGFpbmluZyB0aGUgUERVcwotICAgICAgICAgICAgICogICB0aGF0IG1ha2UgdXAgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgICAgICAgICAqICAgPGxpPjxlbT5tZXNzYWdlPC9lbT4gLSBBbiBTbXNDYk1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJyb2FkY2FzdCBtZXNzYWdlCisgICAgICAgICAgICAgKiAgIGRhdGEuIFRoaXMgaXMgbm90IGFuIGVtZXJnZW5jeSBhbGVydCwgc28gRVRXUyBhbmQgQ01BUyBkYXRhIHdpbGwgYmUgbnVsbC48L2xpPgogICAgICAgICAgICAgICogPC91bD4KICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiA8cD5UaGUgZXh0cmEgdmFsdWVzIGNhbiBiZSBleHRyYWN0ZWQgdXNpbmcKQEAgLTYxNiw4ICs2MTYsOCBAQAogICAgICAgICAgICAgICogdmFsdWVzOjwvcD4KICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAgICAgKiAgIDxsaT48ZW0+cGR1czwvZW0+IC0gQW4gT2JqZWN0W10gb2YgYnl0ZVtdcyBjb250YWluaW5nIHRoZSBQRFVzCi0gICAgICAgICAgICAgKiAgIHRoYXQgbWFrZSB1cCB0aGUgbWVzc2FnZS48L2xpPgorICAgICAgICAgICAgICogICA8bGk+PGVtPm1lc3NhZ2U8L2VtPiAtIEFuIFNtc0NiTWVzc2FnZSBvYmplY3QgY29udGFpbmluZyB0aGUgYnJvYWRjYXN0IG1lc3NhZ2UKKyAgICAgICAgICAgICAqICAgZGF0YSwgaW5jbHVkaW5nIEVUV1Mgb3IgQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbiBpbmZvIGlmIHByZXNlbnQuPC9saT4KICAgICAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogPHA+VGhlIGV4dHJhIHZhbHVlcyBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nCkBAIC02MzEsNiArNjMxLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfRU1FUkdFTkNZX0NCX1JFQ0VJVkVEIjsKIAogICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBBIG5ldyBDRE1BIFNNUyBoYXMgYmVlbiByZWNlaXZlZCBjb250YWluaW5nIFNlcnZpY2UgQ2F0ZWdvcnkKKyAgICAgICAgICAgICAqIFByb2dyYW0gRGF0YSAodXBkYXRlcyB0aGUgbGlzdCBvZiBlbmFibGVkIGJyb2FkY2FzdCBjaGFubmVscykuIFRoZSBpbnRlbnQgd2lsbAorICAgICAgICAgICAgICogaGF2ZSB0aGUgZm9sbG93aW5nIGV4dHJhIHZhbHVlczo8L3A+CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogPHVsPgorICAgICAgICAgICAgICogICA8bGk+PGVtPm9wZXJhdGlvbnM8L2VtPiAtIEFuIGFycmF5IG9mIENkbWFTbXNDYlByb2dyYW1EYXRhIG9iamVjdHMgY29udGFpbmluZworICAgICAgICAgICAgICogICB0aGUgc2VydmljZSBjYXRlZ29yeSBvcGVyYXRpb25zIChhZGQvZGVsZXRlL2NsZWFyKSB0byBwZXJmb3JtLjwvbGk+CisgICAgICAgICAgICAgKiA8L3VsPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPlRoZSBleHRyYSB2YWx1ZXMgY2FuIGJlIGV4dHJhY3RlZCB1c2luZworICAgICAgICAgICAgICoge0BsaW5rICNnZXRNZXNzYWdlc0Zyb21JbnRlbnQoSW50ZW50KX0uPC9wPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPklmIGEgQnJvYWRjYXN0UmVjZWl2ZXIgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZSBwcm9jZXNzaW5nCisgICAgICAgICAgICAgKiB0aGlzIGludGVudCBpdCBzaG91bGQgc2V0IHRoZSByZXN1bHQgY29kZSBhcHByb3ByaWF0ZWx5LjwvcD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU19TRVJWSUNFX0NBVEVHT1JZX1BST0dSQU1fREFUQV9SRUNFSVZFRF9BQ1RJT04gPQorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU01TX1NFUlZJQ0VfQ0FURUdPUllfUFJPR1JBTV9EQVRBX1JFQ0VJVkVEIjsKKworICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBUaGUgU0lNIHN0b3JhZ2UgZm9yIFNNUyBtZXNzYWdlcyBpcyBmdWxsLiAgSWYKICAgICAgICAgICAgICAqIHNwYWNlIGlzIG5vdCBmcmVlZCwgbWVzc2FnZXMgdGFyZ2V0ZWQgZm9yIHRoZSBTSU0gKGNsYXNzIDIpIG1heQogICAgICAgICAgICAgICogbm90IGJlIHNhdmVkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKaW5kZXggNTE2Y2UyYS4uMmRjZWE4MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotIC8qCisvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTM2Myw0MCArMzYzLDY3IEBACiAgICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PwogICAgICAgICAvLyBUaGV5IGFyZSBldmFsdWF0ZWQgYXQgZWFjaCBsaW5lLgogICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNMaW5lQm90dG9tID0gZ2V0TGluZVRvcChmaXJzdExpbmUpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdExpbmUpOwotICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBtUGFpbnQ7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYnVmID0gbVRleHQ7Ci0gICAgICAgICAgICBpbnQgc3BhbkVuZCA9IDA7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtV2lkdGg7Ci0gICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TGluZTsgaSA8PSBsYXN0TGluZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcHJldmlvdXNMaW5lRW5kOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBnZXRMaW5lU3RhcnQoaSArIDEpOwotICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGVuZDsKKyAgICAgICAgICAgIGlmIChsaW5lQmFja2dyb3VuZFNwYW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaW5lQmFja2dyb3VuZFNwYW5zID0gbmV3IFNwYW5TZXQ8TGluZUJhY2tncm91bmRTcGFuPihMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaW50IGx0b3AgPSBwcmV2aW91c0xpbmVCb3R0b207Ci0gICAgICAgICAgICAgICAgaW50IGxib3R0b20gPSBnZXRMaW5lVG9wKGkgKyAxKTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwotICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CisgICAgICAgICAgICBTcGFubmVkIGJ1ZmZlciA9IChTcGFubmVkKSBtVGV4dDsKKyAgICAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOworICAgICAgICAgICAgbGluZUJhY2tncm91bmRTcGFucy5pbml0KGJ1ZmZlciwgMCwgdGV4dExlbmd0aCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgotICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgTGluZUJhY2tncm91bmRTcGFucyBvbiBhIGxpbmUgY29udHJpYnV0ZSB0byBpdHMgYmFja2dyb3VuZC4KLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZUJhY2tncm91bmRTcGFucy5udW1iZXJPZlNwYW5zID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0TGluZSk7CisgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdExpbmUpOworICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlW10gc3BhbnMgPSBOT19QQVJBX1NQQU5TOworICAgICAgICAgICAgICAgIGludCBzcGFuc0xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbVBhaW50OworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gMDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtV2lkdGg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TGluZTsgaSA8PSBsYXN0TGluZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IGdldExpbmVTdGFydChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGVuZDsKIAotICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgc3BhbnMubGVuZ3RoOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuIGJhY2sgPSAoTGluZUJhY2tncm91bmRTcGFuKSBzcGFuc1tuXTsKLSAgICAgICAgICAgICAgICAgICAgYmFjay5kcmF3QmFja2dyb3VuZChjYW52YXMsIHBhaW50LCAwLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBzdGFydCwgZW5kLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGx0b3AgPSBwcmV2aW91c0xpbmVCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCBsYm90dG9tID0gZ2V0TGluZVRvcChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBpbmZyZXF1ZW50LCBzbyB3ZSdsbCB1c2UgdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IGxpbmVCYWNrZ3JvdW5kU3BhbnMuZ2V0TmV4dFRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIExpbmVCYWNrZ3JvdW5kU3BhbnMgb24gYSBsaW5lIGNvbnRyaWJ1dGUgdG8gaXRzIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuc0xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGlvbiBvZiB0aGUgbG9naWMgb2YgZ2V0UGFyYWdyYXBoU3BhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBlbmQgfHwgc3RhcnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVxdWl2YWxlbnQgdG8gYSBnZXRTcGFucyhzdGFydCwgZW5kKSwgYnV0IGZpbGxpbmcgdGhlICdzcGFucycgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBpbnN0ZWFkIHRvIHJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZUJhY2tncm91bmRTcGFucy5udW1iZXJPZlNwYW5zOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXF1YWwgdGVzdCBpcyB2YWxpZCBzaW5jZSBib3RoIGludGVydmFscyBhcmUgbm90IGVtcHR5IGJ5IGNvbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJhY2tncm91bmRTcGFucy5zcGFuU3RhcnRzW2pdID49IGVuZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCYWNrZ3JvdW5kU3BhbnMuc3BhbkVuZHNbal0gPD0gc3RhcnQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNMZW5ndGggPT0gc3BhbnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BhbnMgYXJyYXkgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gQXJyYXlVdGlscy5pZGVhbE9iamVjdEFycmF5U2l6ZSgyICogc3BhbnNMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBuZXdTcGFucyA9IG5ldyBQYXJhZ3JhcGhTdHlsZVtuZXdTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3BhbnMsIDAsIG5ld1NwYW5zLCAwLCBzcGFuc0xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFucyA9IG5ld1NwYW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5zW3NwYW5zTGVuZ3RoKytdID0gbGluZUJhY2tncm91bmRTcGFucy5zcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zTGVuZ3RoOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3BhbiBsaW5lQmFja2dyb3VuZFNwYW4gPSAoTGluZUJhY2tncm91bmRTcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCYWNrZ3JvdW5kU3Bhbi5kcmF3QmFja2dyb3VuZChjYW52YXMsIHBhaW50LCAwLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHN0YXJ0LCBlbmQsIGkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZUJhY2tncm91bmRTcGFucy5yZWN5Y2xlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCkBAIC0xODMwLDYgKzE4NTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY3Qgc1RlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNwYW5uZWRUZXh0OwogICAgIHByaXZhdGUgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBtVGV4dERpcjsKKyAgICBwcml2YXRlIFNwYW5TZXQ8TGluZUJhY2tncm91bmRTcGFuPiBsaW5lQmFja2dyb3VuZFNwYW5zOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX0xFRlRfVE9fUklHSFQgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9SSUdIVF9UT19MRUZUID0gLTE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3BhblNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTYwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5TZXQuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CisKKy8qKgorICogQSBjYWNoZWQgc2V0IG9mIHNwYW5zLiBDYWNoZXMgdGhlIHJlc3VsdCBvZiB7QGxpbmsgU3Bhbm5lZCNnZXRTcGFucyhpbnQsIGludCwgQ2xhc3MpfSBhbmQgdGhlbgorICogcHJvdmlkZXMgZmFzdGVyIGFjY2VzcyB0byB7QGxpbmsgU3Bhbm5lZCNuZXh0U3BhblRyYW5zaXRpb24oaW50LCBpbnQsIENsYXNzKX0uCisgKgorICogRmllbGRzIGFyZSBsZWZ0IHB1YmxpYyBmb3IgYSBjb252ZW5pZW50IGRpcmVjdCBhY2Nlc3MuCisgKgorICogTm90ZSB0aGF0IGVtcHR5IHNwYW5zIGFyZSBpZ25vcmVkIGJ5IHRoaXMgY2xhc3MuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgU3BhblNldDxFPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRT4gY2xhc3NUeXBlOworCisgICAgaW50IG51bWJlck9mU3BhbnM7CisgICAgRVtdIHNwYW5zOworICAgIGludFtdIHNwYW5TdGFydHM7CisgICAgaW50W10gc3BhbkVuZHM7CisgICAgaW50W10gc3BhbkZsYWdzOworCisgICAgU3BhblNldChDbGFzczw/IGV4dGVuZHMgRT4gdHlwZSkgeworICAgICAgICBjbGFzc1R5cGUgPSB0eXBlOworICAgICAgICBudW1iZXJPZlNwYW5zID0gMDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCBpbml0KFNwYW5uZWQgc3Bhbm5lZCwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmluYWwgRVtdIGFsbFNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsIGNsYXNzVHlwZSk7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBhbGxTcGFucy5sZW5ndGg7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKHNwYW5zID09IG51bGwgfHwgc3BhbnMubGVuZ3RoIDwgbGVuZ3RoKSkgeworICAgICAgICAgICAgLy8gVGhlc2UgYXJyYXlzIG1heSBlbmQgdXAgYmVpbmcgdG9vIGxhcmdlIGJlY2F1c2Ugb2YgdGhlIGRpc2NhcmRlZCBlbXB0eSBzcGFucworICAgICAgICAgICAgc3BhbnMgPSAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShjbGFzc1R5cGUsIGxlbmd0aCk7CisgICAgICAgICAgICBzcGFuU3RhcnRzID0gbmV3IGludFtsZW5ndGhdOworICAgICAgICAgICAgc3BhbkVuZHMgPSBuZXcgaW50W2xlbmd0aF07CisgICAgICAgICAgICBzcGFuRmxhZ3MgPSBuZXcgaW50W2xlbmd0aF07CisgICAgICAgIH0KKworICAgICAgICBudW1iZXJPZlNwYW5zID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgRSBzcGFuID0gYWxsU3BhbnNbaV07CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRW5kID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW4pOworICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSBjb250aW51ZTsKKworICAgICAgICAgICAgZmluYWwgaW50IHNwYW5GbGFnID0gc3Bhbm5lZC5nZXRTcGFuRmxhZ3Moc3Bhbik7CisKKyAgICAgICAgICAgIHNwYW5zW251bWJlck9mU3BhbnNdID0gc3BhbjsKKyAgICAgICAgICAgIHNwYW5TdGFydHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuU3RhcnQ7CisgICAgICAgICAgICBzcGFuRW5kc1tudW1iZXJPZlNwYW5zXSA9IHNwYW5FbmQ7CisgICAgICAgICAgICBzcGFuRmxhZ3NbbnVtYmVyT2ZTcGFuc10gPSBzcGFuRmxhZzsKKworICAgICAgICAgICAgbnVtYmVyT2ZTcGFucysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBzcGFucyBpbnRlcnNlY3RpbmcgdGhlIGdpdmVuIGludGVydmFsLgorICAgICAqIEBwYXJhbSBlbmQgbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gc3RhcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTcGFuc0ludGVyc2VjdGluZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlNwYW5zOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGVxdWFsIHRlc3QgaXMgdmFsaWQgc2luY2UgYm90aCBpbnRlcnZhbHMgYXJlIG5vdCBlbXB0eSBieSBjb25zdHJ1Y3Rpb24KKyAgICAgICAgICAgIGlmIChzcGFuU3RhcnRzW2ldID49IGVuZCB8fCBzcGFuRW5kc1tpXSA8PSBzdGFydCkgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltaWxhciB0byB7QGxpbmsgU3Bhbm5lZCNuZXh0U3BhblRyYW5zaXRpb24oaW50LCBpbnQsIENsYXNzKX0KKyAgICAgKi8KKyAgICBpbnQgZ2V0TmV4dFRyYW5zaXRpb24oaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlNwYW5zOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFuU3RhcnRzW2ldOworICAgICAgICAgICAgZmluYWwgaW50IHNwYW5FbmQgPSBzcGFuRW5kc1tpXTsKKyAgICAgICAgICAgIGlmIChzcGFuU3RhcnQgPiBzdGFydCAmJiBzcGFuU3RhcnQgPCBsaW1pdCkgbGltaXQgPSBzcGFuU3RhcnQ7CisgICAgICAgICAgICBpZiAoc3BhbkVuZCA+IHN0YXJ0ICYmIHNwYW5FbmQgPCBsaW1pdCkgbGltaXQgPSBzcGFuRW5kOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIHRoZSBzcGFucyB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgLy8gVGhlIHNwYW5zIGFycmF5IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm90IG51bGwgd2hlbiBudW1iZXJPZlNwYW5zIGlzID4gMAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgeworICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsOyAvLyBwcmV2ZW50IGEgbGVhazogbm8gcmVmZXJlbmNlIGtlcHQgd2hlbiBUZXh0TGluZSBpcyByZWN5Y2xlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCmluZGV4IDFlOGEyZjcuLjBkMjgzNWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTMwLDggKzMwLDYgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCiAvKioKICAqIFJlcHJlc2VudHMgYSBsaW5lIG9mIHN0eWxlZCB0ZXh0LCBmb3IgbWVhc3VyaW5nIGluIHZpc3VhbCBvcmRlciBhbmQKICAqIGZvciByZW5kZXJpbmcuCkBAIC04NjAsNzggKzg1OCw2IEBACiAgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BhblNldDxFPiB7Ci0gICAgICAgIGludCBudW1iZXJPZlNwYW5zOwotICAgICAgICBFW10gc3BhbnM7Ci0gICAgICAgIGludFtdIHNwYW5TdGFydHM7Ci0gICAgICAgIGludFtdIHNwYW5FbmRzOwotICAgICAgICBpbnRbXSBzcGFuRmxhZ3M7Ci0gICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFPiBjbGFzc1R5cGU7Ci0KLSAgICAgICAgU3BhblNldChDbGFzczw/IGV4dGVuZHMgRT4gdHlwZSkgewotICAgICAgICAgICAgY2xhc3NUeXBlID0gdHlwZTsKLSAgICAgICAgICAgIG51bWJlck9mU3BhbnMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoU3Bhbm5lZCBzcGFubmVkLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICAgICAgZmluYWwgRVtdIGFsbFNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsIGNsYXNzVHlwZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYWxsU3BhbnMubGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAoc3BhbnMgPT0gbnVsbCB8fCBzcGFucy5sZW5ndGggPCBsZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJyYXlzIG1heSBlbmQgdXAgYmVpbmcgdG9vIGxhcmdlIGJlY2F1c2Ugb2YgZW1wdHkgc3BhbnMKLSAgICAgICAgICAgICAgICBzcGFucyA9IChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGNsYXNzVHlwZSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcGFuU3RhcnRzID0gbmV3IGludFtsZW5ndGhdOwotICAgICAgICAgICAgICAgIHNwYW5FbmRzID0gbmV3IGludFtsZW5ndGhdOwotICAgICAgICAgICAgICAgIHNwYW5GbGFncyA9IG5ldyBpbnRbbGVuZ3RoXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbnVtYmVyT2ZTcGFucyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRSBzcGFuID0gYWxsU3BhbnNbaV07Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhblN0YXJ0ID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3Bhbik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNwYW5FbmQgPSBzcGFubmVkLmdldFNwYW5FbmQoc3Bhbik7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRmxhZyA9IHNwYW5uZWQuZ2V0U3BhbkZsYWdzKHNwYW4pOwotCi0gICAgICAgICAgICAgICAgc3BhbnNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuOwotICAgICAgICAgICAgICAgIHNwYW5TdGFydHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuU3RhcnQ7Ci0gICAgICAgICAgICAgICAgc3BhbkVuZHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuRW5kOwotICAgICAgICAgICAgICAgIHNwYW5GbGFnc1tudW1iZXJPZlNwYW5zXSA9IHNwYW5GbGFnOwotCi0gICAgICAgICAgICAgICAgbnVtYmVyT2ZTcGFucysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3BhbnNJbnRlcnNlY3RpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRlc3QgaXMgdmFsaWQgc2luY2UgYm90aCBpbnRlcnZhbHMgYXJlIG5vdCBlbXB0eSBieSBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICBpZiAoc3BhblN0YXJ0c1tpXSA+PSBlbmQgfHwgc3BhbkVuZHNbaV0gPD0gc3RhcnQpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldE5leHRUcmFuc2l0aW9uKGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFuU3RhcnRzW2ldOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRW5kID0gc3BhbkVuZHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA+IHN0YXJ0ICYmIHNwYW5TdGFydCA8IGxpbWl0KSBsaW1pdCA9IHNwYW5TdGFydDsKLSAgICAgICAgICAgICAgICBpZiAoc3BhbkVuZCA+IHN0YXJ0ICYmIHNwYW5FbmQgPCBsaW1pdCkgbGltaXQgPSBzcGFuRW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxpbWl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzcGFucyBhcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBudWxsIHdoZW4gbnVtYmVyT2ZTcGFucyBpcyA+IDAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTcGFuczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsOyAvLyBwcmV2ZW50IGEgbGVhazogbm8gcmVmZXJlbmNlIGtlcHQgd2hlbiBUZXh0TGluZSBpcyByZWN5Y2xlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgYSB1bmlkaXJlY3Rpb25hbCBydW4uICBUaGUgcnVuIG11c3Qgbm90CiAgICAgICogY29udGFpbiB0YWJzIG9yIGVtb2ppIGJ1dCBjYW4gY29udGFpbiBzdHlsZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IGQ3MjI0MWYuLjFlZjQ2YTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xMDQ1NiwxMCArMTA0NTYsMTAgQEAKICAgICAgICAgICAgIGlmIChtSGFyZHdhcmVMYXllciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUhhcmR3YXJlTGF5ZXIgPSBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5jcmVhdGVIYXJkd2FyZUxheWVyKAogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgaXNPcGFxdWUoKSk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUhhcmR3YXJlTGF5ZXIuZ2V0V2lkdGgoKSAhPSB3aWR0aCB8fCBtSGFyZHdhcmVMYXllci5nZXRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBtSGFyZHdhcmVMYXllci5yZXNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gVGhlIGxheWVyIGlzIG5vdCB2YWxpZCBpZiB0aGUgdW5kZXJseWluZyBHUFUgcmVzb3VyY2VzIGNhbm5vdCBiZSBhbGxvY2F0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCBmMDllMjlkLi5kYmNlYTcxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC03NDIsNyArNzQyLDggQEAKICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlRmlyc3QoQU5EUk9JRF9BU1NFVCwgIiIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFzc2V0cy5vcGVuKHVybCwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRzLm9wZW4odXJpLmdldFBhdGgoKSwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9GdWxsU2NyZWVuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQppbmRleCBmYWM1NDlkLi43MzBhZDA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0Z1bGxTY3JlZW4uamF2YQpAQCAtMTEyLDYgKzExMiwxOCBAQAogICAgICAgICB9CiAgICAgfTsKIAorICAgIE1lZGlhUGxheWVyLk9uVmlkZW9TaXplQ2hhbmdlZExpc3RlbmVyIG1TaXplQ2hhbmdlZExpc3RlbmVyID0KKyAgICAgICAgbmV3IE1lZGlhUGxheWVyLk9uVmlkZW9TaXplQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoTWVkaWFQbGF5ZXIgbXAsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOworICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1dpZHRoICE9IDAgJiYgbVZpZGVvSGVpZ2h0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvU3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCkuc2V0Rml4ZWRTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9OworCiAgICAgcHJpdmF0ZSBTdXJmYWNlVmlldyBnZXRTdXJmYWNlVmlldygpIHsKICAgICAgICAgcmV0dXJuIG1WaWRlb1N1cmZhY2VWaWV3OwogICAgIH0KQEAgLTE1MCw2ICsxNjIsNyBAQAogICAgICAgICBtYy5zZXRTeXN0ZW1VaVZpc2liaWxpdHkobUxheW91dC5nZXRTeXN0ZW1VaVZpc2liaWxpdHkoKSk7CiAgICAgICAgIHNldE1lZGlhQ29udHJvbGxlcihtYyk7CiAgICAgICAgIG1QbGF5ZXIuc2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSk7CisgICAgICAgIG1QbGF5ZXIuc2V0T25WaWRlb1NpemVDaGFuZ2VkTGlzdGVuZXIobVNpemVDaGFuZ2VkTGlzdGVuZXIpOwogICAgICAgICBwcmVwYXJlRGF0YUFuZERpc3BsYXlNb2RlKG1Qcm94eSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDU3NzQ0NDAuLjllMDcxNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC04OCw2ICs4OCw3IEBACiAgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIuT25Ub3VjaE1vZGVDaGFuZ2VMaXN0ZW5lciwKICAgICAgICAgUmVtb3RlVmlld3NBZGFwdGVyLlJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgewogCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFic0xpc3RWaWV3IjsKIAogICAgIC8qKgpAQCAtMjQyOSw3ICsyNDMwLDcgQEAKICAgICAgICAgZmluYWwgVmlld1RyZWVPYnNlcnZlciB0cmVlT2JzZXJ2ZXIgPSBnZXRWaWV3VHJlZU9ic2VydmVyKCk7CiAgICAgICAgIHRyZWVPYnNlcnZlci5yZW1vdmVPblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBpZiAobVRleHRGaWx0ZXJFbmFibGVkICYmIG1Qb3B1cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cmVlT2JzZXJ2ZXIucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHRyZWVPYnNlcnZlci5yZW1vdmVPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgbUdsb2JhbExheW91dExpc3RlbmVyQWRkZWRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgfQogCkBAIC0yOTQzLDExICsyOTQ0LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpcmVjdGlvbiA9IDA7IC8vIFJlc2V0IHdoZW4gZW50ZXJpbmcgb3ZlcnNjcm9sbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdEZWx0YVkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzSWRsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1FZGdlR2xvd1RvcC5nZXRCb3VuZHMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNJZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUobUVkZ2VHbG93Qm90dG9tLmdldEJvdW5kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblB1bGwoKGZsb2F0KSBvdmVyc2Nyb2xsIC8gZ2V0SGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1RvcC5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKQEAgLTI5NTYsNyArMjk2OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblkgPSB5OwotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0WSA9IHk7CiAgICAgICAgICAgICB9CkBAIC0yOTkwLDI2ICszMDAyLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShtRWRnZUdsb3dUb3AuZ2V0Qm91bmRzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYXdEZWx0YVkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIG92ZXJTY3JvbGxEaXN0YW5jZSAvIGdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1RvcC5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1FZGdlR2xvd0JvdHRvbS5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoaW5jcmVtZW50YWxEZWx0YVkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDb21pbmcgYmFjayB0byAncmVhbCcgbGlzdCBzY3JvbGxpbmcKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFyZW50SWZOZWVkZWQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFja01vdGlvblNjcm9sbChpbmNyZW1lbnRhbERlbHRhWSwgaW5jcmVtZW50YWxEZWx0YVkpOworICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcmVudElmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICB0cmFja01vdGlvblNjcm9sbChpbmNyZW1lbnRhbERlbHRhWSwgaW5jcmVtZW50YWxEZWx0YVkpOworCiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKIAogICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWQgbm90IHNjcm9sbCB0aGUgZnVsbCBhbW91bnQuIFRyZWF0IHRoaXMgZXNzZW50aWFsbHkgbGlrZSB0aGUKQEAgLTM0NjgsMTEgKzM0ODAsMTIgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHRQYWRkaW5nID0gbUxpc3RQYWRkaW5nLnJpZ2h0ICsgbUdsb3dQYWRkaW5nUmlnaHQ7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKSAtIGxlZnRQYWRkaW5nIC0gcmlnaHRQYWRkaW5nOwogCi0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShsZWZ0UGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKDAsIHNjcm9sbFkgKyBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MpKTsKKyAgICAgICAgICAgICAgICBpbnQgZWRnZVkgPSBNYXRoLm1pbigwLCBzY3JvbGxZICsgbUZpcnN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGxlZnRQYWRkaW5nLCBlZGdlWSk7CiAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLnNldFNpemUod2lkdGgsIGdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRQb3NpdGlvbihsZWZ0UGFkZGluZywgZWRnZVkpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1FZGdlR2xvd1RvcC5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwogICAgICAgICAgICAgfQpAQCAtMzQ4MywxMiArMzQ5NiwxNSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBsZWZ0UGFkZGluZyAtIHJpZ2h0UGFkZGluZzsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7CiAKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCArIGxlZnRQYWRkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoaGVpZ2h0LCBzY3JvbGxZICsgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MpKTsKKyAgICAgICAgICAgICAgICBpbnQgZWRnZVggPSAtd2lkdGggKyBsZWZ0UGFkZGluZzsKKyAgICAgICAgICAgICAgICBpbnQgZWRnZVkgPSBNYXRoLm1heChoZWlnaHQsIHNjcm9sbFkgKyBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyk7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShlZGdlWCwgZWRnZVkpOwogICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7CiAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0JvdHRvbS5kcmF3KGNhbnZhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciB0aGUgcm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFBvc2l0aW9uKGVkZ2VYICsgd2lkdGgsIGVkZ2VZIC0gbUVkZ2VHbG93Qm90dG9tLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShtRWRnZUdsb3dCb3R0b20uZ2V0Qm91bmRzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKICAgICAgICAgICAgIH0KQEAgLTM4NzQsNyArMzg5MCw4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc3RvcCBqdXN0IGJlY2F1c2UgZGVsdGEgaXMgemVybyAoaXQgY291bGQgaGF2ZSBiZWVuIHJvdW5kZWQpCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhdEVuZCA9IHRyYWNrTW90aW9uU2Nyb2xsKGRlbHRhLCBkZWx0YSkgJiYgKGRlbHRhICE9IDApOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRFZGdlID0gdHJhY2tNb3Rpb25TY3JvbGwoZGVsdGEsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGF0RW5kID0gYXRFZGdlICYmIChkZWx0YSAhPSAwKTsKICAgICAgICAgICAgICAgICBpZiAoYXRFbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdlYWsgdGhlIHNjcm9sbCBmb3IgaG93IGZhciB3ZSBvdmVyc2hvdApAQCAtMzg4OSw3ICszOTA2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobW9yZSAmJiAhYXRFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlKSBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0RmxpbmdZID0geTsKICAgICAgICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDQzMSw3ICs0NDQ4LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtU2Nyb2xsaW5nQ2FjaGVFbmFibGVkICYmICFtQ2FjaGluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1TY3JvbGxpbmdDYWNoZUVuYWJsZWQgJiYgIW1DYWNoaW5nU3RhcnRlZCAmJiAhaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKICAgICAgICAgICAgIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgbUNhY2hpbmdTdGFydGVkID0gbUNhY2hpbmdBY3RpdmUgPSB0cnVlOwpAQCAtNDQzOSwyMyArNDQ1NiwyNSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbGVhclNjcm9sbGluZ0NhY2hlKCkgewotICAgICAgICBpZiAobUNsZWFyU2Nyb2xsaW5nQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNsZWFyU2Nyb2xsaW5nQ2FjaGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUNhY2hpbmdTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGluZ1N0YXJ0ZWQgPSBtQ2FjaGluZ0FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3bldpdGhDYWNoZUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtUGVyc2lzdGVudERyYXdpbmdDYWNoZSAmIFBFUlNJU1RFTlRfU0NST0xMSU5HX0NBQ0hFKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3aW5nQ2FjaGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBbHdheXNEcmF3bldpdGhDYWNoZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKCFpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgeworICAgICAgICAgICAgaWYgKG1DbGVhclNjcm9sbGluZ0NhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2xlYXJTY3JvbGxpbmdDYWNoZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYWNoaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoaW5nU3RhcnRlZCA9IG1DYWNoaW5nQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3bldpdGhDYWNoZUVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVBlcnNpc3RlbnREcmF3aW5nQ2FjaGUgJiBQRVJTSVNURU5UX1NDUk9MTElOR19DQUNIRSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZHJlbkRyYXdpbmdDYWNoZUVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWx3YXlzRHJhd25XaXRoQ2FjaGVFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc3QobUNsZWFyU2Nyb2xsaW5nQ2FjaGUpOwogICAgICAgICB9Ci0gICAgICAgIHBvc3QobUNsZWFyU2Nyb2xsaW5nQ2FjaGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU5OSwxNCArNDYxOCwxOCBAQAogICAgICAgICAgICAgbVJlY3ljbGVyLnJlbW92ZVNraXBwZWRTY3JhcCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBiZWZvcmUgbW92aW5nIHRoZSBjaGlsZHJlbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBpbnZhbGlkYXRlCisgICAgICAgIC8vIGNhbGxzIHRvIGJ1YmJsZSB1cCBmcm9tIHRoZSBjaGlsZHJlbiBhbGwgdGhlIHdheSB0byB0aGUgdG9wCisgICAgICAgIGlmICghYXdha2VuU2Nyb2xsQmFycygpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKwogICAgICAgICBvZmZzZXRDaGlsZHJlblRvcEFuZEJvdHRvbShpbmNyZW1lbnRhbERlbHRhWSk7CiAKICAgICAgICAgaWYgKGRvd24pIHsKICAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uICs9IGNvdW50OwogICAgICAgICB9CiAKLSAgICAgICAgaW52YWxpZGF0ZSgpOwotCiAgICAgICAgIGZpbmFsIGludCBhYnNJbmNyZW1lbnRhbERlbHRhWSA9IE1hdGguYWJzKGluY3JlbWVudGFsRGVsdGFZKTsKICAgICAgICAgaWYgKHNwYWNlQWJvdmUgPCBhYnNJbmNyZW1lbnRhbERlbHRhWSB8fCBzcGFjZUJlbG93IDwgYWJzSW5jcmVtZW50YWxEZWx0YVkpIHsKICAgICAgICAgICAgIGZpbGxHYXAoZG93bik7CkBAIC00NjI5LDcgKzQ2NTIsNiBAQAogICAgICAgICBtQmxvY2tMYXlvdXRSZXF1ZXN0cyA9IGZhbHNlOwogCiAgICAgICAgIGludm9rZU9uSXRlbVNjcm9sbExpc3RlbmVyKCk7Ci0gICAgICAgIGF3YWtlblNjcm9sbEJhcnMoKTsKIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VFZmZlY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGdlRWZmZWN0LmphdmEKaW5kZXggODNhYThiYS4uYzFmMzFiYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VFZmZlY3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUVmZmVjdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNDUsNiArNDYsNyBAQAogICoge0BsaW5rICNkcmF3KENhbnZhcyl9IG1ldGhvZC48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBFZGdlRWZmZWN0IHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRWRnZUVmZmVjdCI7CiAKICAgICAvLyBUaW1lIGl0IHdpbGwgdGFrZSB0aGUgZWZmZWN0IHRvIGZ1bGx5IHJlY2VkZSBpbiBtcwpAQCAtNTcsMTAgKzU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVMTF9ERUNBWV9USU1FID0gMTAwMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9BTFBIQSA9IDEuZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0VER0VfQUxQSEEgPSAwLjdmOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9TQ0FMRV9ZID0gMC41ZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0dMT1dfQUxQSEEgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19TQ0FMRV9ZID0gMC41ZjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9HTE9XX0hFSUdIVCA9IDQuZjsKIApAQCAtNzYsNyArNzUsOSBAQAogICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbUdsb3c7CiAgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOwogICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUlOX1dJRFRIID0gMzAwOworICAgIHByaXZhdGUgaW50IG1YOworICAgIHByaXZhdGUgaW50IG1ZOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fV0lEVEggPSAzMDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1pbldpZHRoOwogCiAgICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhOwpAQCAtMTE5LDYgKzEyMCw4IEBACiAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gU1RBVEVfSURMRTsKIAogICAgIHByaXZhdGUgZmxvYXQgbVB1bGxEaXN0YW5jZTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbUJvdW5kcyA9IG5ldyBSZWN0KCk7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRWRnZUVmZmVjdCB3aXRoIGEgdGhlbWUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm92aWRlZCBjb250ZXh0LgpAQCAtMTQ1LDYgKzE0OCwyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhpcyBlZGdlIGVmZmVjdCBpbiBwaXhlbHMuIFRoaXMgcG9zaXRpb24gaXMKKyAgICAgKiBvbmx5IHVzZWQgYnkge0BsaW5rICNnZXRCb3VuZHMoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHggVGhlIHBvc2l0aW9uIG9mIHRoZSBlZGdlIGVmZmVjdCBvbiB0aGUgWCBheGlzCisgICAgICogQHBhcmFtIHkgVGhlIHBvc2l0aW9uIG9mIHRoZSBlZGdlIGVmZmVjdCBvbiB0aGUgWSBheGlzCisgICAgICovCisgICAgdm9pZCBzZXRQb3NpdGlvbihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVggPSB4OworICAgICAgICBtWSA9IHk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0lkbGUoKSB7CisgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfSURMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGVmZmVjdCBpdHNlbGYuCisgICAgICovCisgICAgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1HbG93LmdldEJvdW5kcygpLmhlaWdodCgpLCBtRWRnZS5nZXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFJlcG9ydHMgaWYgdGhpcyBFZGdlRWZmZWN0J3MgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlCiAgICAgICogYWZ0ZXIgYSBjYWxsIHRvIHtAbGluayAjZHJhdyhDYW52YXMpfSB0aGUgaG9zdCB3aWRnZXQgc2hvdWxkIHNjaGVkdWxlIGFub3RoZXIKICAgICAgKiBkcmF3aW5nIHBhc3MgdG8gY29udGludWUgdGhlIGFuaW1hdGlvbi4KQEAgLTMwMSw3ICszMjcsNiBAQAogICAgICAgICB1cGRhdGUoKTsKIAogICAgICAgICBmaW5hbCBpbnQgZWRnZUhlaWdodCA9IG1FZGdlLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICBmaW5hbCBpbnQgZWRnZVdpZHRoID0gbUVkZ2UuZ2V0SW50cmluc2ljV2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGdsb3dIZWlnaHQgPSBtR2xvdy5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKICAgICAgICAgZmluYWwgaW50IGdsb3dXaWR0aCA9IG1HbG93LmdldEludHJpbnNpY1dpZHRoKCk7CiAKQEAgLTMzNCw5ICszNTksMjMgQEAKICAgICAgICAgfQogICAgICAgICBtRWRnZS5kcmF3KGNhbnZhcyk7CiAKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9SRUNFREUgJiYgZ2xvd0JvdHRvbSA9PSAwICYmIGVkZ2VCb3R0b20gPT0gMCkgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBtU3RhdGUgIT0gU1RBVEVfSURMRTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGVkZ2UgZWZmZWN0LgorICAgICAqLworICAgIHB1YmxpYyBSZWN0IGdldEJvdW5kcygpIHsKKyAgICAgICAgbUJvdW5kcy5zZXQobUdsb3cuZ2V0Qm91bmRzKCkpOworICAgICAgICBtQm91bmRzLnVuaW9uKG1FZGdlLmdldEJvdW5kcygpKTsKKyAgICAgICAgbUJvdW5kcy5vZmZzZXQobVgsIG1ZKTsKKyAgICAgICAgcmV0dXJuIG1Cb3VuZHM7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgZmxvYXQgdCA9IE1hdGgubWluKCh0aW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb24sIDEuZik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhCmluZGV4IGRhOTg4ODQuLmQwMTlkOGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhCkBAIC0xMjIsMTAgKzEyMiwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGZvcmVncm91bmQgaXMgcG9zaXRpb25lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZm9yZWdyb3VuZCBncmF2aXR5LgorICAgICAqCisgICAgICogQHNlZSAjc2V0Rm9yZWdyb3VuZEdyYXZpdHkoaW50KQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjRnJhbWVMYXlvdXRfZm9yZWdyb3VuZEdyYXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZvcmVncm91bmRHcmF2aXR5KCkgeworICAgICAgICByZXR1cm4gbUZvcmVncm91bmRHcmF2aXR5OworICAgIH0KKworICAgIC8qKgogICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGZvcmVncm91bmQgaXMgcG9zaXRpb25lZC4gRGVmYXVsdHMgdG8gU1RBUlQgYW5kIFRPUC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmb3JlZ3JvdW5kR3Jhdml0eSBTZWUge0BsaW5rIGFuZHJvaWQudmlldy5HcmF2aXR5fQogICAgICAqCisgICAgICogQHNlZSAjZ2V0Rm9yZWdyb3VuZEdyYXZpdHkoKQorICAgICAqCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjRnJhbWVMYXlvdXRfZm9yZWdyb3VuZEdyYXZpdHkKICAgICAgKi8KICAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZExheW91dC5qYXZhCmluZGV4IGZjMDhjYzUuLjYwZGQ1NWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRMYXlvdXQuamF2YQpAQCAtMjksOCArMjksOCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xNDYsNiArMTQ2LDcgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRMYXlvdXRfcm93T3JkZXJQcmVzZXJ2ZWQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRMYXlvdXRfY29sdW1uT3JkZXJQcmVzZXJ2ZWQKICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBHcmlkTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKIAogICAgIC8vIFB1YmxpYyBjb25zdGFudHMKQEAgLTIzNCw3ICsyMzUsNiBAQAogCiAgICAgZmluYWwgQXhpcyBob3Jpem9udGFsQXhpcyA9IG5ldyBBeGlzKHRydWUpOwogICAgIGZpbmFsIEF4aXMgdmVydGljYWxBeGlzID0gbmV3IEF4aXMoZmFsc2UpOwotICAgIGJvb2xlYW4gbGF5b3V0UGFyYW1zVmFsaWQgPSBmYWxzZTsKICAgICBpbnQgb3JpZW50YXRpb24gPSBERUZBVUxUX09SSUVOVEFUSU9OOwogICAgIGJvb2xlYW4gdXNlRGVmYXVsdE1hcmdpbnMgPSBERUZBVUxUX1VTRV9ERUZBVUxUX01BUkdJTlM7CiAgICAgaW50IGFsaWdubWVudE1vZGUgPSBERUZBVUxUX0FMSUdOTUVOVF9NT0RFOwpAQCAtNzEzLDEyICs3MTMsMTAgQEAKIAogICAgICAgICAgICAgbWlub3IgPSBtaW5vciArIG1pbm9yU3BhbjsKICAgICAgICAgfQotICAgICAgICBsYXN0TGF5b3V0UGFyYW1zSGFzaENvZGUgPSBjb21wdXRlTGF5b3V0UGFyYW1zSGFzaENvZGUoKTsKLSAgICAgICAgaW52YWxpZGF0ZVN0cnVjdHVyZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlU3RydWN0dXJlKCkgewotICAgICAgICBsYXlvdXRQYXJhbXNWYWxpZCA9IGZhbHNlOworICAgICAgICBsYXN0TGF5b3V0UGFyYW1zSGFzaENvZGUgPSBVTklOSVRJQUxJWkVEX0hBU0g7CiAgICAgICAgIGhvcml6b250YWxBeGlzLmludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKICAgICAgICAgdmVydGljYWxBeGlzLmludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKICAgICAgICAgLy8gVGhpcyBjYW4gZW5kIHVwIGJlaW5nIGRvbmUgdHdpY2UuIEJldHRlciB0d2ljZSB0aGFuIG5vdCBhdCBhbGwuCkBAIC03NDIsMTAgKzc0MCw2IEBACiAgICAgfQogCiAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGdldExheW91dFBhcmFtcyhWaWV3IGMpIHsKLSAgICAgICAgaWYgKCFsYXlvdXRQYXJhbXNWYWxpZCkgewotICAgICAgICAgICAgdmFsaWRhdGVMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgIGxheW91dFBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gKExheW91dFBhcmFtcykgYy5nZXRMYXlvdXRQYXJhbXMoKTsKICAgICB9CiAKQEAgLTg3NCwyMCArODY4LDIyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yTGF5b3V0UGFyYW1zTW9kaWZpY2F0aW9uKCkgewotICAgICAgICBpbnQgbGF5b3V0UGFyYW1zSGFzaENvZGUgPSBjb21wdXRlTGF5b3V0UGFyYW1zSGFzaENvZGUoKTsKLSAgICAgICAgaWYgKGxhc3RMYXlvdXRQYXJhbXNIYXNoQ29kZSAhPSBVTklOSVRJQUxJWkVEX0hBU0ggJiYKLSAgICAgICAgICAgICAgICBsYXN0TGF5b3V0UGFyYW1zSGFzaENvZGUgIT0gbGF5b3V0UGFyYW1zSGFzaENvZGUpIHsKLSAgICAgICAgICAgIGludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKKyAgICBwcml2YXRlIHZvaWQgY29uc2lzdGVuY3lDaGVjaygpIHsKKyAgICAgICAgaWYgKGxhc3RMYXlvdXRQYXJhbXNIYXNoQ29kZSA9PSBVTklOSVRJQUxJWkVEX0hBU0gpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBsYXN0TGF5b3V0UGFyYW1zSGFzaENvZGUgPSBjb21wdXRlTGF5b3V0UGFyYW1zSGFzaENvZGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChsYXN0TGF5b3V0UGFyYW1zSGFzaENvZGUgIT0gY29tcHV0ZUxheW91dFBhcmFtc0hhc2hDb2RlKCkpIHsKICAgICAgICAgICAgIExvZy53KFRBRywgIlRoZSBmaWVsZHMgb2Ygc29tZSBsYXlvdXQgcGFyYW1ldGVycyB3ZXJlIG1vZGlmaWVkIGluIGJldHdlZW4gbGF5b3V0ICIgKwogICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9ucy4gQ2hlY2sgdGhlIGphdmFkb2MgZm9yIEdyaWRMYXlvdXQuTGF5b3V0UGFyYW1zI3Jvd1NwZWMuIik7CisgICAgICAgICAgICBpbnZhbGlkYXRlU3RydWN0dXJlKCk7CisgICAgICAgICAgICBjb25zaXN0ZW5jeUNoZWNrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBNZWFzdXJlbWVudAogCiAgICAgcHJpdmF0ZSB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zMihWaWV3IGNoaWxkLCBpbnQgcGFyZW50V2lkdGhTcGVjLCBpbnQgcGFyZW50SGVpZ2h0U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZFdpZHRoLCBpbnQgY2hpbGRIZWlnaHQpIHsKKyAgICAgICAgICAgIGludCBjaGlsZFdpZHRoLCBpbnQgY2hpbGRIZWlnaHQpIHsKICAgICAgICAgaW50IGNoaWxkV2lkdGhTcGVjID0gZ2V0Q2hpbGRNZWFzdXJlU3BlYyhwYXJlbnRXaWR0aFNwZWMsCiAgICAgICAgICAgICAgICAgbVBhZGRpbmdMZWZ0ICsgbVBhZGRpbmdSaWdodCArIGdldFRvdGFsTWFyZ2luKGNoaWxkLCB0cnVlKSwgY2hpbGRXaWR0aCk7CiAgICAgICAgIGludCBjaGlsZEhlaWdodFNwZWMgPSBnZXRDaGlsZE1lYXN1cmVTcGVjKHBhcmVudEhlaWdodFNwZWMsCkBAIC05MjMsNyArOTE5LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhTcGVjLCBpbnQgaGVpZ2h0U3BlYykgewotICAgICAgICBjaGVja0ZvckxheW91dFBhcmFtc01vZGlmaWNhdGlvbigpOworICAgICAgICBjb25zaXN0ZW5jeUNoZWNrKCk7CiAKICAgICAgICAgLyoqIElmIHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkge0BsaW5rIFZpZXcjbWVhc3VyZShpbnQsIGludCl9LCBvbmUgb2Ygd2lkdGggb3IgaGVpZ2h0CiAgICAgICAgICAqICBpcyAgbGlrZWx5IHRvIGhhdmUgY2hhbmdlZC4gV2UgbXVzdCBpbnZhbGlkYXRlIGlmIHNvLiAqLwpAQCAtOTkzLDcgKzk4OSw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGNoZWNrRm9yTGF5b3V0UGFyYW1zTW9kaWZpY2F0aW9uKCk7CisgICAgICAgIGNvbnNpc3RlbmN5Q2hlY2soKTsKIAogICAgICAgICBpbnQgdGFyZ2V0V2lkdGggPSByaWdodCAtIGxlZnQ7CiAgICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSBib3R0b20gLSB0b3A7CkBAIC0xMjUwLDcgKzEyNDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIGtleSwgTXV0YWJsZUludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlnbm9yZUlmQWxyZWFkeVByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlnbm9yZUlmQWxyZWFkeVByZXNlbnQpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICBSZW1vdmUgc2VsZiByZWZlcmVudGlhbCBsaW5rcy4KICAgICAgICAgICAgIFRoZXNlIGFwcGVhcjoKQEAgLTE0MjksOCArMTQyNSw4IEBACiAgICAgICAgICAgICAgICAgaW50IGRzdCA9IGFyYy5zcGFuLm1heDsKICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBhcmMudmFsdWUudmFsdWU7CiAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoc3JjIDwgZHN0KSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyBkc3QgKyAiIC0gIiArIHZhciArIHNyYyArICIgPiAiICsgdmFsdWUgOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFyICsgc3JjICsgIiAtICIgKyB2YXIgKyBkc3QgKyAiIDwgIiArIC12YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyBkc3QgKyAiLSIgKyB2YXIgKyBzcmMgKyAiPj0iICsgdmFsdWUgOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyICsgc3JjICsgIi0iICsgdmFyICsgZHN0ICsgIjw9IiArIC12YWx1ZSk7CiAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQppbmRleCBhMWJlYTQzLi41ZWQwMDVmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCkBAIC0yMzUsOSArMjM1LDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZGl2aWRlciBEcmF3YWJsZSB0aGF0IHdpbGwgZGl2aWRlIGVhY2ggaXRlbS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldERpdmlkZXJEcmF3YWJsZShEcmF3YWJsZSkKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9kaXZpZGVyCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldERpdmlkZXJEcmF3YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EaXZpZGVyOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCBhIGRyYXdhYmxlIHRvIGJlIHVzZWQgYXMgYSBkaXZpZGVyIGJldHdlZW4gaXRlbXMuCisgICAgICoKICAgICAgKiBAcGFyYW0gZGl2aWRlciBEcmF3YWJsZSB0aGF0IHdpbGwgZGl2aWRlIGVhY2ggaXRlbS4KKyAgICAgKgogICAgICAqIEBzZWUgI3NldFNob3dEaXZpZGVycyhpbnQpCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfZGl2aWRlcgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpdmlkZXJEcmF3YWJsZShEcmF3YWJsZSBkaXZpZGVyKSB7CiAgICAgICAgIGlmIChkaXZpZGVyID09IG1EaXZpZGVyKSB7CkBAIC0zOTgsNiArNDEzLDggQEAKICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZSBtaW5pbXVtCiAgICAgICogICAgICAgICBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIG1Vc2VMYXJnZXN0Q2hpbGQ7CkBAIC00MTIsNiArNDI5LDggQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUKICAgICAgKiAgICAgICAgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKICAgICAgKi8KICAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKICAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCmluZGV4IGU0YjhmMzQuLjI5Y2YwMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCkBAIC0yMTksNiArMjE5LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVzY3JpYmVzIGhvdyB0aGUgY2hpbGQgdmlld3MgYXJlIHBvc2l0aW9uZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBncmF2aXR5LgorICAgICAqCisgICAgICogQHNlZSAjc2V0R3Jhdml0eShpbnQpCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuR3Jhdml0eQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUmVsYXRpdmVMYXlvdXRfZ3Jhdml0eQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0R3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1HcmF2aXR5OworICAgIH0KKworICAgIC8qKgogICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGNoaWxkIHZpZXdzIGFyZSBwb3NpdGlvbmVkLiBEZWZhdWx0cyB0bwogICAgICAqIDxjb2RlPkdyYXZpdHkuTEVGVCB8IEdyYXZpdHkuVE9QPC9jb2RlPi4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQuamF2YQppbmRleCBiODcwY2VlLi42MzMxYjZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFibGVMYXlvdXQuamF2YQpAQCAtMjMyLDYgKzIzMiw4IEBACiAgICAgICogPHA+SW5kaWNhdGVzIHdoZXRoZXIgYWxsIGNvbHVtbnMgYXJlIHNocmlua2FibGUgb3Igbm90LjwvcD4KICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgY29sdW1ucyBhcmUgc2hyaW5rYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUYWJsZUxheW91dF9zaHJpbmtDb2x1bW5zCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaHJpbmtBbGxDb2x1bW5zKCkgewogICAgICAgICByZXR1cm4gbVNocmlua0FsbENvbHVtbnM7CkBAIC0yNTIsNiArMjU0LDggQEAKICAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciBhbGwgY29sdW1ucyBhcmUgc3RyZXRjaGFibGUgb3Igbm90LjwvcD4KICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgY29sdW1ucyBhcmUgc3RyZXRjaGFibGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGFibGVMYXlvdXRfc3RyZXRjaENvbHVtbnMKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmV0Y2hBbGxDb2x1bW5zKCkgewogICAgICAgICByZXR1cm4gbVN0cmV0Y2hBbGxDb2x1bW5zOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvQml0d2lzZU91dHB1dFN0cmVhbS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvQml0d2lzZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDcwYzBiZTguLmRkZWNiZWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0JpdHdpc2VPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9CaXR3aXNlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTc3LDYgKzc3LDcgQEAKICAgICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlWyhtUG9zICsgYml0cykgPj4+IDJdOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1CdWYsIDAsIG5ld0J1ZiwgMCwgbUVuZCA+Pj4gMyk7CiAgICAgICAgIG1CdWYgPSBuZXdCdWY7CisgICAgICAgIG1FbmQgPSBuZXdCdWYubGVuZ3RoIDw8IDM7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAKaW5kZXggMDg4MDYyYS4uNjU1YTgzNCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmNwcApAQCAtMTYyLDEyICsxNjIsMTIgQEAKIGludDMyX3QgQUlucHV0UXVldWU6OmdldEV2ZW50KEFJbnB1dEV2ZW50Kiogb3V0RXZlbnQpIHsKICAgICAqb3V0RXZlbnQgPSBOVUxMOwogCi0gICAgYm9vbCBmaW5pc2hOb3cgPSBmYWxzZTsKLQogICAgIGNoYXIgYnl0ZXJlYWQ7CiAgICAgc3NpemVfdCBuUmVhZCA9IHJlYWQobURpc3BhdGNoS2V5UmVhZCwgJmJ5dGVyZWFkLCAxKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBpZiAoblJlYWQgPT0gMSkgewotICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChtRGlzcGF0Y2hpbmdLZXlzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIEtleUV2ZW50KiBrZXZlbnQgPSBtRGlzcGF0Y2hpbmdLZXlzWzBdOwogICAgICAgICAgICAgKm91dEV2ZW50ID0ga2V2ZW50OwpAQCAtMTc4LDYgKzE3OCw4IEBACiAgICAgICAgICAgICBpbmZsaWdodC5maW5pc2hTZXEgPSAwOwogICAgICAgICAgICAgbUluRmxpZ2h0RXZlbnRzLnB1c2goaW5mbGlnaHQpOwogICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmaW5pc2hOb3cgPSBmYWxzZTsKICAgICAgICAgaWYgKG1GaW5pc2hQcmVEaXNwYXRjaGVzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGZpbmlzaF9wcmVfZGlzcGF0Y2ggZmluaXNoKG1GaW5pc2hQcmVEaXNwYXRjaGVzWzBdKTsKICAgICAgICAgICAgIG1GaW5pc2hQcmVEaXNwYXRjaGVzLnJlbW92ZUF0KDApOwpAQCAtMTkzLDcgKzE5NSw2IEBACiAgICAgICAgICAgICAgICAgQUxPR1coImdldEV2ZW50IGNvdWxkbid0IGZpbmQgaW5mbGlnaHQgZm9yIHNlcSAlZCIsIGZpbmlzaC5zZXEpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgICAgIGlmIChmaW5pc2hOb3cpIHsKICAgICAgICAgICAgIGZpbmlzaEV2ZW50KCpvdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwpAQCAtMjA2LDcgKzIwNyw4IEBACiAKICAgICB1aW50MzJfdCBjb25zdW1lclNlcTsKICAgICBJbnB1dEV2ZW50KiBteUV2ZW50ID0gTlVMTDsKLSAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXIuY29uc3VtZSh0aGlzLCB0cnVlIC8qY29uc3VtZUJhdGNoZXMqLywgJmNvbnN1bWVyU2VxLCAmbXlFdmVudCk7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvbnN1bWVyLmNvbnN1bWUoJm1Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeSwgdHJ1ZSAvKmNvbnN1bWVCYXRjaGVzKi8sCisgICAgICAgICAgICAmY29uc3VtZXJTZXEsICZteUV2ZW50KTsKICAgICBpZiAocmVzICE9IGFuZHJvaWQ6Ok9LKSB7CiAgICAgICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKICAgICAgICAgICAgIEFMT0dXKCJjaGFubmVsICclcycgfiBGYWlsZWQgdG8gY29uc3VtZSBpbnB1dCBldmVudC4gIHN0YXR1cz0lZCIsCkBAIC0yMTUsNiArMjE3LDEwIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBpZiAobUNvbnN1bWVyLmhhc0RlZmVycmVkRXZlbnQoKSkgeworICAgICAgICB3YWtldXBEaXNwYXRjaExvY2tlZCgpOworICAgIH0KKwogICAgIGluX2ZsaWdodF9ldmVudCBpbmZsaWdodDsKICAgICBpbmZsaWdodC5ldmVudCA9IG15RXZlbnQ7CiAgICAgaW5mbGlnaHQuc2VxID0gLTE7CkBAIC0yNTUsNyArMjYxLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1Mb2NrLmxvY2soKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgY29uc3Qgc2l6ZV90IE4gPSBtSW5GbGlnaHRFdmVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgY29uc3QgaW5fZmxpZ2h0X2V2ZW50JiBpbmZsaWdodChtSW5GbGlnaHRFdmVudHNbaV0pOwpAQCAtMjY3LDExMSArMjc0LDgyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxJbnB1dEV2ZW50Kj4oZXZlbnQpLT5nZXRUeXBlKCkgPT0gQUlOUFVUX0VWRU5UX1RZUEVfS0VZKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsS2V5RXZlbnRzLnB1c2goc3RhdGljX2Nhc3Q8S2V5RXZlbnQqPihldmVudCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxNb3Rpb25FdmVudHMucHVzaChzdGF0aWNfY2FzdDxNb3Rpb25FdmVudCo+KGV2ZW50KSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9vbGVkSW5wdXRFdmVudEZhY3RvcnkucmVjeWNsZShzdGF0aWNfY2FzdDxJbnB1dEV2ZW50Kj4oZXZlbnQpKTsKICAgICAgICAgICAgIG1JbkZsaWdodEV2ZW50cy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIAorCiAgICAgQUxPR1coImZpbmlzaEV2ZW50IGNhbGxlZCBmb3IgdW5rbm93biBldmVudDogJXAiLCBldmVudCk7CiB9CiAKIHZvaWQgQUlucHV0UXVldWU6OmRpc3BhdGNoRXZlbnQoYW5kcm9pZDo6S2V5RXZlbnQqIGV2ZW50KSB7Ci0gICAgbUxvY2subG9jaygpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBMT0dfVFJBQ0UoImRpc3BhdGNoRXZlbnQ6IGRpc3BhdGNoaW5nPSVkIHdyaXRlPSVkXG4iLCBtRGlzcGF0Y2hpbmdLZXlzLnNpemUoKSwKICAgICAgICAgICAgIG1EaXNwYXRjaEtleVdyaXRlKTsKICAgICBtRGlzcGF0Y2hpbmdLZXlzLmFkZChldmVudCk7Ci0gICAgd2FrZXVwRGlzcGF0Y2goKTsKLSAgICBtTG9jay51bmxvY2soKTsKKyAgICB3YWtldXBEaXNwYXRjaExvY2tlZCgpOwogfQogCiB2b2lkIEFJbnB1dFF1ZXVlOjpmaW5pc2hQcmVEaXNwYXRjaChpbnQgc2VxLCBib29sIGhhbmRsZWQpIHsKLSAgICBtTG9jay5sb2NrKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIExPR19UUkFDRSgiZmluaXNoUHJlRGlzcGF0Y2g6IHNlcT0lZCBoYW5kbGVkPSVkXG4iLCBzZXEsIGhhbmRsZWQgPyAxIDogMCk7CiAgICAgZmluaXNoX3ByZV9kaXNwYXRjaCBmaW5pc2g7CiAgICAgZmluaXNoLnNlcSA9IHNlcTsKICAgICBmaW5pc2guaGFuZGxlZCA9IGhhbmRsZWQ7CiAgICAgbUZpbmlzaFByZURpc3BhdGNoZXMuYWRkKGZpbmlzaCk7Ci0gICAgd2FrZXVwRGlzcGF0Y2goKTsKLSAgICBtTG9jay51bmxvY2soKTsKKyAgICB3YWtldXBEaXNwYXRjaExvY2tlZCgpOwogfQogCiBLZXlFdmVudCogQUlucHV0UXVldWU6OmNvbnN1bWVVbmhhbmRsZWRFdmVudCgpIHsKLSAgICBLZXlFdmVudCogZXZlbnQgPSBOVUxMOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBtTG9jay5sb2NrKCk7CisgICAgS2V5RXZlbnQqIGV2ZW50ID0gTlVMTDsKICAgICBpZiAobVVuaGFuZGxlZEtleXMuc2l6ZSgpID4gMCkgewogICAgICAgICBldmVudCA9IG1VbmhhbmRsZWRLZXlzWzBdOwogICAgICAgICBtVW5oYW5kbGVkS2V5cy5yZW1vdmVBdCgwKTsKICAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICBMT0dfVFJBQ0UoImNvbnN1bWVVbmhhbmRsZWRFdmVudDogS2V5RXZlbnQ9JXAiLCBldmVudCk7Ci0KICAgICByZXR1cm4gZXZlbnQ7CiB9CiAKIEtleUV2ZW50KiBBSW5wdXRRdWV1ZTo6Y29uc3VtZVByZURpc3BhdGNoaW5nRXZlbnQoaW50KiBvdXRTZXEpIHsKLSAgICBLZXlFdmVudCogZXZlbnQgPSBOVUxMOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBtTG9jay5sb2NrKCk7CisgICAgS2V5RXZlbnQqIGV2ZW50ID0gTlVMTDsKICAgICBpZiAobVByZURpc3BhdGNoaW5nS2V5cy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGNvbnN0IGluX2ZsaWdodF9ldmVudCYgaW5mbGlnaHQobVByZURpc3BhdGNoaW5nS2V5c1swXSk7CiAgICAgICAgIGV2ZW50ID0gc3RhdGljX2Nhc3Q8S2V5RXZlbnQqPihpbmZsaWdodC5ldmVudCk7CiAgICAgICAgICpvdXRTZXEgPSBpbmZsaWdodC5zZXE7CiAgICAgICAgIG1QcmVEaXNwYXRjaGluZ0tleXMucmVtb3ZlQXQoMCk7CiAgICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgTE9HX1RSQUNFKCJjb25zdW1lUHJlRGlzcGF0Y2hpbmdFdmVudDogS2V5RXZlbnQ9JXAiLCBldmVudCk7Ci0KICAgICByZXR1cm4gZXZlbnQ7CiB9CiAKIEtleUV2ZW50KiBBSW5wdXRRdWV1ZTo6Y3JlYXRlS2V5RXZlbnQoKSB7Ci0gICAgbUxvY2subG9jaygpOwotICAgIEtleUV2ZW50KiBldmVudDsKLSAgICBpZiAobUF2YWlsS2V5RXZlbnRzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQgPSBtQXZhaWxLZXlFdmVudHMudG9wKCk7Ci0gICAgICAgIG1BdmFpbEtleUV2ZW50cy5wb3AoKTsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmV0dXJuIGV2ZW50OwotfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLU1vdGlvbkV2ZW50KiBBSW5wdXRRdWV1ZTo6Y3JlYXRlTW90aW9uRXZlbnQoKSB7Ci0gICAgbUxvY2subG9jaygpOwotICAgIE1vdGlvbkV2ZW50KiBldmVudDsKLSAgICBpZiAobUF2YWlsTW90aW9uRXZlbnRzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgIGV2ZW50ID0gbmV3IE1vdGlvbkV2ZW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQgPSBtQXZhaWxNb3Rpb25FdmVudHMudG9wKCk7Ci0gICAgICAgIG1BdmFpbE1vdGlvbkV2ZW50cy5wb3AoKTsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmV0dXJuIGV2ZW50OworICAgIHJldHVybiBtUG9vbGVkSW5wdXRFdmVudEZhY3RvcnkuY3JlYXRlS2V5RXZlbnQoKTsKIH0KIAogdm9pZCBBSW5wdXRRdWV1ZTo6ZG9VbmhhbmRsZWRLZXkoS2V5RXZlbnQqIGtleUV2ZW50KSB7Ci0gICAgbUxvY2subG9jaygpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBMT0dfVFJBQ0UoIlVuaGFuZGxlZCBrZXk6IHBlbmRpbmc9JWQgd3JpdGU9JWRcbiIsIG1VbmhhbmRsZWRLZXlzLnNpemUoKSwgbVdvcmtXcml0ZSk7CiAgICAgaWYgKG1VbmhhbmRsZWRLZXlzLnNpemUoKSA8PSAwICYmIG1Xb3JrV3JpdGUgPj0gMCkgewogICAgICAgICB3cml0ZV93b3JrKG1Xb3JrV3JpdGUsIENNRF9ERUZfS0VZKTsKICAgICB9CiAgICAgbVVuaGFuZGxlZEtleXMuYWRkKGtleUV2ZW50KTsKLSAgICBtTG9jay51bmxvY2soKTsKIH0KIAogYm9vbCBBSW5wdXRRdWV1ZTo6cHJlRGlzcGF0Y2hLZXkoS2V5RXZlbnQqIGtleUV2ZW50KSB7Ci0gICAgbUxvY2subG9jaygpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBMT0dfVFJBQ0UoInByZURpc3BhdGNoIGtleTogcGVuZGluZz0lZCB3cml0ZT0lZFxuIiwgbVByZURpc3BhdGNoaW5nS2V5cy5zaXplKCksIG1Xb3JrV3JpdGUpOwogICAgIGNvbnN0IHNpemVfdCBOID0gbUluRmxpZ2h0RXZlbnRzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7CkBAIC0zODAsNyArMzU4LDYgQEAKICAgICAgICAgICAgIGlmIChpbmZsaWdodC5zZXEgPj0gMCkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBwcmUtZGlzcGF0Y2hlZCEKICAgICAgICAgICAgICAgICBMT0dfVFJBQ0UoIkV2ZW50IGFscmVhZHkgcHJlLWRpc3BhdGNoZWQhIik7Ci0gICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNlcSsrOwpAQCAtMzkxLDcgKzM2OCw2IEBACiAgICAgICAgICAgICAgICAgd3JpdGVfd29yayhtV29ya1dyaXRlLCBDTURfREVGX0tFWSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHJlRGlzcGF0Y2hpbmdLZXlzLmFkZChpbmZsaWdodCk7Ci0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtNDAwLDcgKzM3Niw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEFJbnB1dFF1ZXVlOjp3YWtldXBEaXNwYXRjaCgpIHsKK3ZvaWQgQUlucHV0UXVldWU6Ondha2V1cERpc3BhdGNoTG9ja2VkKCkgewogcmVzdGFydDoKICAgICBjaGFyIGR1bW15ID0gMDsKICAgICBpbnQgcmVzID0gd3JpdGUobURpc3BhdGNoS2V5V3JpdGUsICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2hhcmR3YXJlX0NhbWVyYS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2hhcmR3YXJlX0NhbWVyYS5jcHAKaW5kZXggNTk5MjExZS4uMGM2NmI4NiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9oYXJkd2FyZV9DYW1lcmEuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcApAQCAtNTQ1LDEyICs1NDUsMjIgQEAKICAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IGdldF9uYXRpdmVfY2FtZXJhKGVudiwgdGhpeiwgTlVMTCk7CiAgICAgaWYgKGNhbWVyYSA9PSAwKSByZXR1cm47CiAKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3VyZmFjZVRleHR1cmUgPSBOVUxMOworICAgIHNwPEJ1ZmZlclF1ZXVlPiBidWZmZXJRdWV1ZSA9IE5VTEw7CiAgICAgaWYgKGpTdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7Ci0gICAgICAgIHN1cmZhY2VUZXh0dXJlID0gcmVpbnRlcnByZXRfY2FzdDxTdXJmYWNlVGV4dHVyZSo+KGVudi0+R2V0SW50RmllbGQoCisgICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3VyZmFjZVRleHR1cmUqPihlbnYtPkdldEludEZpZWxkKAogICAgICAgICAgICAgICAgIGpTdXJmYWNlVGV4dHVyZSwgZmllbGRzLnN1cmZhY2VUZXh0dXJlKSk7CisgICAgICAgIGlmIChzdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZmZXJRdWV1ZSA9IHN1cmZhY2VUZXh0dXJlLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJTdXJmYWNlVGV4dHVyZSBhbHJlYWR5IHJlbGVhc2VkIGluIHNldFByZXZpZXdUZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgIH0KLSAgICBpZiAoY2FtZXJhLT5zZXRQcmV2aWV3VGV4dHVyZShzdXJmYWNlVGV4dHVyZSkgIT0gTk9fRVJST1IpIHsKKworICAgIGlmIChjYW1lcmEtPnNldFByZXZpZXdUZXh0dXJlKGJ1ZmZlclF1ZXVlKSAhPSBOT19FUlJPUikgewogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgICAic2V0UHJldmlld1RleHR1cmUgZmFpbGVkIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkLmNwcAppbmRleCA3OTg0YjljLi40ODBjM2E2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkLmNwcApAQCAtMjMsMTMgKzIzLDEzIEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAibWVkaWEvQXVkaW9SZWNvcmQuaCIKLSNpbmNsdWRlICJtZWRpYS9tZWRpYXJlY29yZGVyLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKaW5kZXggYmZmNTk5NC4uZjUyMmE5YSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKQEAgLTE2LDE2ICsxNiwxNiBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1N5c3RlbSIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9UcmFjay5jcHAKaW5kZXggZDRlZDA2Yy4uOWZiYzQ3NyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2suY3BwCkBAIC0yMiwxMyArMjIsMTMgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxKTklIZWxwLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9BdWRpb1N5c3RlbS5oIgotI2luY2x1ZGUgIm1lZGlhL0F1ZGlvVHJhY2suaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0pldFBsYXllci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0pldFBsYXllci5jcHAKaW5kZXggNmZlZGM2Yi4uYTc4NWY1MiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9KZXRQbGF5ZXIuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfSmV0UGxheWVyLmNwcApAQCAtMjIsMTIgKzIyLDEyIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxKTklIZWxwLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9KZXRQbGF5ZXIuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9KZXRQbGF5ZXIuaD4KIAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfVG9uZUdlbmVyYXRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDU0NGI0YzAuLjMxMTUxYTYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjEsMTMgKzIxLDEzIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxKTklIZWxwLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJtZWRpYS9BdWRpb1N5c3RlbS5oIgotI2luY2x1ZGUgIm1lZGlhL1RvbmVHZW5lcmF0b3IuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL1RvbmVHZW5lcmF0b3IuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5jcHAKaW5kZXggMzBkNGUyMC4uY2UyY2RlZSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19TdXJmYWNlLmNwcApAQCAtMjUxLDggKzI1MSwxNiBAQAogc3RhdGljIHZvaWQgU3VyZmFjZV9pbml0RnJvbVN1cmZhY2VUZXh0dXJlKAogICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgam9iamVjdCBqc3QpCiB7Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdChTdXJmYWNlVGV4dHVyZV9nZXRTdXJmYWNlVGV4dHVyZShlbnYsIGpzdCkpOwotICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2Uoc3QpKTsKKyAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QoU3VyZmFjZVRleHR1cmVfZ2V0U3VyZmFjZVRleHR1cmUoZW52LCBqc3QpKTsKKworICAgIGlmIChzdCA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJTdXJmYWNlVGV4dHVyZSBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBicSA9IHN0LT5nZXRCdWZmZXJRdWV1ZSgpOworCisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZShuZXcgU3VyZmFjZShicSkpOwogICAgIGlmIChzdXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCBPdXRPZlJlc291cmNlc0V4Y2VwdGlvbiwgTlVMTCk7CiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDhmMDNmZTAuLmQxZTM2NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQ4LDYgKzI0OCwyMSBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfd3JpdGVDb250YWN0cyIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY193cml0ZUNvbnRhY3RzIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgdXNlcidzIGNhbGwgbG9nLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTExfTE9HIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLlBFUlNPTkFMX0lORk8iCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9yZWFkQ2FsbExvZyIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19yZWFkQ2FsbExvZyIgLz4KKworICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHdyaXRlIChidXQgbm90IHJlYWQpIHRoZSB1c2VyJ3MKKyAgICAgICAgIGNvbnRhY3RzIGRhdGEuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0NBTExfTE9HIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLlBFUlNPTkFMX0lORk8iCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl93cml0ZUNhbGxMb2ciCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfd3JpdGVDYWxsTG9nIiAvPgorCiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BST0ZJTEUiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbAppbmRleCA0OGY0NjA2Li5mNTU4ZmM3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InNrcnlmIGtvbnRha2RhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJMYWF0IGRpZSBwcm9ncmFtIHRvZSBvbSBkaWUga29udGFrZGF0YSAoYWRyZXNzZSkgd2F0IG9wIGpvdSB0YWJsZXQgZ2VzdG9vciBpcywgdGUgdmVyYW5kZXIuIEt3YWFkd2lsbGlnZSBwcm9ncmFtbWUga2FuIGRpdCBkYWxrIGdlYnJ1aWsgb20gam91IGtvbnRha2RhdGEgdWl0IHRlIHZlZSBvZiB0ZSB2ZXJhbmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIGRpZSBrb250YWtkYXRhIChhZHJlc3NlKSB3YXQgb3Agam91IGZvb24gZ2VzdG9vciBpcywgdGUgdmVyYW5kZXIuIEt3YWFkd2lsbGlnZSBwcm9ncmFtbWUga2FuIGRpdCBkYWxrIGdlYnJ1aWsgb20gam91IGtvbnRha2RhdGEgdWl0IHRlIHZlZSBvZiB0ZSB2ZXJhbmRlci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImxlZXMgam91IHByb2ZpZWxkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIHBlcnNvb25saWtlIHByb2ZpZWxpbmxpZ3RpbmcgdGUgbGVlcyB3YXQgb3Agam91IHRvZXN0ZWwgZ2VzdG9vciBpcywgc29vcyBqb3UgbmFhbSBlbiBrb250YWtiZXNvbmRlcmhlZGUuIERpdCBiZXRla2VuIGRhdCBkaWUgcHJvZ3JhbSBqb3Uga2FuIGlkZW50aWZpc2VlciBlbiBqb3UgcHJvZmllbGlubGlndGluZyBhYW4gYW5kZXIgbWVuc2Uga2FuIHN0dXVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InNrcnlmIG5hIGpvdSBwcm9maWVsZGF0YSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIGVuaWdlIHByaXZhdGUgd29vcmRlLCBuYW1lIGVuIGZyYXNlcyB0ZSBsZWVzIHdhdCBkaWUgZ2VicnVpa2VyIGluIGRpZSBnZWJydWlrZXJ3b29yZGVib2VrIGdlc3Rvb3IgaGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InNrcnlmIG5hIGdlYnJ1aWtlcmdlZGVmaW5pZWVyZGUgd29vcmRlYm9layI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJMYWF0IGRpZSBwcm9ncmFtIHRvZSBvbSBudXdlIHdvb3JkZSBpbiBkaWUgZ2VicnVpa2Vyd29vcmRlYm9layB0ZSBza3J5Zi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4idmVyYW5kZXIvdmVlIHVpdCBVU0ItYmVyZ2luZyBzZSBpbmhvdWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Ind5c2lnL3ZlZSB1aXQgU0Qta2FhcnQgc2UgaW5ob3VkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIGRpZSBVU0ItZ2VoZXVlIHRlIHNrcnlmLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCmluZGV4IGIwNTU2MzQuLjU5YTRhMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i4Yuo4Yql4YuN4YmC4YurIOGLjeGIguGJpSDhjYPhjY0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiLhiaDhjKHhiaPhi4og4Ymw4Yqu4YiFIOGIi+GLrSDhi6jhibDhiqjhiJvhibkg4Yuo4Yql4YuN4YmC4YurKOGKoOGLteGIq+GIuykg4YuN4YiC4YmlIOGIiOGImOGJgOGLqOGIrSDhiIjhiJjhibDhjI3hiaDhiKrhi6vhi40g4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2hIOGLqOGKpeGLjeGJheGLqyDhi43hiILhiaXhiIXhipUg4YiI4YiY4Yuw4Yid4Yiw4Yi1IOGLiOGLreGInSDhiIjhiJjhiYDhi6jhiK0g4Ymw4YqV4Yqu4YiNIOGKoOGLmOGIjSDhiJjhibDhjI3hiaDhiKrhi6vhi47hib0g4YiK4Yyg4YmA4YiZ4Ym1IOGLreGJveGIi+GIieGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i4Ymg4Yi14YiN4Yqt4YiFIOGIi+GLrSDhi6jhibDhiqjhiJvhibkg4Yuo4Yql4YuN4YmC4YurKOGKoOGLteGIq+GIuykg4YuN4YiC4YmlIOGIiOGImOGJgOGLqOGIrSDhiIjhiJjhibDhjI3hiaDhiKrhi6vhi40g4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2hIOGLqOGKpeGLjeGJheGLqyDhi43hiILhiaXhiIXhipUg4YiI4YiY4Yuw4Yid4Yiw4Yi1IOGLiOGLreGInSDhiIjhiJjhiYDhi6jhiK0g4Ymw4YqV4Yqu4YiNIOGKoOGLmOGIjSDhiJjhibDhjI3hiaDhiKrhi6vhi47hib0g4YiK4Yyg4YmA4YiZ4Ym1IOGLreGJveGIi+GIieGNoeGNoSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4i4Yuo4YiY4YyI4YiI4YyrIOGLjeGIguGJpeGLjuGKlSDhi6vhipXhiaXhiaEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i4YiN4YqtIOGKpeGKleGLsCDhiqDhipXhibAg4Yi14YidIOGKpeGKkyDhi6jhi5Xhi43hiYLhi6sg4YiY4Yio4YyDIOGNoyDhiaPhipXhibAg4YiY4Yiz4Yiq4YurIOGLiOGIteGMpSDhi6jhibDhiqjhiJvhibkg4Yuo4YyN4YiNIOGImOGMiOGIiOGMqyDhiJjhiKjhjIMg4YiI4Yib4YqV4Ymg4YmlIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaHhi63hiIThiJ0g4Yib4YiI4Ym1IOGIjOGIjuGJvSDhiJjhibDhjI3hiaDhiKrhi6vhi47hib0g4YiK4YiI4Yup4YiFIOGLreGJveGIi+GIiSDhiqXhipMg4YiI4YiM4YiO4Ym9IOGLqOGImOGMiOGIiOGMqyDhiJjhiKjhjIPhiIXhipUg4Yut4YiN4Yqr4YiJ4Y2h4Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4i4Yuo4Yqg4Yit4Yi14YuOIOGImOGMiOGIiOGMqyDhi43hiILhiaUg4YiL4YutIOGLreGNg+GNiSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IiDhibDhjKDhiYPhiJrhi40g4Ymg4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YiK4Yur4Yqo4Yib4Ym9IOGLqOGJu+GIiOGLjeGKlSDhiJvhipXhipvhi43hiJ0g4Yuo4YyN4YiNIOGJg+GIi+GJteGNoyDhiLXhiJ7hib3hjaPhiqXhipMg4YiA4Yio4YyO4Ym9IOGIiOGIm+GKleGJoOGJpSAg4YiI4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuNIOGLreGNiOGJheGLs+GIieGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuGJoOGJsOGMoOGJg+GImiDhiaDhibDhi4jhiLDhipAg4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhjYPhjY0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i4Ymg4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YuN4Yi14YylIOGKoOGLsuGItSDhiYPhiI0g4Yql4YqV4Yuy4Yy94Y2NIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDA4NjIyMTM3NDYzOTE4MzI4MSI+IuGLqFVTQiDhiqvhiK3hi7Ug4Yut4YuY4Ym24Ym94YqVIOGKoOGKleGJpeGJpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg1Mzc4NzUxNTE4NDUxMzk1MzkiPiLhi6hTRCDhiqvhiK3hi7Ug4Yut4YuY4Ym24Ym94YqVIOGKoOGKleGJpeGJpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTA1NTMwMjg5ODk5OTM1MjMzOSI+IuGImOGJsOGMjeGJoOGIquGLq+GLjSDhiqhVU0Ig4Yqr4Yit4Yu1IOGIi+GLrSDhi6vhiIkg4Yut4YuY4Ym24Ym94YqVIOGKpeGKleGLsuGLq+GKkOGJpSDhi63hjYjhiYXhi7XhiIjhibPhiI3hjaHhjaEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzk0Nzc5MjM3MzU3MDY4MzU0MiI+IuGImOGJsOGMjeGJoOGIquGLq+GLjSDhiqhTRCDhiqvhiK3hi7Ug4YiL4YutIOGLq+GIiSDhi63hi5jhibbhib3hipUg4Yql4YqV4Yuy4Yur4YqQ4YmlIOGLreGNiOGJheGLteGIiOGJs+GIjeGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLhi6hVU0Ig4Yib4Yqo4Yib4Ym7IOGLreGLmOGJtuGJveGKlSDhiYDhi63hiK0v4Yiw4Yit4YudIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLhi6hTRCDhiqvhiK3hi7Ug4Yut4YuY4Ym14YqV4YmA4Yut4YitL+GIsOGIreGLnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLhi4jhi7AgVVNCIOGIm+GIheGLsOGIqCDhibXhi43hiLXhibPhi40g4YiI4YiY4Y2D4Y2NIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaEiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAppbmRleCAxOTMxNTdiLi4zOGVlNzI5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ItmD2KrYp9io2Kkg2KjZitin2YbYp9iqINis2YfYqSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+ItmE2YTYs9mF2KfYrSDZhNmE2KrYt9io2YrZgiDYqNiq2LnYr9mK2YQg2KjZitin2YbYp9iqICjYudmG2YjYp9mGKSDYrNmH2Kkg2KfZhNin2KrYtdin2YQg2KfZhNmF2K7YstmR2YbYqSDYudmE2Ykg2KfZhNis2YfYp9iyINin2YTZhNmI2K3Zii4g2YrZhdmD2YYg2KPZhiDYqtiz2KrYrtiv2YUg2KfZhNiq2LfYqNmK2YLYp9iqINin2YTYttin2LHYqSDYsNmE2YMg2YTZhdiz2K0g2KjZitin2YbYp9iqINis2YfYp9iqINin2YTYp9iq2LXYp9mEINij2Ygg2KrYudiv2YrZhNmH2KcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLZhNmE2LPZhdin2K0g2YTZhNiq2LfYqNmK2YIg2KjYqti52K/ZitmEINio2YrYp9mG2KfYqiAo2LnZhtmI2KfZhikg2KzZh9ipINin2YTYp9iq2LXYp9mEINin2YTZhdiu2LLZkdmG2Kkg2LnZhNmJINmH2KfYqtmB2YMuINmK2YXZg9mGINij2YYg2KrYs9iq2K7Yr9mFINin2YTYqti32KjZitmC2KfYqiDYp9mE2LbYp9ix2Kkg2LDZhNmDINmE2YXYs9itINio2YrYp9mG2KfYqiDYrNmH2KfYqiDYp9mE2KfYqti12KfZhCDYo9mIINiq2LnYr9mK2YTZh9inLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4i2YLYsdin2KHYqSDYqNmK2KfZhtin2Kog2YXZhNmB2YMg2KfZhNi02K7YtdmKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+ItmE2YTYs9mF2KfYrSDZhNmE2KrYt9io2YrZgiDYqNmC2LHYp9ih2Kkg2YXYudmE2YjZhdin2Kog2KfZhNmF2YTZgSDYp9mE2LTYrti12Yog2KfZhNi02K7YtdmK2Kkg2KfZhNmF2K7YstmG2Kkg2LnZhNmJINin2YTYrNmH2KfYstiMINmF2KvZhCDYp9iz2YXZgyDZiNmF2LnZhNmI2YXYp9iqINis2YfYp9iqINin2YTYp9iq2LXYp9mELiDZiti52YbZiiDYsNmE2YMg2KPZhtmHINmK2YXZg9mGINmE2YTYqti32KjZitmCINin2YTYqti52LHZgSDYudmE2YrZgyDZiNil2LHYs9in2YQg2YXYudmE2YjZhdin2Kog2YXZhNmB2YMg2KfZhNi02K7YtdmKINil2YTZiSDYp9mE2KLYrtix2YrZhi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLYp9mE2YPYqtin2KjYqSDYpdmE2Ykg2KjZitin2YbYp9iqINmF2YTZgdmDINin2YTYtNiu2LXZiiI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+ItmE2YTYs9mF2KfYrSDZhNmE2KrYt9io2YrZgiDYqNmC2LHYp9ih2Kkg2KPZiiDZg9mE2YXYp9iqINmI2KPYs9mF2KfYoSDZiNi52KjYp9ix2KfYqiDYrtin2LXYqSDYsdio2YXYpyDYrtiy2YbZh9inINin2YTZhdiz2KrYrtiv2YUg2YHZiiDZgtin2YXZiNizINin2YTZhdiz2KrYrtiv2YUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i2YPYqtin2KjYqSDYpdmE2Ykg2KfZhNmC2KfZhdmI2LMg2KfZhNmF2LnYsdmR2YEg2KjZiNin2LPYt9ipINin2YTZhdiz2KrYrtiv2YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i2YTZhNiz2YXYp9itINmE2YTYqti32KjZitmCINio2YPYqtin2KjYqSDZg9mE2YXYp9iqINis2K/Zitiv2Kkg2YHZiiDZgtin2YXZiNizINin2YTZhdiz2KrYrtiv2YUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Itiq2LnYr9mK2YQv2K3YsNmBINmF2K3YqtmI2YrYp9iqINmI2K3Yr9ipINiq2K7YstmK2YYgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLYqti52K/ZitmEL9it2LDZgSDZhdit2KrZiNmK2KfYqiDYqNi32KfZgtipIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+ItmE2YTYs9mF2KfYrSDZhNmE2KrYt9io2YrZgiDYqNin2YTZg9iq2KfYqNipINil2YTZiSDZiNit2K/YqSDYqtiu2LLZitmGIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbAppbmRleCBhMzdlMjMxLi40YTYwNTRmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ItC30LDQv9GW0YHQstCw0YbRjCDQutCw0L3RgtCw0LrRgtC90YvRjyDQtNCw0LTQt9C10L3Ri9GPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4i0JTQsNC30LLQsNC70Y/QtSDQv9GA0YvQutC70LDQtNCw0L3QvdGP0Lwg0LfQvNGP0L3Rj9GG0Ywg0LrQsNC90YLQsNC60YLRiyAo0LDQtNGA0LDRgdGLKSwg0Y/QutGW0Y8g0LfQsNGF0L7RntCy0LDRjtGG0YbQsCDQvdCwINC/0LvQsNC90YjRjdGG0LUuINCo0LrQvtC00L3QsNGB0L3Ri9GPINC/0YDRi9C60LvQsNC00LDQvdC90ZYg0LzQvtCz0YPRhtGMINCy0YvQutCw0YDRi9GB0YLQvtGe0LLQsNGG0Ywg0LPRjdGC0YPRjiDQvNCw0LPRh9GL0LzQsNGB0YbRjCDQtNC70Y8g0LLRi9C00LDQu9C10L3QvdGPINCw0LHQviDQt9C80LXQvdGLINC60LDQvdGC0LDQutGC0L3Ri9GFINC00LDQtNC30LXQvdGL0YUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLQlNCw0LfQstCw0LvRj9C1INC/0YDRi9C60LvQsNC00LDQvdC90Y/QvCDQt9C80Y/QvdGP0YbRjCDQutCw0L3RgtCw0LrRgtGLICjQsNC00YDQsNGB0YspLCDRj9C60ZbRjyDQt9Cw0YXQvtGe0LLQsNGO0YbRhtCwINC90LAg0LLQsNGI0YvQvCDRgtGN0LvQtdGE0L7QvdC1LiDQqNC60L7QtNC90LDRgdC90YvRjyDQv9GA0YvQutC70LDQtNCw0L3QvdGWINC80L7Qs9GD0YbRjCDQstGL0LrQsNGA0YvRgdGC0L7RntCy0LDRhtGMINCz0Y3RgtGDINC80LDQs9GH0YvQvNCw0YHRhtGMINC00LvRjyDQstGL0LTQsNC70LXQvdC90Y8g0LDQsdC+INC30LzQtdC90Ysg0LrQsNC90YLQsNC60YLQvdGL0YUg0LTQsNC00LfQtdC90YvRhS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ItGH0YvRgtCw0YbRjCDQtNCw0LTQt9C10L3Ri9GPINCy0LDRiNCw0LPQsCDQv9GA0L7RhNGW0LvRjiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLQlNCw0LfQstCw0LvRj9C1INC/0YDRi9C60LvQsNC00LDQvdC90Y/QvCDRgdGH0YvRgtCy0LDRhtGMINCw0YHQsNCx0ZbRgdGC0YPRjiDRltC90YTQsNGA0LzQsNGG0YvRjiDRniDQv9GA0L7RhNGW0LvRj9GFLCDRj9C60LDRjyDQt9Cw0YXQvtGe0LLQsNC10YbRhtCwINC90LAg0LLQsNGI0LDQuSDQv9GA0YvQu9Cw0LTQt9C1LCDQvdCw0L/RgNGL0LrQu9Cw0LQsINCy0LDRiNCwINGW0LzRjyDRliDQutCw0L3RgtCw0LrRgtC90YPRjiDRltC90YTQsNGA0LzQsNGG0YvRji4g0JPRjdGC0LAg0LDQt9C90LDRh9Cw0LUsINGI0YLQviDQv9GA0YvQutC70LDQtNCw0L3QvdC1INC80L7QttCwINGW0LTRjdC90YLRi9GE0ZbQutCw0LLQsNGG0Ywg0LLQsNGBINGWINCw0LTQv9GA0LDQstGW0YbRjCDRltC90YTQsNGA0LzQsNGG0YvRjiDQstCw0YjQsNCz0LAg0L/RgNC+0YTRltC70Y4g0YLRgNGN0YbRltC8INCw0YHQvtCx0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLRg9Cy0Y/QtNC30ZbRhtC1INC00LDQtNC30LXQvdGL0Y8g0LLQsNGI0LDQs9CwINC/0YDQvtGE0ZbQu9GOIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i0JTQsNC30LLQsNC70Y/QtSDQv9GA0YvQutC70LDQtNCw0L3QvdGOINGB0YfRi9GC0LLQsNGG0Ywg0LvRjtCx0YvRjyDQv9GA0YvQstCw0YLQvdGL0Y8g0YHQu9C+0LLRiywg0ZbQvNGR0L3RiyDRliDRhNGA0LDQt9GLLCDRj9C60ZbRjyDQutCw0YDRi9GB0YLQsNC70YzQvdGW0Log0LzQvtC20LAg0LfQsNGF0L7RntCy0LDRhtGMINGDINC60LDRgNGL0YHRgtCw0LvRjNC90ZbRhtC60ZbQvCDRgdC70L7RntC90ZbQutGDLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItC30LDQv9GW0YHQsNGG0Ywg0YMg0LrQsNGA0YvRgdGC0LDQu9GM0L3RltGG0LrRliDRgdC70L7RntC90ZbQuiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLQlNCw0LfQstCw0LvRj9C1INC/0YDRi9C60LvQsNC00LDQvdC90Y/QvCDQt9Cw0L/RltGB0LLQsNGG0Ywg0L3QvtCy0YvRjyDRgdC70L7QstGLINGeINC60LDRgNGL0YHRgtCw0LvRjNC90ZbRhtC60ZYg0YHQu9C+0Z7QvdGW0LouIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC30LzRj9C90ZbRhtGML9Cy0YvQtNCw0LvRltGG0Ywg0LfQvNC10YHRhtGW0LLQsCBVU0It0L3QsNC30LDQv9Cw0YjQstCw0LvRjNC9adC60LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC30LzRj9C90Y/RhtGML9Cy0YvQtNCw0LvRj9GG0Ywg0LfQvNC10YHRhtGW0LLQsCBTRC3QutCw0YDRgtGLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+ItCU0LDQt9Cy0LDQu9GP0LUg0L/RgNGL0LrQu9Cw0LTQsNC90Y/QvCDQstGL0LrQvtC90LLQsNGG0Ywg0LfQsNC/0ZbRgSDQstCwIFVTQi3QvdCw0LfQsNC/0LDRiNCy0LDQu9GM0L3RltC6LiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmluZGV4IGMyNzdlZTkuLmI0NzdkMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i0LfQsNC/0LjRgSDQvdCwINC00LDQvdC90Lgg0LfQsCDQutC+0L3RgtCw0LrRgtC40YLQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC/0YDQvtC80LXQvdGPINC00LDQvdC90LjRgtC1INC30LAg0LrQvtC90YLQsNC60YLQuNGC0LUgKNC30LAg0LDQtNGA0LXRgSksINGB0YrRhdGA0LDQvdC10L3QuCDQsiDRgtCw0LHQu9C10YLQsCDQstC4LiDQl9C70L7QvdCw0LzQtdGA0LXQvdC40YLQtSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQvNC+0LPQsNGCINC00LAg0LjQt9C/0L7Qu9C30LLQsNGCINGC0L7QstCwLCDQt9CwINC00LAg0LjQt9GC0YDQuNGP0YIg0LjQu9C4INC/0YDQvtC80LXQvdGP0YIg0YLQtdC30Lgg0LTQsNC90L3QuC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC/0YDQvtC80LXQvdGPINC00LDQvdC90LjRgtC1INC30LAg0LrQvtC90YLQsNC60YLQuNGC0LUgKNC30LAg0LDQtNGA0LXRgSksINGB0YrRhdGA0LDQvdC10L3QuCDQsiDRgtC10LvQtdGE0L7QvdCwINCy0LguINCX0LvQvtC90LDQvNC10YDQtdC90LjRgtC1INC/0YDQuNC70L7QttC10L3QuNGPINC80L7Qs9Cw0YIg0LTQsCDQuNC30L/QvtC70LfQstCw0YIg0YLQvtCy0LAsINC30LAg0LTQsCDQuNC30YLRgNC40Y/RgiDQuNC70Lgg0L/RgNC+0LzQtdC90Y/RgiDRgtC10LfQuCDQtNCw0L3QvdC4LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4i0YfQtdGC0LXQvdC1INC90LAg0LTQsNC90L3QuNGC0LUg0LIg0L/RgNC+0YTQuNC70LAg0LLQuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjQu9C+0LbQtdC90LjQtdGC0L4g0LTQsCDRh9C10YLQtSDQuNC90YTQvtGA0LzQsNGG0LjRj9GC0LAg0L7RgiDQu9C40YfQvdC40Y8g0L/QvtGC0YDQtdCx0LjRgtC10LvRgdC60Lgg0L/RgNC+0YTQuNC7LCDRgdGK0YXRgNCw0L3QtdC90LAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0LLQuCwg0L3QsNC/0YDQuNC80LXRgCDQstCw0YjQtdGC0L4g0LjQvNC1INC4INC00LDQvdC90Lgg0LfQsCDQstGA0YrQt9C60LAuINCi0L7QstCwINC+0LfQvdCw0YfQsNCy0LAsINGH0LUg0L/RgNC40LvQvtC20LXQvdC40LXRgtC+INC80L7QttC1INC00LAg0LLQuCDQuNC00LXQvdGC0LjRhNC40YbQuNGA0LAg0Lgg0LTQsCDQuNC30L/RgNCw0YnQsCDQuNC90YTQvtGA0LzQsNGG0LjRj9GC0LAg0LfQsCDQv9C+0YLRgNC10LHQuNGC0LXQu9GB0LrQuNGPINCy0Lgg0L/RgNC+0YTQuNC7INC90LAg0LTRgNGD0LPQuCDRhdC+0YDQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLQt9Cw0L/QuNGBINCyINC/0L7RgtGALiDQstC4INC/0YDQvtGE0LjQuyI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINGH0LXRgtC1INGH0LDRgdGC0L3QuCDQtNGD0LzQuCwg0LjQvNC10L3QsCDQuCDRhNGA0LDQt9C4LCDQutC+0LjRgtC+INC/0L7RgtGA0LXQsdC40YLQtdC70Y/RgiDQvNC+0LbQtSDQtNCwINC1INGB0YrRhdGA0LDQvdC40Lsg0LIg0L/QvtGC0YDQtdCx0LjRgtC10LvRgdC60LjRjyDRgNC10YfQvdC40LouIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i0LfQsNC/0LjRgSDQsiDQtNC10YTQuNC90LjRgNCw0L3QuNGPINC+0YIg0L/QvtGC0YDQtdCx0LjRgtC10LvRjyDRgNC10YfQvdC40LoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40LvQvtC20LXQvdC40LXRgtC+INC00LAg0LfQsNC/0LjRgdCy0LAg0L3QvtCy0Lgg0LTRg9C80Lgg0LIg0L/QvtGC0YDQtdCx0LjRgtC10LvRgdC60LjRjyDRgNC10YfQvdC40LouIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC/0YDQvtC80Y/QvdCwL9C40LfRgtGA0LjQstCw0L3QtSDQvdCwINGB0YrQtNGK0YDQttCw0L3QuNC10YLQviDQsiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC/0YDQvtC80Y/QvdCwL9C40LfRgtGA0LjQstCw0L3QtSDQvdCwINGB0YrQtNGK0YDQttCw0L3QuNC10YLQviDQvdCwIFNEINC60LDRgNGC0LDRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC30LDQv9C40YHQstCwINCyIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAppbmRleCAxODkyMjVlLi4wY2IzNWRiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImVzY3JpdXJlIGRhZGVzIGRlIGNvbnRhY3RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iUGVybWV0IHF1ZSBsXCdhcGxpY2FjacOzIG1vZGlmaXF1aSBsZXMgZGFkZXMgZGUgY29udGFjdGUgKGFkcmXDp2EpIGVtbWFnYXR6ZW1hZGVzIGEgbGEgdGF1bGV0YS4gTGVzIGFwbGljYWNpb25zIG1hbGljaW9zZXMgcG9kZW4gdXRpbGl0emFyLWhvIHBlciBlc2JvcnJhciBvIG1vZGlmaWNhciBsZXMgZGFkZXMgZGUgY29udGFjdGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJQZXJtZXQgcXVlIGxcJ2FwbGljYWNpw7MgbW9kaWZpcXVpIGxlcyBkYWRlcyBkZSBjb250YWN0ZSAoYWRyZcOnYSkgZW1tYWdhdHplbWFkZXMgYWwgdGVsw6hmb24uIExlcyBhcGxpY2FjaW9ucyBtYWxpY2lvc2VzIHBvZGVuIHV0aWxpdHphci1obyBwZXIgZXNib3JyYXIgbyBwZXIgbW9kaWZpY2FyIGxlcyBkYWRlcyBkZSBjb250YWN0ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImxlY3R1cmEgZGUgZGFkZXMgZGVsIHRldSBwZXJmaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iUGVybWV0IHF1ZSBsXCdhcGxpY2FjacOzIHB1Z3VpIGxsZWdpciBpbmZvcm1hY2nDsyBkZWwgcGVyZmlsIHBlcnNvbmFsIGVtbWFnYXR6ZW1hZGEgYWwgZGlzcG9zaXRpdSwgY29tIGFyYSBlbCB0ZXUgbm9tIGkgbGEgdGV2YSBpbmZvcm1hY2nDsyBkZSBjb250YWN0ZS4gQWl4w7Igc2lnbmlmaWNhIHF1ZSBsXCdhcGxpY2FjacOzIGV0IHBvdCBpZGVudGlmaWNhciBpIGVudmlhciBsYSBpbmZvcm1hY2nDsyBkZWwgdGV1IHBlcmZpbCBhIGFsdHJlcyBwZXJzb25lcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJlc2NyaXB0dXJhIGEgbGVzIHRldmVzIGRhZGVzIGRlbCBwZXJmaWwiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtZXQgcXVlIGxcJ2FwbGljYWNpw7MgbGxlZ2VpeGkgbGVzIHBhcmF1bGVzLCBlbHMgbm9tcyBpIGxlcyBmcmFzZXMgcHJpdmF0cyBxdWUgbFwndXN1YXJpIHBvdCBoYXZlciBlbW1hZ2F0emVtYXQgYWwgc2V1IGRpY2Npb25hcmkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iZXNjcml1IGFsIGRpY2Npb25hcmkgZGVmaW5pdCBwZXIgbFwndXN1YXJpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1ldCBxdWUgbFwnYXBsaWNhY2nDsyBlc2NyaWd1aSBwYXJhdWxlcyBub3ZlcyBhbCBkaWNjaW9uYXJpIGRlIGxcJ3VzdWFyaS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyL2VzYm9ycmFyIGNvbnRpbmd1dCBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lc2JvcnJhciBjb250aW5ndXQgZGUgbGEgdGFyZ2V0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtZXQgcXVlIGxcJ2FwbGljYWNpw7MgZXNjcmlndWkgYSBsXCdlbW1hZ2F0emVtYXRnZSBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggMzg5YTY3Mi4uZDM2M2YwYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJ6YXBpc292YXQgZGF0YSBrb250YWt0xa8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJVbW/FvsWIdWplIGFwbGlrYWNpIHVwcmF2aXQga29udGFrdG7DrSDDumRhamUgKGFkcmVzeSkgdWxvxb5lbsOpIHYgdGFibGV0dS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSB0b3RvIG9wcsOhdm7Em27DrSBwb3XFvsOtdCBrIHZ5bWF6w6Fuw60gbmVibyDDunByYXbEmyBrb250YWt0bsOtY2ggw7pkYWrFry4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlVtb8W+xYh1amUgYXBsaWthY2kgdXByYXZpdCBrb250YWt0bsOtIMO6ZGFqZSB1bG/FvmVuw6kgdiB0ZWxlZm9udSAoYWRyZXN1KS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSB0b3RvIG9wcsOhdm7Em27DrSBwb3XFvsOtdCBrIHZ5bWF6w6Fuw60gbmVibyDDunByYXbEmyBrb250YWt0bsOtY2ggw7pkYWrFry4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+IsSNdGVuw60gw7pkYWrFryBvIHZhxaFlbSBwcm9maWx1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IlVtb8W+xYh1amUgYXBsaWthY2kgxI3DrXN0IMO6ZGFqZSB2IG9zb2Juw61tIHByb2ZpbHUgdWxvxb5lbsOpIHYgemHFmcOtemVuw60sIG5hcMWZw61rbGFkIGptw6lubyBuZWJvIGtvbnRha3Ruw60gw7pkYWplLiBabmFtZW7DoSB0bywgxb5lIHbDoXMgb3N0YXRuw60gYXBsaWthY2UgbW9ob3UgaWRlbnRpZmlrb3ZhdCBhIG9kZXNsYXQgw7pkYWplIHogcHJvZmlsdSBkYWzFocOtbSBhcGxpa2Fjw61tLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InphcGlzb3ZhdCBkbyDDumRhasWvIG8gcHJvZmlsdSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlVtb8W+bsOtIGFwbGlrYWNpIMSNw61zdCBzb3Vrcm9tw6Egc2xvdmEsIGptw6luYSBhIGZyw6F6ZSwga3RlcsOhIHXFvml2YXRlbCBtb2hsIHVsb8W+aXQgZG8gc3bDqWhvIHNsb3Zuw61rdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJ6w6FwaXMgZG8gc2xvdm7DrWt1IGRlZmlub3ZhbsOpaG8gdcW+aXZhdGVsZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6YXBpc292YXQgbm92w6Egc2xvdmEgZG8gdcW+aXZhdGVsc2vDqWhvIHNsb3Zuw61rdS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iw7pwcmF2YS9tYXrDoW7DrSBvYnNhaHUgw7psb8W+acWhdMSbIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iem3Em25hL3NtYXrDoW7DrSBvYnNhaHUga2FydHkgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6YXBpc292YXQgZG8gw7psb8W+acWhdMSbIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCAzY2EwNTM0Li5lZDUxNjkyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InNrcml2IGtvbnRha3RkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iVGlsbGFkZXIsIGF0IGFwcGVuIGthbiDDpm5kcmUgZGF0YSBmb3Iga29udGFrdHBlcnNvbmVyIChhZHJlc3NlciksIGRlciBlciBnZW10IHDDpSBkaW4gdGFibGV0LiBPbmRzaW5kZWRlIGFwcHMga2FuIGJydWdlIGRldHRlIHRpbCBhdCBzbGV0dGUgZWxsZXIgw6ZuZHJlIGRpbmUga29udGFrdG9wbHlzbmluZ2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iVGlsbGFkZXIsIGF0IGFwcGVuIGthbiDDpm5kcmUga29udGFrdGRhdGEgKGFkcmVzc2VyKSwgZGVyIGVyIGdlbXQgcMOlIGRpbiB0ZWxlZm9uLiBPbmRzaW5kZWRlIGFwcHMga2FuIGJydWdlIGRldHRlIHRpbCBhdCBzbGV0dGUgZWxsZXIgw6ZuZHJlIGtvbnRha3RkYXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4ibMOmc2UgZGluZSBwcm9maWxkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IlRpbGxhZGVyLCBhdCBhcHBlbiBrYW4gbMOmc2UgcGVyc29ubGlnZSBwcm9maWxvcGx5c25pbmdlciwgZGVyIGVyIGdlbXQgcMOlIGRpbiBlbmhlZCwgZi5la3MuIGRpdCBuYXZuIG9nIGRpbmUga29udGFrdG9wbHlzbmluZ2VyLiBEZXQgYmV0eWRlciwgYXQgYXBwZW4ga2FuIGlkZW50aWZpY2VyZSBkaWcgb2cgc2VuZGUgZGluZSBwcm9maWxvcGx5c25pbmdlciB0aWwgYW5kcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4ic2tyaXZlIHRpbCBkaW5lIHByb2ZpbGRhdGEiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJUaWxsYWRlciwgYXQgYXBwZW4ga2FuIGzDpnNlIGFsbGUgcHJpdmF0ZSBvcmQsIG5hdm5lIG9nIHPDpnRuaW5nZXIsIHNvbSBicnVnZXJlbiBrYW4gaGF2ZSBnZW10IGkgYnJ1Z2Vyb3JkYm9nZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2tyaXZlIHRpbCBicnVnZXJvcmRib2dlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJUaWxsYWRlciwgYXQgYXBwZW4ga2FuIHNrcml2ZSBueWUgb3JkIGkgYnJ1Z2Vyb3JkYm9nZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQwODYyMjEzNzQ2MzkxODMyODEiPiJsw6ZzZSBVU0ItbGFnZXJldHMgaW5kaG9sZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg1Mzc4NzUxNTE4NDUxMzk1MzkiPiJsw6ZzZSBpbmRob2xkZXQgYWYgU0Qta29ydGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxMDU1MzAyODk4OTk5MzUyMzM5Ij4iVGlsbGFkZXIsIGF0IGFwcFwnZW4gbMOmc2VyIGluZGhvbGQgcMOlIFVTQi1sYWdlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzk0Nzc5MjM3MzU3MDY4MzU0MiI+IlRpbGxhZGVyLCBhdCBhcHBcJ2VuIGzDpnNlciBpbmRob2xkZXQgYWYgU0Qta29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJyZXR0ZS9zbGV0dGUgaSBVU0ItbGFnZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJldC9zbGV0IGluZGhvbGRldCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkxhZGVyIGFwcGVuIHNrcml2ZSB0aWwgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmluZGV4IDcyYWM1NWYuLjdkMTJhMjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iS29udGFrdGRhdGVuIHNjaHJlaWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IkVybcO2Z2xpY2h0IGRlciBBcHAsIGRpZSBhdWYgSWhyZW0gVGFibGV0IGdlc3BlaWNoZXJ0ZW4gS29udGFrdGRhdGVuIChBZHJlc3NlbikgenUgw6RuZGVybi4gU2Now6RkbGljaGUgQXBwcyBrw7ZubmVuIHNvIElocmUgS29udGFrdGRhdGVuIGzDtnNjaGVuIG9kZXIgw6RuZGVybi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IkVybcO2Z2xpY2h0IGRlciBBcHAsIGRpZSBhdWYgSWhyZW0gVGVsZWZvbiBnZXNwZWljaGVydGVuIEtvbnRha3RkYXRlbiAoQWRyZXNzZW4pIHp1IMOkbmRlcm4uIFNjaMOkZGxpY2hlIEFwcHMga8O2bm5lbiBzbyBJaHJlIEtvbnRha3RkYXRlbiBsw7ZzY2hlbiBvZGVyIMOkbmRlcm4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJJaHJlIFByb2ZpbGRhdGVuIGxlc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IkVybcO2Z2xpY2h0IGRlciBBcHAsIGF1ZiBJaHJlbSBHZXLDpHQgZ2VzcGVpY2hlcnRlIHBlcnPDtm5saWNoZSBQcm9maWxpbmZvcm1hdGlvbmVuIHp1IGxlc2VuLCBkYXJ1bnRlciBJaHJlbiBOYW1lbiB1bmQgSWhyZSBLb250YWt0ZGF0ZW4uIERpZSBBcHAga2FubiBTaWUgc29taXQgaWRlbnRpZml6aWVyZW4gdW5kIElocmUgUHJvZmlsaW5mb3JtYXRpb25lbiBhbiBhbmRlcmUgc2VuZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+IkluIElocmUgUHJvZmlsZGF0ZW4gc2NocmVpYmVuIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iRXJtw7ZnbGljaHQgZGVyIEFwcCwgYWxsZSBwcml2YXRlbiBXw7ZydGVyLCBOYW1lbiB1bmQgQXVzZHLDvGNrZSB6dSBsZXNlbiwgZGllIGVpbiBOdXR6ZXIgaW4gc2VpbmVtIFfDtnJ0ZXJidWNoIGdlc3BlaWNoZXJ0IGhhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IkluIGJlbnV0emVyZGVmaW5pZXJ0ZXMgV8O2cnRlcmJ1Y2ggc2NocmVpYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkVybcO2Z2xpY2h0IGRlciBBcHAsIGRlbSBOdXR6ZXJ3w7ZydGVyYnVjaCBuZXVlIEVpbnRyw6RnZSBoaW56dXp1ZsO8Z2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQwODYyMjEzNzQ2MzkxODMyODEiPiJVU0ItU3BlaWNoZXItSW5oYWx0IGxlc2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODUzNzg3NTE1MTg0NTEzOTUzOSI+IlNELUthcnRlbi1JbmhhbHQgbGVzZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjEwNTUzMDI4OTg5OTkzNTIzMzkiPiJFcm3DtmdsaWNodCBkZXIgQXBwLCBkZW4gVVNCLVNwZWljaGVyIHp1IGxlc2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiJFcm3DtmdsaWNodCBkZXIgQXBwLCBkZW4gSW5oYWx0IGVpbmVyIFNELUthcnRlIHp1IGxlc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQi1TcGVpY2hlcmluaGFsdCDDpG5kZXJuL2zDtnNjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTRC1LYXJ0ZW4tSW5oYWx0IMOkbmRlcm4vbMO2c2NoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iRXJtw7ZnbGljaHQgZGVyIEFwcCwgaW4gZGVuIFVTQi1TcGVpY2hlciB6dSBzY2hyZWliZW4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCAwZTVkZDEwLi5jMzg5OGFiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+Is61zrPOs8+BzrHPhs6uIM60zrXOtM6/zrzOrc69z4nOvSDOtc+AzrHPhs6uz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDOvc6xIM+Ez4HOv8+Azr/PgM6/zrnOtc6vIM+EzrEgzrTOtc60zr/OvM6tzr3OsSDOtc+AzrHPhs6uz4IgKM60zrnOtc+NzrjPhc69z4POt8+CKSDPgM6/z4UgzrXOr869zrHOuSDOsc+Azr/OuM63zrrOtc+FzrzOrc69zrEgz4PPhM6/IHRhYmxldCDPg86xz4IuIM6azrHOus+MzrLOv8+FzrvOtc+CIM61z4bOsc+BzrzOv86zzq3PgiDOvM+Azr/Pgc6/z43OvSDOvc6xIM+Ezr8gz4fPgc63z4POuc68zr/PgM6/zrnOrs+Dzr/Phc69IM6zzrnOsSDOvc6xIM60zrnOsc6zz4HOrM+Izr/Phc69IM6uIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc6uz4POv8+Fzr0gz4TOsSDOtM61zrTOv868zq3Ovc6xIM61z4DOsc+Gz47OvSDPg86xz4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDOvc6xIM+Ez4HOv8+Azr/PgM6/zrnOtc6vIM+EzrEgzrTOtc60zr/OvM6tzr3OsSDOtc+AzrHPhs6uz4IgKM60zrnOtc+NzrjPhc69z4POt8+CKSDPgM6/z4UgzrXOr869zrHOuSDOsc+Azr/OuM63zrrOtc+FzrzOrc69zrEgz4PPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CLiDOms6xzrrPjM6yzr/Phc67zrXPgiDOtc+GzrHPgc68zr/Os86tz4IgzrzPgM6/z4HOv8+Nzr0gzr3OsSDPhM6/IM+Hz4HOt8+DzrnOvM6/z4DOv865zq7Pg86/z4XOvSDOs865zrEgzr3OsSDOtM65zrHOs8+BzqzPiM6/z4XOvSDOriDOvc6xIM+Ez4HOv8+Azr/PgM6/zrnOrs+Dzr/Phc69IM+EzrEgzrTOtc60zr/OvM6tzr3OsSDOtc+AzrHPhs+Ozr0gz4POsc+CLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4izrHOvc6szrPOvS4gzrTOtc60LiDPgM+Bzr/Phi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xzr3OrM6zzr3Pic+Dzrcgz4DPgc6/z4PPic+AzrnOus+Ozr0gz4DOu863z4HOv8+Gzr/Pgc65z47OvSDPgM+Bzr/Phs6vzrsgzr/OuSDOv8+Azr/Or861z4IgzrXOr869zrHOuSDOsc+Azr/OuM63zrrOtc+FzrzOrc69zrXPgiDPg8+Ezrcgz4PPhc+DzrrOtc+Fzq4gz4POsc+CLCDPjM+Az4nPgiDPhM6/IM+Mzr3Ov868zrEgzrrOsc65IM+EzrEgz4PPhM6/zrnPh861zq/OsSDOtc+AzrnOus6/zrnOvc+Jzr3Or86xz4Igz4POsc+CLiDOkc+Fz4TPjCDPg863zrzOsc6vzr3Otc65IM+Mz4TOuSDOtyDOtc+GzrHPgc68zr/Os86uIM68z4DOv8+BzrXOryDOvc6xIM+DzrHPgiDOsc69zrHOs869z4nPgc6vz4POtc65IM66zrHOuSDOvc6xIM+Dz4TOtc6vzrvOtc65IM+EzrnPgiDPgM67zrfPgc6/z4bOv8+Bzq/Otc+CIM+DzrHPgiDPgM+Bzr/Phs6vzrsgz4POtSDOrM67zrvOv8+Fz4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4izrXOs86zz4EuIM+DzrUgzrTOtc60LiDPgM+Bzr/Phs6vzrsiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyDOuc60zrnPic+EzrnOus+Ozr0gzrvOrc6+zrXPic69LCDOv869zr/OvM6sz4TPic69IM66zrHOuSDPhs+BzqzPg861z4nOvSwgz4TOsSDOv8+Azr/Or86xIM6/IM+Hz4HOrs+Dz4TOt8+CIM61zr3OtM6tz4fOtc+EzrHOuSDOvc6xIM6tz4fOtc65IM6xz4DOv864zrfOus61z43Pg861zrkgz4PPhM6/IM67zrXOvs65zrrPjCDPh8+Bzq7Pg8+EzrcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4izrXOs86zz4HOsc+Gzq4gz4POtSDOu861zr7Ouc66z4wgzrrOsc64zr/Pgc65z4POvM6tzr3OvyDOsc+Az4wgz4TOv869IM+Hz4HOrs+Dz4TOtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrXOs86zz4HOsc+Gzq4gzr3Orc+Jzr0gzrvOrc6+zrXPic69IM+Dz4TOvyDOu861zr7Ouc66z4wgz4fPgc6uz4PPhM63LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLPhM+Bzr/PgC4vzrTOuc6xzrPPgS4gz4DOtc+BLiDOsc+ALiDPh8+Oz4EuIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iz4TPgc6/z4DOv8+Azr/Or863z4POty/OtM65zrHOs8+BzrHPhs6uIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM61zrPOs8+BzrHPhs6uIM+Dz4TOv869IM6xz4DOv864zrfOus61z4XPhM65zrrPjCDPh8+Oz4HOvyBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAppbmRleCBlN2ZmOTczLi41YWQ2OGZjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4id3JpdGUgY29udGFjdCBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iQWxsb3dzIHRoZSBhcHAgdG8gbW9kaWZ5IHRoZSBjb250YWN0IChhZGRyZXNzKSBkYXRhIHN0b3JlZCBvbiB5b3VyIHRhYmxldC4gTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNvbnRhY3QgZGF0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IkFsbG93cyB0aGUgYXBwIHRvIG1vZGlmeSB0aGUgY29udGFjdCAoYWRkcmVzcykgZGF0YSBzdG9yZWQgb24geW91ciBwaG9uZS4gTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNvbnRhY3QgZGF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+InJlYWQgeW91ciBwcm9maWxlIGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iQWxsb3dzIHRoZSBhcHAgdG8gcmVhZCBwZXJzb25hbCBwcm9maWxlIGluZm9ybWF0aW9uIHN0b3JlZCBvbiB5b3VyIGRldmljZSwgc3VjaCBhcyB5b3VyIG5hbWUgYW5kIGNvbnRhY3QgaW5mb3JtYXRpb24uIFRoaXMgbWVhbnMgdGhlIGFwcCBjYW4gaWRlbnRpZnkgeW91IGFuZCBzZW5kIHlvdXIgcHJvZmlsZSBpbmZvcm1hdGlvbiB0byBvdGhlcnMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4id3JpdGUgdG8geW91ciBwcm9maWxlIGRhdGEiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJBbGxvd3MgdGhlIGFwcCB0byByZWFkIGFueSBwcml2YXRlIHdvcmRzLCBuYW1lcyBhbmQgcGhyYXNlcyB0aGF0IHRoZSB1c2VyIG1heSBoYXZlIHN0b3JlZCBpbiB0aGUgdXNlciBkaWN0aW9uYXJ5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IndyaXRlIHRvIHVzZXItZGVmaW5lZCBkaWN0aW9uYXJ5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkFsbG93cyB0aGUgYXBwIHRvIHdyaXRlIG5ldyB3b3JkcyBpbnRvIHRoZSB1c2VyIGRpY3Rpb25hcnkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQwODYyMjEzNzQ2MzkxODMyODEiPiJyZWFkIFVTQiBzdG9yYWdlIGNvbnRlbnRzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODUzNzg3NTE1MTg0NTEzOTUzOSI+InJlYWQgU0QgY2FyZCBjb250ZW50cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTA1NTMwMjg5ODk5OTM1MjMzOSI+IkFsbG93cyB0aGUgYXBwIHRvIHJlYWQgY29udGVudHMgb2YgVVNCIHN0b3JhZ2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiJBbGxvd3MgdGhlIGFwcCB0byByZWFkIGNvbnRlbnRzIG9mIFNEIGNhcmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Im1vZGlmeS9kZWxldGUgVVNCIHN0b3JhZ2UgY29udGVudHMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmeS9kZWxldGUgU0QgY2FyZCBjb250ZW50cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJBbGxvd3MgdGhlIGFwcCB0byB3cml0ZSB0byB0aGUgVVNCIHN0b3JhZ2UuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAppbmRleCA4ZTM2OTQ4Li4yMGYxOGQ5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iZXNjcmliaXIgZGF0b3MgZGUgY29udGFjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbGEgaW5mb3JtYWNpw7NuIGRlIGNvbnRhY3RvIChkaXJlY2Npw7NuKSBhbG1hY2VuYWRhIGVuIHR1IHRhYmxldGEuIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXIgZXN0ZSBwZXJtaXNvIHBhcmEgYm9ycmFyIG8gbW9kaWZpY2FyIHR1IGluZm9ybWFjacOzbiBkZSBjb250YWN0by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIG1vZGlmaXF1ZSBsYSBpbmZvcm1hY2nDs24gZGUgY29udGFjdG8gKGRpcmVjY2nDs24pIGFsbWFjZW5hZGEgZW4gdHUgZGlzcG9zaXRpdm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXIgZXN0ZSBwZXJtaXNvIHBhcmEgYm9ycmFyIG8gbW9kaWZpY2FyIHR1IGluZm9ybWFjacOzbiBkZSBjb250YWN0by4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+IkxlZXIgdHVzIGRhdG9zIGRlIHBlcmZpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBsZWEgbGEgaW5mb3JtYWNpw7NuIGRlIHBlcmZpbCBhbG1hY2VuYWRhIGVuIHR1IGRpc3Bvc2l0aXZvLCBjb21vIHR1IG5vbWJyZSBlIGluZm9ybWFjacOzbiBkZSBjb250YWN0by4gRXN0byBzaWduaWZpY2EgcXVlIGxhIGFwbGljYWNpw7NuIHB1ZWRlIGlkZW50aWZpY2FydGUgeSBlbnZpYXIgdHUgaW5mb3JtYWNpw7NuIGRlIHBlcmZpbCBhIG90cm9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+IkVzY3JpYi4gZW4gZGF0b3MgZGUgdHUgcGVyZmlsIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gbGVhIGN1YWxxdWllciBwYWxhYnJhLCBub21icmUgbyBmcmFzZSBkZSBjYXLDoWN0ZXIgcHJpdmFkbyBxdWUgZWwgdXN1YXJpbyBoYXlhIGFsbWFjZW5hZG8gZW4gc3UgZGljY2lvbmFyaW8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iYWdyZWdhciBhbCBkaWNjaW9uYXJpbyBkZWZpbmlkbyBwb3IgZWwgdXN1YXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBpbmdyZXNlIHBhbGFicmFzIG51ZXZhcyBlbiBlbCBkaWNjaW9uYXJpbyBkZWwgdXN1YXJpby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyIG8gZWxpbWluYXIgZWwgY29udGVuaWRvIGRlbCBhbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lbGltaW5hciBlbCBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBlc2NyaWJhIGVuIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAppbmRleCBhNDYzOGZhLi45NDBlNThhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImVzY3JpYmlyIGRhdG9zIGRlIGNvbnRhY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gbGVhIHRvZG9zIGxvcyBkYXRvcyAoZGlyZWNjaW9uZXMpIGRlIGNvbnRhY3RvcyBhbG1hY2VuYWRvcyBlbiBlbCB0YWJsZXQuIExhcyBhcGxpY2FjaW9uZXMgbWFsaW50ZW5jaW9uYWRhcyBwdWVkZW4gdXNhciBlc3RlIHBlcm1pc28gcGFyYSBib3JyYXIgbyBtb2RpZmljYXIgbG9zIGRhdG9zIGRlIGNvbnRhY3Rvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGNvbnN1bHRlIHRvZG9zIGxvcyBkYXRvcyAoZGlyZWNjaW9uZXMpIGRlIGNvbnRhY3RvcyBhbG1hY2VuYWRvcyBlbiBlbCB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaW50ZW5jaW9uYWRhcyBwdWVkZW4gdXNhciBlc3RlIHBlcm1pc28gcGFyYSBib3JyYXIgbyBtb2RpZmljYXIgbG9zIGRhdG9zIGRlIGNvbnRhY3Rvcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImFjY2VkZXIgYSBkYXRvcyBkZSB0dSBwZXJmaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gYWNjZWRhIGEgaW5mb3JtYWNpw7NuIGRlbCBwZXJmaWwgcGVyc29uYWwgYWxtYWNlbmFkYSBlbiBlbCBkaXNwb3NpdGl2byAoY29tbyBlbCBub21icmUgbyBsYSBpbmZvcm1hY2nDs24gZGUgY29udGFjdG8pLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBsYSBhcGxpY2FjacOzbiBwdWVkZSBpZGVudGlmaWNhciBhbCB1c3VhcmlvIHkgZW52aWFyIGxhIGluZm9ybWFjacOzbiBkZSBzdSBwZXJmaWwgYSBvdHJvcyB1c3Vhcmlvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJlc2NyaWJpciBlbiBkYXRvcyBkZSB0dSBwZXJmaWwiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBsZWEgY3VhbHF1aWVyIHBhbGFicmEsIG5vbWJyZSBvIGZyYXNlIGRlIGNhcsOhY3RlciBwcml2YWRvIHF1ZSBlbCB1c3VhcmlvIGhheWEgYWxtYWNlbmFkbyBlbiBzdSBkaWNjaW9uYXJpby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJhw7FhZGlyIGFsIGRpY2Npb25hcmlvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGVzY3JpYmEgcGFsYWJyYXMgbnVldmFzIGVuIGVsIGRpY2Npb25hcmlvIGRlIHVzdWFyaW8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Im1vZGlmaWNhci9ib3JyYXIgY29udGVuaWRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBlcm1pdGUgZXNjcmliaXIgZW4gZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCmluZGV4IDY5N2M4ZjEuLjdiOTFkNDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ia2lyanV0YSBrb250YWt0YW5kbWVpZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IlbDtWltYWxkYWIgcmFrZW5kdXNlbCBtdXV0YSB0YWh2ZWxhcnZ1dGlzc2Ugc2FsdmVzdGF0dWQga29udGFrdGFuZG1laWQgKGFhZHJlc3NlKS4gUGFoYXRhaHRsaWt1ZCByYWtlbmR1c2VkIHbDtWl2YWQgc2VkYSBrYXN1dGFkYSB0ZWllIGtvbnRha3RhbmRtZXRlIGt1c3R1dGFtaXNla3MgdsO1aSBtdXV0bWlzZWtzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iVsO1aW1hbGRhYiByYWtlbmR1c2VsIG11dXRhIHRlbGVmb25pIHNhbHZlc3RhdHVkIGtvbnRha3RhbmRtZWlkIChhYWRyZXNzZSkuIFBhaGF0YWh0bGlrdWQgcmFrZW5kdXNlZCB2w7VpdmFkIHNlZGEga2FzdXRhZGEgdGVpZSBrb250YWt0YW5kbWV0ZSBrdXN0dXRhbWlzZWtzIHbDtWkgbXV1dG1pc2Vrcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+InByb2ZpaWxpIGFuZG1ldGUgbHVnZW1pbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iVsO1aW1hbGRhYiByYWtlbmR1c2VsIGx1Z2VkYSBzZWFkbWVzc2Ugc2FsdmVzdGF0dWQgaXNpa2xpa2t1IHRlYXZldCwgbsOkaXRla3MgdGVpZSBuaW1lIGphIGtvbnRha3RhbmRtZWlkLiBTZWUgdMOkaGVuZGFiLCBldCByYWtlbmR1cyBzYWFiIHRlaWQgdHV2YXN0YWRhIGphIHNhYXRhIHRlaWUgcHJvZmlpbGl0ZWF2ZXQgdGVpc3RlbGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4iYW5kbWV0ZSBraXJqdXRhbWluZSBwcm9maWlsaSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlbDtWltYWxkYWIgcmFrZW5kdXNlbCBsdWdlZGEga8O1aWtpIHByaXZhYXRzZWlkIHPDtW51LCBuaW1lc2lkIGphIGZyYWFzZSwgbWlsbGUga2FzdXRhamEgdsO1aXMgc2FsdmVzdGFkYSBrYXN1dGFqYXPDtW5hc3Rpa2t1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Ikthc3V0YWphIG3DpMOkcmF0dWQgc8O1bmFzdGlra3Uga2lyanV0YW1pbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iVsO1aW1hbGRhYiByYWtlbmR1c2VsIGtpcmp1dGFkYSBrYXN1dGFqYXPDtW5hc3Rpa2t1IHV1c2kgc8O1bnUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQi1zZWFkbWUgc2lzdSBtdXV0bS4va3VzdHV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibXV1ZGEva3VzdHV0YSBTRC1rYWFyZGkgc2lzdSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJWw7VpbWFsZGFiIHJha2VuZHVzZWwga2lyanV0YWRhIFVTQi1tw6RsdXNlYWRtZWxlLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IGE0YTliZmYuLmJiNDY4OWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i2YbZiNi02KrZhiDYp9i32YTYp9i52KfYqiDYqtmF2KfYsyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+Itio2Ycg2KjYsdmG2KfZhdmHINin2KzYp9iy2Ycg2YXbjOKAjtiv2YfYryDYr9in2K/Zh+KAjtmH2KfbjCDZhdiu2KfYt9ioINiw2K7bjNix2Ycg2LTYr9mHINiv2LEg2LHYp9uM2KfZhtmHINmE2YjYrduMINix2Kcg2KrYutuM24zYsSDYr9mH2K8uINio2LHZhtin2YXZh+KAjtmH2KfbjCDZhdiu2LHYqCDZhduM4oCO2KrZiNin2YbZhtivINin2LIg2KLZhiDYp9iz2KrZgdin2K/ZhyDaqdmG2YbYryDYqtinINiv2KfYr9mH4oCO2YfYp9uMINiq2YXYp9izINi02YXYpyDYsdinINiq2LrbjNuM2LEg2K/Zh9mG2K8g24zYpyDZvtin2qkg2qnZhtmG2K8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLYqNmHINio2LHZhtin2YXZhyDYp9is2KfYstmHINmF24zigI7Yr9mH2K8g2KrYpyDYr9in2K/Zh+KAjtmH2KfbjCDZhdiu2KfYt9ioICjYotiv2LHYsykg2LHYpyDaqdmHINiv2LEg2KrZhNmB2YYg2LDYrtuM2LHZhyDYtNiv2Ycg2KrYutuM24zYsSDYr9mH2K8uINio2LHZhtin2YXZh+KAjtmH2KfbjCDZhdiu2LHYqCDZhduM4oCO2KrZiNin2YbZhtivINin2LIg2KfbjNmGINin2LPYqtmB2KfYr9mHINqp2YbZhtivINiq2Kcg2K/Yp9iv2YfigI7Zh9in24wg2KrZhdin2LMg2LTZhdinINix2Kcg2b7Yp9qpINqp2YbZhtivINuM2Kcg2KrYutuM24zYsSDYr9mH2YbYry4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+Itiu2YjYp9mG2K/ZhiDYr9in2K/Zh+KAjNmH2KfbjCDZhtmF2KfbjNmHINi02YXYpyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLYqNmHINio2LHZhtin2YXZhyDYp9is2KfYstmHINmF24zigI7Yr9mH2K8g2KfYt9mE2KfYudin2Kog2YbZhdin24zZhyDYtNiu2LXbjCDYsNiu24zYsdmHINi02K/ZhyDYr9ixINiv2LPYqtqv2KfZhyDYtNmF2Kcg2LHYpyDYqNiu2YjYp9mG2K8uINuM2LnZhtuMINio2LHZhtin2YXZhyDZhduM4oCO2KrZiNin2YbYryDYtNmF2Kcg2LHYpyDYtNmG2KfYs9in24zbjCDaqdmG2K8g2Ygg2KfYt9mE2KfYudin2Kog2YbZhdin24zZhyDYtNmF2Kcg2LHYpyDYqNmHINiv24zar9ix2KfZhiDYp9ix2LPYp9mEINqp2YbYry4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLZhtmI2LTYqtmGINiv2LEg2K/Yp9iv2YfigIzZh9in24wg2YbZhdin24zZhyDYtNmF2KciPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLYqNmHINio2LHZhtin2YXZhyDYp9is2KfYstmHINmF24zigI7Yr9mH2K8g2YfYsSDar9mI2YbZhyDaqdmE2YXZh9iMINmG2KfZhdiMINi52KjYp9ix2Kog2K7YtdmI2LXbjCDYsdinINqp2Ycg2qnYp9ix2KjYsSDYr9ixINmB2LHZh9mG2q8g2YTYutiqINiu2YjYryDYsNiu24zYsdmHINqp2LHYr9mHINin2LPYqiDYqNiu2YjYp9mG2K8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i2YbZiNi02KrZhiDYr9ixINmB2LHZh9mG2q8g2YTYutiqINiq2LnYsduM2YEg2LTYr9mHINin2LIg2LPZiNuMINqp2KfYsdio2LEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i2KjZhyDYqNix2YbYp9mF2Ycg2KfYrNin2LLZhyDZhduM4oCO2K/Zh9ivINiq2Kcg2qnZhNmF2KfYqiDYrNiv24zYryDYsdinINiv2LEg2YHZh9ix2LPYqiDaqdin2LHYqNixINio2YbZiNuM2LPYry4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i2KfYtdmE2KfYrS/Yrdiw2YEg2YXYrdiq2YjYp9mH2KfbjCDYrdin2YHYuNmHIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i2KfYtdmE2KfYrSDaqdix2K/Zhi/Yrdiw2YEg2YXYrdiq2YjbjNin2Kog2qnYp9ix2KogU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i2KjZhyDYqNix2YbYp9mF2Ycg2KfYrNin2LLZhyDZhduM4oCO2K/Zh9ivINiq2Kcg2K/YsSDYrdin2YHYuNmHIFVTQiDYqNmG2YjbjNiz2K8uIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKaW5kZXggMWI4YjE4YS4uNTUzYjU5MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJraXJqb2l0YSB5aHRleXN0aWV0b2phIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iQW50YWEgc292ZWxsdWtzZW4gbXVva2F0YSB0YWJsZXQtbGFpdHRlZW4geWh0ZXlzdGlldG9qYSAob3NvaXRldGlldG9qYSkuIEhhaXRhbGxpc2V0IHNvdmVsbHVrc2V0IHZvaXZhdCBrw6R5dHTDpMOkIHTDpHTDpCB5aHRleXN0aWV0b2plbiBwb2lzdGFtaXNlZW4gdGFpIG11b2trYWFtaXNlZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJBbnRhYSBzb3ZlbGx1a3NlbiBtdW9rYXRhIHB1aGVsaW1lbiB5aHRleXN0aWV0b2phIChvc29pdGV0aWV0b2phKS4gSGFpdGFsbGlzZXQgc292ZWxsdWtzZXQgdm9pdmF0IGvDpHl0dMOkw6QgdMOkdMOkIHlodGV5c3RpZXRvamVuIHBvaXN0YW1pc2VlbiB0YWkgbXVva2thYW1pc2Vlbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+Imx1a2VhIHByb2ZpaWxpc2kgdGllZG90Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IkFudGFhIHNvdmVsbHVrc2VuIGx1a2VhIGxhaXR0ZWVsbGUgdGFsbGVubmV0dHVqYSBoZW5raWzDtmtvaHRhaXNpYSB0aWV0b2phLCBrdXRlbiBuaW1lbiBqYSB5aHRleXN0aWV0b2phLiBUw6Rtw6QgYW50YWEgc292ZWxsdWtzZW4gdHVubmlzdGFhIHNpbnV0IGphIGzDpGhldHTDpMOkIHByb2ZpaWxpdGlldG9qYXNpIG11aWxsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJraXJqb2l0dGFhIHByb2ZpaWxpbiB0aWV0b2loaW4iPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJBbnRhYSBzb3ZlbGx1a3NlbiBsdWtlYSB5a3NpdHlpc2nDpCBzYW5vamEsIG5pbWnDpCB0YWkgaWxtYXVrc2lhLCBqb2l0YSBrw6R5dHTDpGrDpCBvbiB2b2ludXQgdGFsbGVudGFhIGvDpHl0dMOkasOkbiBzYW5ha2lyamFhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJrw6R5dHTDpGrDpG4gbcOkw6RyaXR0ZWxlbcOkw6RuIHNhbmFraXJqYWFuIGtpcmpvaXR0YW1pbmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkFudGFhIHNvdmVsbHVrc2VuIGtpcmpvaXR0YWEgdXVzaWEgc2Fub2phIGvDpHl0dMOkasOkbiBzYW5ha2lyamFhbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibXVva2thYS9wb2lzdGEgVVNCLXNpc8OkbHTDtsOkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtdW9ra2FhL3BvaXN0YSBTRC1rb3J0aW4gc2lzw6RsdMO2w6QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iQW50YWEgc292ZWxsdWtzZW4ga2lyam9pdHRhYSBVU0ItdGFsbGVubnVzdGlsYWFuLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IGIxOWE3ZGUuLjdlMmM0YzAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iw4lkaXRpb24gZGVzIGRvbm7DqWVzIGRcJ3VuIGNvbnRhY3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZGUgbW9kaWZpZXIgbGVzIGNvb3Jkb25uw6llcyAoYWRyZXNzZXMpIGRlIHZvcyBjb250YWN0cyBxdWkgc29udCBzdG9ja8OpZXMgc3VyIHZvdHJlIHRhYmxldHRlLiBEZXMgYXBwbGljYXRpb25zIG1hbHZlaWxsYW50ZXMgcGV1dmVudCBleHBsb2l0ZXIgY2V0dGUgZm9uY3Rpb25uYWxpdMOpIHBvdXIgZWZmYWNlciBvdSBtb2RpZmllciBjZXMgY29vcmRvbm7DqWVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iUGVybWV0IMOgIGxcJ2FwcGxpY2F0aW9uIGRlIG1vZGlmaWVyIGxlcyBjb29yZG9ubsOpZXMgKGFkcmVzc2VzKSBkZSB2b3MgY29udGFjdHMgcXVpIHNvbnQgc3RvY2vDqWVzIHN1ciB2b3RyZSB0w6lsw6lwaG9uZS4gRGVzIGFwcGxpY2F0aW9ucyBtYWx2ZWlsbGFudGVzIHBldXZlbnQgZXhwbG9pdGVyIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGVmZmFjZXIgb3UgbW9kaWZpZXIgY2VzIGNvb3Jkb25uw6llcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImxpcmUgdm9zIGRvbm7DqWVzIGRlIHByb2ZpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZGUgbGlyZSBsZXMgaW5mb3JtYXRpb25zIGRlIHByb2ZpbCBzdG9ja8OpZXMgc3VyIHZvdHJlIGFwcGFyZWlsLCB0ZWxsZXMgcXVlIHZvdHJlIG5vbSBldCB2b3MgY29vcmRvbm7DqWVzLCBvdSBkXCdlbiBham91dGVyLiBEXCdhdXRyZXMgYXBwbGljYXRpb25zIHBldXZlbnQgYWxvcnMgdm91cyBpZGVudGlmaWVyIGV0IGVudm95ZXIgdm9zIGluZm9ybWF0aW9ucyBkZSBwcm9maWwgw6AgZGVzIHRpZXJzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+Im1vZGlmaWVyIHZvcyBkb25uw6llcyBkZSBwcm9maWwiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZGUgbGlyZSB0b3VzIGxlcyBtb3RzLCBub21zIGV0IGV4cHJlc3Npb25zIHByaXbDqXMgcXVlIGxcJ3V0aWxpc2F0ZXVyIGEgcHUgZW5yZWdpc3RyZXIgZGFucyBzb24gZGljdGlvbm5haXJlIHBlcnNvbm5lbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJlbnJlZ2lzdHJlciBkYW5zIGxlIGRpY3Rpb25uYWlyZSBkw6lmaW5pIHBhciBsXCd1dGlsaXNhdGV1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZFwnZW5yZWdpc3RyZXIgZGUgbm91dmVhdXggbW90cyBkYW5zIGxlIGRpY3Rpb25uYWlyZSBwZXJzb25uZWwgZGUgbFwndXRpbGlzYXRldXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Ik1vZGlmaWVyL1N1cHByaW1lciBjb250ZW51IG3DqW1vaXJlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpZXIvc3VwcHJpbWVyIGxlIGNvbnRlbnUgZGUgbGEgY2FydGUgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iUGVybWV0IMOgIGxcJ2FwcGxpY2F0aW9uIGRlIG1vZGlmaWVyIGxlIGNvbnRlbnUgZGUgbGEgbcOpbW9pcmUgZGUgc3RvY2thZ2XCoFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbAppbmRleCBkNGI5MjFmLi5iZDU2NDIxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+IuCkuOCkguCkquCksOCljeCklSDgpKHgpYfgpJ/gpL4g4KSy4KS/4KSW4KWH4KSCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4i4KSP4KSq4KWN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpIbgpKrgpJXgpYcg4KSf4KWH4KSs4KSy4KWH4KSfIOCkruClh+CkgiDgpLjgpILgpJfgpY3gpLDgpLngpYDgpKQg4KS44KSC4KSq4KSw4KWN4KSVICjgpKrgpKTgpL4pIOCkoeClh+Ckn+CkviDgpLjgpILgpLbgpYvgpKfgpL/gpKQg4KSV4KSw4KSo4KWHIOCkpuClh+CkpOCkviDgpLngpYguIOCkpuClgeCksOCljeCkreCkvuCkteCkqOCkvuCkquClguCksOCljeCkoyDgpI/gpKrgpY3gpLLgpL/gpJXgpYfgpLbgpKgg4KSH4KS44KSV4KS+IOCkieCkquCkr+Cli+CklyDgpIbgpKrgpJXgpYcg4KS44KSC4KSq4KSw4KWN4KSVIOCkoeClh+Ckn+CkviDgpJXgpYsg4KSu4KS/4KSf4KS+4KSo4KWHIOCkr+CkviDgpLjgpILgpLbgpYvgpKfgpL/gpKQg4KSV4KSw4KSo4KWHIOCkruClh+CkgiDgpJXgpLAg4KS44KSV4KSk4KWHIOCkueCliOCkgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IuCkj+CkquCljeCksuCkv+CkleClh+CktuCkqCDgpJXgpYsg4KSG4KSq4KSV4KWHIOCkq+CkvOCli+CkqCDgpK7gpYfgpIIg4KS44KSC4KSX4KWN4KSw4KS54KWA4KSkIOCkuOCkguCkquCksOCljeCklSAo4KSq4KSk4KS+KSDgpKHgpYfgpJ/gpL4g4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOCkqOClhyDgpKbgpYfgpKTgpL4g4KS54KWILiDgpKbgpYHgpLDgpY3gpK3gpL7gpLXgpKjgpL7gpKrgpYLgpLDgpY3gpKMg4KSP4KSq4KWN4KSy4KS/4KSV4KWH4KS24KSoIOCkh+CkuOCkleCkviDgpIngpKrgpK/gpYvgpJcg4KSG4KSq4KSV4KWHIOCkuOCkguCkquCksOCljeCklSDgpKHgpYfgpJ/gpL4g4KSV4KWLIOCkruCkv+Ckn+CkvuCkqOClhyDgpK/gpL4g4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOCkqOClhyDgpK7gpYfgpIIg4KSV4KSwIOCkuOCkleCkpOClhyDgpLngpYjgpIIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLgpIXgpKrgpKjgpL4g4KSq4KWN4KSw4KWL4KSr4KS84KS+4KSH4KSyIOCkoeClh+Ckn+CkviDgpKrgpKLgpLzgpYfgpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i4KSP4KSq4KWN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpIbgpKrgpJXgpYcg4KSJ4KSq4KSV4KSw4KSjIOCkruClh+CkgiDgpLjgpILgpJfgpY3gpLDgpLngpYDgpKQg4KSo4KS+4KSuIOCklOCksCDgpLjgpILgpKrgpLDgpY3gpJUg4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCknOCliOCkuOClgCDgpKjgpL/gpJzgpYAg4KSq4KWN4KSw4KWL4KSr4KS84KS+4KSH4KSyIOCknOCkvuCkqOCkleCkvuCksOClgCDgpKrgpKLgpLzgpKjgpYcg4KSm4KWH4KSk4KS+IOCkueCliC4g4KSH4KS44KSV4KS+IOCkheCksOCljeCkpSDgpLngpYgg4KSV4KS/IOCkj+CkquCljeCksuCkv+CkleClh+CktuCkqCDgpIbgpKrgpJXgpYsg4KSq4KS54KSa4KS+4KSoIOCkuOCkleCkpOCkviDgpLngpYgg4KSU4KSwIOCkhuCkquCkleClgCDgpKrgpY3gpLDgpYvgpKvgpLzgpL7gpIfgpLIg4KSV4KWAIOCknOCkvuCkqOCkleCkvuCksOClgCDgpIXgpKjgpY3gpK8g4KSy4KWL4KSX4KWL4KSCIOCkleCliyDgpK3gpYfgpJwg4KS44KSV4KSk4KS+IOCkueCliC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLgpIXgpKrgpKjgpYcg4KSq4KWN4KSw4KWL4KSr4KS84KS+4KSH4KSyIOCkoeClh+Ckn+CkviDgpK7gpYfgpIIg4KSy4KS/4oCN4KSW4KWH4KSCIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i4KSP4KSq4KWN4oCN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpJDgpLjgpYcg4KSo4KS/4KSc4KWAIOCktuCkrOCljeKAjeCkpuCli+Ckgiwg4KSo4KS+4KSu4KWL4KSCIOCklOCksCDgpLXgpL7gpJXgpY3gpK/gpL7gpILgpLbgpYvgpIIg4KSV4KWLIOCkquCkouCkvOCkqOClhyDgpKbgpYfgpKTgpL4g4KS54KWIIOCknOCliyDgpLjgpILgpK3gpLXgpKQ6IOCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkviDgpKbgpY3gpLXgpL7gpLDgpL4g4KSJ4KSq4KSv4KWL4KSX4KSV4KSw4KWN4KSk4KS+IOKAjeCkoeCkv+CkleCljeCktuCkqOCksOClgCDgpK7gpYfgpIIg4KS44KSC4KSX4KWN4KSw4KS54KWA4KSkIOCkleCkv+CkjyDgpJfgpI8g4KS54KWL4KSCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkvi3gpKjgpL/gpLDgpY3gpKfgpL7gpLDgpL/gpKQg4KSh4KS/4KSV4KWN4KS24KSo4KSw4KWAIOCkruClh+CkgiDgpLLgpL/gpJbgpYfgpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i4KSP4KSq4KWN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpIngpKrgpK/gpYvgpJfgpJXgpLDgpY3gpKTgpL4g4KSh4KS/4KSV4KWN4KS24KSo4KSw4KWAIOCkruClh+CkgiDgpKjgpI8g4KS24KSs4KWN4KSmIOCksuCkv+CkluCkqOClhyDgpKbgpYfgpKTgpL4g4KS54KWILiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJVU0Ig4KS44KSC4KSX4KWN4KSw4KS54KSjIOCkuOCkvuCkruCkl+CljeCksOCkv+Ckr+Cli+CkgiDgpJXgpYsg4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOClh+Ckgi/gpLngpJ/gpL7gpI/gpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIOCkleCkvuCksOCljeCkoSDgpLjgpL7gpK7gpJfgpY3gpLDgpL/gpK/gpL7gpIIg4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOClh+Ckgi/gpLngpJ/gpL7gpI/gpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i4KSP4KSq4KWN4KSy4KS/LiDgpJXgpYsgVVNCIOCkuOCkguCkl+CljeCksOCkueCkoyDgpK7gpYfgpIIg4KSy4KS/4KSW4KSo4KWHIOCkpuClh+CkpOCkviDgpLngpYguIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKaW5kZXggZmJkM2EzZC4uOGIyZTc1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJwaXNhbmplIGtvbnRha3RuaWggcG9kYXRha2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJPbW9ndcSHdWplIGFwbGlrYWNpamkgZGEgcHJvbWlqZW5pIGtvbnRha3RuZSBwb2RhdGtlIChhZHJlc2UpIHBvaHJhbmplbmUgbmEgdGFibGV0bm9tIHJhxI11bmFsdS4gWmxvbmFtamVybmUgYXBsaWthY2lqZSBtb2d1IG5hIHRhaiBuYcSNaW4gaXpicmlzYXRpIGlsaSBwcm9taWplbml0aSB2YcWhZSBrb250YWt0bmUgcG9kYXRrZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+Ik9tb2d1xId1amUgYXBsaWthY2lqaSBkYSBwcm9taWplbmkga29udGFrdG5lIHBvZGF0a2UgKGFkcmVzZSkgcG9ocmFuamVuZSBuYSB0ZWxlZm9udS4gWmxvbmFtamVybmUgYXBsaWthY2lqZSBtb2d1IG5hIHRhaiBuYcSNaW4gaXpicmlzYXRpIGlsaSBwcm9taWplbml0aSB2YcWhZSBrb250YWt0bmUgcG9kYXRrZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+IsSNaXRhbmplIHBvZGF0YWthIHZhxaFlZyBwcm9maWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+Ik9tb2d1xId1amUgYXBsaWthY2lqaSDEjWl0YW5qZSBvc29ibmloIHBvZGF0YWthIHByb2ZpbGEgcG9ocmFuamVuaWggbmEgdXJlxJFhanUsIGthbyDFoXRvIHN1IHZhxaFlIGltZSBpbGkga29udGFrdG5pIHBvZGFjaS4gVG8gem5hxI1pIGRhIHZhcyBhcGxpa2FjaWphIG1vxb5lIGlkZW50aWZpY2lyYXRpIGkgc2xhdGkgaW5mb3JtYWNpamUgcyB2YcWhZWcgcHJvZmlsYSBkcnVnaW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InBpc2FuamUgdSBwb2RhdGtlIHByb2ZpbGEiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgxI1pdGFuamUgc3ZpaCBwcml2YXRuaWggcmlqZcSNaSwgaW1lbmEgaSBpenJhemEga29qZSBqZSBrb3Jpc25payBwb2hyYW5pbyB1IGtvcmlzbmnEjWtvbSByamXEjW5pa3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4icGlzYW5qZSB1IGtvcmlzbmnEjWtpIGRlZmluaXJhbiByamXEjW5payI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgcGlzYW5qZSBub3ZpaCByaWplxI1pIHUga29yaXNuacSNa2kgcmplxI1uaWsuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Iml6bWplbmkvYnJpxaFpIHNhZHLFvmFqZSBtZW1vcmlqZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Iml6bWplbmEvYnJpc2FuamUgc2FkcsW+YWphIFNEIGthcnRpY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iRG9wdcWhdGEgcGlzYW5qZSB1IFVTQiBwb2hyYW51LiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCmluZGV4IGM2MTkwZmQuLmQ1NWNhZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ibsOpdmplZ3lhZGF0b2sgw61yw6FzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IkxlaGV0xZF2w6kgdGVzemkgYXogYWxrYWxtYXrDoXMgc3rDoW3DoXJhLCBob2d5IG3Ds2Rvc8OtdHNhIGEgdMOhYmxhZ8OpcGVuIHTDoXJvbHQgbsOpdmplZ3ktIChjw61tLSkgYWRhdG9rYXQuIEEgcm9zc3ppbmR1bGF0w7ogYWxrYWxtYXrDoXNvayBmZWxoYXN6bsOhbGhhdGrDoWsgZXp0IGEgbsOpdmplZ3lhZGF0b2sgdMO2cmzDqXPDqXJlIHZhZ3kgbcOzZG9zw610w6Fzw6FyYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IkxlaGV0xZF2w6kgdGVzemkgYXogYWxrYWxtYXrDoXMgc3rDoW3DoXJhLCBob2d5IG3Ds2Rvc8OtdHNhIGEgdGVsZWZvbm9uIHTDoXJvbHQgbsOpdmplZ3ktIChjw61tLSkgYWRhdG9rYXQuIEEgcm9zc3ppbmR1bGF0w7ogYWxrYWxtYXrDoXNvayBmZWxoYXN6bsOhbGhhdGrDoWsgZXp0IGEgbsOpdmplZ3lhZGF0b2sgdMO2cmzDqXPDqXJlIHZhZ3kgbcOzZG9zw610w6Fzw6FyYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+Im9sdmFzc2EgZWwgcHJvZmlsYWRhdGFpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJMZWhldMWRdsOpIHRlc3ppIGF6IGFsa2FsbWF6w6FzIHN6w6Ftw6FyYSBhIGvDqXN6w7xsw6lrZW4gdMOhcm9sdCBzemVtw6lseWVzIHByb2ZpbGFkYXRvaywgcMOpbGTDoXVsIGEgbsOpdiDDqXMgZWzDqXJoZXTFkXPDqWcgb2x2YXPDoXPDoXQuIEV6IGF6dCBqZWxlbnRpLCBob2d5IG3DoXMgYWxrYWxtYXrDoXNvayBpcyBhem9ub3PDrXRoYXRqw6FrIMOWbnQsIMOpcyBlbGvDvGxkaGV0aWsgbcOhc29rbmFrIGEgcHJvZmlsYWRhdGFpdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLDrXLDoXMgYSBwcm9maWxhZGF0b2tiYSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkxlaGV0xZF2w6kgdGVzemkgYXogYWxrYWxtYXrDoXMgc3rDoW3DoXJhLCBob2d5IG9sdmFzc2EgYSBmZWxoYXN6bsOhbMOzaSBzesOzdMOhcmJhbiB0w6Fyb2x0IHNhasOhdCBzemF2YWthdCwgbmV2ZWtldCDDqXMga2lmZWplesOpc2VrZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iYSBmZWxoYXN6bsOhbMOzIMOhbHRhbCBkZWZpbmnDoWx0IHN6w7N0w6FyIMOtcsOhc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iTGVoZXTFkXbDqSB0ZXN6aSBheiBhbGthbG1hesOhcyBzesOhbcOhcmEsIGhvZ3kgw7pqIHN6YXZha2F0IMOtcmpvbiBhIGZlbGhhc3puw6Fsw7NpIHN6w7N0w6FyYmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQi10w6FyIHRhcnRhbG3DoW5hayBtw7Nkb3PDrXTDoXNhIMOpcyB0w7ZybMOpc2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ImF6IFNELWvDoXJ0eWEgdGFydGFsbcOhbmFrIG3Ds2Rvc8OtdMOhc2Egw6lzIHTDtnJsw6lzZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJBeiBhbGthbG1hesOhcyBVU0ItdMOhcnJhIMOtcmhhdC4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAppbmRleCBkMmQ0ZWNlLi4yZmFkN2ExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKQEAgLTYzLDEwICs2MywxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0iUnVhY01taSIgbXNnaWQ9Ijc4Mjc4ODc0NTkxMzgzMDg4ODYiPiJQZW5vbGFrYW4gcGFuZ2dpbGFuIHlhbmcgdGlkYWsgZGlpbmdpbmthbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IkNuZE1taSIgbXNnaWQ9IjMxMTY0NDYyMzcwODE1NzU4MDgiPiJQZW5naXJpbWFuIG5vbW9yIHBhbmdnaWxhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IkRuZE1taSIgbXNnaWQ9IjEyNjU0Nzg5MzI0MTgzMzQzMzEiPiJKYW5nYW4gZ2FuZ2d1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPbk5leHRDYWxsT24iIG1zZ2lkPSI0Mjk0MTU0MDkxNDU3ODE5MjMiPiJOb21vciBwZW5lbGVwb24gYmF3YWFuIFwiZGliYXRhc2lcIi4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBEaWJhdGFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9IkNMSVJEZWZhdWx0T25OZXh0Q2FsbE9mZiIgbXNnaWQ9IjMwOTI5MTgwMDYwNzc4NjQ2MjQiPiJOb21vciBwZW5nZ3VuYSBiYXdhYW4gXCJkaWJhdGFzaVwiLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IFRpZGFrIGRpYmF0YXNpLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9IkNMSVJEZWZhdWx0T2ZmTmV4dENhbGxPbiIgbXNnaWQ9IjYxNzk0MjUxODI4NTY0MTg0NjUiPiJOb21vciBwZW5lbGVwb24gYmF3YWFuIHRpZGFrIGRpYmF0YXNpLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IERpYmF0YXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPZmZOZXh0Q2FsbE9mZiIgbXNnaWQ9IjI1Njc5OTg2MzMxMjQ0MDg1NTIiPiJOb21vciBwZW5lbGVwb24gYmF3YWFuIHRpZGFrIGRpYmF0YXNpLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IFRpZGFrIGRpYmF0YXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPbk5leHRDYWxsT24iIG1zZ2lkPSI0Mjk0MTU0MDkxNDU3ODE5MjMiPiJOb21vciBwZW5lbGVwb24gZGVmYXVsdCBcImRpYmF0YXNpXCIuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogRGliYXRhc2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9uTmV4dENhbGxPZmYiIG1zZ2lkPSIzMDkyOTE4MDA2MDc3ODY0NjI0Ij4iTm9tb3IgcGVuZ2d1bmEgZGVmYXVsdCBcImRpYmF0YXNpXCIuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogVGlkYWsgZGliYXRhc2kuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPZmZOZXh0Q2FsbE9uIiBtc2dpZD0iNjE3OTQyNTE4Mjg1NjQxODQ2NSI+Ik5vbW9yIHBlbmVsZXBvbiBkZWZhdWx0IHRpZGFrIGRpYmF0YXNpLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IERpYmF0YXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPZmZOZXh0Q2FsbE9mZiIgbXNnaWQ9IjI1Njc5OTg2MzMxMjQ0MDg1NTIiPiJOb21vciBwZW5lbGVwb24gZGVmYXVsdCB0aWRhayBkaWJhdGFzaS4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBUaWRhayBkaWJhdGFzaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VOb3RQcm92aXNpb25lZCIgbXNnaWQ9Ijg2MTQ4MzAxODA1MDg2ODY2NjYiPiJMYXlhbmFuIHRpZGFrIGRpcGVybGVuZ2thcGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iQ0xJUlBlcm1hbmVudCIgbXNnaWQ9IjMzNzczNzExNDU5MjY4MzU2NzEiPiJBbmRhIHRpZGFrIGRhcGF0IG1lbmd1YmFoIHNldGVsYW4gbm9tb3IgcGVuZWxlcG9uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IlJlc3RyaWN0ZWRDaGFuZ2VkVGl0bGUiIG1zZ2lkPSI1NTkyMTg5Mzk4OTU2MTg3NDk4Ij4iQWtzZXMgdGVyYmF0YXMgYmVydWJhaCI8L3N0cmluZz4KQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXREZWJ1Z0FwcCIgbXNnaWQ9IjMwMjIxMDcxOTg2ODY1ODQwNTIiPiJtZW5nYWt0aWZrYW4gZGVidWdnaW5nIGFwbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldERlYnVnQXBwIiBtc2dpZD0iNDQ3NDUxMjQxNjI5OTAxMzI1NiI+Ik1lbmdpemlua2FuIGFwbCBtZW5nYWt0aWZrYW4gZGVidWdnaW5nIHVudHVrIGFwbCBsYWluLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FuIGNhcmEgaW5pIHVudHVrIG1lbnV0dXAgYXBsIGxhaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb25maWd1cmF0aW9uIiBtc2dpZD0iODIxNDQ3NTc3OTUyMTIxODI5NSI+InViYWggc2V0ZWxhbiBVSSBBbmRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2hhbmdlQ29uZmlndXJhdGlvbiIgbXNnaWQ9IjQzNzIyMjM4NzMxNTQyOTYwNzYiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWgga29uZmlndXJhc2kgc2FhdCBpbmksIG1pc2FsbnlhIGxva2FsIGF0YXUgdWt1cmFuIGZvbiBrZXNlbHVydWhhbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VDb25maWd1cmF0aW9uIiBtc2dpZD0iNDM3MjIyMzg3MzE1NDI5NjA3NiI+Ik1lbmdpemlua2FuIGFwbCBtZW5ndWJhaCBrb25maWd1cmFzaSBzYWF0IGluaSwgbWlzYWxueWEgbG9rYWwgYXRhdSB1a3VyYW4gZm9udCBrZXNlbHVydWhhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2VuYWJsZUNhck1vZGUiIG1zZ2lkPSI1Njg0NTA0MDU4MTkyOTIxMDk4Ij4iYWt0aWZrYW4gbW9kZSBtb2JpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2VuYWJsZUNhck1vZGUiIG1zZ2lkPSI0ODUzMTg3NDI1NzUxNDE5NDY3Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmdha3RpZmthbiBtb2RlIG1vYmlsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfa2lsbEJhY2tncm91bmRQcm9jZXNzZXMiIG1zZ2lkPSI4MzczNzE0NzUyNzkzMDYxOTYzIj4iaGVudGlrYW4gcHJvc2VzIGxhdGFyIGJlbGFrYW5nIjwvc3RyaW5nPgpAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4idHVsaXNrYW4gZGF0YSBrZW5hbGFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIGRhdGEgKGFsYW1hdCkga2VuYWxhbiB5YW5nIHRlcnNpbXBhbiBkaSB0YWJsZXQuIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVuZ2d1bmFrYW4gaW5pIHVudHVrIG1lbmdoYXB1cyBhdGF1IG1lbmd1YmFoIGRhdGEga2VuYWxhbiBBbmRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBkYXRhIChhbGFtYXQpIGtlbmFsYW4geWFuZyB0ZXJzaW1wYW4gZGkgcG9uc2VsIEFuZGEuIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVuZ2d1bmFrYW4gaW5pIHVudHVrIG1lbmdoYXB1cyBhdGF1IG1lbW9kaWZpa2FzaSBkYXRhIGtlbmFsYW4gQW5kYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+Im1lbWJhY2EgZGF0YSBwcm9maWwgQW5kYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBpbmZvcm1hc2kgcHJvZmlsIHByaWJhZGkgeWFuZyB0ZXJzaW1wYW4gZGkgcGVyYW5na2F0IEFuZGEsIG1pc2FsbnlhIG5hbWEgZGFuIGluZm9ybWFzaSBrZW5hbGFuIEFuZGEuIEluaSBhcnRpbnlhIGFwbCBkYXBhdCBtZW5nZW5hbGkgZGFuIG1lbmdpcmltIGluZm9ybWFzaSBwcm9maWwgQW5kYSBrZSBvcmFuZyBsYWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+Im1lbnVsaXMga2UgZGF0YSBwcm9maWwgQW5kYSI8L3N0cmluZz4KQEAgLTQzNCw3ICs0NDYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0V2FsbHBhcGVyIiBtc2dpZD0iNzM3MzQ0NzkyMDk3NzYyNDc0NSI+Ik1lbmdpemlua2FuIGFwbCBtZW55ZXRlbCB3YWxscGFwZXIgc2lzdGVtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0V2FsbHBhcGVySGludHMiIG1zZ2lkPSIzNjAwNzIxMDY5MzUzMTA2ODUxIj4iYXR1ciBwZXR1bmp1ayB1a3VyYW4gd2FsbHBhcGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0V2FsbHBhcGVySGludHMiIG1zZ2lkPSI4MjM1Nzg0Mzg0MjIzNzMwMDkxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbnlldGVsIHBldHVuanVrIHVrdXJhbiB3YWxscGFwZXIgc2lzdGVtLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbWFzdGVyQ2xlYXIiIG1zZ2lkPSIyMzE1NzUwNDIzMTM5Njk3Mzk3Ij4ic2V0ZWwgdWxhbmcgc2lzdGVtIGtlIHNldGVsYW4gYmF3YWFuIHBhYnJpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbWFzdGVyQ2xlYXIiIG1zZ2lkPSIyMzE1NzUwNDIzMTM5Njk3Mzk3Ij4ic2V0ZWwgdWxhbmcgc2lzdGVtIGtlIHNldGVsYW4gZGVmYXVsdCBwYWJyaWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tYXN0ZXJDbGVhciIgbXNnaWQ9IjM2NjUzODA0OTI2MzM5MTAyMjYiPiJNZW5naXppbmthbiBhcGwgbWVueWV0ZWwgdWxhbmcgc2lzdGVtIGtlIHNldGVsYW4gcGFicmlrIHNlcGVudWhueWEsIG1lbmdoYXB1cyBzZW11YSBkYXRhLCBrb25maWd1cmFzaSwgZGFuIGFwbCB5YW5nIHRlcnBhc2FuZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldFRpbWUiIG1zZ2lkPSIyMDIxNjE0ODI5NTkxNzc1NjQ2Ij4iYXR1ciB3YWt0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldFRpbWUiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE4OTYzNDE0MzgxNTExNTI4ODEiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWggd2FrdHUgcGFkYSBqYW0gdGFibGV0LiI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+Ik1lbmdpemlua2FuIGFwbCBtZW1iYWNhIGthdGEsIG5hbWEsIGRhbiBmcmFzYSBwcmliYWRpIGFwYSBwdW4geWFuZyBtdW5na2luIGRpc2ltcGFuIG9sZWggcGVuZ2d1bmEgZGkga2FtdXMgcGVuZ2d1bmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ibWVudWxpcyBrZSBrYW11cyB5YW5nIGRpYnVhdCBwZW5nZ3VuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJNZW5naXppbmthbiBhcGwgbWVudWxpcyBrYXRhLWthdGEgYmFydSBrZSBkYWxhbSBrYW11cyBwZW5nZ3VuYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4idWJhaC9oYXB1cyBrb250ZW4gcGVueWltcGFuYW4gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJ1YmFoL2hhcHVzIGlzaSBrYXJ0dSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJNZW5naXppbmthbiBhcGwgbWVudWxpcyBrZSBwZW55aW1wYW5hbiBVU0IuIjwvc3RyaW5nPgpAQCAtNjk1LDEwICs3MTUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjYyMTY2NzI3MDY1NDU2OTY5NTUiPiJBbmRhIHRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkgc2FsYWggbWVuZ2V0aWsgUElOLiAiXG5cbiJDb2JhIGxhZ2kgZGFsYW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZGV0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTE5MTYxMTk4NDYyNTQ2MDgyMCI+IkFuZGEgdGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaSBzYWxhaCBtZW5nZ2FtYmFyIHBvbGEgcGVtYnVrYSBrdW5jaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBsYWdpIHVwYXlhIGdhZ2FsLCBBbmRhIGFrYW4gZGltaW50YSBtZW1idWthIGt1bmNpIHRhYmxldCBtZW5nZ3VuYWthbiBpbmZvIG1hc3VrIEdvb2dsZS4iXG5cbiJDb2JhIGxhZ2kgZGFsYW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gZGV0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1OTAyMjc1NTk3NjM3NjI3NTEiPiJBbmRhIHRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkgc2FsYWggbWVuZ2dhbWJhciBwb2xhIHBlbWJ1a2Ega3VuY2kuIFNldGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbGFnaSB1cGF5YSBnYWdhbCwgQW5kYSBha2FuIGRpbWludGEgbWVtYnVrYSBrdW5jaSBwb25zZWwgbWVuZ2d1bmFrYW4gaW5mbyBtYXN1ayBHb29nbGUuIlxuXG4iQ29iYSBsYWdpIGRhbGFtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IGRldGlrLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9hdF93aXBlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI2MTI4MTA2Mzk5NzQ1NzU1NjA0Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHRhYmxldCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHVwYXlhIGdhZ2FsIGxhZ2ksIHRhYmxldCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBiYXdhYW4gcGFicmlrIGRhbiBzZW11YSBkYXRhIHBlbmdndW5hIGhpbGFuZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfYXRfd2lwZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2MDM1NjUxNDIxNTY4MjY1NjUiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgcG9uc2VsIHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkuIFNldGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdXBheWEgZ2FnYWwgbGFnaSwgcG9uc2VsIGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBzZXRlbGFuIGJhd2FhbiBwYWJyaWsgZGFuIHNlbXVhIGRhdGEgcGVuZ2d1bmEgaGlsYW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX25vd193aXBpbmciIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjI4MDg3MzUxNjQ5MzkzNDM2NSI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayB0YWJsZXQgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IGthbGkuIEtpbmkgdGFibGV0IGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBzZXRlbGFuIGJhd2FhbiBwYWJyaWsuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfbm93X3dpcGluZyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjMwMjU1MDQ3MjE3NjQ5MjIyNDYiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgcG9uc2VsIHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBrYWxpLiBLaW5pIHBvbnNlbCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBiYXdhYW4gcGFicmlrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9hdF93aXBlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI2MTI4MTA2Mzk5NzQ1NzU1NjA0Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHRhYmxldCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHVwYXlhIGdhZ2FsIGxhZ2ksIHRhYmxldCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBkZWZhdWx0IHBhYnJpayBkYW4gc2VtdWEgZGF0YSBwZW5nZ3VuYSBoaWxhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2F0X3dpcGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjAzNTY1MTQyMTU2ODI2NTY1Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHBvbnNlbCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHVwYXlhIGdhZ2FsIGxhZ2ksIHBvbnNlbCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBkZWZhdWx0IHBhYnJpayBkYW4gc2VtdWEgZGF0YSBwZW5nZ3VuYSBoaWxhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfbm93X3dpcGluZyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMjgwODczNTE2NDkzOTM0MzY1Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHRhYmxldCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4ga2FsaS4gS2luaSB0YWJsZXQgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gZGVmYXVsdCBwYWJyaWsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfbm93X3dpcGluZyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjMwMjU1MDQ3MjE3NjQ5MjIyNDYiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgcG9uc2VsIHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBrYWxpLiBLaW5pIHBvbnNlbCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBkZWZhdWx0IHBhYnJpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iQ29iYSBsYWdpIGRhbGFtIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBkZXRpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Ikx1cGEgcG9sYT8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2dsb2dpbl9mb3Jnb3RfcGF0dGVybiIgbXNnaWQ9IjI1ODg1MjE1MDExNjYwMzI3NDciPiJQZW1idWthIGt1bmNpIGFrdW4iPC9zdHJpbmc+CkBAIC05MDksOCArOTI5LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iSElEVVAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJNQVRJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJUaW5kYWthbiBsZW5na2FwIG1lbmdndW5ha2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWx3YXlzVXNlIiBtc2dpZD0iNDU4MzAxODM2ODAwMDYxMDQzOCI+Ikd1bmFrYW4gc2VjYXJhIGJhd2FhbiB1bnR1ayB0aW5kYWthbiBpbmkuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY2xlYXJEZWZhdWx0SGludE1zZyIgbXNnaWQ9IjMyNTI1ODQ2ODk1MTIwNzcyNTciPiJNZW5naGFwdXMgYmF3YWFuIGRpIFNldGVsYW4gc2lzdGVtICZndDsgQXBsICZndDsgVGVydW5kdWguIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWx3YXlzVXNlIiBtc2dpZD0iNDU4MzAxODM2ODAwMDYxMDQzOCI+Ikd1bmFrYW4gc2VjYXJhIGRlZmF1bHQgdW50dWsgdGluZGFrYW4gaW5pLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNsZWFyRGVmYXVsdEhpbnRNc2ciIG1zZ2lkPSIzMjUyNTg0Njg5NTEyMDc3MjU3Ij4iTWVuZ2hhcHVzIGRlZmF1bHQgZGkgU2V0ZWxhbiBzaXN0ZW0gJmd0OyBBcGwgJmd0OyBUZXJ1bmR1aC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjaG9vc2VBY3Rpdml0eSIgbXNnaWQ9Ijc0ODY4NzYxNDc3NTE4MDMzMzMiPiJQaWxpaCB0aW5kYWthbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNob29zZVVzYkFjdGl2aXR5IiBtc2dpZD0iNjg5NDc0ODQxNjA3MzU4MzUwOSI+IlBpbGloIGFwbCB1bnR1ayBwZXJhbmdrYXQgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm9BcHBsaWNhdGlvbnMiIG1zZ2lkPSIyOTkxODE0MjczOTM2NTA0Njg5Ij4iVGlkYWsgYWRhIGFwbCB5YW5nIGRhcGF0IG1lbGFrdWthbiB0aW5kYWthbiBpbmkuIjwvc3RyaW5nPgpAQCAtOTYxLDggKzk4MSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJ2b2x1bWVfaWNvbl9kZXNjcmlwdGlvbl9pbmNhbGwiIG1zZ2lkPSI4ODkwMDczMjE4MTU0NTQzMzk3Ij4iVm9sdW1lIHBhbmdnaWxhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZvbHVtZV9pY29uX2Rlc2NyaXB0aW9uX21lZGlhIiBtc2dpZD0iNDIxNzMxMTcxOTY2NTE5NDIxNSI+IlZvbHVtZSBtZWRpYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZvbHVtZV9pY29uX2Rlc2NyaXB0aW9uX25vdGlmaWNhdGlvbiIgbXNnaWQ9IjcwNDQ5ODY1NDY0NzcyODIyNzQiPiJWb2x1bWUgcGVtYmVyaXRhaHVhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX2RlZmF1bHQiIG1zZ2lkPSIzNzg5NzU4OTgwMzU3Njk2OTM2Ij4iTmFkYSBkZXJpbmcgYmF3YWFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icmluZ3RvbmVfZGVmYXVsdF93aXRoX2FjdHVhbCIgbXNnaWQ9IjgxMjk1NjM0ODA4OTU5OTAzNzIiPiJOYWRhIGRlcmluZyBiYXdhYW4gKDx4bGlmZjpnIGlkPSJBQ1RVQUxfUklOR1RPTkUiPiUxJHM8L3hsaWZmOmc+KSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX2RlZmF1bHQiIG1zZ2lkPSIzNzg5NzU4OTgwMzU3Njk2OTM2Ij4iTmFkYSBkZXJpbmcgZGVmYXVsdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX2RlZmF1bHRfd2l0aF9hY3R1YWwiIG1zZ2lkPSI4MTI5NTYzNDgwODk1OTkwMzcyIj4iTmFkYSBkZXJpbmcgZGVmYXVsdCAoPHhsaWZmOmcgaWQ9IkFDVFVBTF9SSU5HVE9ORSI+JTEkczwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmluZ3RvbmVfc2lsZW50IiBtc2dpZD0iNDQ0MDMyNDQwNzgwNzQ2ODcxMyI+IlNlbnlhcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX3BpY2tlcl90aXRsZSIgbXNnaWQ9IjM1MTUxNDM5MzkxNzUxMTkwOTQiPiJOYWRhIGRlcmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX3Vua25vd24iIG1zZ2lkPSI1NDc3OTE5OTg4NzAxNzg0Nzg4Ij4iTmFkYSBkZXJpbmcgdGlkYWsgZGlrZW5hbCI8L3N0cmluZz4KQEAgLTEwMDcsNyArMTAyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ0aW1lX3BpY2tlcl9kaWFsb2dfdGl0bGUiIG1zZ2lkPSI4MzQ5MzYyNjIzMDY4ODE5Mjk1Ij4iU2V0ZWwgd2FrdHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkYXRlX3BpY2tlcl9kaWFsb2dfdGl0bGUiIG1zZ2lkPSI1ODc5NDUwNjU5NDUzNzgyMjc4Ij4iU2V0ZWwgdGFuZ2dhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRhdGVfdGltZV9zZXQiIG1zZ2lkPSI1Nzc3MDc1NjE0MzIxMDg3NzU4Ij4iU2V0ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3Blcm1pc3Npb25fZ3JvdXAiIG1zZ2lkPSIyNjkwMTYwOTkxNDA1NjQ2MTI4Ij4iQmF3YWFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9wZXJtaXNzaW9uX2dyb3VwIiBtc2dpZD0iMjY5MDE2MDk5MTQwNTY0NjEyOCI+IkRlZmF1bHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19uZXdfcGVybV9wcmVmaXgiIG1zZ2lkPSI4MjU3NzQwNzEwNzU0MzAxNDA3Ij48Zm9udCBzaXplPSIxMiIgZmdjb2xvcj0iI2ZmZmZhM2EzIj4iQkFSVTogIjwvZm9udD48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vX3Blcm1pc3Npb25zIiBtc2dpZD0iNzI4MzM1NzcyODIxOTMzODExMiI+IlRpZGFrIHBlcmx1IGl6aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19oaWRlIiBtc2dpZD0iNzI4MzkxNTM5MTMyMDY3NjIyNiI+PGI+IlNlbWJ1bnlpa2FuIjwvYj48L3N0cmluZz4KQEAgLTEwNzYsNyArMTA5Niw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4icGVyYmFydWkgc3RhdGlzdGlrIHBlbmdndW5hYW4ga29tcG9uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iMTEwNjYxMjQyNDI1NDI3NzYzMCI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgc3RhdGlzdGlrIHBlbmdndW5hYW4ga29tcG9uZW4geWFuZyBkaWt1bXB1bGthbi4gVGlkYWsgdW50dWsgZGlndW5ha2FuIG9sZWggYXBsIG5vcm1hbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NvcHlQcm90ZWN0ZWREYXRhIiBtc2dpZD0iNDM0MTAzNjMxMTIxMTQwNjY5MiI+Im1lbnlhbGluIGtvbnRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvcHlQcm90ZWN0ZWREYXRhIiBtc2dpZD0iNDM5MDY5NzEyNDI4ODMxNzgzMSI+Ik1lbmdpemlua2FuIGFwbCBtZW5qYWxhbmthbiBsYXlhbmFuIGtvbnRhaW5lciBiYXdhYW4gdW50dWsgbWVueWFsaW4ga29udGVuLiBUaWRhayB1bnR1ayBkaWd1bmFrYW4gb2xlaCBhcGwgbm9ybWFsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvcHlQcm90ZWN0ZWREYXRhIiBtc2dpZD0iNDM5MDY5NzEyNDI4ODMxNzgzMSI+Ik1lbmdpemlua2FuIGFwbCBtZW5qYWxhbmthbiBsYXlhbmFuIGtvbnRhaW5lciBkZWZhdWx0IHVudHVrIG1lbnlhbGluIGtvbnRlbi4gVGlkYWsgdW50dWsgZGlndW5ha2FuIG9sZWggYXBsIG5vcm1hbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0dXRvcmlhbF9kb3VibGVfdGFwX3RvX3pvb21fbWVzc2FnZV9zaG9ydCIgbXNnaWQ9IjQwNzA0MzMyMDgxNjAwNjM1MzgiPiJTZW50dWggZHVhIGthbGkgdW50dWsgbWVuZ29udHJvbCBwZXJiZXNhci9wZXJrZWNpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImdhZGdldF9ob3N0X2Vycm9yX2luZmxhdGluZyIgbXNnaWQ9IjQ4ODIwMDQzMTQ5MDY0NjYxNjIiPiJUaWRhayBkYXBhdCBtZW5hbWJhaGthbiBnYXdpdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbWVfYWN0aW9uX2dvIiBtc2dpZD0iODMyMDg0NTY1MTczNzM2OTAyNyI+IkJ1a2EiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCA5NmM2NzA5Li41YTRmMzU3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InNjcml0dHVyYSBkYXRpIGRpIGNvbnRhdHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgbW9kaWZpY2FyZSBpIGRhdGkgZGkgY29udGF0dG8gKGluZGlyaXp6aSkgbWVtb3JpenphdGkgc3VsIHRhYmxldC4gTGUgYXBwbGljYXppb25pIGRhbm5vc2UgcG90cmViYmVybyBmYXJuZSB1c28gcGVyIGNhbmNlbGxhcmUgbyBtb2RpZmljYXJlIGkgdHVvaSBkYXRpIGRpIGNvbnRhdHRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgbW9kaWZpY2FyZSBpIGRhdGkgZGkgY29udGF0dG8gKGluZGlyaXp6aSkgbWVtb3JpenphdGkgc3VsIHRlbGVmb25vLiBMZSBhcHBsaWNhemlvbmkgZGFubm9zZSBwb3RyZWJiZXJvIGZhcm5lIHVzbyBwZXIgY2FuY2VsbGFyZSBvIG1vZGlmaWNhcmUgaSB0dW9pIGRhdGkgZGkgY29udGF0dG8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJsZXR0dXJhIGRlaSB0dW9pIGRhdGkgcHJvZmlsbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIGluZm9ybWF6aW9uaSBkZWwgcHJvZmlsbyBwZXJzb25hbGUgbWVtb3JpenphdGUgc3VsIGRpc3Bvc2l0aXZvLCBjb21lIGlsIHR1byBub21lIGUgbGUgdHVlIGluZm9ybWF6aW9uaSBkaSBjb250YXR0by4gQ2nDsiBzaWduaWZpY2EgY2hlIGxcJ2FwcGxpY2F6aW9uZSBwdcOyIGlkZW50aWZpY2FydGkgZSBpbnZpYXJlIGxlIHR1ZSBpbmZvcm1hemlvbmkgZGkgcHJvZmlsbyBhZCBhbHRyaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJzY3JpdHR1cmEgZGF0aSBkZWwgcHJvZmlsbyI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkNvbnNlbnRlIGFsbFwnYXBwbGljYXppb25lIGRpIGxlZ2dlcmUgcGFyb2xlLCBmcmFzaSBlIG5vbWkgcHJpdmF0aSBjaGUgbFwndXRlbnRlIHBvdHJlYmJlIGF2ZXIgbWVtb3JpenphdG8gbmVsIGRpemlvbmFyaW8gdXRlbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InNjcml0dHVyYSBuZWwgZGl6aW9uYXJpbyBkZWZpbml0byBkYWxsXCd1dGVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgbnVvdmUgcGFyb2xlIG5lbCBkaXppb25hcmlvIHV0ZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDA4NjIyMTM3NDYzOTE4MzI4MSI+ImxldHR1cmEgY29udGVudXRpIGFyY2hpdmlvIFVTQiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg1Mzc4NzUxNTE4NDUxMzk1MzkiPiJsZXR0dXJhIGRlaSBjb250ZW51dGkgZGVsbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxMDU1MzAyODk4OTk5MzUyMzM5Ij4iQ29uc2VudGUgZGkgbGVnZ2VyZSBsXCdhcmNoaXZpbyBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Im1vZGlmaWNhL2VsaW1pbmF6LiBjb250ZW51dGkgYXJjaGl2aW8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXJlL2VsaW1pbmFyZSBpIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgbmVsbFwnYXJjaGl2aW8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCmluZGV4IDQ4NWUwYjAuLjU2YTk4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i15vXqteV15Eg16DXqteV16DXmdedINep15wg15DXoNep15kg16fXqdeoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4i157XkNek16nXqCDXnNeZ15nXqdeV150g15zXqdeg15XXqiDXkNeqINek16jXmNeZINeU16fXqdeoICjXm9eq15XXkdeqKSDXlNee15DXldeX16HXoNeZ150g15HXmNeR15zXmC4g15nXmdep15XXnteZ150g15bXk9eV16DXmdeZ150g16LXnNeV15zXmdedINec15TXqdeq157XqSDXkdeb15og15vXk9eZINec157Xl9eV16cg15DXlSDXnNep16DXldeqINeQ16og16TXqNeY15kg15TXp9ep16gg16nXnNeaLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i157XkNek16nXqCDXnNeZ15nXqdeV150g15zXqdeg15XXqiDXkNeqINek16jXmNeZINeU16fXqdeoICjXm9eq15XXkdeqKSDXlNee15DXldeX16HXoNeZ150g15HXmNec16TXldefLiDXmdeZ16nXldee15nXnSDXlteT15XXoNeZ15nXnSDXotec15XXnNeZ150g15zXlNep16rXntepINeR15vXmiDXm9eT15kg15zXnteX15XXpyDXkNeVINec16nXoNeV16og15DXqiDXpNeo15jXmSDXlNen16nXqCDXqdec15ouIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLXp9eo15Ag15DXqiDXoNeq15XXoNeZINeU16TXqNeV16TXmdecINep15zXmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLXnteQ16TXqdeoINec15nXmdep15XXnSDXnNen16jXldeQINeg16rXldeg15nXnSDXkdek16jXmNeZINeU16TXqNeV16TXmdecINeU15DXmdep15kg15TXnteQ15XXl9eh16DXmdedINeR157Xm9ep15nXqCwg15vXkteV158g16nXnteaINeV16TXqNeY15kg15TXp9ep16gg16nXnNeaLiDXntep157XoteV16og15TXk9eR16gg16nXlNeZ15nXqdeV150g15nXldeb15wg15zXlteU15XXqiDXkNeV16rXmiDXldec16nXnNeV15cg15DXqiDXnteZ15PXoiDXlNek16jXldek15nXnCDXqdec15og15zXkNeg16nXmdedINeQ15fXqNeZ150uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4i15vXqteV15Eg15HXoNeq15XXoNeZINeU16TXqNeV16TXmdecINep15zXmiI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+Itee15DXpNep16gg15zXmdeZ16nXldedINec16fXqNeV15Ag157Xmdec15nXnSwg16nXnteV16og15XXkdeZ15jXldeZ15nXnSDXpNeo15jXmdeZ150g16nXlNee16nXqtee16kg15DXl9eh158g15HXnteZ15zXldefINeU157Xqdeq157XqS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiLXm9eq15nXkdeUINec157Xmdec15XXnyDXkdeU15LXk9eo16og15TXntep16rXntepIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+Itee15DXpNep16gg15zXmdeZ16nXldedINec15vXqteV15Eg157Xmdec15nXnSDXl9eT16nXldeqINeR157Xmdec15XXnyDXlNee16nXqtee16kuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQwODYyMjEzNzQ2MzkxODMyODEiPiLXp9eo15nXkNeqINeq15XXm9efINeQ15fXodeV158gVVNCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODUzNzg3NTE1MTg0NTEzOTUzOSI+Iten16jXmdeQ16og16rXldeb158g15vXqNeY15nXoSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTA1NTMwMjg5ODk5OTM1MjMzOSI+Itee15DXpNep16gg15zXmdeZ16nXldedINec16fXqNeV15Ag15DXqiDXlNeq15XXm9efINep15wg15DXl9eh15XXnyBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiLXnteQ16TXqdeoINec15nXmdep15XXnSDXnNen16jXldeQINeQ16og15TXqteV15vXnyDXqdecINeb16jXmNeZ16EgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Itep16DXlC/XnteX16cg16rXldeb158g15HXkNee16bXoteZINeQ15fXodeV158g157XodeV15IgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLXqdeg15Qv157Xl9enINeq15XXm9efINep15wg15vXqNeY15nXoSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLXnteQ16TXqdeoINec15nXmdep15XXnSDXnNeb16rXldeRINec15TXqten158g15TXkNeX16HXldefINee16HXldeSIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAppbmRleCBiYzk4NDBkLi5jMjQ4MDQwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+IumAo+e1oeWFiOODh+ODvOOCv+OBruabuOOBjei+vOOBvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IuOCv+ODluODrOODg+ODiOOBq+S/neWtmOOBleOCjOOBpuOBhOOCi+mAo+e1oeWFiO+8iOOCouODieODrOOCue+8ieODh+ODvOOCv+OBruWkieabtOOCkuOCouODl+ODquOBq+ioseWPr+OBl+OBvuOBmeOAguOBk+OBruioseWPr+OCkuaCquaEj+OBruOBguOCi+OCouODl+ODquOBq+WIqeeUqOOBleOCjOOCi+OBqOOAgemAo+e1oeWFiOODh+ODvOOCv+OBjOa2iOWOu+OBvuOBn+OBr+WkieabtOOBleOCjOOCi+aBkOOCjOOBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i5pC65biv56uv5pyr44Gr5L+d5a2Y44GV44KM44Gm44GE44KL6YCj57Wh5YWI77yI44Ki44OJ44Os44K577yJ44OH44O844K/44Gu5aSJ5pu044KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CC44GT44Gu6Kix5Y+v44KS5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Gr5Yip55So44GV44KM44KL44Go44CB6YCj57Wh5YWI44OH44O844K/44GM5raI5Y6744G+44Gf44Gv5aSJ5pu044GV44KM44KL5oGQ44KM44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLjg5fjg63jg5XjgqPjg7zjg6vjg4fjg7zjgr/jga7oqq3jgb/lj5bjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i56uv5pyr44Gr5L+d5a2Y44GV44KM44Gm44GE44KL5YCL5Lq644Gu44OX44Ot44OV44Kj44O844Or5oOF5aCx77yI5ZCN5YmN44CB6YCj57Wh5YWI5oOF5aCx44Gq44Gp77yJ44KS6Kqt44G/5Y+W44KL44GT44Go44KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CC6Kix5Y+v44GZ44KL44Go44CB44Ki44OX44Oq44Gn44Gv44Om44O844K244O844Gu6Lqr5YWD44KS54m55a6a44GX44Gf44KK44OX44Ot44OV44Kj44O844Or5oOF5aCx44KS56ys5LiJ6ICF44Gr6Lui6YCB44GX44Gf44KK44Gn44GN44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4i44OX44Ot44OV44Kj44O844Or44OH44O844K/44Gr5pu444GN6L6844KAIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i44Om44O844K244O844GM5Y2Y6Kqe44Oq44K544OI44Gr5YCL5Lq65oOF5aCx44Go44GX44Gm55m76Yyy44GX44Gf5Y+v6IO95oCn44Gu44GC44KL6Kqe5Y+l44KE5ZCN5YmN44KS6Kqt44G/6L6844KA44GT44Go44KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i5Y2Y6Kqe44Oq44K544OI44G444Gu5pu444GN6L6844G/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuWNmOiqnuODquOCueODiOOBq+aWsOOBl+OBhOiqnuWPpeOCkuabuOOBjei+vOOCgOOBk+OBqOOCkuOCouODl+ODquOBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjga7jgrPjg7Pjg4bjg7Pjg4Tjga7lpInmm7Qv5YmK6ZmkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTROOCq+ODvOODieOBruOCs+ODs+ODhuODs+ODhOOCkuS/ruatoy/liYrpmaTjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iVVNC44K544OI44Os44O844K444G444Gu5pu444GN6L6844G/44KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKaW5kZXggYzk4MDFhMy4uY2JkMmU4NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLsl7Drnb3sspgg642w7J207YSwIOyekeyEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IuyVseydtCDtg5zruJTrpr/sl5Ag7KCA7J6l65CcIOuqqOuToCDsl7Drnb3sspgo7KO87IaMKSDrjbDsnbTthLDrpbwg7J297J2EIOyImCDsnojrj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiDsnbQg6rK97JqwIOyVheyEsSDslbHsnbQg7Jew65297LKYIOuNsOydtO2EsOulvCDsp4DsmrDqsbDrgpgg7IiY7KCV7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLslbHsnbQg7Zy064yA7KCE7ZmU7JeQIOyggOyepeuQnCDrqqjrk6Ag7Jew65297LKYKOyjvOyGjCkg642w7J207YSw66W8IOydveydhCDsiJgg7J6I64+E66GdIO2XiOyaqe2VqeuLiOuLpC4g7J20IOqyveyasCDslYXshLEg7JWx7J20IOyXsOudveyymCDrjbDsnbTthLDrpbwg7KeA7Jqw6rGw64KYIOyImOygle2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4i7ZSE66Gc7ZWEIOuNsOydtO2EsCDsnb3quLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i7JWx7J20IOq4sOq4sOyXkCDsoIDsnqXrkJwg6rCc7J24IO2UhOuhnO2VhCDsoJXrs7Qo7JiIOiDsgqzsmqnsnpAg7J2066aELCDsl7Drnb3sspgg7KCV67O0IOuTsSnrpbwg7J297J2EIOyImCDsnojrj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiDsnbTripQg7JWx7J20IOyCrOyaqeyekOulvCDtmZXsnbjtlZjqs6Ag64uk66W4IOyCrOyaqeyekOuTpOyXkOqyjCDtlbTri7kg7ZSE66Gc7ZWEIOygleuztOulvCDsoITshqHtlaAg7IiYIOyeiOuLpOuKlCDqsoPsnYQg7J2Y66+47ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+Iu2UhOuhnO2VhCDrjbDsnbTthLDsl5Ag7JOw6riwIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i7JWx7J20IOyCrOyaqeyekCDsgqzsoITsl5Ag67O06rSA65CY7Ja0IOyeiOuKlCDruYTqs7XqsJwg64uo7Ja0LCDsnbTrpoQg67CPIOq1rOusuOydhCDsnb3rj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuyCrOyaqeyekCDsoJXsnZgg7IKs7KCE7JeQIOyekeyEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLslbHsnbQg7IKs7Jqp7J6QIOyCrOyghOyXkCDsg4gg64uo7Ja066W8IOyeheugpe2VoCDsiJgg7J6I64+E66GdIO2XiOyaqe2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iVVNCIOyggOyepeyGjCDsvZjthZDsuKAg7IiY7KCVL+yCreygnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Qg7Lm065OcIOy9mO2FkOy4oCDsiJjsoJUv7IKt7KCcIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IuyVseydtCBVU0Ig7KCA7J6l7IaM7JeQIOyTuCDsiJgg7J6I64+E66GdIO2XiOyaqe2VqeuLiOuLpC4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAppbmRleCA0NDI0YWQ1Li5iNWFmZGQ1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InJhxaF5dGkgYWRyZXNhdMWzIGR1b21lbmlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iTGVpZMW+aWFtYSBwcm9ncmFtYWkga2Vpc3RpIHBsYW7FoWV0aW5pYW1lIGtvbXBpdXRlcnlqZSBzYXVnb211cyBrb250YWt0aW5pdXMgKGFkcmVzbykgZHVvbWVuaXMuIEtlbmvEl2ppxaFrb3MgcHJvZ3JhbW9zIGdhbGkgdGFpIG5hdWRvdGksIGthZCBpxaF0cmludMWzIGFyIHBha2Vpc3TFsyBqxatzxbMga29udGFrdGluaXVzIGR1b21lbmlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iTGVpZMW+aWFtYSBwcm9ncmFtYWkga2Vpc3RpIHRlbGVmb25lIHNhdWdvbXVzIGtvbnRha3Rpbml1cyAoYWRyZXNvKSBkdW9tZW5pcy4gS2Vua8SXamnFoWtvcyBwcm9ncmFtb3MgZ2FsaSB0YWkgbmF1ZG90aSwga2FkIGnFoXRyaW50xbMgYXIgcGFrZWlzdMWzIGrFq3PFsyBrb250YWt0aW5pdXMgZHVvbWVuaXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJza2FpdHl0aSBwcm9maWxpbyBkdW9tZW5pcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJMZWlkxb5pYW1hIHByb2dyYW1haSBza2FpdHl0aSBhc21lbmluxJkgcHJvZmlsaW8gaW5mb3JtYWNpasSFLCBzYXVnb23EhSBqxatzxbMgxK9yZW5naW55amUsIHB2ei4sIGrFq3PFsyB2YXJkxIUsIHBhdmFyZMSZIGlyIGtvbnRha3RpbsSZIGluZm9ybWFjaWrEhS4gVGFpIHJlacWha2lhLCBrYWQgcHJvZ3JhbWEgZ2FsaSBudXN0YXR5dGkgasWrc8WzIHRhcGF0eWLEmSBpciBzacWzc3RpIHByb2ZpbGlvIGluZm9ybWFjaWrEhSBraXRpZW1zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InJhxaF5dGkga2FpcCBwcm9maWxpbyBkdW9tZW5pcyI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkxlaWTFvmlhbWEgcHJvZ3JhbWFpIHNrYWl0eXRpIHByaXZhxI1pdXMgxb5vZMW+aXVzLCB2YXJkdXMgaXIgZnJhemVzLCBrdXJpdW9zIG5hdWRvdG9qYXMgacWhc2F1Z29qbyBuYXVkb3Rvam8gxb5vZHluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJyYcWheXRpIG5hdWRvdG9qbyBudXN0YXR5dGFtZSDFvm9keW5lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkxlaWTFvmlhbWEgcHJvZ3JhbWFpIHJhxaF5dGkgbmF1anVzIMW+b2TFvml1cyDEryBuYXVkb3Rvam8gxb5vZHluxIUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ImtlaXN0aSAvIGnFoXRyaW50aSBVU0IgYXRtaW50aW7El3MgdHVyaW7EryI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ia2Vpc3RpIC8gacWhdHJpbnRpIFNEIGtvcnRlbMSXcyB0dXJpbsSvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkxlaWTFvi4gcHJvZ3IuIHJhxaEuIMSvIFVTQiBhdG0uIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKaW5kZXggODliYWFhYS4uNjViM2Q3ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJyYWtzdMSrdCBrb250YWt0cGVyc29udSBkYXR1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IsS7YXVqIGxpZXRvdG5laSBtb2RpZmljxJN0IHBsYW7FoWV0ZGF0b3LEgSBzYWdsYWLEgXRvcyBrb250YWt0cGVyc29udSAoYWRyZcWhdSkgZGF0dXMuIMS7YXVucHLEgXTEq2dhcyBsaWV0b3RuZXMgdG8gdmFyIGl6bWFudG90LCBsYWkgZHrEk3N0dSB2YWkgbW9kaWZpY8STdHUga29udGFrdHBlcnNvbnUgZGF0dXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLEu2F1aiBsaWV0b3RuZWkgbW9kaWZpY8STdCB0xIFscnVuxKsgc2FnbGFixIF0b3Mga29udGFrdHBlcnNvbnUgKGFkcmXFoXUpIGRhdHVzLiDEu2F1bnByxIF0xKtnYXMgbGlldG90bmVzIHRvIHZhciBpem1hbnRvdCwgbGFpIGR6xJNzdHUgdmFpIG1vZGlmaWPEk3R1IGtvbnRha3RwZXJzb251IGRhdHVzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4iasWrc3UgcHJvZmlsYSBkYXR1IGxhc8SrxaFhbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4ixLthdWogbGlldG90bmVpIGxhc8SrdCBpZXLEq2PEkyBzYWdsYWLEgXRvIHBlcnNvbsSrZ8SBIHByb2ZpbGEgaW5mb3JtxIFjaWp1LCBwaWVtxJNyYW0sIGrFq3N1IHbEgXJkdSB1biBrb250YWt0aW5mb3JtxIFjaWp1LiBUYXMgbm96xKttxJMsIGthIGxpZXRvdG5lIHZhciBqxatzIGlkZW50aWZpY8STdCB1biBzxat0xKt0IGrFq3N1IHByb2ZpbGEgaW5mb3JtxIFjaWp1IGNpdMSBbSBwZXJzb27EgW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4icmFrc3TEq8WhYW5hIGrFq3N1IHByb2ZpbGEgZGF0b3MiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLEu2F1aiBsaWV0b3RuZWkgbGFzxKt0IGplYmt1cnVzIHByaXbEgXR1IHbEgXJkdXMsIG5vc2F1a3VtdXMgdW4gZnLEgXplcywga28gbGlldG90xIFqcyBzYWdsYWLEgWppcyBzYXbEgSBsaWV0b3TEgWphIHbEgXJkbsSrY8SBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InJha3N0xKt0IGxpZXRvdMSBamEgbm90ZWlrdMSBIHbEgXJkbsSrY8SBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IsS7YXVqIGxpZXRvdG5laSByYWtzdMSrdCBqYXVudXMgdsSBcmR1cyBsaWV0b3TEgWphIHbEgXJkbsSrY8SBLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJwxIFydmVpZG90L2R6xJNzdCBVU0LCoGtyLiBzYXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJwxIFydmVpZG90L2R6xJNzdCBTRMKga2FydGVzIHNhdHVydSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLEu2F1aiBsaWV0b3RuZWkgcmFrc3TEq3QgVVNCwqBhdG1pxYbEgS4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAppbmRleCAzODViZWJiLi5iYjJjZjYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InR1bGlzIGRhdGEga2VuYWxhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+Ik1lbWJlbmFya2FuIGFwbCB1bnR1ayBtZW5ndWJhaCBzdWFpIGRhdGEga2VuYWxhbiAoYWxhbWF0KSB5YW5nIGRpc2ltcGFuIHBhZGEgdGFibGV0IGFuZGEuIEFwbCBoYXNhZCBib2xlaCBtZW5nZ3VuYWthbm55YSB1bnR1ayBtZW1hZGFtIGF0YXUgbWVuZ3ViYWggc3VhaSBkYXRhIGtlbmFsYW4gYW5kYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+Ik1lbWJlbmFya2FuIGFwbCB1bnR1ayBtZW5ndWJhaCBzdWFpIGRhdGEga2VuYWxhbiAoYWxhbWF0KSB5YW5nIGRpc2ltcGFuIHBhZGEgdGVsZWZvbiBhbmRhLiBBcGwgaGFzYWQgYm9sZWggbWVuZ2d1bmFrYW5ueWEgdW50dWsgbWVtYWRhbSBhdGF1IG1lbmd1YmFoIHN1YWkgZGF0YSBrZW5hbGFuIGFuZGEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJiYWNhIGRhdGEgcHJvZmlsIGFuZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iTWVtYmVuYXJrYW4gYXBsIHVudHVrIG1lbWJhY2EgbWFrbHVtYXQgcHJvZmlsIHBlcmliYWRpIHlhbmcgZGlzaW1wYW4gZGFsYW0gcGVyYW50aSBhbmRhLCBzZXBlcnRpIG5hbWEgZGFuIG1ha2x1bWF0IGtlbmFsYW4gYW5kYS4gSW5pIGJlcm1ha25hIGFwbCBsYWluIGJvbGVoIG1lbmdlbmFsIHBhc3RpIGFuZGEgZGFuIG1lbmdoYW50YXIgbWFrbHVtYXQgcHJvZmlsIGFuZGEga2VwYWRhIG9yYW5nIGxhaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4idHVsaXMga2UgZGF0YSBwcm9maWwgYW5kYSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+Ik1lbWJlbmFya2FuIGFwbCBtZW1iYWNhIHNlYmFyYW5nIGthdGEta2F0YSBwZXJpYmFkaSwgbmFtYSBkYW4gZnJhc2EgeWFuZyBtdW5na2luIHRlbGFoIGRpc2ltcGFuIG9sZWggcGVuZ2d1bmEgZGFsYW0ga2FtdXMgcGVuZ2d1bmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4idHVsaXMga2Uga2FtdXMgeWFuZyBkaXRha3JpZmthbiBwZW5nZ3VuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJNZW1iZW5hcmthbiBhcGwgbWVudWxpcyBwZXJrYXRhYW4gYmFoYXJ1IGtlIGRhbGFtIGthbXVzIHBlbmdndW5hLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJ1YmFoIHN1YWkvcGFkYW0ga2RnbiBzdG9ybiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InViYWggc3VhaS9wYWRhbWthbiBrYW5kdW5nYW4ga2FkIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+Ik1lbWJlbmFya2FuIGFwbCBtZW51bGlzIGtlIHN0b3JhbiBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggZTcwYTY2NC4uMzljNzMzZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJza3JpdmUga29udGFrdGluZm9ybWFzam9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iTGFyIGFwcGVuIGxlc2UgYWxsZSBrb250YWt0ZGF0YWVuZSAoYWRyZXNzZW5lKSBzb20gZXIgbGFncmV0IHDDpSBuZXR0YnJldHRldC4gT25kc2lubmVkZSBhcHBlciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIHNsZXR0ZSBlbGxlciBlbmRyZSBrb250YWt0ZGF0YWVuZSBkaW5lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iTGFyIGFwcGVuIGxlc2UgYWxsZSBrb250YWt0ZGF0YWVuZSAoYWRyZXNzZW5lKSBzb20gZXIgbGFncmV0IHDDpSB0ZWxlZm9uZW4uIE9uZHNpbm5lZGUgYXBwZXIga2FuIGJydWtlIGRldHRlIHRpbCDDpSBzbGV0dGUgZWxsZXIgZW5kcmUga29udGFrdGRhdGFlbmUgZGluZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+Imxlc2UgcHJvZmlsZGF0YWVuZSBkaW5lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IkxhciBhcHBlbiBsZXNlIHBlcnNvbmxpZ2UgcHJvZmlsaW5mb3JtYXNqb24gc29tIGVyIGxhZ3JldCBww6UgZW5oZXRlbiwgc29tIGZvciBla3NlbXBlbCBuYXZuIG9nIGtvbnRha3RpbmZvcm1hc2pvbi4gRGV0dGUgYmV0eXIgYXQgYXBwZW4ga2FuIGlkZW50aWZpc2VyZSBkZWcgb2cgc2VuZGUgcHJvZmlsaW5mb3JtYXNqb25lbiBkaW4gdGlsIGFuZHJlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InNrcml2IHRpbCBwcm9maWxkYXRhZW5lIGRpbmUiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJMYXIgYXBwZW4gbGVzZSBldmVudHVlbGxlIHByaXZhdGUgb3JkLCBuYXZuIG9nIHV0dHJ5a2sgc29tIGJydWtlcmVuIGthbiBoYSBsYWdyZXQgaSBicnVrZXJvcmRsaXN0ZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2tyaXZlIGkgYnJ1a2VyZGVmaW5lcnQgb3JkbGlzdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iTGFyIGFwcGVuIHNrcml2ZSBueWUgb3JkIGkgYnJ1a2Vyb3JkbGlzdGVuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJlbmRyZS9zbGV0dGUgaW5uaC4gaSBVU0ItbGFnci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iR2lyIGFwcGVuIHRpbGxhdGVsc2UgdGlsIMOlIHNrcml2ZSB0aWwgVVNCLWxhZ3Jpbmdlbi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAppbmRleCA2ODc2YzYzLi43NjA5Y2M1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImNvbnRhY3RnZWdldmVucyBzY2hyaWp2ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJIaWVybWVlIGthbiBkZSBhcHAgZGUgb3AgdXcgdGFibGV0IG9wZ2VzbGFnZW4gY29udGFjdGdlZ2V2ZW5zIChhZHJlc2dlZ2V2ZW5zKSB3aWp6aWdlbi4gU2NoYWRlbGlqa2UgYXBwcyBrdW5uZW4gaGllcm1lZSB1dyBjb250YWN0Z2VnZXZlbnMgdmVyd2lqZGVyZW4gb2Ygd2lqemlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJIaWVybWVlIGthbiBkZSBhcHAgZGUgb3AgdXcgdGVsZWZvb24gb3BnZXNsYWdlbiBjb250YWN0Z2VnZXZlbnMgKGFkcmVzZ2VnZXZlbnMpIHdpanppZ2VuLiBTY2hhZGVsaWprZSBhcHBzIGt1bm5lbiBoaWVybWVlIHV3IGNvbnRhY3RnZWdldmVucyB2ZXJ3aWpkZXJlbiBvZiB3aWp6aWdlbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+InV3IHByb2ZpZWxnZWdldmVucyBsZXplbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJIaWVybWVlIGthbiBkZSBhcHAgcGVyc29vbmxpamtlIHByb2ZpZWxnZWdldmVucyBsZXplbiBkaWUgb3AgdXcgYXBwYXJhYXQgemlqbiBvcGdlc2xhZ2VuLCB6b2FscyB1dyBuYWFtIGVuIGNvbnRhY3RnZWdldmVucy4gRGl0IGJldGVrZW50IGRhdCBkZSBhcHAgdSBrYW4gaWRlbnRpZmljZXJlbiBlbiB1dyBwcm9maWVsZ2VnZXZlbnMgbmFhciBhbmRlcmVuIGthbiB2ZXJ6ZW5kZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4ic2NocmlqdmVuIG5hYXIgcHJvZmllbGdlZ2V2ZW5zIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iSGllcm1lZSBrYW4gZGUgYXBwIHByaXbDqXdvb3JkZW4sIG5hbWVuIGVuIHdvb3JkY29tYmluYXRpZXMgbGV6ZW4gZGllIGRlIGdlYnJ1aWtlciBoZWVmdCBvcGdlc2xhZ2VuIGluIGhldCBnZWJydWlrZXJzd29vcmRlbmJvZWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2NocmlqdmVuIG5hYXIgZG9vciBnZWJydWlrZXIgZ2VkZWZpbmllZXJkIHdvb3JkZW5ib2VrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkhpZXJtZWUga2FuIGRlIGFwcCBuaWV1d2Ugd29vcmRlbiBzY2hyaWp2ZW4gbmFhciBoZXQgZ2VicnVpa2Vyc3dvb3JkZW5ib2VrLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJpbmhvdWQgdmFuIFVTQi1vcHNsYWcgYWFucGFzc2VuL3ZlcndpamRlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJpbmhvdWQgb3AgZGUgU0Qta2FhcnQgYWFucGFzc2VuL3ZlcndpamRlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkhpZXJtZWUga2FuIGRlIGFwcCBzY2hyaWp2ZW4gbmFhciBkZSBVU0Itb3BzbGFnLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCmluZGV4IDk2ZGNmYTAuLmI0ZmM3N2IgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iemFwaXN5d2FuaWUgZGFueWNoIGtvbnRha3Rvd3ljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IlBvendhbGEgYXBsaWthY2ppIG5hIHptaWFuxJkgZGFueWNoIGtvbnRha3Rvd3ljaCAoYWRyZXNvd3ljaCkgemFwaXNhbnljaCB3IHRhYmxlY2llLiBaxYJvxZtsaXdlIGFwbGlrYWNqZSBtb2fEhSB0byB3eWtvcnp5c3RhxIcgdyBjZWx1IHVzdW5pxJljaWEgbHViIHptb2R5Zmlrb3dhbmlhIFR3b2ljaCBkYW55Y2gga29udGFrdG93eWNoLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iUG96d2FsYSBhcGxpa2FjamkgbmEgem1pYW7EmSBkYW55Y2gga29udGFrdG93eWNoIChhZHJlc293eWNoKSB6YXBpc2FueWNoIHcgdGVsZWZvbmllLiBaxYJvxZtsaXdlIGFwbGlrYWNqZSBtb2fEhSB0byB3eWtvcnp5c3RhxIcgZG8gdXN1bmnEmWNpYSBsdWIgem1vZHlmaWtvd2FuaWEgVHdvaWNoIGRhbnljaCBrb250YWt0b3d5Y2guIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJvZGN6eXQgZGFueWNoIHogVHdvamVnbyBwcm9maWx1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IlBvendhbGEgYXBsaWthY2ppIG5hIG9kY3p5dCBpbmZvcm1hY2ppLCB0YWtpY2ggamFrIFR3b2plIG5hendpc2tvIGkgaW5mb3JtYWNqZSBrb250YWt0b3dlLCB6IHByb2ZpbHUgb3NvYmlzdGVnbyBwcnplY2hvd3l3YW5lZ28gbmEgdXJ6xIVkemVuaXUuIE96bmFjemEgdG8sIMW8ZSBpbm5lIGFwbGlrYWNqZSBtb2fEhSBDacSZIHppZGVudHlmaWtvd2HEhyBpIHByemVzxYJhxIcgaW5mb3JtYWNqZSB6IFR3b2plZ28gcHJvZmlsdSBkbyBpbm55Y2ggb3PDs2IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4iemFwaXMgZGFueWNoIHcgVHdvaW0gcHJvZmlsdSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBvendhbGEgYXBsaWthY2ppIG5hIG9kY3p5dHl3YW5pZSB3c3plbGtpY2ggcHJ5d2F0bnljaCBzxYLDs3csIG5hencgaSB3eXJhxbxlxYQgemFwaXNhbnljaCB3IHPFgm93bmlrdSB1xbx5dGtvd25pa2EuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iemFwaXN5d2FuaWUgdyBzxYJvd25pa3UgemRlZmluaW93YW55bSBwcnpleiB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iUG96d2FsYSBhcGxpa2FjamkgbmEgemFwaXN5d2FuaWUgbm93eWNoIHPFgsOzdyBkbyBzxYJvd25pa2EgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJNb2R5Zmlrb3dhbmllL3VzdXdhbmllIHogbm/Fm25pa2EgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2R5Zmlrb3dhbmllL3VzdXdhbmllIHphd2FydG/Fm2NpIGthcnR5IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBvendhbGEgYXBsaWthY2ppIG5hIHphcGlzIHcgcGFtacSZY2kgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggN2YwMzFmZC4uZjc2YmU0YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImVzY3JldmVyIGRhZG9zIGRlIGNvbnRhY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iUGVybWl0ZSBxdWUgYSBhcGxpY2HDp8OjbyBtb2RpZmlxdWUgb3MgZGFkb3MgZGUgY29udGFjdG8gKGVuZGVyZcOnbykgYXJtYXplbmFkb3Mgbm8gdGFibGV0LiBBcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBpc3RvIHBhcmEgYXBhZ2FyIG91IG1vZGlmaWNhciBvcyBkYWRvcyBkb3Mgc2V1cyBjb250YWN0b3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJQZXJtaXRlIHF1ZSB1bWEgYXBsaWNhw6fDo28gbW9kaWZpcXVlIG9zIGRhZG9zIGRlIGNvbnRhY3RvIChlbmRlcmXDp28pIGFybWF6ZW5hZG9zIG5vIHRlbGVtw7N2ZWwuIEFzIGFwbGljYcOnw7VlcyBtYWxpY2lvc2FzIHBvZGVtIHV0aWxpemFyIGlzdG8gcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIG9zIGRhZG9zIGRvcyBzZXVzIGNvbnRhY3Rvcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImxlciBvcyBkYWRvcyBkbyBwZXJmaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iUGVybWl0ZSBxdWUgYSBhcGxpY2HDp8OjbyBsZWlhIGRhZG9zIGRlIHBlcmZpbCBwZXNzb2FpcyBhcm1hemVuYWRvcyBubyBzZXUgYXBhcmVsaG8sIGNvbW8gbyBzZXUgbm9tZSBlIGRhZG9zIGRlIGNvbnRhY3RvLiBJc3RvIHNpZ25pZmljYSBxdWUgb3V0cmFzIGFwbGljYcOnw7VlcyBwb2RlbSBpZGVudGlmaWPDoS1sbyBlIGVudmlhciBvcyBzZXVzIGRhZG9zIGRlIHBlcmZpbCBhIHRlcmNlaXJvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJlc2NyZXZlciBub3MgZGFkb3MgZG8gc2V1IHBlcmZpbCI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBlcm1pdGUgw6AgYXBsaWNhw6fDo28gbGVyIHF1YWlzcXVlciBwYWxhdnJhcywgbm9tZXMgZSBleHByZXNzw7VlcyBwcml2YWRhcyBxdWUgbyB1dGlsaXphZG9yIHBvc3NhIHRlciBhcm1hemVuYWRvIG5vIGRpY2lvbsOhcmlvIGRvIHV0aWxpemFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iZXNjcmV2ZXIgbm8gZGljaW9uw6FyaW8gZGVmaW5pZG8gcGVsbyB1dGlsaXphZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgw6AgYXBsaWNhw6fDo28gZXNjcmV2ZXIgbm92YXMgcGFsYXZyYXMgbm8gZGljaW9uw6FyaW8gZG8gdXRpbGl6YWRvci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kLi9lbGltLiBjb250ZcO6ZG8gZG8gYXJtYXouIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBlcm1pdGUgcXVlIGEgYXBsaWNhw6fDo28gZXNjcmV2YSBuYSB1bmlkYWRlIGRlIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IGZiZmU4OGYuLjQ2ZTQ0NWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iZ3JhdmFyIGRhZG9zIGRlIGNvbnRhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJQZXJtaXRlIHF1ZSBvIGFwbGljYXRpdm8gbW9kaWZpcXVlIG9zIGRhZG9zIGRlIGNvbnRhdG8gKGVuZGVyZcOnbykgYXJtYXplbmFkb3MgZW0gc2V1IHRhYmxldC4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGVzc2UgcmVjdXJzbyBwYXJhIGFwYWdhciBvdSBtb2RpZmljYXIgc2V1cyBkYWRvcyBkZSBjb250YXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIG1vZGlmaXF1ZSBvcyBkYWRvcyBkZSBjb250YXRvIChlbmRlcmXDp28pIGFybWF6ZW5hZG9zIGVtIHNldSB0ZWxlZm9uZS4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGVzc2UgcmVjdXJzbyBwYXJhIGFwYWdhciBvdSBtb2RpZmljYXIgc2V1cyBkYWRvcyBkZSBjb250YXRvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4ibGVyIGRhZG9zIGRlIHNldSBwZXJmaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGxlaWEgaW5mb3JtYcOnw7VlcyBkZSBwZXJmaWwgcGVzc29haXMgYXJtYXplbmFkYXMgZW0gc2V1IGRpc3Bvc2l0aXZvLCBjb21vIHNldSBub21lIGUgaW5mb3JtYcOnw7VlcyBkZSBjb250YXRvLiBJc3NvIHNpZ25pZmljYSBxdWUgbyBhcGxpY2F0aXZvIHBvZGUgaWRlbnRpZmljw6EtbG8gZSBlbnZpYXIgc3VhcyBpbmZvcm1hw6fDtWVzIGRlIHBlcmZpbCBwYXJhIG91dHJvcyBhcGxpY2F0aXZvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJlc2NyZXZlciBub3MgZGFkb3MgZG8gcGVyZmlsIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGxlaWEgcGFsYXZyYXMsIG5vbWVzIGUgZnJhc2VzIHBhcnRpY3VsYXJlcyBhcm1hemVuYWRvcyBwZWxvIHVzdcOhcmlvIG5vIGRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImdyYXZhciBubyBkaWNpb27DoXJpbyBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgcXVlIG8gYXBsaWNhdGl2byBncmF2ZSBub3ZhcyBwYWxhdnJhcyBubyBkaWNpb27DoXJpbyBkbyB1c3XDoXJpby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyL2V4Y2x1aXIgY29udC4gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZXhjbHVpciBjb250ZcO6ZG8gZG8gY2FydMOjbyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtaXRlIGdyYXZhciBubyBhcm1hei4gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCmluZGV4IGZmNzZmNzQuLmZjNmE1MTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApAQCAtNDg5LDYgKzQ4OSwxOCBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDb250YWN0cyAoNTA3NTE2NDgxODY0NzkzNDA2NykgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRQcm9maWxlICg2ODI0NjgxNDM4NTI5ODQyMjgyKSAtLT4KICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRQcm9maWxlICg5NDUyMDc1Mzc5NzYzMDY3OSkgLS0+CkBAIC03NjQsNiArNzc2LDE0IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZURpY3Rpb25hcnkgKDgxODUzODU3MTYyNTUwNjUyOTEpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRXcml0ZSAoODU0MzA4NzYzMTA3NjQ3NTIpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaXRnYXIvc3RpenphciBjdW50ZWducyBkYSBsYSBjYXJ0YSBTRCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCmluZGV4IGNhYzU4NmUuLjA1N2IwMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ic2NyaWVyZSBkYXRlIGRlIGNvbnRhY3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJQZXJtaXRlIGFwbGljYcWjaWVpIHPEgyBtb2RpZmljZSBkYXRlbGUgZGUgY29udGFjdCAoYWRyZXNlbGUpIHN0b2NhdGUgcGUgdGFibGV0xIMuIEFwbGljYcWjaWlsZSByxIN1IGludGVuxaNpb25hdGUgcG90IHPEgyB1dGlsaXplemUgYWNlYXN0xIMgcGVybWlzaXVuZSBwZW50cnUgYSDFn3RlcmdlIHNhdSBhIG1vZGlmaWNhIGRhdGVsZSBkdnMuIGRlIGNvbnRhY3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJQZXJtaXRlIGFwbGljYcWjaWVpIHPEgyBtb2RpZmljZSBkYXRlbGUgZGUgY29udGFjdCAoYWRyZXNlbGUpIHN0b2NhdGUgcGUgdGVsZWZvbi4gQXBsaWNhxaNpaWxlIHLEg3UgaW50ZW7Fo2lvbmF0ZSBwb3Qgc8SDIHV0aWxpemV6ZSBhY2Vhc3TEgyBwZXJtaXNpdW5lIHBlbnRydSBhIMWfdGVyZ2Ugc2F1IHBlbnRydSBhIG1vZGlmaWNhIGRhdGVsZSBkdnMuIGRlIGNvbnRhY3QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJjaXRpcmUgZGF0ZSBkaW4gcHJvZmlsdWwgZHZzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJQZXJtaXRlIGFwbGljYcWjaWVpIHPEgyBjaXRlYXNjxIMgaW5mb3JtYcWjaWkgZGUgcHJvZmlsIHBlcnNvbmFsIHN0b2NhdGUgcGUgZGlzcG96aXRpdiwgY3VtIGFyIGZpIG51bWVsZSDFn2kgaW5mb3JtYcWjaWlsZSBkZSBjb250YWN0LCBjZWVhIGNlIMOubnNlYW1uxIMgY8SDIGFwbGljYcWjaWEgdsSDIHBvYXRlIGlkZW50aWZpY2EgxZ9pIHBvYXRlIHRyaW1pdGUgaW5mb3JtYcWjaWlsZSBkdnMuIGRlIHByb2ZpbCBhbHRvciB1dGlsaXphdG9yaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJzY3JpZXJlIGRhdGUgw65uIHByb2ZpbHVsIGR2cy4iPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtaXRlIGFwbGljYcWjaWVpIHPEgyBjaXRlYXNjxIMgY3V2aW50ZSwgbnVtZSDFn2kgZXhwcmVzaWkgcHJpdmF0ZSBzdG9jYXRlIGRlIHV0aWxpemF0b3Igw65uIGRpY8WjaW9uYXJ1bCBzxIN1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InNjcmllcmUgw65uIGRpY8WjaW9uYXJ1bCBkZWZpbml0IGRlIHV0aWxpemF0b3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iUGVybWl0ZSBhcGxpY2HFo2llaSBzxIMgc2NyaWUgY3V2aW50ZSBub2kgw65uIGRpY8WjaW9uYXJ1bCB1dGlsaXphdG9ydWx1aS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyZS/Fn3RlcmdlcmUgYSBjb27Fo2ludXR1bHVpIHN0b2PEg3JpaSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhcmUvxZ90ZXJnZXJlIGNvbsWjaW51dCBjYXJkIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBlcm1pdGUgc2NyaWVyZSDDrm4gc3RvYy4gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCmluZGV4IDNhNTU0ZDYuLjRkYzI0ZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i0L/QtdGA0LXQt9Cw0L/QuNGB0YvQstCw0YLRjCDQtNCw0L3QvdGL0LUg0LrQvtC90YLQsNC60YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+ItCf0YDQuNC70L7QttC10L3QuNC1INGB0LzQvtC20LXRgiDQuNC30LzQtdC90Y/RgtGMINCw0LTRgNC10YHQsCwg0YHQvtGF0YDQsNC90LXQvdC90YvQtSDQvdCwINC/0LvQsNC90YjQtdGC0L3QvtC8INCf0JouINCS0YDQtdC00L7QvdC+0YHQvdGL0LUg0L/RgNC+0LPRgNCw0LzQvNGLINGB0LzQvtCz0YPRgiDRgtCw0LrQuNC8INC+0LHRgNCw0LfQvtC8INGD0LTQsNC70Y/RgtGMINC4INC40LfQvNC10L3Rj9GC0Ywg0LTQsNC90L3Ri9C1INCy0LDRiNC40YUg0LrQvtC90YLQsNC60YLQvtCyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i0J/RgNC40LvQvtC20LXQvdC40LUg0YHQvNC+0LbQtdGCINC40LfQvNC10L3Rj9GC0Ywg0LDQtNGA0LXRgdCwLCDRgdC+0YXRgNCw0L3QtdC90L3Ri9C1INC90LAg0YLQtdC70LXRhNC+0L3QtS4g0JLRgNC10LTQvtC90L7RgdC90YvQtSDQv9GA0L7Qs9GA0LDQvNC80Ysg0YHQvNC+0LPRg9GCINGC0LDQutC40Lwg0L7QsdGA0LDQt9C+0Lwg0YPQtNCw0LvRj9GC0Ywg0Lgg0LjQt9C80LXQvdGP0YLRjCDQtNCw0L3QvdGL0LUg0LLQsNGI0LjRhSDQutC+0L3RgtCw0LrRgtC+0LIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLQv9GA0L7RgdC80LDRgtGA0LjQstCw0YLRjCDQtNCw0L3QvdGL0LUg0L/RgNC+0YTQuNC70Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i0J/RgNC40LvQvtC20LXQvdC40LUg0YHQvNC+0LbQtdGCINGB0YfQuNGC0YvQstCw0YLRjCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQu9C40YfQvdC+0LPQviDQv9GA0L7RhNC40LvRjywg0YHQvtGF0YDQsNC90LXQvdC90YPRjiDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC1LCDRgtCw0LrRg9GOINC60LDQuiDQstCw0YjQtSDQuNC80Y8g0Lgg0LrQvtC90YLQsNC60YLQvdGL0LUg0LTQsNC90L3Ri9C1LiDQrdGC0L4g0L7Qt9C90LDRh9Cw0LXRgiwg0YfRgtC+INC/0YDQuNC70L7QttC10L3QuNC1INGB0LzQvtC20LXRgiDQv9C+0LvRg9GH0LjRgtGMINCy0LDRiNC4INC70LjRh9C90YvQtSDQtNCw0L3QvdGL0LUg0Lgg0L7RgtC/0YDQsNCy0LjRgtGMINC40YUg0LTRgNGD0LPQuNC8INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRj9C8LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+ItC40LfQvNC10L3QtdC90LjQtSDQtNCw0L3QvdGL0YUg0L/RgNC+0YTQuNC70Y8iPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDQv9C+0LvRg9GH0LjRgiDQtNC+0YHRgtGD0L8g0LrQviDQstGB0LXQvCDRgdC70L7QstCw0LwsINC40LzQtdC90LDQvCDQuCDRhNGA0LDQt9Cw0LwsINC60L7RgtC+0YDRi9C1INGF0YDQsNC90Y/RgtGB0Y8g0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0Lwg0YHQu9C+0LLQsNGA0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i0LfQsNC/0LjRgdGMINC00LDQvdC90YvRhSDQsiDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSDRgdC70L7QstCw0YDRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDRgdC80L7QttC10YIg0LTQvtCx0LDQstC70Y/RgtGMINGB0LvQvtCy0LAg0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0YHQu9C+0LLQsNGA0YwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC00L7RgdGC0YPQvyDQuiBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC40LfQvNC10L3Rj9GC0Ywv0YPQtNCw0LvRj9GC0Ywg0YHQvtC00LXRgNC20LjQvNC+0LUgU0Qt0LrQsNGA0YLRiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDRgdC80L7QttC10YIg0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0LTQsNC90L3Ri9C1INC90LAgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmluZGV4IGRhYTMyMWQuLjJiZThjMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iesOhcGlzIMO6ZGFqb3Yga29udGFrdG92Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iVW1vxb7FiHVqZSBhcGxpa8OhY2lpIHptZW5pxaUgdsWhZXRreSBrb250YWt0bsOpIMO6ZGFqZSAoYWRyZXN5KSB1bG/FvmVuw6kgdiB0YWJsZXRlLiDFoGtvZGxpdsOpIGFwbGlrw6FjaWUgdG8gbcO0xb51IHZ5dcW+acWlIGEgdnltYXphxaUgYWxlYm8gem1lbmnFpSB2YcWhZSBrb250YWt0bsOpIMO6ZGFqZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlVtb8W+xYh1amUgYXBsaWvDoWNpaSDEjcOtdGHFpSB2xaFldGt5IGtvbnRha3Ruw6kgw7pkYWplIChhZHJlc3kpIHVsb8W+ZW7DqSB2IHRlbGVmw7NuZS4gxaBrb2RsaXbDqSBhcGxpa8OhY2llIHRvIG3DtMW+dSB2eXXFvmnFpSBuYSBvZG9zbGFuaWUgdmHFoWljaCDDumRham92IGluw71tIG9zb2LDoW0uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLEjcOtdGHFpSDDumRhamUgdsOhxaFobyBwcm9maWx1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IlVtb8W+xYh1amUgYXBsaWvDoWNpaSDEjcOtdGHFpSBpbmZvcm3DoWNpZSB2IG9zb2Jub20gcHJvZmlsZSB1bG/FvmVuw6kgdm8gdmHFoW9tIHphcmlhZGVuw60sIGFrbyBqZSB2YcWhZSBtZW5vIGEga29udGFrdG7DqSBpbmZvcm3DoWNpZS4gWm5hbWVuw6EgdG8sIMW+ZSDEj2FsxaFpZSBhcGxpa8OhY2llIHbDoXMgbcO0xb51IGlkZW50aWZpa292YcWlIGEgcG9zbGHFpSBvc3RhdG7DvW0gaW5mb3Jtw6FjaWUgbyB2YcWhb20gcHJvZmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJ6YXBpc292YcWlIGRvIMO6ZGFqb3YgcHJvZmlsdSI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlVtb8W+xYh1amUgYXBsaWvDoWNpaSDEjcOtdGHFpSBzw7prcm9tbsOpIHNsb3bDoSwgbsOhenZ5IGEgZnLDoXp5LCBrdG9yw6kgbW9ob2wgcG91xb7DrXZhdGXEviB1bG/FvmnFpSBkbyBzbG92bsOta2EgcG91xb7DrXZhdGXEvmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iemFwaXNvdmHFpSBkbyBzbG92bsOta2EgZGVmaW5vdmFuw6lobyBwb3XFvsOtdmF0ZcS+b20iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iVW1vxb7FiHVqZSBhcGxpa8OhY2lpIHphcGlzb3ZhxaUgbm92w6kgc2xvdsOhIGRvIHBvdcW+w612YXRlxL5za8OpaG8gc2xvdm7DrWthLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJ1cHJhdmnFpS9vZHN0csOhbmnFpSBvYnNhaCB1a2wuIHByLiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlptZW5pxaUvb2RzdHLDoW5pxaUgb2JzYWgga2FydHkgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iVW1vxb7FiHVqZSBhcGxpa8OhY2lpIHrDoXBpcyBkbyB1a2xhZGFjaWVobyBwcmllc3RvcnUgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCmluZGV4IDIwYWQ1OWIuLjE0NGNiZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4icGlzYW5qZSBwb2RhdGtvdiBzdGlrYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IlByb2dyYW11IG9tb2dvxI1hIHNwcmVtaW5qYW5qZSBwb2RhdGtvdiBzdGlrb3YgKG5hc2xvdiksIHNocmFuamVuaWggdiB0YWJsacSNbmVtIHJhxI11bmFsbmlrdS4gWmxvbmFtZXJuaSBwcm9ncmFtaSBsYWhrbyB0byB1cG9yYWJpam8gemEgYnJpc2FuamUgYWxpIHNwcmVtaW5qYW5qZSBwb2RhdGtvdiBzdGlrYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlByb2dyYW11IG9tb2dvxI1hIHNwcmVtaW5qYW5qZSBwb2RhdGtvdiBzdGlrb3YgKG5hc2xvdiksIHNocmFuamVuaWggdiB0ZWxlZm9udS4gWmxvbmFtZXJuaSBwcm9ncmFtaSBsYWhrbyB0byB1cG9yYWJpam8gemEgYnJpc2FuamUgYWxpIHNwcmVtaW5qYW5qZSBwb2RhdGtvdiBzdGlrYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImJyYW5qZSBwb2RhdGtvdiB2IHByb2ZpbHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iUHJvZ3JhbXUgb21vZ2/EjWEgYnJhbmplIG9zZWJuaWggcG9kYXRrb3YgdiBwcm9maWx1LCBrb3Qgc28gaW1lIGluIHBvZGF0a2kgemEgc3Rpay4gVG8gcG9tZW5pLCBkYSB2YXMgbGFoa28gcHJvZ3JhbSBwcmVwb3puYSBpbiB2YcWhZSBwb2RhdGtlIG8gcHJvZmlsdSBwb8WhbGplIGRydWdpbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJwaXNhbmplIHYgcG9kYXRrZSB2IHByb2ZpbHUiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQcm9ncmFtdSBvbW9nb8SNYSBicmFuamUgbW9yZWJpdG5paCB6YXNlYm5paCBiZXNlZCwgaW1lbiBpbiBpenJhem92LCBraSBqaWggamUgdXBvcmFibmlrIHNocmFuaWwgdiB1cG9yYWJuacWha2kgc2xvdmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InBpc2FuamUgdiB1cG9yYWJuacWha28gZG9sb8SNZW4gc2xvdmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlByb2dyYW11IG9tb2dvxI1hIHBpc2FuamUgbm92ZSBiZXNlZGUgdiB1cG9yYWJuacWha2kgc2xvdmFyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJzcHJlbWluamFuamUgdnNlYmluZSBwb21uaWxuaWthIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ic3ByZW1pbmphbmplL2JyaXNhbmplIHZzZWJpbmUga2FydGljZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQcm9ncmFtdSBvbW9nb8SNYSB6YXBpc292YW5qZSB2IHBvbW5pbG5payBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKaW5kZXggOWZiOGFiZi4uM2NkZWQ1YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLRg9C/0LjRgdC40LLQsNGa0LUg0L/QvtC00LDRgtCw0LrQsCDQviDQutC+0L3RgtCw0LrRgtC40LzQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+ItCU0L7Qt9Cy0L7RmdCw0LLQsCDQsNC/0LvQuNC60LDRhtC40ZjQuCDQtNCwINC40LfQvNC10L3QuCDQv9C+0LTQsNGC0LrQtSDQviDQutC+0L3RgtCw0LrRgtGDICjQsNC00YDQtdGB0LgpINGB0LDRh9GD0LLQsNC90LUg0L3QsCDRgtCw0LHQu9C10YLRgy4g0JfQu9C+0L3QsNC80LXRgNC90LUg0LDQv9C70LjQutCw0YbQuNGY0LUg0LzQvtCz0YMg0YLQviDQtNCwINC40YHQutC+0YDQuNGB0YLQtSDQtNCwINCx0Lgg0LjQt9Cx0YDQuNGB0LDQu9C1INC40LvQuCDQuNC30LzQtdC90LjQu9C1INC/0L7QtNCw0YLQutC1INC+INC60L7QvdGC0LDQutGC0YMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiLQlNC+0LfQstC+0ZnQsNCy0LAg0LDQv9C70LjQutCw0YbQuNGY0Lgg0LTQsCDQuNC30LzQtdC90Lgg0L/QvtC00LDRgtC60LUg0L4g0LrQvtC90YLQsNC60YLRgyAo0LDQtNGA0LXRgdC4KSDRgdCw0YfRg9Cy0LDQvdC1INC90LAg0YLQtdC70LXRhNC+0L3Rgy4g0JfQu9C+0L3QsNC80LXRgNC90LUg0LDQv9C70LjQutCw0YbQuNGY0LUg0LzQvtCz0YMg0YLQviDQtNCwINC40YHQutC+0YDQuNGB0YLQtSDQtNCwINCx0Lgg0LjQt9Cx0YDQuNGB0LDQu9C1INC40LvQuCDQuNC30LzQtdC90LjQu9C1INC/0L7QtNCw0YLQutC1INC+INC60L7QvdGC0LDQutGC0YMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLRh9C40YLQsNGa0LUg0L/QvtC00LDRgtCw0LrQsCDQviDQv9GA0L7RhNC40LvRgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLQlNC+0LfQstC+0ZnQsNCy0LAg0LDQv9C70LjQutCw0YbQuNGY0Lgg0LTQsCDRh9C40YLQsCDQu9C40YfQvdC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUg0YHQsCDQv9GA0L7RhNC40LvQsCDRgdCw0YfRg9Cy0LDQvdC1INC90LAg0YPRgNC10ZLQsNGY0YMsINC60LDQviDRiNGC0L4g0YHRgyDQuNC80LUg0Lgg0LrQvtC90YLQsNC60YIg0LjQvdGE0L7RgNC80LDRhtC40ZjQtS4g0KLQviDQt9C90LDRh9C4INC00LAg0LTRgNGD0LPQtSDQsNC/0LvQuNC60LDRhtC40ZjQtSDQvNC+0LPRgyDQtNCwINCy0LDRgSDQuNC00LXQvdGC0LjRhNC40LrRg9GY0YMg0Lgg0LTQsCDQuNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INCy0LDRiNC10Lwg0L/RgNC+0YTQuNC70YMg0YjQsNGZ0YMg0LTRgNGD0LPQuNC80LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4i0YPQv9C40YHQuNCy0LDRmtC1INGDINC/0L7QtNCw0YLQutC1INC/0YDQvtGE0LjQu9CwIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i0JTQvtC30LLQvtGZ0LDQstCwINCw0L/Qu9C40LrQsNGG0LjRmNC4INC00LAg0YfQuNGC0LAg0YHQstC1INC/0YDQuNCy0LDRgtC90LUg0YDQtdGH0LgsINC90LDQt9C40LLQtSDQuCDRhNGA0LDQt9C1INC60L7RmNC1INGY0LUg0LrQvtGA0LjRgdC90LjQuiDRgdCw0YfRg9Cy0LDQviDRgyDQutC+0YDQuNGB0L3QuNGH0LrQvtC8INGA0LXRh9C90LjQutGDLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItGD0L/QuNGB0LjQstCw0ZrQtSDRgyDRgNC10YfQvdC40Log0LrQvtGY0Lgg0ZjQtSDQtNC10YTQuNC90LjRgdCw0L4g0LrQvtGA0LjRgdC90LjQuiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLQlNC+0LfQstC+0ZnQsNCy0LAg0LDQv9C70LjQutCw0YbQuNGY0Lgg0LTQsCDRg9C/0LjRgdGD0ZjQtSDQvdC+0LLQtSDRgNC10YfQuCDRgyDQutC+0YDQuNGB0L3QuNGH0LrQuCDRgNC10YfQvdC40LouIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC40LfQvNC10L3QsC/QsdGA0LjRgdCw0ZrQtSDRgdCw0LTRgNC20LDRmNCwIFVTQiDQvNC10LzQvtGA0LjRmNC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLQuNC30LzQtdC90LAv0LHRgNC40YHQsNGa0LUg0YHQsNC00YDQttCw0ZjQsCBTRCDQutCw0YDRgtC40YbQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLQlNC+0LfQstC+0ZnQsNCy0LAg0LDQv9C70LjQutCw0YbQuNGY0Lgg0LTQsCDRg9C/0LjRgdGD0ZjQtSDQv9C+0LTQsNGC0LrQtSDQvdCwIFVTQiDQvNC10LzQvtGA0LjRmNGDLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCmluZGV4IDJjNDE4OWIuLjVjNThkNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ic2tyaXZhIGtvbnRha3R1cHBnaWZ0ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJUaWxsw6V0ZXIgYXR0IGFwcGVuIMOkbmRyYXIga29udGFrdHVwcGdpZnRlciAoYWRyZXNzZXIpIHNvbSBsYWdyYXMgcMOlIHBla2RhdG9ybi4gU2thZGxpZ2EgYXBwYXIga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHJhZGVyYSBlbGxlciDDpG5kcmEga29udGFrdHVwcGdpZnRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IlRpbGzDpXRlciBhdHQgYXBwZW4gw6RuZHJhciBrb250YWt0dXBwZ2lmdGVyIChhZHJlc3Nlcikgc29tIGxhZ3JhcyBww6UgbW9iaWxlbi4gU2thZGxpZ2EgYXBwYXIga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHJhZGVyYSBlbGxlciDDpG5kcmEga29udGFrdHVwcGdpZnRlci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ImzDpHNlciBkaW4gcHJvZmlsaW5mb3JtYXRpb24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iVGlsbMOldGVyIGF0dCBhcHBlbiBsw6RzZXIgcGVyc29ubGlnIHByb2ZpbGluZm9ybWF0aW9uIHNvbSBsYWdyYXMgcMOlIGRpbiBlbmhldCwgdC5leC4gZGl0dCBuYW1uIG9jaCBrb250YWt0dXBwZ2lmdGVyLiBEZXQgaW5uZWLDpHIgYXR0IGFwcGVuIGthbiBpZGVudGlmaWVyYSBkaWcgb2NoIHNraWNrYSBwcm9maWxpbmZvcm1hdGlvbiB0aWxsIGFuZHJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+InNrcml2ZXIgdGlsbCBkYXRhIGbDtnIgZGluIHByb2ZpbCI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlRpbGzDpXRlciBhdHQgYXBwZW4gbMOkc2VyIGFsbGEgcHJpdmF0YSBvcmQsIG5hbW4gb2NoIGZyYXNlciBzb20gYW52w6RuZGFyZW4gaGFyIHNwYXJhdCBpIG9yZGxpc3Rhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJsw6RnZ2EgdGlsbCBpIGFudsOkbmRhcmRlZmluaWVyYWQgb3JkbGlzdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iVGlsbMOldGVyIGF0dCBhcHBlbiBhbmdlciBueWEgb3JkIGkgYW52w6RuZGFyb3JkbGlzdGFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkUmVhZCIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MDg2MjIxMzc0NjM5MTgzMjgxIj4ibMOkcyBpbm5laMOlbGxldCAgcMOlIFVTQi1sYWdyaW5nc2VuaGV0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFJlYWQiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NTM3ODc1MTUxODQ1MTM5NTM5Ij4ibMOkcyBpbm5laMOlbGxldCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxMDU1MzAyODk4OTk5MzUyMzM5Ij4iQXBwZW4gZsOlciBsw6RzYSBpbm5laMOlbGwgcMOlIFVTQi1lbmhldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzk0Nzc5MjM3MzU3MDY4MzU0MiI+IlRpbGzDpXRlciBhcHBlbiBhdHQgbMOkc2EgaW5uZWjDpWxsZXQgcMOlIFNELWtvcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IsOkbmRyYS90YSBib3J0IGZyw6VuIFVTQi1lbmhldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iw6RuZHJhL3RhIGJvcnQgaW5uZWjDpWxsIHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iR8O2ciBhdHQgYXBwIHNrcml2ZXIgdGlsbCBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKaW5kZXggMTMwNTNhYi4uZTYyZTFhYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJhbmRpa2EgZGF0YSB5YSBhbndhbmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJJbmFydWh1c3UgcHJvZ3JhbXUga3VyZWtlYmlzaGEgZGF0YSB5YSBtd2FzaWxpYW5pKGFud2FuaSkgaWxpeW9oaWZhZGhpd2Ega3dlbnllIGtvbXB5dXRhIHlha28ga2kuIHByb2dyYW11IGhhc2lkaSB6aW5hd2V6YSB0dW1pYSBoaWkga3VmdXRhIGF1IGt1cmVrZWJpc2hhIGRhdGEgeWFrbyB5YSBtd2FzaWxpYW5pLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iSW5hcnVodXN1IHByb2dyYW11IGt1cmVrZWJpc2hhIGRhdGEgeWEgbXdhc2lsaWFuaShhbndhbmkpIGlsaXlvaGlmYWRoaXdhIGt3ZW55ZSBzaW11IHlha28uIFByb2dyYW11IGhhc2lkaSB6aW5hd2V6YSBrdXR1bWlhIGhpaSBrdWZ1dGEgYXUga3VyZWtlYmlzaGEgZGF0YSB5YWtvIHlhIG13YXNpbGlhbmkuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJzb21hIGRhdGEgeWEgbWFlbGV6byB5YWtvIG1hZnVwaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiJJbmFydWh1c3UgcHJvZ3JhbXUga3Vzb21hIG1hZWxlem8gbWFmdXBpIHlhIGtpYmluYWZzaSB5YWxpeW9oaWZhZGhpd2Ega3dlbnllIGtpZmFhIGNoYWtvLCBrYW1hIHZpbGUgamluYSBsYWtvIG5hIHRhYXJpZmEgeWEga3V3YXNpbGlhbmEuIEhpaSBpbmEgbWFhbmlzaGEgcHJvZ3JhbXUgaW5hd2V6YSBrdWt1dGFtYnVhIG5hIGt1dHVtYSB0YWFyaWZhIHlha28gZnVwaSB5YSBraWJpbmFmc2kga3dhIHdlbmdpbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4iYW5kaWthIGt3ZW55ZSBkYXRhIHlhIG1hZWxlem8geWFrbyBtYWZ1cGkiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJJbmFydWh1c3UgcHJvZ3JhbXUga3Vzb21hIG1hbmVubywgbWFqaW5hIG5hIHZpZnVuZ3UgdnlvdnlvdGUgdnlhIGtpYmluYWZzaSwgYW1iYXZ5byBodWVuZGEgbXR1bWlhamkgYW1laGlmYWRoaSBrYXRpa2Ega2FtdXNpIHlhIG10dW1pYWppLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImFuZGlrYSBrd2Ega2FtdXNpIGlsaXlvYmFpbmlzaHdhIG5hIG10dW1pYWppIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkluYXJ1aHVzdSBwcm9ncmFtdSBrdWFuZGlrYSBtYW5lbm8gbWFweWEga2F0aWthIGthbXVzaSB5YSBtdHVtaWFqaS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4icmVrZWJpc2hhL2Z1dGEgbWF1ZGh1aSB5YSBoaWZhZGhpIHlhIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4icmVrZWJpc2hhL2Z1dGEgbWF1ZGh1aSB5YSBrYWRpIHlhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkluYXJ1aHVzdSBwcm9ncmFtdSBrdWFuZGlraWEgaGlmYWRoaSB5YSBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKaW5kZXggYTlhMTk2Yy4uZWE2ZjU3MiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLguYDguILguLXguKLguJnguILguYnguK3guKHguLnguKXguJfguLXguYjguK3guKLguLnguYjguJXguLTguJTguJXguYjguK0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguYHguIHguYnguYTguILguILguYnguK3guKHguLnguKXguIHguLLguKPguJXguLTguJTguJXguYjguK0gKOC4l+C4teC5iOC4reC4ouC4ueC5iCkg4LiX4Li14LmI4LmA4LiB4LmH4Lia4LmE4Lin4LmJ4LmD4LiZ4LmB4LiX4LmH4Lia4LmA4Lil4LmH4LiV4LiC4Lit4LiH4LiE4Li44LiTIOC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4l+C4teC5iOC5gOC4m+C5h+C4meC4reC4seC4meC4leC4o+C4suC4ouC4reC4suC4iOC5g+C4iuC5ieC4geC4suC4o+C4reC4meC4uOC4jeC4suC4leC4meC4teC5ieC4peC4muC4q+C4o+C4t+C4reC5geC4geC5ieC5hOC4guC4guC5ieC4reC4oeC4ueC4peC4geC4suC4o+C4leC4tOC4lOC4leC5iOC4reC4guC4reC4h+C4hOC4uOC4kyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4LmB4Lit4Lib4Lie4Lil4Li04LmA4LiE4LiK4Lix4LiZ4LmB4LiB4LmJ4LmE4LiC4LiC4LmJ4Lit4Lih4Li54Lil4LiB4Liy4Lij4LiV4Li04LiU4LiV4LmI4LitICjguJfguLXguYjguK3guKLguLnguYgpIOC4l+C4teC5iOC5gOC4geC5h+C4muC5hOC4p+C5ieC5g+C4meC5guC4l+C4o+C4qOC4seC4nuC4l+C5jOC4guC4reC4h+C4hOC4uOC4kyDguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguJfguLXguYjguYDguJvguYfguJnguK3guLHguJnguJXguKPguLLguKLguK3guLLguIjguYPguIrguYnguIHguLLguKPguK3guJnguLjguI3guLLguJXguJnguLXguYnguKXguJrguKvguKPguLfguK3guYHguIHguYnguYTguILguILguYnguK3guKHguLnguKXguIHguLLguKPguJXguLTguJTguJXguYjguK3guILguK3guIfguITguLjguJMiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+IuC4reC5iOC4suC4meC4guC5ieC4reC4oeC4ueC4peC5guC4m+C4o+C5hOC4n+C4peC5jOC4guC4reC4h+C4hOC4uOC4kyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguK3guYjguLLguJnguILguYnguK3guKHguLnguKXguYLguJvguKPguYTguJ/guKXguYzguKrguYjguKfguJnguJrguLjguITguITguKXguJfguLXguYjguYDguIHguYfguJrguYTguKfguYnguJrguJnguK3guLjguJvguIHguKPguJPguYzguILguK3guIfguITguLjguJMg4LmA4LiK4LmI4LiZIOC4iuC4t+C5iOC4reC5geC4peC4sOC4guC5ieC4reC4oeC4ueC4peC4leC4tOC4lOC4leC5iOC4rSDguIvguLbguYjguIfguKvguKHguLLguKLguITguKfguLLguKHguKfguYjguLLguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguIjguLDguKrguLLguKHguLLguKPguJbguKPguLDguJrguLjguJXguLHguKfguJXguJnguILguK3guIfguITguLjguJPguYHguKXguLDguKrguYjguIfguILguYnguK3guKHguLnguKXguYLguJvguKPguYTguJ/guKXguYzguILguK3guIfguITguLjguJPguYHguIHguYjguJzguLnguYnguK3guLfguYjguJnguYTguJTguYkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLguYDguILguLXguKLguJnguKXguIfguYPguJnguILguYnguK3guKHguLnguKXguYLguJvguKPguYTguJ/guKXguYzguILguK3guIfguITguLjguJMiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguK3guYjguLLguJnguITguLMg4LiK4Li34LmI4LitIOC5geC4peC4sOC4p+C4peC4teC4quC5iOC4p+C4meC4muC4uOC4hOC4hOC4peC4l+C4teC5iOC4nOC4ueC5ieC5g+C4iuC5ieC4reC4suC4iOC5gOC4geC5h+C4muC5hOC4p+C5ieC5g+C4meC4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oeC4guC4reC4h+C4nOC4ueC5ieC5g+C4iuC5iSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuC5gOC4guC4teC4ouC4meC4peC4h+C5g+C4meC4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oeC4l+C4teC5iOC4nOC4ueC5ieC5g+C4iuC5ieC4geC4s+C4q+C4meC4lCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguYDguILguLXguKLguJnguITguLPguYPguKvguKHguYjguKXguIfguYPguJnguJ7guIjguJnguLLguJnguLjguIHguKPguKHguJzguLnguYnguYPguIrguYkiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i4LmB4LiB4LmJ4LmE4LiCL+C4peC4muC5gOC4meC4t+C5ieC4reC4q+C4suC4guC4reC4h+C4l+C4teC5iOC5gOC4geC5h+C4muC4guC5ieC4reC4oeC4ueC4pSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IuC5geC4geC5ieC5hOC4gi/guKXguJrguILguYnguK3guKHguLnguKXguIHguLLguKPguYzguJQgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4LmB4Lit4Lib4LivIOC5gOC4guC4teC4ouC4meC4peC4h+C5g+C4mSBVU0IiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAppbmRleCAyNjcyMDgzLi5mMTQzYjVmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InN1bXVsYXQgbmcgZGF0YSBuZyBwYWtpa2lwYWctdWduYXkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJQaW5hcGF5YWdhbiBhbmcgYXBwIG5hIGJhZ3VoaW4gYW5nIGRhdGEgbmcgY29udGFjdCAoYWRkcmVzcykgbmEgbmFrYWltYmFrIHNhIGl5b25nIHRhYmxldC4gTWFhYXJpIGl0b25nIGdhbWl0aW4gbmcgbmFrYWthaGFtYWsgbmEgYXBwcyB1cGFuZyBidXJhaGluIG8gYmFndWhpbiBhbmcgaXlvbmcgZGF0YSBuZyBjb250YWN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iUGluYXBheWFnYW4gYW5nIGFwcCBuYSBiYWd1aGluIGFuZyBkYXRhIG5nIGNvbnRhY3QgKGFkZHJlc3MpIG5hIG5ha2FpbWJhayBzYSBpeW9uZyB0ZWxlcG9uby4gTWFhYXJpIGl0b25nIGdhbWl0aW4gbmcgbmFrYWthaGFtYWsgbmEgYXBwcyB1cGFuZyBidXJhaGluIG8gYmFndWhpbiBhbmcgaXlvbmcgZGF0YSBuZyBjb250YWN0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4iYmFzYWhpbiBhbmcgaXlvbmcgZGF0YSBuZyBwcm9maWxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IlBpbmFwYXlhZ2FuIGFuZyBhcHAgbmEgYmFzYWhpbiBhbmcgcGVyc29uYWwgbmEgaW1wb3JtYXN5b24gbmcgcHJvZmlsZSBuYSBuYWthaW1iYWsgc2EgaXlvbmcgZGV2aWNlLCBnYXlhIG5nIGl5b25nIHBhbmdhbGFuIGF0IGltcG9ybWFzeW9uIG5nIGNvbnRhY3QuIE5hbmdhbmdhaHVsdWdhbiBpdG8gbmEgbWFraWtpbGFsYSBrYSBuZyBhcHAgYXQgbWFpcGFwYWRhbGEgbml0byBhbmcgaW1wb3JtYXN5b24gbmcgaXlvbmcgcHJvZmlsZSBzYSBpYmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4iaS13cml0ZSBzYSBpeW9uZyBkYXRhIG5nIHByb2ZpbGUiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQaW5hcGF5YWdhbiBhbmcgYXBwIG5hIG1hZ2Jhc2EgbmcgYW51bWFuZyBwcmliYWRvbmcgbWdhIHNhbGl0YSwgcGFuZ2FsYW4gYXQgcGFyaXJhbGEgbmEgbWFhYXJpbmcgaW5pbWJhayBuZyB1c2VyIHNhIGRpa3N5dW5hcnlvIG5nIHVzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ibWFnc3VsYXQgc2EgZGlrc3l1bmFyeW9uZyB0aW51a295IG5nIHVzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iUGluYXBheWFnYW4gYW5nIGFwcCBuYSBtYWdzdWxhdCBuZyBtZ2EgYmFnb25nIHNhbGl0YSBzYSBkaWtzeXVuYXJ5byBuZyB1c2VyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJiYWd1aGluL3RhbmdnYWxpbiBsYW1hbiBuZyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ImJhZ3VoaW4vdGFuZ2dhbGluIGFuZyBtZ2EgbmlsYWxhbWFuIG5nIFNEIGNhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iUGluYXBheWFnYW4gYW5nIGFwcCBuYSBtYWdzdWxhdCBzYSBVU0Igc3RvcmFnZS4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAppbmRleCAwNTljY2VhLi45YWRjOGFhOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJracWfaSB2ZXJpbGVyaSB5YXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJVeWd1bGFtYXlhLCB0YWJsZXRpbml6ZGUgZGVwb2xhbmFuIGtpxZ9pIChhZHJlcykgdmVyaWxlcmluaSBkZcSfacWfdGlybWUgaXpuaSB2ZXJpci4gS8O2dMO8IGFtYcOnbMSxIHV5Z3VsYW1hbGFyIGtpxZ9pIHZlcmlsZXJpbml6aSBzaWxtZWsgdmV5YSBkZcSfacWfdGlybWVrIGnDp2luIGJ1bnUga3VsbGFuYWJpbGlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4iVXlndWxhbWF5YSwgdGVsZWZvbnVudXpkYSBkZXBvbGFuYW4ga2nFn2kgKGFkcmVzKSB2ZXJpbGVyaW5pIGRlxJ9pxZ90aXJtZSBpem5pIHZlcmlyLiBLw7Z0w7wgYW1hw6dsxLEgdXlndWxhbWFsYXIga2nFn2kgdmVyaWxlcmluaXppIHNpbG1layB2ZXlhIGRlxJ9pxZ90aXJtZWsgacOnaW4gYnVudSBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJwcm9maWwgdmVyaWxlcmltaSBva3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4iVXlndWxhbWF5YSwgYWTEsW7EsXogdmUgaWxldGnFn2ltIGJpbGdpbGVyaW5peiBnaWJpIGNpaGF6xLFuxLF6ZGEgc2FrbGFuYW4ga2nFn2lzZWwgcHJvZmlsIGJpbGdpbGVyaW5pIG9rdW1hIGl6bmkgdmVyaXIuIEJ1IGl6aW4sIHV5Z3VsYW1hbsSxbiBzaXppIHRhbsSxbWxheWFiaWxlY2XEn2kgdmUgcHJvZmlsIGJpbGdpbGVyaW5pemkgYmHFn2thbGFyxLFuYSBnw7ZuZGVyZWJpbGVjZcSfaSBhbmxhbcSxbmEgZ2VsaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4icHJvZmlsIHZlcmlsZXJpbWUgeWF6Ijwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iVXlndWxhbWF5YSwga3VsbGFuxLFjxLFuxLFuIGt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8bmRlIGRlcG9sYW3EscWfIG9sYWJpbGVjZcSfaSBracWfaXNlbCBrZWxpbWVsZXJpLCBhZGxhcsSxIHZlIGtlbGltZSDDtmJla2xlcmluaSBva3VtYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Imt1bGxhbsSxY8SxIHRhbsSxbWzEsSBzw7Z6bMO8xJ9lIHlheiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJVeWd1bGFtYXlhLCBrdWxsYW7EsWPEsSBzw7Z6bMO8xJ/DvG5lIHllbmkga2VsaW1lbGVyIHlhem1hIGl6bmkgdmVyaXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQiBkZXAgYmlybSBpw6dlcmnEn2luaSBkxJ/Fny9zaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIGthcnQgacOnZXJpa2xlcmluaSBkZcSfacWfdGlyL3NpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJVeWd1bGFtYXlhIFVTQiBkZXBvbGFtYSBiaXJpbWluZSB5YXptYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCmluZGV4IDQyOTI5ZWMuLjNmZjVmNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApAQCAtMzM1LDYgKzMzNSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4i0LfQsNC/0LjRgS4g0LrQvtC90YLQsNC60YLQvdGWINC00LDQvdGWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINC30LzRltC90Y7QstCw0YLQuCDQutC+0L3RgtCw0LrRgtC90ZYg0LTQsNC90ZYgKNCw0LTRgNC10YHRgyksINC30LHQtdGA0LXQttC10L3RliDQsiDQv9C70LDQvdGI0LXRgtC90L7QvNGDINCf0JouINCo0LrRltC00LvQuNCy0ZYg0L/RgNC+0LPRgNCw0LzQuCDQvNC+0LbRg9GC0Ywg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INGG0LUg0LTQu9GPINCy0LjQtNCw0LvQtdC90L3RjyDRh9C4INC30LzRltC90Lgg0LLQsNGI0LjRhSDQutC+0L3RgtCw0LrRgtC90LjRhSDQtNCw0L3QuNGFLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDc1MTY0ODE4NjQ3OTM0MDY3Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINC30LzRltC90Y7QstCw0YLQuCDQutC+0L3RgtCw0LrRgtC90ZYg0LTQsNC90ZYgKNCw0LTRgNC10YHRgyksINC30LHQtdGA0LXQttC10L3RliDQsiDRgtC10LvQtdGE0L7QvdGWLiDQqNC60ZbQtNC70LjQstGWINC/0YDQvtCz0YDQsNC80Lgg0LzQvtC20YPRgtGMINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDRhtC1INC00LvRjyDQstC40LTQsNC70LXQvdC90Y8g0YfQuCDQt9C80ZbQvdC4INCy0LDRiNC40YUg0LrQvtC90YLQsNC60YLQvdC40YUg0LTQsNC90LjRhS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+ItGH0LjRgtCw0YLQuCDQtNCw0L3RliDQstCw0YjQvtCz0L4g0L/RgNC+0YTRltC70Y4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijk0NTIwNzUzNzk3NjMwNjc5Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINGH0LjRgtCw0YLQuCDQvtGB0L7QsdC40YHRgtGDINGW0L3RhNC+0YDQvNCw0YbRltGOINC/0YDQvtGE0ZbQu9GOLCDQt9Cx0LXRgNC10LbQtdC90YMg0L3QsCDQstCw0YjQvtC80YMg0L/RgNC40YHRgtGA0L7Rlywg0Y/Qui3QvtGCINCy0LDRiNC1INGW0LzigJnRjyDRgtCwINC60L7QvdGC0LDQutGC0L3RgyDRltC90YTQvtGA0LzQsNGG0ZbRji4g0KbQtSDQvtC30L3QsNGH0LDRlCwg0YnQviDRltC90YjRliDQv9GA0L7Qs9GA0LDQvNC4INC80L7QttGD0YLRjCDRltC00LXQvdGC0LjRhNGW0LrRg9Cy0LDRgtC4INCy0LDRiNGDINC+0YHQvtCx0YMg0YLQsCDQvdCw0LTRgdC40LvQsNGC0Lgg0LTQsNC90ZYg0LLQsNGI0L7Qs9C+INC/0YDQvtGE0ZbQu9GOINGW0L3RiNC40LwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4i0LfQsNC/0LjRgdGD0LLQsNGC0Lgg0LIg0LTQsNC90ZYg0L/RgNC+0YTRltC70Y4iPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQlNC+0LfQstC+0LvRj9GUINC/0YDQvtCz0YDQsNC80ZYg0YfQuNGC0LDRgtC4INCx0YPQtNGMLdGP0LrRliDQvtGB0L7QsdC40YHRgtGWINCy0LjRgdC70L7QstC4LCDQvdCw0LfQstC4INGC0LAg0YTRgNCw0LfQuCwg0Y/QutGWINC60L7RgNC40YHRgtGD0LLQsNGHINC80ZbQsyDQt9Cx0LXRgNC10LPRgtC4INGDINGB0LLQvtGU0LzRgyDRgdC70L7QstC90LjQutGDLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItC/0LjRgdCw0YLQuCDRgyDQstC60LDQt9Cw0L3QuNC5INC60L7RgNC40YHRgtGD0LLQsNGH0LXQvCDRgdC70L7QstC90LjQuiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLQlNC+0LfQstC+0LvRj9GUINC/0YDQvtCz0YDQsNC80ZYg0L/QuNGB0LDRgtC4INC90L7QstGWINGB0LvQvtCy0LAg0LIg0YHQu9C+0LLQvdC40Log0LrQvtGA0LjRgdGC0YPQstCw0YfQsC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFJlYWQiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDA4NjIyMTM3NDYzOTE4MzI4MSI+ItGH0LjRgtCw0YLQuCDQstC80ZbRgdGCINC90L7RgdGW0Y8gVVNCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODUzNzg3NTE1MTg0NTEzOTUzOSI+ItGH0LjRgtCw0YLQuCDQstC80ZbRgdGCINC60LDRgNGC0LggU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjEwNTUzMDI4OTg5OTkzNTIzMzkiPiLQlNC+0LfQstC+0LvRj9GUINC/0YDQvtCz0YDQsNC80ZYg0YfQuNGC0LDRgtC4INCy0LzRltGB0YIg0L3QvtGB0ZbRjyBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiLQlNC+0LfQstC+0LvRj9GUINC/0YDQvtCz0YDQsNC80ZYg0YfQuNGC0LDRgtC4INCy0LzRltGB0YIg0LrQsNGA0YLQuCBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i0LfQvNGW0L3RjtCy0LDRgtC4L9Cy0LjQtNCw0LvRj9GC0Lgg0LLQvNGW0YHRgiDQvdC+0YHRltGPIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i0LfQvNGW0L3RjtCy0LDRgtC4L9Cy0LjQtNCw0LsuINCy0LzRltGB0YIg0LrQsNGA0YLQuCBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLQlNC+0LfQstC+0LvRj9GUINC/0YDQvtCz0YDQsNC80ZYg0L/QuNGB0LDRgtC4INC90LAg0L3QvtGB0ZbQuSBVU0IiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAppbmRleCA2NDQ2OWFiLi5hYTRlNjk1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImdoaSBk4buvIGxp4buHdSBsacOqbiBo4buHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iOTg4OTY5NzU5MTEwNjMyOTc4Ij4iQ2hvIHBow6lwIOG7qW5nIGThu6VuZyBz4butYSDEkeG7lWkgZOG7ryBsaeG7h3UgKMSR4buLYSBjaOG7iSkgbGnDqm4gaOG7hyDEkcaw4bujYyBsxrB1IHRy4buvIHRyw6puIG3DoXkgdMOtbmggYuG6o25nIGPhu6dhIGLhuqFuLiDhu6huZyBk4bulbmcgxJHhu5ljIGjhuqFpIGPDsyB0aOG7gyBz4butIGThu6VuZyBxdXnhu4FuIG7DoHkgxJHhu4MgeMOzYSBob+G6t2Mgc+G7rWEgxJHhu5VpIGThu68gbGnhu4d1IGxpw6puIGjhu4cgY+G7p2EgYuG6oW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjUwNzUxNjQ4MTg2NDc5MzQwNjciPiJDaG8gcGjDqXAg4bupbmcgZOG7pW5nIHPhu61hIMSR4buVaSBk4buvIGxp4buHdSAoxJHhu4thIGNo4buJKSBsacOqbiBo4buHIMSRxrDhu6NjIGzGsHUgdHLhu68gdHLDqm4gxJFp4buHbiB0aG/huqFpIGPhu6dhIGLhuqFuLiDhu6huZyBk4bulbmcgxJHhu5ljIGjhuqFpIGPDsyB0aOG7gyBz4butIGThu6VuZyBxdXnhu4FuIG7DoHkgxJHhu4MgeMOzYSBob+G6t2Mgc+G7rWEgxJHhu5VpIGThu68gbGnhu4d1IGxpw6puIGjhu4cgY+G7p2EgYuG6oW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiLEkeG7jWMgZC5saeG7h3UgdC5z4butIGPhu6dhIGLhuqFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IkNobyBwaMOpcCDhu6luZyBk4bulbmcgxJHhu41jIHRow7RuZyB0aW4gdGnhu4N1IHPhu60gY8OhIG5ow6JuIMSRxrDhu6NjIGzGsHUgdHLhu68gdHLDqm4gdGhp4bq/dCBi4buLLCBjaOG6s25nIGjhuqFuIG5oxrAgdMOqbiB2w6AgdGjDtG5nIHRpbiBsacOqbiBo4buHIGPhu6dhIGLhuqFuLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Ag4bupbmcgZOG7pW5nIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggZGFuaCB0w61uaCBj4bunYSBi4bqhbiB2w6AgZ+G7rWkgdGjDtG5nIHRpbiB0aeG7g3Ugc+G7rSBj4bunYSBi4bqhbiBjaG8gbmfGsOG7nWkga2jDoWMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVByb2ZpbGUiIG1zZ2lkPSI0Njc5ODc4MzI1MTc3MTc3NDAwIj4iZ2hpIGThu68gbGnhu4d1IHQuc+G7rSBj4bunYSBi4bqhbiI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkNobyBwaMOpcCDhu6luZyBk4bulbmcgxJHhu41jIGLhuqV0IGvhu7MgdOG7qywgdMOqbiB2w6AgY+G7pW0gdOG7qyByacOqbmcgbsOgbyBtw6AgbmfGsOG7nWkgZMO5bmcgY8OzIHRo4buDIMSRw6MgbMawdSB0cuG7ryB0cm9uZyB04burIMSRaeG7g24gY+G7p2EgbmfGsOG7nWkgZMO5bmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iZ2hpIHbDoG8gdOG7qyDEkWnhu4NuIGRvIG5nxrDhu51pIGTDuW5nIHjDoWMgxJHhu4tuaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJDaG8gcGjDqXAg4bupbmcgZOG7pW5nIGdoaSB04burIG3hu5tpIHbDoG8gdOG7qyDEkWnhu4NuIGPhu6dhIG5nxrDhu51pIGTDuW5nLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJz4butYSDEkeG7lWkveMOzYSBu4buZaSBkdW5nIGLhu5kgbmjhu5sgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJz4butYSDEkeG7lWkveMOzYSBu4buZaSBkdW5nIHRo4bq7IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkNobyBwaMOpcCDhu6luZyBk4bulbmcgZ2hpIHbDoG8gYuG7mSBsxrB1IHRy4buvIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDI2NjRhZDMuLmYyMWQ3YjggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0zMzUsNiArMzM1LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLlhpnlhaXogZTns7vmlbDmja4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiLlhYHorrjlupTnlKjnqIvluo/or7vlj5bmgqjlubPmnb/nlLXohJHkuIrlrZjlgqjnmoTogZTns7vkurrvvIjlnLDlnYDvvInmlbDmja7jgILmgbbmhI/lupTnlKjnqIvluo/lj6/og73lgJ/mraTmuIXpmaTmiJbkv67mlLnmgqjnmoTogZTns7vkurrmlbDmja7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IuWFgeiuuOW6lOeUqOeoi+W6j+S/ruaUueaCqOaJi+acuuS4iuWtmOWCqOeahOiBlOezu+S6uu+8iOWcsOWdgO+8ieaVsOaNruOAguaBtuaEj+W6lOeUqOeoi+W6j+WPr+iDveWAn+atpOa4hemZpOaIluS/ruaUueaCqOeahOiBlOezu+S6uuaVsOaNruOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRDYWxsTG9nICgzNDc4MTMzMTg0NjI0MTAyNzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzOTk1MTU3NTk5OTc2NTE1MDAyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRDYWxsTG9nICgzNDUyMDE3NTU5ODA0NzUwNzU4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfd3JpdGVDYWxsTG9nICg4NTUyMDQ1NjY0NzQzNDk5MzU0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjY2MTgwNjA2MjI3NDExOTI0NSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY4Mzk0MTczNjM1Mjc4Nzg0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFByb2ZpbGUiIG1zZ2lkPSI2ODI0NjgxNDM4NTI5ODQyMjgyIj4i6K+75Y+W5oKo55qE5Liq5Lq66LWE5paZ5pWw5o2uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPluaCqOiuvuWkh+S4iuWtmOWCqOeahOS4quS6uui1hOaWmeS/oeaBr++8jOS+i+WmguaCqOeahOWnk+WQjeWSjOiBlOezu+S/oeaBr+OAgui/meaEj+WRs+edgOW6lOeUqOeoi+W6j+WPr+S7peivhuWIq+aCqOeahOi6q+S7ve+8jOW5tuWwhuaCqOeahOS4quS6uui1hOaWmeS/oeaBr+WPkemAgee7meS7luS6uuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVQcm9maWxlIiBtc2dpZD0iNDY3OTg3ODMyNTE3NzE3NzQwMCI+IuWGmeWFpeWIsOaCqOeahOS4quS6uui1hOaWmeaVsOaNriI8L3N0cmluZz4KQEAgLTQ5OSw2ICs1MTEsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPlueUqOaIt+WPr+iDveWcqOeUqOaIt+ivjeWFuOS4reW3suWtmOWCqOeahOS7u+aEj+engeacieWtl+ivjeOAgeWQjeensOWSjOefreivreOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuWGmeWFpeeUqOaIt+WumuS5ieeahOivjeWFuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLlhYHorrjlupTnlKjnqIvluo/lkJHnlKjmiLfor43lhbjkuK3lhpnlhaXmlrDor43jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i5L+u5pS5L+WIoOmZpCBVU0Ig5a2Y5YKo6K6+5aSH5YaF5a65Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLkv67mlLkv5Yig6ZmkIFNEIOWNoeS4reeahOWGheWuuSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLlhYHorrjlupTnlKjnqIvluo/lhpnlhaUgVVNCIOWtmOWCqOiuvuWkh+OAgiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggN2M4NjE3ZS4uNjdhNzhjNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+Iui8uOWFpeiBr+e1oeS6uuizh+aWmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijk4ODk2OTc1OTExMDYzMjk3OCI+IuWFgeioseaHieeUqOeoi+W8j+S/ruaUueW5s+adv+mbu+iFpuS4iuWEsuWtmOeahOiBr+e1oeS6uiAo5Zyw5Z2AKSDos4fmlpnjgILoq4vms6jmhI/vvIzmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73liKnnlKjmraTlip/og73muIXpmaTmiJbkv67mlLnmgqjnmoToga/ntaHkurros4fmlpnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+IuWFgeioseaHieeUqOeoi+W8j+S/ruaUueaJi+apn+S4iuWEsuWtmOeahOiBr+e1oeS6uiAo5Zyw5Z2AKSDos4fmlpnjgILoq4vms6jmhI/vvIzmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73liKnnlKjmraTlip/og73muIXpmaTmiJbkv67mlLnmgqjnmoToga/ntaHkurros4fmlpnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkQ2FsbExvZyAoMzQ3ODEzMzE4NDYyNDEwMjczOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzk5NTE1NzU5OTk3NjUxNTAwMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkQ2FsbExvZyAoMzQ1MjAxNzU1OTgwNDc1MDc1OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3dyaXRlQ2FsbExvZyAoODU1MjA0NTY2NDc0MzQ5OTM1NCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY193cml0ZUNhbGxMb2cgKDY2NjE4MDYwNjIyNzQxMTkyNDUpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2ODM5NDE3MzYzNTI3ODc4NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIiBtc2dpZD0iNjgyNDY4MTQzODUyOTg0MjI4MiI+IuiugOWPluaCqOeahOWAi+S6uuizh+aWmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTQ1MjA3NTM3OTc2MzA2NzkiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5boo53nva7kuIrlhLLlrZjnmoTlgIvkurros4fmlpnvvIzkvovlpoLmgqjnmoTlp5PlkI3lkozoga/ntaHos4foqIrjgILpgJnooajnpLrmh4nnlKjnqIvlvI/lj6/ku6XorZjliKXmgqjnmoTouqvliIbvvIzkuKblsIfmgqjnmoTlgIvkurros4fmlpnlgrPpgIHntabku5bkurrjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiLlr6vlhaXmgqjnmoTlgIvkurros4fmlpkiPC9zdHJpbmc+CkBAIC00OTksNiArNTExLDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5bkvb/nlKjogIXlhLLlrZjlnKjkvb/nlKjogIXlrZflhbjlhafnmoTku7vkvZXnp4HkurrlrZfoqZ7jgIHlkI3nqLHlkozoqZ7ntYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiLlr6vlhaXkvb/nlKjogIXlrprnvqnnmoTlrZflhbgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i5YWB6Kix5oeJ55So56iL5byP5bCH5paw5a2X6Kme5a+r5YWl5L2/55So6ICF55qE5a2X5YW444CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IuS/ruaUuS/liKrpmaQgVVNCIOWEsuWtmOijnee9ruWFp+WuuSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i5L+u5pS5L+WIqumZpCBTRCDljaHnmoTlhaflrrkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i5YWB6Kix5oeJ55So56iL5byP5a+r5YWlIFVTQiDlhLLlrZjoo53nva7jgIIiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAppbmRleCAwOTc3N2FiLi5lN2U2ZjZkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKQEAgLTMzNSw2ICszMzUsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImJoYWxhIGlkYXRoYSB5b3RoaW50YW5hIG5heWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5ODg5Njk3NTkxMTA2MzI5NzgiPiJJdnVtZWxhIGluc2l6YSB1a3V0aGkgaWd1cXVsZSBpbWluaW5pbmd3YW5lIHlla2hlbGkgbG9rdXhodW1hbmEgZWxpZ2NpbndlIGVraG9tcHl1dGhlbmkgeWFraG8geWVwZW5pLiBJemluc2l6YSBlemlub2J1bmdvemkgemluZ2FzZWJlbnppc2EgbG9raHUgdWt1c3VzYSBub21hIHppZ3VxdWxlIHVsd2F6aSBsd2FraG8gbG9rdXhodWFuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTA3NTE2NDgxODY0NzkzNDA2NyI+Ikl2dW1lbGEgaW5zaXphIHVrdXRoaSBpZ3VxdWxlIGltaW5pbmluZ3dhbmUgeWVraGVsaSBsb2t1eGh1bWFuYSBlbGlnY2lud2Ugb2Npbmd3ZW5pIGx3YWtoby4gSXppbnNpemEgZXppbm9idW5nb3ppIHppbmdhc2ViZW56aXNhIGxva2h1IHVrdXN1c2Egbm9tYSB6aWd1cXVsZSB1bHdhemkgbHdha2hvIGxva3V4aHVhbmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZENhbGxMb2cgKDM0NzgxMzMxODQ2MjQxMDI3MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM5OTUxNTc1OTk5NzY1MTUwMDIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZENhbGxMb2cgKDM0NTIwMTc1NTk4MDQ3NTA3NTgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl93cml0ZUNhbGxMb2cgKDg1NTIwNDU2NjQ3NDM0OTkzNTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVDYWxsTG9nICg2NjYxODA2MDYyMjc0MTE5MjQ1KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3dyaXRlQ2FsbExvZyAoNjgzOTQxNzM2MzUyNzg3ODQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSIgbXNnaWQ9IjY4MjQ2ODE0Mzg1Mjk4NDIyODIiPiJiaGFsYSBpbWluaW5pbmdvIHllbWluaW5pbmd3YW5lIHlha2hvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5NDUyMDc1Mzc5NzYzMDY3OSI+Ikl2dW1lbGEgaW5zaXphIHVrdXRoaSBpZnVuZGUgdWx3YXppIGxvbXVudHUgbHdlcGhyb2ZheWxpIG9sdWdjaW53ZSBlZGl2YXlpc2luaSB5YWtobyBuamVuZ2VnYW1hIGxha2hvIGthbnllIG5lbWluaW5pbmd3YW5lIHlva3V4aHVtYW5hIG5hd2UuIExva2h1IGt1Y2hhemEgdWt1dGhpIGl6aW5zYSBpbmdha3VobG9uemEgYmVzZSBpdGh1bWVsZWxhIGFiYW55ZSBpbWluaW5pbmd3YW5lIHllcGhyb2ZheWlsaSB5YWtoby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSIgbXNnaWQ9IjQ2Nzk4NzgzMjUxNzcxNzc0MDAiPiJiaGFsYSBpbWluaW5pbmd3YW5lIHllbWluaW5pbmdvIHlha2hvIjwvc3RyaW5nPgpAQCAtNDk5LDYgKzUxMSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iSXZ1bWVsYSB1aGxlbG8gbG9rdXNlYmVuemEgdWt1ZnVuZGEgbm9tYSB5aW1hcGhpIGFtYWdhbWEgYXlpbWZpaGxvLCBhbWFnYW1hIG5lbWlzaG8gbGV5byB1bXNlYmVuemlzaSBheWlnY2luZSBrd2lzaWNoYXphbWF6d2kgc29tc2ViZW56aXNpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImJoYWxhIGt3aXNpY2hhemFtYXp3aSBlc2ljYWNpc2l3ZSBzb21zZWJlbnppc2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iSXZ1bWVsYSBpbnNpemEgdWt1dGhpIGliaGFsZSBhbWFnYW1hIGFtYXNoYSBlc2ljaGF6aW5pbWF6d2kuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQwODYyMjEzNzQ2MzkxODMyODEiPiJmdW5kYSBva3VxdWtldGh3ZSBrd2VzaXRvcmVqaSBzZS1VU0IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFJlYWQiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NTM3ODc1MTUxODQ1MTM5NTM5Ij4iZnVuZGEgb2t1cXVrZXRod2Uga3dla2hhZGkgbGUtU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRSZWFkIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjEwNTUzMDI4OTg5OTkzNTIzMzkiPiJJdnVtZWxhIHVobGVsbyBsb2t1c2ViZW56YSB1a3VmdW5kYSBva3VxdWtldGh3ZSBrd2VzaXRvcmVqaSBzZS1VU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkUmVhZCIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc5NDc3OTIzNzM1NzA2ODM1NDIiPiJJdnVtZWxhIHVobGVsbyBsb2t1c2ViZW56YSBrdWZ1bmRhIG9rdXF1a2V0aHdlIGt3ZWtoYWRpIGxlLVNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJndXF1bGEvc3VzYSBva3VxdWtldGh3ZSBpc2l0b3Jlamkgc2UtVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJndXF1bGEvc3VzYSBva3VxdWtldGh3ZSBrd2VraGFkaSBsZS1TRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJJdnVtZWxhIGluc2l6YSB1a3V0aGkgaWJoYWxlbGUgZWt1bG9uZG9sb3p3ZW5pIGt3ZS1VU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggNzEzN2I3Yy4uNzc5OWY3NCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC05NDIsNiArOTQyLDI2IEBACiAgICAgICAgIGNvbnRhY3QgKGFkZHJlc3MpIGRhdGEgc3RvcmVkIG9uIHlvdXIgcGhvbmUuIE1hbGljaW91cwogICAgICAgICBhcHBzIG1heSB1c2UgdGhpcyB0byBlcmFzZSBvciBtb2RpZnkgeW91ciBjb250YWN0IGRhdGEuPC9zdHJpbmc+CiAKKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkQ2FsbExvZyI+cmVhZCBjYWxsIGxvZzwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGxMb2ciIHByb2R1Y3Q9InRhYmxldCI+QWxsb3dzIHRoZSBhcHAgdG8gcmVhZCB5b3VyIHRhYmxldFwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gc2VuZCB5b3VyIGRhdGEgdG8gb3RoZXIgcGVvcGxlLjwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGxMb2ciIHByb2R1Y3Q9ImRlZmF1bHQiPkFsbG93cyB0aGUgYXBwIHRvIHJlYWQgeW91ciBwaG9uZVwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gc2VuZCB5b3VyIGRhdGEgdG8gb3RoZXIgcGVvcGxlLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsbExvZyI+d3JpdGUgY2FsbCBsb2c8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsbExvZyIgcHJvZHVjdD0idGFibGV0Ij5BbGxvd3MgdGhlIGFwcCB0byBtb2RpZnkgeW91ciB0YWJsZXRcJ3MgY2FsbCBsb2csIGluY2x1ZGluZyBkYXRhIGFib3V0IGluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscy4KKyAgICAgICAgTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNhbGwgbG9nLjwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxsTG9nIiBwcm9kdWN0PSJkZWZhdWx0Ij5BbGxvd3MgdGhlIGFwcCB0byBtb2RpZnkgeW91ciBwaG9uZVwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gZXJhc2Ugb3IgbW9kaWZ5IHlvdXIgY2FsbCBsb2cuPC9zdHJpbmc+CisKKwogICAgIDwhLS0gVGl0bGUgb2YgdGhlIHJlYWQgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIj5yZWFkIHlvdXIgcHJvZmlsZSBkYXRhPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBwcm9maWxlIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBwZXJzb25hbCBwcm9maWxlIGRhdGEuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Mb2NhbGVVdGlsVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Mb2NhbGVVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E2MDQzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7Ci1pbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldE5ldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldy5MQVlPVVRfRElSRUNUSU9OX0xUUjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuTEFZT1VUX0RJUkVDVElPTl9SVEw7Ci0KLXB1YmxpYyBjbGFzcyBMb2NhbGVVdGlsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBAVGVzdFRhcmdldE5ldygKLSAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCi0gICAgICAgIG1ldGhvZCA9ICJnZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlIiwKLSAgICAgICAgYXJncyA9IHtMb2NhbGUuY2xhc3N9Ci0gICAgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKG51bGwpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkVOR0xJU0gpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DQU5BREEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DQU5BREFfRlJFTkNIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuRlJBTkNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuRlJFTkNIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuR0VSTUFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuR0VSTUFOWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLklUQUxJQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5JVEFMWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlVLKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuVVMpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlJPT1QpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkNISU5BKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuQ0hJTkVTRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkpBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuSkFQQU5FU0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5LT1JFQSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLktPUkVBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlBSQykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlNJTVBMSUZJRURfQ0hJTkVTRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlRBSVdBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlRSQURJVElPTkFMX0NISU5FU0UpKTsKLQotICAgICAgICBMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJBRSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkJIIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiRFoiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJFRyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIklRIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiSk8iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJLVyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkxCIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiTFkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJNQSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIk9NIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiUUEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJTQSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlNEIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiU1kiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJUTiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIllFIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJmYSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImZhIiwgIkFGIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiZmEiLCAiSVIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoIml3Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiaXciLCAiSUwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJoZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImhlIiwgIklMIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwYV9BcmFiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicGFfQXJhYiIsICJQSyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwcyIsICJBRiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1ciIsICJJTiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInVyIiwgIlBLIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1el9BcmFiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXpfQXJhYiIsICJBRiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgLy8gTG9jYWxlIHdpdGhvdXQgYSByZWFsIGxhbmd1YWdlCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInp6Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9CaXR3aXNlU3RyZWFtc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0JpdHdpc2VTdHJlYW1zVGVzdC5qYXZhCmluZGV4IGEzMDRiNjguLjMwNmY1OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0JpdHdpc2VTdHJlYW1zVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0JpdHdpc2VTdHJlYW1zVGVzdC5qYXZhCkBAIC0xMzMsNCArMTMzLDI1IEBACiAgICAgICAgIGxvbmcgZW5kID0gYW5kcm9pZC5vcy5TeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlcGVhdGVkIGVuY29kZS1kZWNvZGUgdG9vayAiICsgKGVuZCAtIHN0YXJ0KSArICIgbXMiKTsKICAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gMTAwMDA7CisgICAgICAgIGludFtdIHNpemVBcnIgPSBuZXcgaW50W2l0ZXJhdGlvbnNdOworICAgICAgICBpbnRbXSB2YWx1ZUFyciA9IG5ldyBpbnRbaXRlcmF0aW9uc107CisgICAgICAgIEJpdHdpc2VPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJpdHdpc2VPdXRwdXRTdHJlYW0oOCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeCA9IHJhbmRvbS5uZXh0SW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9ICh4ICYgMHgwNykgKyAxOworICAgICAgICAgICAgaW50IHZhbHVlID0geCAmICgtMSA+Pj4gKDMyIC0gc2l6ZSkpOworICAgICAgICAgICAgc2l6ZUFycltpXSA9IHNpemU7CisgICAgICAgICAgICB2YWx1ZUFycltpXSA9IHZhbHVlOworICAgICAgICAgICAgb3V0U3RyZWFtLndyaXRlKHNpemUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQml0d2lzZUlucHV0U3RyZWFtKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUFycltpXSwgaW5TdHJlYW0ucmVhZChzaXplQXJyW2ldKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9kYXRhL2ZvbnRzL2ZhbGxiYWNrX2ZvbnRzLnhtbCBiL2RhdGEvZm9udHMvZmFsbGJhY2tfZm9udHMueG1sCmluZGV4IDUxYjA3ZTQuLjYzYjNhNTggMTAwNjQ0Ci0tLSBhL2RhdGEvZm9udHMvZmFsbGJhY2tfZm9udHMueG1sCisrKyBiL2RhdGEvZm9udHMvZmFsbGJhY2tfZm9udHMueG1sCkBAIC0yMSw2ICsyMSwxNSBAQAogICAgIGZhbGxiYWNrIGZvbnRzLiBUaGF0IGZpbGUgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZhbGxiYWNrIGZvbnRzIHNob3VsZCBiZQogICAgIHNlYXJjaGVkLCB0byBlbnN1cmUgdGhhdCBhIHZlbmRvci1wcm92aWRlZCBmb250IHdpbGwgYmUgdXNlZCBiZWZvcmUgYW5vdGhlciBmYWxsYmFjayBmb250CiAgICAgd2hpY2ggaGFwcGVucyB0byBoYW5kbGUgdGhlIHNhbWUgZ2x5cGguCisKKyAgICBIYW4gbGFuZ3VhZ2VzIChDaGluZXNlLCBKYXBhbmVzZSwgYW5kIEtvcmVhbikgc2hhcmUgYSBjb21tb24gcmFuZ2Ugb2YgdW5pY29kZSBjaGFyYWN0ZXJzOworICAgIHRoZWlyIG9yZGVyaW5nIGluIHRoZSBmYWxsYmFjayBvciB2ZW5kb3IgZmlsZXMgZ2l2ZXMgcHJpb3JpdHkgdG8gdGhlIGZpcnN0IGluIHRoZSBsaXN0LgorICAgIExvY2FsZS1zcGVjaWZpYyBvcmRlcmluZyBjYW4gYmUgY29uZmlndXJlZCBieSBhZGRpbmcgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiBjb2RlcyB0byB0aGUgZW5kCisgICAgb2YgdGhlIGZpbGVuYW1lIChlLmcuIC9zeXN0ZW0vZXRjL2ZhbGxiYWNrX2ZvbnRzLWphLnhtbCkuIFdoZW4gbm8gcmVnaW9uIGNvZGUgaXMgdXNlZCwKKyAgICBhcyB3aXRoIHRoaXMgZXhhbXBsZSwgYWxsIHJlZ2lvbnMgYXJlIG1hdGNoZWQuIFVzZSBzZXBhcmF0ZSBmaWxlcyBmb3IgZWFjaCBzdXBwb3J0ZWQgbG9jYWxlLgorICAgIFRoZSBzdGFuZGFyZCBmYWxsYmFjayBmaWxlIChmYWxsYmFja19mb250cy54bWwpIGlzIHVzZWQgd2hlbiBhIGxvY2FsZSBkb2VzIG5vdCBoYXZlIGl0cyBvd24KKyAgICBmaWxlLiBBbGwgZmFsbGJhY2sgZmlsZXMgbXVzdCBjb250YWluIHRoZSBzYW1lIGNvbXBsZXRlIHNldCBvZiBmb250czsgb25seSB0aGVpciBvcmRlcmluZworICAgIGNhbiBkaWZmZXIuCiAtLT4KIDxmYW1pbHlzZXQ+CiAgICAgPGZhbWlseT4KZGlmZiAtLWdpdCBhL2RhdGEvZm9udHMvdmVuZG9yX2ZvbnRzLnhtbCBiL2RhdGEvZm9udHMvdmVuZG9yX2ZvbnRzLnhtbAppbmRleCBmZTUxZmQyNy4uYzExMTZkMCAxMDA2NDQKLS0tIGEvZGF0YS9mb250cy92ZW5kb3JfZm9udHMueG1sCisrKyBiL2RhdGEvZm9udHMvdmVuZG9yX2ZvbnRzLnhtbApAQCAtMjUsNiArMjUsMTUgQEAKICAgICBwbGFjZSBpbiB0aGUgb3ZlcmFsbCBmYWxsYmFjayBmb250cy4gVGhlIG9yZGVyIG9mIHRoaXMgbGlzdCBkZXRlcm1pbmVzIHdoaWNoIGZhbGxiYWNrIGZvbnQKICAgICB3aWxsIGJlIHVzZWQgdG8gc3VwcG9ydCBhbnkgZ2x5cGhzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBkZWZhdWx0IHN5c3RlbSBmb250cy4KIAorICAgIEhhbiBsYW5ndWFnZXMgKENoaW5lc2UsIEphcGFuZXNlLCBhbmQgS29yZWFuKSBzaGFyZSBhIGNvbW1vbiByYW5nZSBvZiB1bmljb2RlIGNoYXJhY3RlcnM7CisgICAgdGhlaXIgb3JkZXJpbmcgaW4gdGhlIGZhbGxiYWNrIG9yIHZlbmRvciBmaWxlcyBnaXZlcyBwcmlvcml0eSB0byB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuCisgICAgTG9jYWxlLXNwZWNpZmljIG9yZGVyaW5nIGNhbiBiZSBjb25maWd1cmVkIGJ5IGFkZGluZyBsYW5ndWFnZSBhbmQgcmVnaW9uIGNvZGVzIHRvIHRoZSBlbmQKKyAgICBvZiB0aGUgZmlsZW5hbWUgKGUuZy4gL3N5c3RlbS9ldGMvZmFsbGJhY2tfZm9udHMtamEueG1sKS4gV2hlbiBubyByZWdpb24gY29kZSBpcyB1c2VkLAorICAgIGFzIHdpdGggdGhpcyBleGFtcGxlLCBhbGwgcmVnaW9ucyBhcmUgbWF0Y2hlZC4gVXNlIHNlcGFyYXRlIGZpbGVzIGZvciBlYWNoIHN1cHBvcnRlZCBsb2NhbGUuCisgICAgVGhlIHN0YW5kYXJkIGZhbGxiYWNrIGZpbGUgKGZhbGxiYWNrX2ZvbnRzLnhtbCkgaXMgdXNlZCB3aGVuIGEgbG9jYWxlIGRvZXMgbm90IGhhdmUgaXRzIG93bgorICAgIGZpbGUuIEFsbCBmYWxsYmFjayBmaWxlcyBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgY29tcGxldGUgc2V0IG9mIGZvbnRzOyBvbmx5IHRoZWlyIG9yZGVyaW5nCisgICAgY2FuIGRpZmZlci4KKwogICAgIFRoZSBzYW1wbGUgY29uZmlndXJhdGlvbiBiZWxvdyBpcyBhbiBleGFtcGxlIG9mIGhvdyBvbmUgbWlnaHQgcHJvdmlkZSB0d28gZmFtaWxpZXMgb2YgZm9udHMKICAgICB0aGF0IGdldCBpbnNlcnRlZCBhdCB0aGUgZmlyc3QgYW5kIHNlY29uZCAoMCAgYW5kIDEpIHBvc2l0aW9uIGluIHRoZSBvdmVyYWxsIGZhbGxiYWNrIGZvbnRzLgogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAppbmRleCA1ZWU0MWU2Li40YjFiNDBlYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0xNTksMTEgKzE1OSwxMyBAQAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKKy8vIG1ha2Ugc3VyZSB0aGF0IGxvd2VyLWNhc2UgbGV0dGVycyBhcmUgdXNlZC4KIGNvbnN0IFN0cmluZzggRndkTG9ja0VuZ2luZTo6RmlsZVN1ZmZpeGVzW10gPSB7CiAgICAgU3RyaW5nOCgiLmZsIiksCiAgICAgU3RyaW5nOCgiLmRtIiksCiB9OwogCisvLyBtYWtlIHN1cmUgdGhhdCBsb3dlci1jYXNlIGxldHRlcnMgYXJlIHVzZWQuCiBjb25zdCBTdHJpbmc4IEZ3ZExvY2tFbmdpbmU6Ok1pbWVUeXBlc1tdID0gewogICAgIFN0cmluZzgoImFwcGxpY2F0aW9uL3gtYW5kcm9pZC1kcm0tZmwiKSwKICAgICBTdHJpbmc4KCJhcHBsaWNhdGlvbi92bmQub21hLmRybS5tZXNzYWdlIiksCkBAIC0xODQsOCArMTg2LDEwIEBACiB9CiAKIGJvb2wgRndkTG9ja0VuZ2luZTo6SXNNaW1lVHlwZVN1cHBvcnRlZChjb25zdCBTdHJpbmc4JiBtaW1lKSB7CisgICAgU3RyaW5nOCB0bXAobWltZSk7CisgICAgdG1wLnRvTG93ZXIoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMCwgbiA9IHNpemVvZihNaW1lVHlwZXMpL3NpemVvZihNaW1lVHlwZXNbMF0pOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmIChtaW1lID09IE1pbWVUeXBlc1tpXSkgeworICAgICAgICBpZiAodG1wID09IE1pbWVUeXBlc1tpXSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTMsOCArMTk3LDEwIEBACiB9CiAKIGJvb2wgRndkTG9ja0VuZ2luZTo6SXNGaWxlU3VmZml4U3VwcG9ydGVkKGNvbnN0IFN0cmluZzgmIHN1ZmZpeCkgeworICAgIFN0cmluZzggdG1wKHN1ZmZpeCk7CisgICAgdG1wLnRvTG93ZXIoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMCwgbiA9IHNpemVvZihGaWxlU3VmZml4ZXMpL3NpemVvZihGaWxlU3VmZml4ZXNbMF0pOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmIChzdWZmaXggPT0gRmlsZVN1ZmZpeGVzW2ldKSB7CisgICAgICAgIGlmICh0bXAgPT0gRmlsZVN1ZmZpeGVzW2ldKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMCw3ICsyMjYsNiBAQAogICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAKICAgICBTdHJpbmc4IGV4dFN0cmluZyA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOwotICAgIGV4dFN0cmluZy50b0xvd2VyKCk7CiAgICAgcmV0dXJuIElzRmlsZVN1ZmZpeFN1cHBvcnRlZChleHRTdHJpbmcpOwogfQogCkBAIC0zMzEsOCArMzM2LDYgQEAKIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUiKTsKIAotICAgIG1pbWVTdHIudG9Mb3dlcigpOwotCiAgICAgLyogQ2hlY2tzIHdoZXRoZXIKICAgICAqIDEuIHBhdGggYW5kIG1pbWUgdHlwZSBib3RoIGFyZSBub3QgZW1wdHkgc3RyaW5ncyAobWVhbmluZyB1bmF2YWlsYWJsZSkgZWxzZSBjb250ZW50IGlzIHVua25vd24KICAgICAqIDIuIGlmIG9uZSBvZiB0aGVtIGlzIGVtcHR5IHN0cmluZyBhbmQgaWYgb3RoZXIgaXMga25vd24gdGhlbiBpdHMgYSBEUk0gQ29udGVudCBPYmplY3QuCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCmluZGV4IDBmZmMwYTcuLmEzZWFjM2UgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1QYXNzdGhydVBsdWdJbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNTgsNyArNTgsNyBAQAogCiBEcm1Db25zdHJhaW50cyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0Q29uc3RyYWludHMoCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRDb25zdHJhaW50cyBGcm9tIFBhdGg6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRDb25zdHJhaW50cyBGcm9tIFBhdGg6ICVkIiwgdW5pcXVlSWQpOwogICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IG5ldyBEcm1Db25zdHJhaW50cygpOwogCiAgICAgU3RyaW5nOCB2YWx1ZSgiZHVtbXlfYXZhaWxhYmxlX3RpbWUiKTsKQEAgLTczLDcgKzczLDcgQEAKIH0KIAogRHJtSW5mb1N0YXR1cyogRHJtUGFzc3RocnVQbHVnSW46Om9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvIC0gRW50ZXIgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJvY2Vzc0RybUluZm8gLSBFbnRlciA6ICVkIiwgdW5pcXVlSWQpOwogICAgIERybUluZm9TdGF0dXMqIGRybUluZm9TdGF0dXMgPSBOVUxMOwogICAgIGlmIChOVUxMICE9IGRybUluZm8pIHsKICAgICAgICAgc3dpdGNoIChkcm1JbmZvLT5nZXRJbmZvVHlwZSgpKSB7CkBAIC0xMDIsMjggKzEwMiwyOCBAQAogICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvIC0gRXhpdCIpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Qcm9jZXNzRHJtSW5mbyAtIEV4aXQiKTsKICAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0T25JbmZvTGlzdGVuZXIoCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0T25JbmZvTGlzdGVuZXIgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0T25JbmZvTGlzdGVuZXIgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplKGludCB1bmlxdWVJZCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemUgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblRlcm1pbmF0ZSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25UZXJtaW5hdGUgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBEcm1TdXBwb3J0SW5mbyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldFN1cHBvcnRJbmZvIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldFN1cHBvcnRJbmZvIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvID0gbmV3IERybVN1cHBvcnRJbmZvKCk7CiAgICAgLy8gQWRkIG1pbWV0eXBlJ3MKICAgICBkcm1TdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOCgiYXBwbGljYXRpb24vdm5kLnBhc3N0aHJ1LmRybSIpKTsKQEAgLTEzNiwxMiArMTM2LDEyIEBACiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNhdmVSaWdodHMgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uU2F2ZVJpZ2h0cyA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIERybUluZm8qIERybVBhc3N0aHJ1UGx1Z0luOjpvbkFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkFjcXVpcmVEcm1JbmZvIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkFjcXVpcmVEcm1JbmZvIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgRHJtSW5mbyogZHJtSW5mbyA9IE5VTEw7CiAKICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvUmVxdWVzdCkgewpAQCAtMTU3LDY1ICsxNTcsNjUgQEAKIH0KIAogYm9vbCBEcm1QYXNzdGhydVBsdWdJbjo6b25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpjYW5IYW5kbGU6ICVzICIsIHBhdGguc3RyaW5nKCkpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6Y2FuSGFuZGxlOiAlcyAiLCBwYXRoLnN0cmluZygpKTsKICAgICBTdHJpbmc4IGV4dGVuc2lvbiA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOwogICAgIGV4dGVuc2lvbi50b0xvd2VyKCk7CiAgICAgcmV0dXJuIChTdHJpbmc4KCIucGFzc3RocnUiKSA9PSBleHRlbnNpb24pOwogfQogCiBTdHJpbmc4IERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE9yaWdpbmFsTWltZVR5cGUoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gU3RyaW5nOCgidmlkZW8vcGFzc3RocnUiKTsKIH0KIAogaW50IERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldERybU9iamVjdFR5cGUoCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldERybU9iamVjdFR5cGUoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXREcm1PYmplY3RUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRHJtT2JqZWN0VHlwZTo6VU5LTk9XTjsKIH0KIAogaW50IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DaGVja1JpZ2h0c1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CiAgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBib29sIERybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25WYWxpZGF0ZUFjdGlvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25SZW1vdmVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25SZW1vdmVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlQWxsUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlQWxsUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogRHJtQ29udmVydGVkU3RhdHVzKiBEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29udmVydERhdGEoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgRHJtQnVmZmVyKiBjb252ZXJ0ZWREYXRhID0gTlVMTDsKIAogICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSAmJiAwIDwgaW5wdXREYXRhLT5sZW5ndGgpIHsKQEAgLTIyOSwxMyArMjI5LDEzIEBACiB9CiAKIERybUNvbnZlcnRlZFN0YXR1cyogRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlQ29udmVydFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LLCBOVUxMLCAwIC8qb2Zmc2V0Ki8pOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAKICNpZmRlZiBFTkFCTEVfUEFTU1RIUlVfREVDUllQVElPTgogICAgIGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlID0gU3RyaW5nOCgidmlkZW8vcGFzc3RocnUiKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgewogICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgewogICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOyBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CkBAIC0yNjYsMzQgKzI2Niw0MCBAQAogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIC8qKgogICAgICAqIEFzIGEgd29ya2Fyb3VuZCBpbXBsZW1lbnRhdGlvbiBwYXNzdGhydSB3b3VsZCBjb3B5IHRoZSBnaXZlbgogICAgICAqIGVuY3J5cHRlZCBidWZmZXIgYXMgaXQgaXMgdG8gZGVjcnlwdGVkIGJ1ZmZlci4gTm90ZSwgZGVjQnVmZmVyCiAgICAgICogbWVtb3J5IGhhcyB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KICAgICAgKi8KICAgICBpZiAoTlVMTCAhPSAoKmRlY0J1ZmZlcikgJiYgMCA8ICgqZGVjQnVmZmVyKS0+bGVuZ3RoKSB7Ci0gICAgICAgIG1lbWNweSgoKmRlY0J1ZmZlciktPmRhdGEsIGVuY0J1ZmZlci0+ZGF0YSwgZW5jQnVmZmVyLT5sZW5ndGgpOwotICAgICAgICAoKmRlY0J1ZmZlciktPmxlbmd0aCA9IGVuY0J1ZmZlci0+bGVuZ3RoOworICAgICAgICBpZiAoKCpkZWNCdWZmZXIpLT5sZW5ndGggPj0gZW5jQnVmZmVyLT5sZW5ndGgpIHsKKyAgICAgICAgICAgIG1lbWNweSgoKmRlY0J1ZmZlciktPmRhdGEsIGVuY0J1ZmZlci0+ZGF0YSwgZW5jQnVmZmVyLT5sZW5ndGgpOworICAgICAgICAgICAgKCpkZWNCdWZmZXIpLT5sZW5ndGggPSBlbmNCdWZmZXItPmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZWNCdWZmZXIgc2l6ZSAoJWQpIHRvbyBzbWFsbCB0byBob2xkICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAoKmRlY0J1ZmZlciktPmxlbmd0aCwgZW5jQnVmZmVyLT5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzc2l6ZV90IERybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oCmluZGV4IGE1OTY3N2EuLjc5NzdjMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmgKKysrIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaApAQCAtNjUsNyArNjUsNyBAQAogICogICAgICBiLiBKYXZhIHNlbmRzIGV2ZW50IHRocm91Z2ggZGVmYXVsdCBrZXkgaGFuZGxlci4KICAqICAgICAgYy4gZXZlbnQgaXMgZmluaXNoZWQuCiAgKi8KLXN0cnVjdCBBSW5wdXRRdWV1ZSA6IHB1YmxpYyBhbmRyb2lkOjpJbnB1dEV2ZW50RmFjdG9yeUludGVyZmFjZSB7CitzdHJ1Y3QgQUlucHV0UXVldWUgewogcHVibGljOgogICAgIC8qIENyZWF0ZXMgYSBjb25zdW1lciBhc3NvY2lhdGVkIHdpdGggYW4gaW5wdXQgY2hhbm5lbC4gKi8KICAgICBleHBsaWNpdCBBSW5wdXRRdWV1ZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJbnB1dENoYW5uZWw+JiBjaGFubmVsLCBpbnQgd29ya1dyaXRlKTsKQEAgLTk2LDE2ICs5NiwxNiBAQAogICAgIGFuZHJvaWQ6OktleUV2ZW50KiBjb25zdW1lVW5oYW5kbGVkRXZlbnQoKTsKICAgICBhbmRyb2lkOjpLZXlFdmVudCogY29uc3VtZVByZURpc3BhdGNoaW5nRXZlbnQoaW50KiBvdXRTZXEpOwogCi0gICAgdmlydHVhbCBhbmRyb2lkOjpLZXlFdmVudCogY3JlYXRlS2V5RXZlbnQoKTsKLSAgICB2aXJ0dWFsIGFuZHJvaWQ6Ok1vdGlvbkV2ZW50KiBjcmVhdGVNb3Rpb25FdmVudCgpOworICAgIGFuZHJvaWQ6OktleUV2ZW50KiBjcmVhdGVLZXlFdmVudCgpOwogCiAgICAgaW50IG1Xb3JrV3JpdGU7CiAKIHByaXZhdGU6CiAgICAgdm9pZCBkb1VuaGFuZGxlZEtleShhbmRyb2lkOjpLZXlFdmVudCoga2V5RXZlbnQpOwogICAgIGJvb2wgcHJlRGlzcGF0Y2hLZXkoYW5kcm9pZDo6S2V5RXZlbnQqIGtleUV2ZW50KTsKLSAgICB2b2lkIHdha2V1cERpc3BhdGNoKCk7CisgICAgdm9pZCB3YWtldXBEaXNwYXRjaExvY2tlZCgpOwogCisgICAgYW5kcm9pZDo6UG9vbGVkSW5wdXRFdmVudEZhY3RvcnkgbVBvb2xlZElucHV0RXZlbnRGYWN0b3J5OwogICAgIGFuZHJvaWQ6OklucHV0Q29uc3VtZXIgbUNvbnN1bWVyOwogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3Blcj4gbUxvb3BlcjsKIApAQCAtMTI3LDExICsxMjcsNiBAQAogCiAgICAgaW50IG1TZXE7CiAKLSAgICAvLyBDYWNoZSBvZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBrZXkgZXZlbnRzLgotICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpLZXlFdmVudCo+IG1BdmFpbEtleUV2ZW50czsKLSAgICAvLyBDYWNoZSBvZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBtb3Rpb24gZXZlbnRzLgotICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpNb3Rpb25FdmVudCo+IG1BdmFpbE1vdGlvbkV2ZW50czsKLQogICAgIC8vIEFsbCBpbnB1dCBldmVudHMgdGhhdCBhcmUgYWN0aXZlbHkgYmVpbmcgcHJvY2Vzc2VkLgogICAgIGFuZHJvaWQ6OlZlY3Rvcjxpbl9mbGlnaHRfZXZlbnQ+IG1JbkZsaWdodEV2ZW50czsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbmRyb2lkZncvSW5wdXQuaCBiL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0LmgKaW5kZXggZjVkYjZlMjQuLmE0ZWJkOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0LmgKKysrIGIvaW5jbHVkZS9hbmRyb2lkZncvSW5wdXQuaApAQCAtNjE2LDYgKzYxNiwyNiBAQAogfTsKIAogLyoKKyAqIEFuIGlucHV0IGV2ZW50IGZhY3RvcnkgaW1wbGVtZW50YXRpb24gdGhhdCBtYWludGFpbnMgYSBwb29sIG9mIGlucHV0IGV2ZW50cy4KKyAqLworY2xhc3MgUG9vbGVkSW5wdXRFdmVudEZhY3RvcnkgOiBwdWJsaWMgSW5wdXRFdmVudEZhY3RvcnlJbnRlcmZhY2UgeworcHVibGljOgorICAgIFBvb2xlZElucHV0RXZlbnRGYWN0b3J5KHNpemVfdCBtYXhQb29sU2l6ZSA9IDIwKTsKKyAgICB2aXJ0dWFsIH5Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeSgpOworCisgICAgdmlydHVhbCBLZXlFdmVudCogY3JlYXRlS2V5RXZlbnQoKTsKKyAgICB2aXJ0dWFsIE1vdGlvbkV2ZW50KiBjcmVhdGVNb3Rpb25FdmVudCgpOworCisgICAgdm9pZCByZWN5Y2xlKElucHV0RXZlbnQqIGV2ZW50KTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzaXplX3QgbU1heFBvb2xTaXplOworCisgICAgVmVjdG9yPEtleUV2ZW50Kj4gbUtleUV2ZW50UG9vbDsKKyAgICBWZWN0b3I8TW90aW9uRXZlbnQqPiBtTW90aW9uRXZlbnRQb29sOworfTsKKworLyoKICAqIENhbGN1bGF0ZXMgdGhlIHZlbG9jaXR5IG9mIHBvaW50ZXIgbW92ZW1lbnRzIG92ZXIgdGltZS4KICAqLwogY2xhc3MgVmVsb2NpdHlUcmFja2VyIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0VHJhbnNwb3J0LmggYi9pbmNsdWRlL2FuZHJvaWRmdy9JbnB1dFRyYW5zcG9ydC5oCmluZGV4IGE4NDZlNjUuLjI5YzI5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0VHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuaApAQCAtMjkyLDcgKzI5MiwyOSBAQAogICAgICAqLwogICAgIHN0YXR1c190IHNlbmRGaW5pc2hlZFNpZ25hbCh1aW50MzJfdCBzZXEsIGJvb2wgaGFuZGxlZCk7CiAKLSAgICAvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGJhdGNoLiAqLworICAgIC8qIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIGRlZmVycmVkIGV2ZW50IHdhaXRpbmcuCisgICAgICoKKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgY29uc3VtZSgpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb25zdW1lcgorICAgICAqIGhhcyBhIGRlZmVycmVkIGV2ZW50IHRvIGJlIHByb2Nlc3NlZC4gIERlZmVycmVkIGV2ZW50cyBhcmUgc29tZXdoYXQgc3BlY2lhbCBpbgorICAgICAqIHRoYXQgdGhleSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGlucHV0IGNoYW5uZWwuICBJZiB0aGUgaW5wdXQgY2hhbm5lbAorICAgICAqIGJlY29tZXMgZW1wdHksIHRoZSBjbGllbnQgbWF5IG5lZWQgdG8gZG8gZXh0cmEgd29yayB0byBlbnN1cmUgdGhhdCBpdCBwcm9jZXNzZXMKKyAgICAgKiB0aGUgZGVmZXJyZWQgZXZlbnQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBpbnB0dSBjaGFubmVsJ3MgZmlsZSBkZXNjcmlwdG9yCisgICAgICogaXMgbm90IHJlYWRhYmxlLgorICAgICAqCisgICAgICogT25lIG9wdGlvbiBpcyBzaW1wbHkgdG8gY2FsbCBjb25zdW1lKCkgaW4gYSBsb29wIHVudGlsIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgICogVGhpcyBndWFyYW50ZWVzIHRoYXQgYWxsIGRlZmVycmVkIGV2ZW50cyB3aWxsIGJlIHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEFsdGVybmF0ZWx5LCB0aGUgY2FsbGVyIGNhbiBjYWxsIGhhc0RlZmVycmVkRXZlbnQoKSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcworICAgICAqIGEgZGVmZXJyZWQgZXZlbnQgd2FpdGluZyBhbmQgdGhlbiBlbnN1cmUgdGhhdCBpdHMgZXZlbnQgbG9vcCB3YWtlcyB1cCBhdCBsZWFzdAorICAgICAqIG9uZSBtb3JlIHRpbWUgdG8gY29uc3VtZSB0aGUgZGVmZXJyZWQgZXZlbnQuCisgICAgICovCisgICAgYm9vbCBoYXNEZWZlcnJlZEV2ZW50KCkgY29uc3Q7CisKKyAgICAvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGJhdGNoLgorICAgICAqCisgICAgICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGNvbnN1bWUoKSB3aXRoIGNvbnN1bWVCYXRjaGVzID09IGZhbHNlIHRvIGRldGVybWluZQorICAgICAqIHdoZXRoZXIgY29uc3VtZSgpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIgb24gd2l0aCBjb25zdW1lQmF0Y2hlcyA9PSB0cnVlLgorICAgICAqLwogICAgIGJvb2wgaGFzUGVuZGluZ0JhdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NwdXN0YXRzL1RocmVhZENwdVVzYWdlLmggYi9pbmNsdWRlL2NwdXN0YXRzL1RocmVhZENwdVVzYWdlLmgKaW5kZXggMjQwMTJhNC4uOWNkOTNkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oCisrKyBiL2luY2x1ZGUvY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaApAQCAtMTcsMTYgKzE3LDE3IEBACiAjaWZuZGVmIF9USFJFQURfQ1BVX1VTQUdFX0gKICNkZWZpbmUgX1RIUkVBRF9DUFVfVVNBR0VfSAogCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogCi0vLyBUcmFjayBDUFUgdXNhZ2UgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIG1haW50YWluIHN0YXRpc3RpY3Mgb24KLS8vIHRoZSBDUFUgdXNhZ2UuICBVbml0cyBhcmUgaW4gcGVyLXRocmVhZCBDUFUgbnMsIGFzIHJlcG9ydGVkIGJ5CituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRyYWNrIENQVSB1c2FnZSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorLy8gVW5pdHMgYXJlIGluIHBlci10aHJlYWQgQ1BVIG5zLCBhcyByZXBvcnRlZCBieQogLy8gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkuICBTaW1wbGUgdXNhZ2U6IGZvciBjeWNsaWMKIC8vIHRocmVhZHMgd2hlcmUgeW91IHdhbnQgdG8gbWVhc3VyZSB0aGUgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIHdob2xlCiAvLyBjeWNsZSwganVzdCBjYWxsIHNhbXBsZUFuZEVuYWJsZSgpIGF0IHRoZSBzdGFydCBvZiBlYWNoIGN5Y2xlLgotLy8gVGhlbiBjYWxsIHN0YXRpc3RpY3MoKSB0byBnZXQgdGhlIHJlc3VsdHMsIGFuZCByZXNldFN0YXRpc3RpY3MoKQotLy8gdG8gc3RhcnQgYSBuZXcgc2V0IG9mIG1lYXN1cmVtZW50cy4KLS8vIEZvciBhY3ljbGljIHRocmVhZHMsIG9yIGZvciBjeWNsaWMgdGhyZWFkcyB3aGVyZSB5b3Ugd2FudCB0byBtZWFzdXJlCisvLyBGb3IgYWN5Y2xpYyB0aHJlYWRzLCBvciBmb3IgY3ljbGljIHRocmVhZHMgd2hlcmUgeW91IHdhbnQgdG8gbWVhc3VyZS90cmFjawogLy8gb25seSBwYXJ0IG9mIGVhY2ggY3ljbGUsIGNhbGwgZW5hYmxlKCksIGRpc2FibGUoKSwgYW5kL29yIHNldEVuYWJsZWQoKQogLy8gdG8gZGVtYXJjYXRlIHRoZSByZWdpb24ocykgb2YgaW50ZXJlc3QsIGFuZCB0aGVuIGNhbGwgc2FtcGxlKCkgcGVyaW9kaWNhbGx5LgogLy8gVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUgZm9yIGNvbmN1cnJlbnQgY2FsbHMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzOwpAQCAtNDQsMTMgKzQ1LDE3IEBACiAgICAgICAgIC8vIG1QcmV2aW91c1RzCiAgICAgICAgIC8vIG1Nb25vdG9uaWNUcwogICAgICAgICBtTW9ub3RvbmljS25vd24oZmFsc2UpCi0gICAgICAgIC8vIG1TdGF0aXN0aWNzCi0gICAgICAgIHsgfQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZCkgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZpbml0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0tlcm5lbE1heDsgKytpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRrSHpbaV0gPSAodWludDMyX3QpIH4wOyAgIC8vIHVua25vd24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgflRocmVhZENwdVVzYWdlKCkgeyB9CiAKICAgICAvLyBSZXR1cm4gd2hldGhlciBjdXJyZW50bHkgdHJhY2tpbmcgQ1BVIHVzYWdlIGJ5IGN1cnJlbnQgdGhyZWFkCi0gICAgYm9vbCBpc0VuYWJsZWQoKSAgICB7IHJldHVybiBtSXNFbmFibGVkOyB9CisgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCAgeyByZXR1cm4gbUlzRW5hYmxlZDsgfQogCiAgICAgLy8gRW5hYmxlIHRyYWNraW5nIG9mIENQVSB1c2FnZSBieSBjdXJyZW50IHRocmVhZDsKICAgICAvLyBhbnkgQ1BVIHVzZWQgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQgd2lsbCBiZSB0cmFja2VkLgpAQCAtNjYsMzkgKzcxLDUyIEBACiAgICAgLy8gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc2FmZSBuZXN0ZWQgZW5hYmxlL2Rpc2FibGluZy4KICAgICBib29sIHNldEVuYWJsZWQoYm9vbCBpc0VuYWJsZWQpOwogCi0gICAgLy8gQWRkIGEgc2FtcGxlIHBvaW50IGZvciBjZW50cmFsIHRlbmRlbmN5IHN0YXRpc3RpY3MsIGFuZCBhbHNvCi0gICAgLy8gZW5hYmxlIHRyYWNraW5nIGlmIG5lZWRlZC4gIElmIHRyYWNraW5nIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIHRoZW4KLSAgICAvLyBlbmFibGVzIHRyYWNraW5nIGJ1dCBkb2VzIG5vdCBhZGQgYSBzYW1wbGUgKGl0IGlzIG5vdCBwb3NzaWJsZSB0byBhZGQKLSAgICAvLyBhIHNhbXBsZSB0aGUgZmlyc3QgdGltZSBiZWNhdXNlIG5vIHByZXZpb3VzKS4gIE90aGVyd2lzZSBpZiB0cmFja2luZyBpcwotICAgIC8vIGVuYWJsZWQsIHRoZW4gYWRkcyBhIHNhbXBsZSBmb3IgdHJhY2tlZCBDUFUgbnMgc2luY2UgdGhlIHByZXZpb3VzCisgICAgLy8gQWRkIGEgc2FtcGxlIHBvaW50LCBhbmQgYWxzbyBlbmFibGUgdHJhY2tpbmcgaWYgbmVlZGVkLgorICAgIC8vIElmIHRyYWNraW5nIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIHRoZW4gdGhpcyBjYWxsIGVuYWJsZXMgdHJhY2tpbmcgYnV0CisgICAgLy8gZG9lcyBfbm90XyBhZGQgYSBzYW1wbGUgLS0gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBhIHNhbXBsZSB0aGUKKyAgICAvLyBmaXJzdCB0aW1lIGJlY2F1c2UgdGhlcmUgaXMgbm8gcHJldmlvdXMgcG9pbnQgdG8gc3VidHJhY3QgZnJvbS4KKyAgICAvLyBPdGhlcndpc2UsIGlmIHRyYWNraW5nIGlzIGVuYWJsZWQsCisgICAgLy8gdGhlbiBhZGRzIGEgc2FtcGxlIGZvciB0cmFja2VkIENQVSBucyBzaW5jZSB0aGUgcHJldmlvdXMKICAgICAvLyBzYW1wbGUsIG9yIHNpbmNlIHRoZSBmaXJzdCBjYWxsIHRvIHNhbXBsZUFuZEVuYWJsZSgpLCBlbmFibGUoKSwgb3IKICAgICAvLyBzZXRFbmFibGVkKHRydWUpLiAgSWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgc2FtcGxlIGJ1dCB0cmFja2luZyBpcwogICAgIC8vIG5vdyBkaXNhYmxlZCwgdGhlbiBhZGRzIGEgc2FtcGxlIGZvciB0aGUgdHJhY2tlZCBDUFUgbnMgYWNjdW11bGF0ZWQKICAgICAvLyB1cCB1bnRpbCB0aGUgbW9zdCByZWNlbnQgZGlzYWJsZSgpLCByZXNldHMgdGhpcyBhY2N1bXVsYXRvciwgYW5kIHRoZW4KICAgICAvLyBlbmFibGVzIHRyYWNraW5nLiAgQ2FsbGluZyB0aGlzIG1ldGhvZCByYXRoZXIgdGhhbiBlbmFibGUoKSBmb2xsb3dlZAogICAgIC8vIGJ5IHNhbXBsZSgpIGF2b2lkcyBhIHJhY2UgY29uZGl0aW9uIGZvciB0aGUgZmlyc3Qgc2FtcGxlLgotICAgIHZvaWQgc2FtcGxlQW5kRW5hYmxlKCk7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzYW1wbGUgJ25zJyBpcyB2YWxpZCwgb3IgZmFsc2UgaWYgaW52YWxpZC4KKyAgICAvLyBOb3RlIHRoYXQgJ25zJyBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHBhc3NlZCBieSByZWZlcmVuY2UuCisgICAgLy8gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIGluaXRpYWxpemUgdGhpcyB2YXJpYWJsZS4KKyAgICAvLyBUaGUgdW5pdHMgYXJlIENQVSBuYW5vc2Vjb25kcyBjb25zdW1lZCBieSBjdXJyZW50IHRocmVhZC4KKyAgICBib29sIHNhbXBsZUFuZEVuYWJsZShkb3VibGUmIG5zKTsKIAotICAgIC8vIEFkZCBhIHNhbXBsZSBwb2ludCBmb3IgY2VudHJhbCB0ZW5kZW5jeSBzdGF0aXN0aWNzLCBidXQgZG8gbm90CisgICAgLy8gQWRkIGEgc2FtcGxlIHBvaW50LCBidXQgZG8gbm90CiAgICAgLy8gY2hhbmdlIHRoZSB0cmFja2luZyBlbmFibGVkIHN0YXR1cy4gIElmIHRyYWNraW5nIGhhcyBlaXRoZXIgbmV2ZXIgYmVlbgogICAgIC8vIGVuYWJsZWQsIG9yIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQgc2luY2UgdGhlIGxhc3Qgc2FtcGxlLCB0aGVuIGxvZyBhIHdhcm5pbmcKICAgICAvLyBhbmQgZG9uJ3QgYWRkIHNhbXBsZS4gIE90aGVyd2lzZSwgYWRkcyBhIHNhbXBsZSBmb3IgdHJhY2tlZCBDUFUgbnMgc2luY2UKICAgICAvLyB0aGUgcHJldmlvdXMgc2FtcGxlIG9yIHNpbmNlIHRoZSBmaXJzdCBjYWxsIHRvIHNhbXBsZUFuZEVuYWJsZSgpLAogICAgIC8vIGVuYWJsZSgpLCBvciBzZXRFbmFibGVkKHRydWUpIGlmIG5vIHByZXZpb3VzIHNhbXBsZS4KLSAgICB2b2lkIHNhbXBsZSgpOworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2FtcGxlIGlzIHZhbGlkLCBvciBmYWxzZSBpZiBpbnZhbGlkLgorICAgIC8vIE5vdGUgdGhhdCAnbnMnIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KKyAgICAvLyBUaGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlLgorICAgIC8vIFRoZSB1bml0cyBhcmUgQ1BVIG5hbm9zZWNvbmRzIGNvbnN1bWVkIGJ5IGN1cnJlbnQgdGhyZWFkLgorICAgIGJvb2wgc2FtcGxlKGRvdWJsZSYgbnMpOwogCi0gICAgLy8gUmV0dXJuIHRoZSBlbGFwc2VkIGRlbHRhIHdhbGwgY2xvY2sgbnMgc2luY2UgaW5pdGlhbCBlbmFibGUgb3Igc3RhdGlzdGljcyByZXNldCwKKyAgICAvLyBSZXR1cm4gdGhlIGVsYXBzZWQgZGVsdGEgd2FsbCBjbG9jayBucyBzaW5jZSBpbml0aWFsIGVuYWJsZSBvciByZXNldCwKICAgICAvLyBhcyByZXBvcnRlZCBieSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykuCiAgICAgbG9uZyBsb25nIGVsYXBzZWQoKSBjb25zdDsKIAotICAgIC8vIFJlc2V0IHN0YXRpc3RpY3MgYW5kIGVsYXBzZWQuICBIYXMgbm8gZWZmZWN0IG9uIHRyYWNraW5nIG9yIGFjY3VtdWxhdG9yLgotICAgIHZvaWQgcmVzZXRTdGF0aXN0aWNzKCk7CisgICAgLy8gUmVzZXQgZWxhcHNlZCB3YWxsIGNsb2NrLiAgSGFzIG5vIGVmZmVjdCBvbiB0cmFja2luZyBvciBhY2N1bXVsYXRvci4KKyAgICB2b2lkIHJlc2V0RWxhcHNlZCgpOwogCi0gICAgLy8gUmV0dXJuIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjZW50cmFsIHRlbmRlbmN5IHN0YXRpc3RpY3MuCi0gICAgLy8gTm90ZSB0aGF0IG9ubHkgdGhlIGNvbnN0IG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBvbiB0aGlzIG9iamVjdC4KLSAgICBjb25zdCBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzJiBzdGF0aXN0aWNzKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0YXRpc3RpY3M7Ci0gICAgfQorICAgIC8vIFJldHVybiBjdXJyZW50IGNsb2NrIGZyZXF1ZW5jeSBmb3Igc3BlY2lmaWVkIENQVSwgaW4ga0h6LgorICAgIC8vIFlvdSBjYW4gZ2V0IHlvdXIgQ1BVIG51bWJlciB1c2luZyBzY2hlZF9nZXRjcHUoMikuICBOb3RlIHRoYXQsIHVubGVzcyBDUFUgYWZmaW5pdHkKKyAgICAvLyBoYXMgYmVlbiBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHksIHRoZSBDUFUgbnVtYmVyIGNhbiBjaGFuZ2UuCisgICAgLy8gQWxzbyBub3RlIHRoYXQsIHVubGVzcyB0aGUgQ1BVIGdvdmVybm9yIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXBwcm9wcmlhdGVseSwKKyAgICAvLyB0aGUgQ1BVIGZyZXF1ZW5jeSBjYW4gY2hhbmdlLiAgQW5kIGV2ZW4gaWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgbG9ja2VkIGRvd24KKyAgICAvLyB0byBhIHBhcnRpY3VsYXIgdmFsdWUsIHRoYXQgdGhlIGZyZXF1ZW5jeSBtaWdodCBzdGlsbCBiZSBhZGp1c3RlZAorICAgIC8vIHRvIHByZXZlbnQgdGhlcm1hbCBvdmVybG9hZC4gIFRoZXJlZm9yZSB5b3Ugc2hvdWxkIHBvbGwgZm9yIHlvdXIgdGhyZWFkJ3MKKyAgICAvLyBjdXJyZW50IENQVSBudW1iZXIgYW5kIGNsb2NrIGZyZXF1ZW5jeSBwZXJpb2RpY2FsbHkuCisgICAgdWludDMyX3QgZ2V0Q3B1a0h6KGludCBjcHVOdW0pOwogCiBwcml2YXRlOgogICAgIGJvb2wgbUlzRW5hYmxlZDsgICAgICAgICAgICAgICAgLy8gd2hldGhlciB0cmFja2luZyBpcyBjdXJyZW50bHkgZW5hYmxlZApAQCAtMTA3LDcgKzEyNSwxNSBAQAogICAgIHN0cnVjdCB0aW1lc3BlYyBtUHJldmlvdXNUczsgICAgLy8gbW9zdCByZWNlbnQgdGhyZWFkIENQVSB0aW1lLCB2YWxpZCBvbmx5IGlmIG1Jc0VuYWJsZWQgaXMgdHJ1ZQogICAgIHN0cnVjdCB0aW1lc3BlYyBtTW9ub3RvbmljVHM7ICAgLy8gbW9zdCByZWNlbnQgbW9ub3RvbmljIHRpbWUKICAgICBib29sIG1Nb25vdG9uaWNLbm93bjsgICAgICAgICAgIC8vIHdoZXRoZXIgbU1vbm90b25pY1RzIGhhcyBiZWVuIHNldAotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbVN0YXRpc3RpY3M7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9DUFUgPSA4OworICAgIHN0YXRpYyBpbnQgc1NjYWxpbmdGZHNbTUFYX0NQVV07Ly8gZmlsZSBkZXNjcmlwdG9yIHBlciBDUFUgZm9yIHJlYWRpbmcgc2NhbGluZ19jdXJfZnJlcQorICAgIHVpbnQzMl90IG1DdXJyZW50a0h6W01BWF9DUFVdOyAgLy8gY3VycmVudCBDUFUgZnJlcXVlbmN5IGluIGtIeiwgbm90IHN0YXRpYyB0byBhdm9pZCBhIHJhY2UKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3Qgc09uY2VDb250cm9sOworICAgIHN0YXRpYyBpbnQgc0tlcm5lbE1heDsgICAgICAgICAgLy8gbGlrZSBNQVhfQ1BVLCBidXQgZGV0ZXJtaW5lZCBhdCBydW50aW1lID09IGNwdS9rZXJuZWxfbWF4ICsgMQorICAgIHN0YXRpYyB2b2lkIGluaXQoKTsKIH07CiAKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiAjZW5kaWYgLy8gIF9USFJFQURfQ1BVX1VTQUdFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IDM5ZDU4YWIuLjAwZmFjYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtNjQsNiArNjQsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsKiByZXBseSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBuZXh0KSA9IDA7CiAKICAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCiAgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCmluZGV4IDlmNmZmNGMuLjM4YTNlNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGlic29uaXZveC9qZXQuaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc190eXBlcy5oPgotI2luY2x1ZGUgIkF1ZGlvVHJhY2suaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDgxNjhkZmYuLmQ0YWEyMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTEwNyw2ICsxMDcsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNsb3NlKCkgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIG5lZWRzVHJhaWxpbmdQYWRkaW5nKCkgeyByZXR1cm4gdHJ1ZTsgfQogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSgpIDogbUNvb2tpZSgwKSwgbU5vdGlmeSgwKSB7fQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDljZDVmOWYuLmE2OGFiNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTk2LDYgKzk2LDkgQEAKIGVudW0gbWVkaWFfaW5mb190eXBlIHsKICAgICAvLyAweHgKICAgICBNRURJQV9JTkZPX1VOS05PV04gPSAxLAorICAgIC8vIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKKyAgICAvLyBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrCisgICAgTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAogICAgIC8vIDd4eAogICAgIC8vIFRoZSB2aWRlbyBpcyB0b28gY29tcGxleCBmb3IgdGhlIGRlY29kZXI6IGl0IGNhbid0IGRlY29kZSBmcmFtZXMgZmFzdAogICAgIC8vIGVub3VnaC4gUG9zc2libHkgb25seSB0aGUgYXVkaW8gcGxheXMgZmluZSBhdCB0aGlzIHN0YWdlLgpAQCAtMTE3LDYgKzEyMCw5IEBACiAgICAgTUVESUFfSU5GT19OT1RfU0VFS0FCTEUgPSA4MDEsCiAgICAgLy8gTmV3IG1lZGlhIG1ldGFkYXRhIGlzIGF2YWlsYWJsZS4KICAgICBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSA9IDgwMiwKKworICAgIC8vOXh4CisgICAgTUVESUFfSU5GT19USU1FRF9URVhUX0VSUk9SID0gOTAwLAogfTsKIAogCkBAIC0xMzcsOSArMTQzLDYgQEAKIC8vIFRoZSBzYW1lIGVudW0gc3BhY2UgaXMgdXNlZCBmb3IgYm90aCBzZXQgYW5kIGdldCwgaW4gY2FzZSB0aGVyZSBhcmUgZnV0dXJlIGtleXMgdGhhdAogLy8gY2FuIGJlIGJvdGggc2V0IGFuZCBnZXQuICBCdXQgYXMgb2Ygbm93LCBhbGwgcGFyYW1ldGVycyBhcmUgZWl0aGVyIHNldCBvbmx5IG9yIGdldCBvbmx5LgogZW51bSBtZWRpYV9wYXJhbWV0ZXJfa2V5cyB7Ci0gICAgS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX1RSQUNLX0lOREVYID0gMTAwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKLSAgICBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfQUREX09VVF9PRl9CQU5EX1NPVVJDRSA9IDEwMDEsICAgICAvLyBzZXQgb25seQotCiAgICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCiAgICAgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUyA9IDExMDAsICAgICAgICAgICAgLy8gc2V0IG9ubHkKIApAQCAtMTUyLDYgKzE1NSwyMyBAQAogICAgIEtFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CiB9OwogCisvLyBLZWVwIElOVk9LRV9JRF8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgorZW51bSBtZWRpYV9wbGF5ZXJfaW52b2tlX2lkcyB7CisgICAgSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPID0gMSwKKyAgICBJTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRSA9IDIsCisgICAgSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0VfRkQgPSAzLAorICAgIElOVk9LRV9JRF9TRUxFQ1RfVFJBQ0sgPSA0LAorICAgIElOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSyA9IDUsCit9OworCisvLyBLZWVwIE1FRElBX1RSQUNLX1RZUEVfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KK2VudW0gbWVkaWFfdHJhY2tfdHlwZSB7CisgICAgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID0gMCwKKyAgICBNRURJQV9UUkFDS19UWVBFX1ZJREVPID0gMSwKKyAgICBNRURJQV9UUkFDS19UWVBFX0FVRElPID0gMiwKKyAgICBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCA9IDMsCit9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyByZWYtY291bnRlZCBvYmplY3QgZm9yIGNhbGxiYWNrcwogY2xhc3MgTWVkaWFQbGF5ZXJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQpAQCAtMjA3LDYgKzIyNyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBjaGFyKiBhZGRyU3RyaW5nLCB1aW50MTZfdCBwb3J0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlZmQzNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSEFSRFdBUkVfQVBJX0hfCi0KLSNkZWZpbmUgSEFSRFdBUkVfQVBJX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIHRoZSBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgotLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzJyBleHRlbnNpb24KLS8vIGlzIGdpdmVuLgotLy8KLS8vIFdoZW4gQW5kcm9pZCBuYXRpdmUgYnVmZmVyIHVzZSBpcyBkaXNhYmxlZCBmb3IgYSBwb3J0ICh0aGUgZGVmYXVsdCBzdGF0ZSksCi0vLyB0aGUgT01YIG5vZGUgc2hvdWxkIG9wZXJhdGUgYXMgbm9ybWFsLCBhbmQgZXhwZWN0IFVzZUJ1ZmZlciBjYWxscyB0byBzZXQgaXRzCi0vLyBidWZmZXJzLiAgVGhpcyBpcyB0aGUgbW9kZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIENQVSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciBpcwotLy8gcmVxdWlyZWQuCi0vLwotLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGhhcyBiZWVuIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gcG9ydCwgdGhlIHZpZGVvCi0vLyBjb2xvciBmb3JtYXQgZm9yIHRoZSBwb3J0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIGFuIEFuZHJvaWQgcGl4ZWwgZm9ybWF0Ci0vLyByYXRoZXIgdGhhbiBhbiBPTVggY29sb3IgZm9ybWF0LiAgVGhlIG5vZGUgc2hvdWxkIHRoZW4gZXhwZWN0IHRvIHJlY2VpdmUKLS8vIFVzZUFuZHJvaWROYXRpdmVCdWZmZXIgY2FsbHMgKHZpYSBPTVhfU2V0UGFyYW1ldGVyKSByYXRoZXIgdGhhbiBVc2VCdWZmZXIKLS8vIGNhbGxzIGZvciB0aGF0IHBvcnQuCi1zdHJ1Y3QgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBlbmFibGU7Ci19OwotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIoKSB3aGVuIHRoZSBleHRlbnNpb24KLS8vIGluZGV4ICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIKLS8vIGlzIGdpdmVuLgotLy8KLS8vIFdoZW4gbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgdmlkZW8gYnVmZmVycyBwYXNzZWQgYmV0d2VlbiBPTVggY2xpZW50cwotLy8gYW5kIE9NWCBjb21wb25lbnRzLCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnVmZmVyIGRhdGEgaXMgdXAgdG8gdGhlCi0vLyBidWZmZXIgcmVjZWl2ZXIsIGFuZCB0aGUgZGF0YSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgYWN0dWFsIHZpZGVvIGRhdGEsIGJ1dAotLy8gc29tZSBpbmZvcm1hdGlvbiBoZWxwZnVsIGZvciB0aGUgcmVjZWl2ZXIgdG8gbG9jYXRlIHRoZSBhY3R1YWwgZGF0YS4KLS8vIFRoZSBidWZmZXIgcmVjZWl2ZXIgdGh1cyBuZWVkcyB0byBrbm93IGhvdyB0byBpbnRlcnByZXQgd2hhdCBpcyBzdG9yZWQKLS8vIGluIHRoZXNlIGJ1ZmZlcnMsIHdpdGggbWVjaGFuaXNtcyBwcmUtZGV0ZXJtaW5lZCBleHRlcm5hbGx5LiBIb3cgdG8KLS8vIGludGVycHJldCB0aGUgbWV0YSBkYXRhIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgbWV0aG9kLgotLy8KLS8vIEN1cnJlbnRseSwgdGhpcyBpcyBzcGVjaWZpY2FsbHkgdXNlZCB0byBwYXNzIG1ldGEgZGF0YSBmcm9tIHZpZGVvIHNvdXJjZQotLy8gKGNhbWVyYSBjb21wb25lbnQsIGZvciBpbnN0YW5jZSkgdG8gdmlkZW8gZW5jb2RlciB0byBhdm9pZCBtZW1jcHlpbmcgb2YKLS8vIGlucHV0IHZpZGVvIGZyYW1lIGRhdGEuIFRvIGRvIHRoaXMsIGJTdG9yZU1ldGFEdGEgaXMgc2V0IHRvIE9NWF9UUlVFLgotLy8gSWYgYlN0b3JlTWV0YURhdGEgaXMgc2V0IHRvIGZhbHNlLCByZWFsIFlVViBmcmFtZSBkYXRhIHdpbGwgYmUgc3RvcmVkCi0vLyBpbiB0aGUgYnVmZmVycy4gSW4gYWRkaXRpb24sIGlmIG5vIE9NWF9TZXRQYXJhbWV0ZXIoKSBjYWxsIGlzIG1hZGUKLS8vIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uIGluZGV4LCByZWFsIFlVViBkYXRhIGlzIHN0b3JlZAotLy8gaW4gdGhlIGJ1ZmZlcnMuCi1zdHJ1Y3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJTdG9yZU1ldGFEYXRhOwotfTsKLQotLy8gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgotLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXInIGV4dGVuc2lvbiBpcwotLy8gZ2l2ZW4uICBUaGlzIGNhbGwgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBpZiBhIHByaW9yIGNhbGwgd2FzIG1hZGUgd2l0aCB0aGUKLS8vICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbiBpbmRleCwKLS8vIGVuYWJsaW5nIHVzZSBvZiBBbmRyb2lkIG5hdGl2ZSBidWZmZXJzLgotc3RydWN0IFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUFRSIHBBcHBQcml2YXRlOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGVhZGVyOwotICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dCdWZmZXI+JiBuYXRpdmVCdWZmZXI7Ci19OwotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9HZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCi0vLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZ2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlJwotLy8gZXh0ZW5zaW9uIGlzIGdpdmVuLiAgVGhlIHVzYWdlIGJpdHMgcmV0dXJuZWQgZnJvbSB0aGlzIHF1ZXJ5IHdpbGwgYmUgdXNlZCB0bwotLy8gYWxsb2NhdGUgdGhlIEdyYWxsb2MgYnVmZmVycyB0aGF0IGdldCBwYXNzZWQgdG8gdGhlIHVzZUFuZHJvaWROYXRpdmVCdWZmZXIKLS8vIGNvbW1hbmQuCi1zdHJ1Y3QgR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlUGFyYW1zIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLy8gSU4KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLy8gSU4KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLy8gSU4KLSAgICBPTVhfVTMyIG5Vc2FnZTsgICAgICAgICAgICAgLy8gT1VUCi19OwotCi0vLyBBbiBlbnVtIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlIHRvIGluZGljYXRlIGFuIG9wYXF1ZSBjb2xvcmZvcm1hdAotLy8gaXMgZGVjbGFyZWQgaW4gbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAotLy8gVGhpcyB3aWxsIGluZm9ybSB0aGUgZW5jb2RlciB0aGF0IHRoZSBhY3R1YWwKLS8vIGNvbG9yZm9ybWF0IHdpbGwgYmUgcmVsYXllZCBieSB0aGUgR1JhbGxvYyBCdWZmZXJzLgotLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgID0gMHg3RjAwMDAwMSwKLQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1leHRlcm4gYW5kcm9pZDo6T01YUGx1Z2luQmFzZSAqY3JlYXRlT01YUGx1Z2luKCk7Ci0KLSNlbmRpZiAgLy8gSEFSRFdBUkVfQVBJX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAppbmRleCAyZWIyNTllLi40NTdkNWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKQEAgLTU0LDYgKzU0LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNOwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhZGF0YUJ1ZmZlclR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZjhhYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQURBVEFfQlVGRkVSX1RZUEVfSAotI2RlZmluZSBNRVRBREFUQV9CVUZGRVJfVFlQRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0jZW5kaWYKLQotLyoKLSAqIE1ldGFkYXRhQnVmZmVyVHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXJzIHRoYXQKLSAqIGNhbiBiZSBwYXNzZWQgdG8gdmlkZW8gZW5jb2RlciBjb21wb25lbnQgZm9yIGVuY29kaW5nLCB2aWEgU3RhZ2VmcmlnaHQKLSAqIG1lZGlhIHJlY29yZGluZyBmcmFtZXdvcmsuIFRvIHNlZSBob3cgdG8gd29yayB3aXRoIHRoZSBtZXRhZGF0YSBidWZmZXJzCi0gKiBpbiBtZWRpYSByZWNvcmRpbmcgZnJhbWV3b3JrLCBwbGVhc2UgY29uc3VsdCBIYXJkd2FyZUFQSS5oCi0gKgotICogVGhlIGNyZWF0b3Igb2YgbWV0YWRhdGEgYnVmZmVycyBhbmQgdmlkZW8gZW5jb2RlciBzaGFyZSBjb21tb24ga25vd2xlZGdlCi0gKiBvbiB3aGF0IGlzIGFjdHVhbGx5IGJlaW5nIHN0b3JlZCBpbiB0aGVzZSBtZXRhZGF0YSBidWZmZXJzLCBhbmQKLSAqIGhvdyB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIgY29tcG9uZW50Ci0gKiB0byBsb2NhdGUgdGhlIGFjdHVhbCBwaXhlbCBkYXRhIGFzIHRoZSBzb3VyY2UgaW5wdXQgZm9yIHZpZGVvCi0gKiBlbmNvZGVyLCBwbHVzIHdoYXRldmVyIG90aGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVjZXNzYXJ5LiBTdGFnZWZyaWdodAotICogbWVkaWEgcmVjb3JkaW5nIGZyYW1ld29yayBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgc3BlY2lmaWMgYWJvdXQgdGhlCi0gKiBtZXRhZGF0YSBidWZmZXJzLCBleGNlcHQgZm9yIHJlY2V2aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXRhZGF0YSBidWZmZXIKLSAqIGFzIHRoZSBzb3VyY2UgaW5wdXQsIG1ha2luZyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHBhc3NpbmcgdGhlCi0gKiBjb3B5IHZpYSBPcGVuTUFYIEFQSSB0byB0aGUgdmlkZW8gZW5jb2RlciBjb21wb25lbnQuCi0gKgotICogVGhlIGNyZWF0b3Igb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlcnMgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QKLSAqIDQgYnl0ZXMgaW4gZXZlcnkgbWV0YWRhdGEgYnVmZmVyIGluZGljYXRlcyBpdHMgYnVmZmVyIHR5cGUsCi0gKiBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciBjb250YWlucyB0aGUKLSAqIGFjdHVhbCBtZXRhZGF0YSBpbmZvcm1hdGlvbi4gV2hlbiBhIHZpZGVvIGVuY29kZXIgY29tcG9uZW50IHJlY2VpdmVzCi0gKiBhIG1ldGFkYXRhIGJ1ZmZlciwgaXQgdXNlcyB0aGUgZmlyc3QgNCBieXRlcyBpbiB0aGF0IGJ1ZmZlciB0byBmaW5kCi0gKiBvdXQgdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHRha2VzIGFjdGlvbiBhcHByb3ByaWF0ZQotICogdG8gdGhhdCB0eXBlIG9mIG1ldGFkYXRhIGJ1ZmZlcnMgKGZvciBpbnN0YW5jZSwgbG9jYXRlIHRoZSBhY3R1YWwKLSAqIHBpeGVsIGRhdGEgaW5wdXQgYW5kIHRoZW4gZW5jb2RpbmcgdGhlIGlucHV0IGRhdGEgdG8gcHJvZHVjZSBhCi0gKiBjb21wcmVzc2VkIG91dHB1dCBidWZmZXIpLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGxheW91dCBvZiBhIG1ldGFkYXRhIGJ1ZmZlciwKLSAqIHdoZXJlIGJ1ZmZlciB0eXBlIGlzIGEgNC1ieXRlIGZpZWxkIG9mIE1ldGFkYXRhQnVmZmVyVHlwZSwKLSAqIGFuZCB0aGUgcGF5bG9hZCBpcyB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgIGJ1ZmZlciB0eXBlICB8ICAgICAgICAgIHBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqLwotdHlwZWRlZiBlbnVtIHsKLQotICAgIC8qCi0gICAgICoga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKLSAgICAgKiB0aGUgc291cmNlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaXMgdGhlIGNhbWVyYSBjb21wb25lbnQuCi0gICAgICovCi0gICAga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSAgPSAwLAotCi0gICAgLyoKLSAgICAgKiBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKLSAgICAgKiB0aGUgcGF5bG9hZCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMKLSAgICAgKiBhIGJ1ZmZlcl9oYW5kbGVfdC4KLSAgICAgKiBTbyBpbiB0aGlzIGNhc2UsdGhlIG1ldGFkYXRhIHRoYXQgdGhlIGVuY29kZXIgcmVjZWl2ZXMKLSAgICAgKiB3aWxsIGhhdmUgYSBieXRlIHN0cmVhbSB0aGF0IGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgKiAxLiBGaXJzdCwgdGhlcmUgaXMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSBHUkFsbG9jCi0gICAgICogc291cmNlIChrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkKLSAgICAgKiAyLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJfaGFuZGxlX3QgdGhhdCBpcyBhIGhhbmRsZSB0byB0aGUKLSAgICAgKiBHUmFsbG9jIGJ1ZmZlci4gVGhlIGVuY29kZXIgbmVlZHMgdG8gaW50ZXJwcmV0IHRoaXMgR1JhbGxvYyBoYW5kbGUKLSAgICAgKiBhbmQgZW5jb2RlIHRoZSBmcmFtZXMuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiB8ICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSB8IHNpemVvZihidWZmZXJfaGFuZGxlX3QpIHwKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqLwotICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlID0gMSwKLQotICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KLQotfSBNZXRhZGF0YUJ1ZmZlclR5cGU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIE1FVEFEQVRBX0JVRkZFUl9UWVBFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDhlMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBPTVhfUExVR0lOX0JBU0VfSF8KLQotI2RlZmluZSBPTVhfUExVR0lOX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhDb21wb25lbnRCYXNlOwotCi1zdHJ1Y3QgT01YUGx1Z2luQmFzZSB7Ci0gICAgT01YUGx1Z2luQmFzZSgpIHt9Ci0gICAgdmlydHVhbCB+T01YUGx1Z2luQmFzZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgPSAwOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIE9NWF9VMzIgaW5kZXgpID0gMDsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpID0gMDsKLQotcHJpdmF0ZToKLSAgICBPTVhQbHVnaW5CYXNlKGNvbnN0IE9NWFBsdWdpbkJhc2UgJik7Ci0gICAgT01YUGx1Z2luQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE9NWFBsdWdpbkJhc2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9NWF9QTFVHSU5fQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9BdWRpby5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9BdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgyODQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIEBmaWxlIE9NWF9BdWRpby5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IEF1ZGlvIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW5taWx0cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9BdWRpb19oCi0jZGVmaW5lIE9NWF9BdWRpb19oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgbWlkaSBNSURJCi0gKiBAaW5ncm91cCBhdWRpbwotICovCi0gCi0vKiogQGRlZmdyb3VwIGVmZmVjdHMgQXVkaW8gZWZmZWN0cwotICogQGluZ3JvdXAgYXVkaW8KLSAqLwotCi0vKiogQGRlZmdyb3VwIGF1ZGlvIE9wZW5NQVggSUwgQXVkaW8gRG9tYWluCi0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEF1ZGlvIGRvbWFpbgotICogQHsKLSAqLwotCi0vKiogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGF1ZGlvIGNvZGluZ3MuICAKLSAqICBJZiAiT01YX0FVRElPX0NvZGluZ1VudXNlZCIgaXMgc2VsZWN0ZWQsIHRoZSBjb2Rpbmcgc2VsZWN0aW9uIG11c3QgCi0gKiAgYmUgZG9uZSBpbiBhIHZlbmRvciBzcGVjaWZpYyB3YXkuICBTaW5jZSB0aGlzIGlzIGZvciBhbiBhdWRpbyAKLSAqICBwcm9jZXNzaW5nIGVsZW1lbnQgdGhpcyBlbnVtIGlzIHJlbGV2YW50LiAgSG93ZXZlciwgZm9yIGFub3RoZXIgCi0gKiAgdHlwZSBvZiBjb21wb25lbnQgb3RoZXIgZW51bXMgd291bGQgYmUgaW4gdGhpcyBhcmVhLgotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NPRElOR1RZUEUgewotICAgIE9NWF9BVURJT19Db2RpbmdVbnVzZWQgPSAwLCAgLyoqPCBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGNvZGluZyBpcyBOL0EgICovCi0gICAgT01YX0FVRElPX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IGF1dG8gZGV0ZWN0aW9uIG9mIGF1ZGlvIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQQ00sICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQQ00gY29kaW5nICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FEUENNLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFEUENNIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdBTVIsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBTVIgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBmdWxscmF0ZSAoaS5lLiBHU002MTApICovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUVGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEqLwotICAgIE9NWF9BVURJT19Db2RpbmdHU01IUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BEQ0ZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUERDRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQRENIUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1RETUFGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MjApICovCi0gICAgT01YX0FVRElPX0NvZGluZ1RETUFFRlIsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MTApICovCi0gICAgT01YX0FVRElPX0NvZGluZ1FDRUxQOCwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDhrYnBzIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdRQ0VMUDEzLCAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBRQ0VMUCAxM2ticHMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0VWUkMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEVWUkMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1NNViwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNNViBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcxMSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MTEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0c3MjMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzIzIGRvdCAxIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzI2LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyNiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcyOSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjkgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FBQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFBQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nTVAzLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTVAzIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdTQkMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBTQkMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1ZPUkJJUywgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFZPUkJJUyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nV01BLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgV01BIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdSQSwgICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBSQSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nTUlESSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTUlESSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19DT0RJTkdUWVBFOwotCi0KLS8qKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqICBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBhdWRpbyAKLSAqICBwYXRoLiAgSWYgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQotICogIHBvcnQgKHN1Y2ggYXMgZnJlcXVlbmN5KSwgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIG11c3QgYmUgc2VudCBzdWNoIGFzIHRoZQotICogIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBzdHJ1Y3R1cmUgdG8gc3VwcGx5IHRoZSBleHRyYSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9ydC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1NUUklORyBjTUlNRVR5cGU7ICAgICAgICAgICAgLyoqPCBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQgKi8KLSAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsgLyoqIDwgcGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBvdXRwdXQgZGV2aWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMCAqLwotICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsgIC8qKjwgVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9NWCBjb21wb25lbnQgKi8KLSAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLwotfSBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFOwotCi0KLS8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKLSAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldCAqLwotICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLwotICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgcG9ydCAoZS5nLiBQQ00sIEFNUiwgTVAzLCBldGMpICovCi19IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRTsKLQotCi0vKiogUENNIG1vZGUgdHlwZSAgKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX1BDTU1PREVUWVBFIHsgCi0gICAgT01YX0FVRElPX1BDTU1vZGVMaW5lYXIgPSAwLCAgLyoqPCBMaW5lYXIgUENNIGVuY29kZWQgZGF0YSAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZUFMYXcsICAgICAgICAvKio8IEEgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZU1VTGF3LCAgICAgICAvKio8IE11IGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fUENNTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19QQ01NT0RFVFlQRTsgCi0KLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMVFlQRSB7Ci0gICAgT01YX0FVRElPX0NoYW5uZWxOb25lID0gMHgwLCAgICAvKio8IFVudXNlZCBvciBlbXB0eSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTEYgICA9IDB4MSwgICAgLyoqPCBMZWZ0IGZyb250ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxSRiAgID0gMHgyLCAgICAvKio8IFJpZ2h0IGZyb250ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxDRiAgID0gMHgzLCAgICAvKio8IENlbnRlciBmcm9udCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTFMgICA9IDB4NCwgICAgLyoqPCBMZWZ0IHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxSUyAgID0gMHg1LCAgICAvKio8IFJpZ2h0IHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMRkUgID0gMHg2LCAgICAvKio8IExvdyBmcmVxdWVuY3kgZWZmZWN0cyAqLwotICAgIE9NWF9BVURJT19DaGFubmVsQ1MgICA9IDB4NywgICAgLyoqPCBCYWNrIHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMUiAgID0gMHg4LCAgICAvKio8IExlZnQgcmVhci4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbFJSICAgPSAweDksICAgIC8qKjwgUmlnaHQgcmVhci4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ2hhbm5lbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNYXggID0gMHg3RkZGRkZGRiAKLX0gT01YX0FVRElPX0NIQU5ORUxUWVBFOwotCi0jZGVmaW5lIE9NWF9BVURJT19NQVhDSEFOTkVMUyAxNiAgLyoqPCBtYXhpbXVtIG51bWJlciBkaXN0aW5jdCBhdWRpbyBjaGFubmVscyB0aGF0IGEgYnVmZmVyIG1heSBjb250YWluICovCi0jZGVmaW5lIE9NWF9NSU5fUENNUEFZTE9BRF9NU0VDIDUgLyoqPCBNaW5pbXVtIGF1ZGlvIGJ1ZmZlciBwYXlsb2FkIHNpemUgZm9yIHVuY29tcHJlc3NlZCAoUENNKSBhdWRpbyAqLwotCi0vKiogUENNIGZvcm1hdCBkZXNjcmlwdGlvbiAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIChlLmcuIDIgZm9yIHN0ZXJlbykgKi8gCi0gICAgT01YX05VTUVSSUNBTERBVEFUWVBFIGVOdW1EYXRhOyAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIHNpZ25lZCBvciB1bnNpZ25lZCAqLyAKLSAgICBPTVhfRU5ESUFOVFlQRSBlRW5kaWFuOyAgICAgICAgICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgbGl0dGxlIG9yIGJpZyBlbmRpYW4gKi8gCi0gICAgT01YX0JPT0wgYkludGVybGVhdmVkOyAgICAgICAgICAgIC8qKjwgVHJ1ZSBmb3Igbm9ybWFsIGludGVybGVhdmVkIGRhdGE7IGZhbHNlIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24taW50ZXJsZWF2ZWQgZGF0YSAoZS5nLiBibG9jayBkYXRhKSAqLyAKLSAgICBPTVhfVTMyIG5CaXRQZXJTYW1wbGU7ICAgICAgICAgICAgLyoqPCBCaXQgcGVyIHNhbXBsZSAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovIAotICAgIE9NWF9BVURJT19QQ01NT0RFVFlQRSBlUENNTW9kZTsgICAvKio8IFBDTSBtb2RlIGVudW1lcmF0aW9uICovIAotICAgIE9NWF9BVURJT19DSEFOTkVMVFlQRSBlQ2hhbm5lbE1hcHBpbmdbT01YX0FVRElPX01BWENIQU5ORUxTXTsgLyoqPCBTbG90IGkgY29udGFpbnMgY2hhbm5lbCBkZWZpbmVkIGJ5IGVDaGFubmVsTWFwW2ldICovCi0KLX0gT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFOyAKLQotCi0vKiogQXVkaW8gY2hhbm5lbCBtb2RlLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggQUFDIGFuZCBNUDMsIGFsdGhvdWdoIHRoZSBuYW1lcyBhcmUgbW9yZSBhcHByb3ByaWF0ZQotICogZm9yIHRoZSBNUDMuICBGb3IgZXhhbXBsZSwgSm9pbnRTdGVyZW8gZm9yIE1QMyBpcyBDb3VwbGluZ0NoYW5uZWxzIGZvciBBQUMuIAotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSB7Ci0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvID0gMCwgIC8qKjwgMiBjaGFubmVscywgdGhlIGJpdHJhdGUgYWxsb2NhdGlvbiBiZXR3ZWVuIHRob3NlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIGNoYW5uZWxzIGNoYW5nZXMgYWNjb3JkaW5nbHkgdG8gZWFjaCBjaGFubmVsIGluZm9ybWF0aW9uICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlSm9pbnRTdGVyZW8sIC8qKjwgbW9kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB3aGF0IGlzIGNvbW1vbiBiZXR3ZWVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgY2hhbm5lbHMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBnYWluICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlRHVhbCwgICAgICAgIC8qKjwgMiBtb25vLWNoYW5uZWxzLCBlYWNoIGNoYW5uZWwgaXMgZW5jb2RlZCB3aXRoIGhhbGYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHJhdGUgb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1vbm8sICAgICAgICAvKio8IE1vbm8gY2hhbm5lbCBtb2RlICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFOwotCi0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSB7Ci0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMUxheWVyMyA9IDAsIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyTGF5ZXIzLCAgICAgLyoqPCBNUDMgQXVkaW8gTVBFRyAyIExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDJfNUxheWVyMywgICAvKio8IE1QMyBBdWRpbyBNUEVHMi41IExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEU7Ci0KLS8qKiBNUDMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCi0gICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAgICAgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBNUDMgc3RyZWFtIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRTsKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgewotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDJBRFRTID0gMCwgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDIgZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMsICAgICAvKio8IEFBQyBBdWRpbyBEYXRhIFRyYW5zcG9ydCBTdHJlYW0gNCBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TE9BUywgICAgIC8qKjwgQUFDIExvdyBPdmVyaGVhZCBBdWRpbyBTdHJlYW0gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExBVE0sICAgICAvKio8IEFBQyBMb3cgb3ZlcmhlYWQgQXVkaW8gVHJhbnNwb3J0IE11bHRpcGxleCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRBRElGLCAgICAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBJbnRlcmNoYW5nZSBGb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkYsICAgICAgIC8qKjwgQUFDIGluc2lkZSBNUEVHLTQvSVNPIEZpbGUgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFJBVywgICAgICAgICAvKio8IEFBQyBSYXcgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRTsKLQotCi0vKiogQUFDIG1vZGUgdHlwZS4gIE5vdGUgdGhhdCB0aGUgdGVybSBwcm9maWxlIGlzIHVzZWQgd2l0aCB0aGUgTVBFRy0yCi0gKiBzdGFuZGFyZCBhbmQgdGhlIHRlcm0gb2JqZWN0IHR5cGUgYW5kIHByb2ZpbGUgaXMgdXNlZCB3aXRoIE1QRUctNCAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRXsKLSAgT01YX0FVRElPX0FBQ09iamVjdE51bGwgPSAwLCAgICAgIC8qKjwgTnVsbCwgbm90IHVzZWQgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdE1haW4gPSAxLCAgICAgIC8qKjwgQUFDIE1haW4gb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RMQywgICAgICAgICAgICAvKio8IEFBQyBMb3cgQ29tcGxleGl0eSBvYmplY3QgKEFBQyBwcm9maWxlKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0U1NSLCAgICAgICAgICAgLyoqPCBBQUMgU2NhbGFibGUgU2FtcGxlIFJhdGUgb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RMVFAsICAgICAgICAgICAvKio8IEFBQyBMb25nIFRlcm0gUHJlZGljdGlvbiBvYmplY3QgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgICAgICAgICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSAob2JqZWN0IHR5cGUgU0JSLCBIRS1BQUMgcHJvZmlsZSkgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdFNjYWxhYmxlLCAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIG9iamVjdCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0RVJMQyA9IDE3LCAgICAgLyoqPCBFUiBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChFcnJvciBSZXNpbGllbnQgQUFDLUxDKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TEQgPSAyMywgICAgICAgLyoqPCBBQUMgTG93IERlbGF5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50KSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMgPSAyOSwgICAgLyoqPCBBQUMgSGlnaCBFZmZpY2llbmN5IHdpdGggUGFyYW1ldHJpYyBTdGVyZW8gY29kaW5nIChIRS1BQUMgdjIsIG9iamVjdCB0eXBlIFBTKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fQUFDT2JqZWN0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFOwotCi0KLS8qKiBBQUMgdG9vbCB1c2FnZSAoZm9yIG5BQUN0b29scyBpbiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUpLgotICogUmVxdWlyZWQgZm9yIGVuY29kZXIgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uYWwgYXMgZGVjb2RlciBpbmZvIG91dHB1dC4KLSAqIEZvciBNUDMsIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgaXMgc3VmZmljaWVudC4gKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xOb25lIDB4MDAwMDAwMDAgLyoqPCBubyBBQUMgdG9vbHMgYWxsb3dlZCAoZW5jb2RlciBjb25maWcpIG9yIGFjdGl2ZSAoZGVjb2RlciBpbmZvIG91dHB1dCkgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xNUyAgIDB4MDAwMDAwMDEgLyoqPCBNUzogTWlkL3NpZGUgam9pbnQgY29kaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xJUyAgIDB4MDAwMDAwMDIgLyoqPCBJUzogSW50ZW5zaXR5IHN0ZXJlbyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sVE5TICAweDAwMDAwMDA0IC8qKjwgVE5TOiBUZW1wb3JhbCBOb2lzZSBTaGFwaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xQTlMgIDB4MDAwMDAwMDggLyoqPCBQTlM6IE1QRUctNCBQZXJjZXB0dWFsIE5vaXNlIHN1YnN0aXR1dGlvbiB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTFRQICAweDAwMDAwMDEwIC8qKjwgTFRQOiBNUEVHLTQgTG9uZyBUZXJtIFByZWRpY3Rpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbEFsbCAgMHg3RkZGRkZGRiAvKio8IGFsbCBBQUMgdG9vbHMgYWxsb3dlZCBvciBhY3RpdmUgKCovCi0KLS8qKiBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgKEVSKSB0b29sIHVzYWdlIChmb3IgbkFBQ0VSdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KLSAqIFJlcXVpcmVkIGZvciBFUiBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSTm9uZSAgMHgwMDAwMDAwMCAgLyoqPCBubyBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUlZDQjExIDB4MDAwMDAwMDEgIC8qKjwgVkNCMTE6IFZpcnR1YWwgQ29kZSBCb29rcyBmb3IgQUFDIHNlY3Rpb24gZGF0YSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJSVkxDICAweDAwMDAwMDAyICAvKio8IFJWTEM6IFJldmVyc2libGUgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJIQ1IgICAweDAwMDAwMDA0ICAvKio8IEhDUjogSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUkFsbCAgIDB4N0ZGRkZGRkYgIC8qKjwgYWxsIEFBQyBFUiB0b29scyBhbGxvd2VkL3VzZWQgKi8KLQotCi0vKiogQUFDIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLwotICAgIE9NWF9VMzIgbkZyYW1lTGVuZ3RoOyAgICAgICAgICAvKio8IEZyYW1lIGxlbmd0aCAoaW4gYXVkaW8gc2FtcGxlcyBwZXIgY2hhbm5lbCkgb2YgdGhlIGNvZGVjLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSAxMDI0IG9yIDk2MCAoQUFDLUxDKSwgMjA0OCAoSEUtQUFDKSwgNDgwIG9yIDUxMiAoQUFDLUxEKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfVTMyIG5BQUN0b29sczsgICAgICAgICAgICAgLyoqPCBBQUMgdG9vbCB1c2FnZSAqLwotICAgIE9NWF9VMzIgbkFBQ0VSdG9vbHM7ICAgICAgICAgICAvKio8IE1QRUctNCBBQUMgZXJyb3IgcmVzaWxpZW5jZSB0b29sIHVzYWdlICovCi0gICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIGVBQUNQcm9maWxlOyAgIC8qKjwgQUFDIHByb2ZpbGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRSBlQUFDU3RyZWFtRm9ybWF0OyAvKio8IEFBQyBzdHJlYW0gZm9ybWF0IGVudW1lcmF0aW9uICovCi0gICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLX0gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFOwotCi0KLS8qKiBWT1JCSVMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgZW5jb2RlZCBkYXRhIGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcy4gRW5jb2RpbmcgaXMgc2V0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGNsb3Nlc3QgdG8gc3BlY2lmaWVkICB2YWx1ZSAoaW4gYnBzKSAqLwotICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgLyoqPCBTZXRzIG1pbmltdW0gYml0cmF0ZSAoaW4gYnBzKS4gKi8KLSAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtYXhpbXVtIGJpdHJhdGUgKGluIGJwcykuICovCi0KLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX1MzMiBuUXVhbGl0eTsJCSAgLyoqPCBTZXRzIGVuY29kaW5nIHF1YWxpdHkgdG8gbiwgYmV0d2VlbiAtMSAobG93KSBhbmQgMTAgKGhpZ2gpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbiwgdGVoIHF1YWxpdHkgbGV2ZWwgaXMgMy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIHF1YWxpdHkgcmFuZ2UgaXMgMCAtIDEwLiAqLwotICAgIE9NWF9CT09MIGJNYW5hZ2VkOwkJICAvKio8IFNldCAgYml0cmF0ZSAgbWFuYWdlbWVudCAgbW9kZS4gVGhpcyB0dXJucyBvZmYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbCBWQlIgZW5jb2RpbmcsIGJ1dCBhbGxvd3MgaGFyZCBvciBzb2Z0IGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMgdG8gYmUgZW5mb3JjZWQgYnkgdGhlIGVuY29kZXIuIFRoaXMgbW9kZSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2xvd2VyLCBhbmQgbWF5IGFsc28gYmUgbG93ZXIgcXVhbGl0eS4gSXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3RyZWFtaW5nLiAqLwotICAgIE9NWF9CT09MIGJEb3dubWl4OwkJICAvKio8IERvd25taXggaW5wdXQgZnJvbSBzdGVyZW8gdG8gbW9ubyAoaGFzIG5vIGVmZmVjdCBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXN0ZXJlbyBzdHJlYW1zKS4gVXNlZnVsIGZvciBsb3dlci1iaXRyYXRlIGVuY29kaW5nLiAqLyAgICAgCi19IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFOwotCi0KLS8qKiBXTUEgVmVyc2lvbiAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIHsKLSAgT01YX0FVRElPX1dNQUZvcm1hdFVudXNlZCA9IDAsIC8qKjwgZm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXQ3LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDcgKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdDgsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOCAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0OSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA5ICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19XTUFGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fV01BRk9STUFUVFlQRTsKLQotCi0vKiogV01BIFByb2ZpbGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgewotICBPTVhfQVVESU9fV01BUHJvZmlsZVVudXNlZCA9IDAsICAvKio8IHByb2ZpbGUgdW51c2VkIG9yIHVua25vd24gKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVMMSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwxICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlTDIsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMiAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZUwzLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDMgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19XTUFQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRTsKLQotCi0vKiogV01BIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1dNQVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMTYgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLwotCU9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSBlUHJvZmlsZTsgIC8qKjwgUHJvZmlsZSBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLwotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLwotICAgIE9NWF9VMTYgbkJsb2NrQWxpZ247ICAgICAgLyoqPCBpcyB0aGUgYmxvY2sgYWxpZ25tZW50LCBvciBibG9jayBzaXplLCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gY29kZWMgKi8KLSAgICBPTVhfVTE2IG5FbmNvZGVPcHRpb25zOyAgIC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLwotICAgIE9NWF9VMzIgblN1cGVyQmxvY2tBbGlnbjsgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCi19IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFOwotCi0vKiogCi0gKiBSZWFsQXVkaW8gZm9ybWF0Ci0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIHsKLSAgICBPTVhfQVVESU9fUkFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9BVURJT19SQTgsICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDggY29kZWMgKi8KLSAgICBPTVhfQVVESU9fUkE5LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA5IGNvZGVjICovCi0gICAgT01YX0FVRElPX1JBMTBfQUFDLCAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGNvZGVjIGZvciBiaXRyYXRlcyBvZiBtb3JlIHRoYW4gMTI4a2JwcyAqLwotICAgIE9NWF9BVURJT19SQTEwX0NPREVDLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIGNvZGVjIGZvciBiaXRyYXRlcyBsZXNzIHRoYW4gMTI4IGticHMgKi8KLSAgICBPTVhfQVVESU9fUkExMF9MT1NTTEVTUywgICAgICAvKio8IFJlYWxBdWRpbyBMb3NzbGVzcyAqLwotICAgIE9NWF9BVURJT19SQTEwX01VTFRJQ0hBTk5FTCwgIC8qKjwgUmVhbEF1ZGlvIE11bHRpY2hhbm5lbCAqLwotICAgIE9NWF9BVURJT19SQTEwX1ZPSUNFLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIFZvaWNlIGZvciBiaXRyYXRlcyBiZWxvdyAxNSBrYnBzICovCi0gICAgT01YX0FVRElPX1JBRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19SQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1JBRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFOwotCi0vKiogUkEgKFJlYWwgQXVkaW8pIHBhcmFtcyAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgLyoqPCBpcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8gCi0gICAgT01YX1UzMiBuQml0c1BlckZyYW1lOyAgICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBiaXRzIHBlciBmcmFtZSAgKi8gCi0gICAgT01YX1UzMiBuU2FtcGxlUGVyRnJhbWU7ICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBzYW1wbGVzIHBlciBmcmFtZSAqLyAKLSAgICBPTVhfVTMyIG5Db3VwbGluZ1F1YW50Qml0czsgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIGNvdXBsaW5nIHF1YW50aXphdGlvbiBiaXRzIGluIHRoZSBzdHJlYW0gKi8gCi0gICAgT01YX1UzMiBuQ291cGxpbmdTdGFydFJlZ2lvbjsgICAvKio8IGlzIHRoZSBjb3VwbGluZyBzdGFydCByZWdpb24gaW4gdGhlIHN0cmVhbSAgKi8gCi0gICAgT01YX1UzMiBuTnVtUmVnaW9uczsgICAgICAgIC8qKjwgaXMgdGhlIG51bWJlciBvZiByZWdpb25zIHZhbHVlICovIAotICAgIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBpcyB0aGUgUmVhbEF1ZGlvIGF1ZGlvIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fUkFUWVBFOyAKLQotCi0vKiogU0JDIEFsbG9jYXRpb24gTWV0aG9kIFR5cGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIHsKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTG91ZG5lc3MsIC8qKjwgTG91ZG5lc3MgYWxsb2NhdGlvbiBtZXRob2QgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kU05SLCAgICAgIC8qKjwgU05SIGFsbG9jYXRpb24gbWV0aG9kICovCi0gIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFOwotCi0KLS8qKiBTQkMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkJsb2NrczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJsb2NrcyAqLwotICAgIE9NWF9VMzIgblN1YmJhbmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHN1YmJhbmRzICovCi0gICAgT01YX1UzMiBuQml0UG9vbDsgICAgICAgICAgLyoqPCBCaXRwb29sIHZhbHVlICovCi0gICAgT01YX0JPT0wgYkVuYWJsZUJpdHJhdGU7ICAgLyoqPCBVc2UgYml0cmF0ZSB2YWx1ZSBpbnN0ZWFkIG9mIGJpdHBvb2wgKi8KLSAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIGVTQkNBbGxvY1R5cGU7ICAgLyoqPCBTQkMgQWxsb2NhdGlvbiBtZXRob2QgdHlwZSAqLwotfSBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRTsKLQotCi0vKiogQURQQ00gc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfVTMyIG5CaXRzUGVyU2FtcGxlOyAgICAgLyoqPCBOdW1iZXIgb2YgYml0cyBpbiBlYWNoIHNhbXBsZSAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCi19IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEU7IAotCi0KLS8qKiBHNzIzIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyM1JBVEUgewotICAgIE9NWF9BVURJT19HNzIzTW9kZVVudXNlZCA9IDAsICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZUxvdywgICAgICAgICAvKio8IDUzMDAgYnBzICovCi0gICAgT01YX0FVRElPX0c3MjNNb2RlSGlnaCwgICAgICAgIC8qKjwgNjMwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0c3MjNNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzIzUkFURTsKLQotCi0vKiogRzcyMyAtIFNhbXBsZSByYXRlIG11c3QgYmUgOCBLSHogKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8gCi0gICAgT01YX0FVRElPX0c3MjNSQVRFIGVCaXRSYXRlOyAgLyoqPCB0b2RvOiBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byBhIGNvbmZpZz8gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovIAotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIFBvc3QgRmlsdGVyICovIAotfSBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEU7IAotCi0KLS8qKiBJVFUgRzcyNiAoQURQQ00pIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyNk1PREUgewotICAgIE9NWF9BVURJT19HNzI2TW9kZVVudXNlZCA9IDAsICAvKio8IEc3MjYgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlMTYsICAgICAgICAgIC8qKjwgMTYga2JwcyAqLwotICAgIE9NWF9BVURJT19HNzI2TW9kZTI0LCAgICAgICAgICAvKio8IDI0IGticHMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGUzMiwgICAgICAgICAgLyoqPCAzMiBrYnBzLCBtb3N0IGNvbW1vbiByYXRlLCBhbHNvIEc3MjEgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGU0MCwgICAgICAgICAgLyoqPCA0MCBrYnBzICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19HNzI2TW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fRzcyNk1PREU7Ci0KLQotLyoqIEcuNzI2IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIG11c3QgYmUgYXQgOEtIeiAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICAgT01YX0FVRElPX0c3MjZNT0RFIGVHNzI2TW9kZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFOyAKLQotCi0vKiogRzcyOSBjb2RlciB0eXBlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjlUWVBFIHsKLSAgICBPTVhfQVVESU9fRzcyOSA9IDAsICAgICAgICAgICAvKio8IElUVSBHLjcyOSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlBLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXggQSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlCLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43Mjkgd2l0aCBhbm5leCBCIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19HNzI5QUIsICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4ZXMgQSBhbmQgQiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fRzcyOUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fRzcyOVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjlNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzI5VFlQRTsKLQotCi0vKiogRzcyOSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBmaXhlZCA2S0h6IHNhbXBsZSByYXRlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9BVURJT19HNzI5VFlQRSBlQml0VHlwZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFOwotCi0KLS8qKiBBTVIgRnJhbWUgZm9ybWF0ICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgeyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZSA9IDAsICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgQ29uZm9ybWFuY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmQpIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjEsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDEgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYyLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAyKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEZpbGUgU3RvcmFnZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRSVFBQYXlsb2FkLCAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgUmVhbC1UaW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IFByb3RvY29sIFBheWxvYWQgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElUVSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIElUVSBGb3JtYXQgKGFkZGVkIGF0IE1vdG9yb2xhIHJlcXVlc3QpICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEU7IAotCi0KLS8qKiBBTVIgYmFuZCBtb2RlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSB7Ci0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkID0gMCwgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMCA9ICA0NzUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAxID0gIDUxNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8gCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDMgPSAgNjcwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNCA9ICA3NDAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA1ID0gIDc5NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDYgPSAxMDIwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNyA9IDEyMjAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAwID0gIDY2MDAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDEgPSAgODg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMiA9IDEyNjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMyA9IDE0MjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNCA9IDE1ODUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA1ID0gMTgyNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDYgPSAxOTg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNyA9IDIzMDUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCOCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA4ID0gMjM4NTAgYnBzICovICAgICAgCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFOwotICAgICAKLQotLyoqIEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBtb2RlICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSB7IAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmID0gMCwgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgaXMgZGlzYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDEsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDEgKFZBRDEpIGlzIGVuYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDIsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDIgKFZBRDIpIGlzIGVuYWJsZWQgKi8gICAgICAgCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPbkF1dG8sICAgICAgICAgLyoqPCBUaGUgY29kZWMgd2lsbCBhdXRvbWF0aWNhbGx5IHNlbGVjdCBiZXR3ZWVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmLCBWQUQxIG9yIFZBRDIgbW9kZXMgKi8gCi0KLSAgICBPTVhfQVVESU9fQU1SRFRYYXNFRlIsICAgICAgICAgICAgIC8qKjwgRFRYIGFzIEVGUiBpbnN0ZWFkIG9mIEFNUiBzdGFuZGFyZCAoM0dQUCAyNi4xMDEsIGZyYW1lIHR5cGUgPTgsOSwxMCkgKi8KLQotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRTsgCi0gCi0KLS8qKiBBTVIgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgcmVhZCBvbmx5IGZpZWxkICovCi0gICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBlQU1SQmFuZE1vZGU7IC8qKjwgQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbiAqLyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgIGVBTVJEVFhNb2RlOyAgLyoqPCBBTVIgRFRYIE1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIGVBTVJGcmFtZUZvcm1hdDsgLyoqPCBBTVIgZnJhbWUgZm9ybWF0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFOwotCi0KLS8qKiBHU01fRlIgKEVUU0kgMDYuMTAsIDNHUFAgNDYuMDEwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEU7Ci0KLQotLyoqIEdTTS1IUiAoRVRTSSAwNi4yMCwgM0dQUCA0Ni4wMjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRTsKLQotCi0vKiogR1NNLUVGUiAoRVRTSSAwNi42MCwgM0dQUCA0Ni4wNjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFOwotCi0KLS8qKiBURE1BIEZSIChUSUEvRUlBLTEzNi00MjAsIFZTRUxQIDcuOTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRTsKLQotCi0vKiogVERNQSBFRlIgKFRJQS9FSUEtMTM2LTQxMCwgQUNFTFAgNy40a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRTsKLQotCi0vKiogUERDIEZSICggUkNSLTI3LCBWU0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEU7Ci0KLQotLyoqIFBEQyBFRlIgKCBSQ1ItMjcsIEFDRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFOwotCi0vKiogUERDIEhSICggUkNSLTI3LCBQU0ktQ0VMUCAzLjQ1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFOwotCi0KLS8qKiBDRE1BIFJhdGUgdHlwZXMgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIHsKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVCbGFuayA9IDAsICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGlzIGJsYW5rICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRnVsbCwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBmdWxsIHJhdGUgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVIYWxmLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGhhbGYgcmF0ZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZVF1YXJ0ZXIsICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gcXVhcnRlciByYXRlICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRWlnaHRoLCAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBlaWdodGggcmF0ZSAoRFRYKSovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRXJhc3VyZSwgICAgICAgICAgICAvKio8IENETUEgZXJhc3VyZSBmcmFtZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0NETUFSQVRFVFlQRTsKLQotCi0vKiogUUNFTFA4IChUSUEvRUlBLTk2LCB1cCB0byA4a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLwotICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCi19IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFOwotCi0KLS8qKiBRQ0VMUDEzICggQ0RNQSwgRUlBL1RJQS03MzMsIDEzLjNrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLX0gT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFOwotCi0KLS8qKiBFVlJDICggQ0RNQSwgRUlBL1RJQS0xMjcsIFJDRUxQIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IGFjdHVhbCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciAqLwotICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCi0gICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRTsKLQotCi0vKiogU01WICggdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSA/PyovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgPz8qLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyID8/Ki8KLSAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLwotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciA/PyovCi19IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFOwotCi0KLS8qKiBNSURJIEZvcm1hdCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJRk9STUFUVFlQRQotewotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VW5rbm93biA9IDAsIC8qKjwgTUlESSBGb3JtYXQgdW5rbm93biBvciBkb24ndCBjYXJlICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYwLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAwICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYxLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAxICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYyLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAyICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTUE1JREksICAgICAgLyoqPCBTUC1NSURJICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYwLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDAgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjEsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0TW9iaWxlWE1GLCAgIC8qKjwgTW9iaWxlIFhNRiAoZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAyKSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01JRElGT1JNQVRUWVBFOwotCi0KLS8qKiBNSURJIHBhcmFtcyAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBmaWxlIHBhc3NlZCBpbiwgb3RoZXJ3aXNlIGlmIDB4MCwgdGhlIE1JREkgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtZXJnZWQgYW5kIHN0cmVhbWVkIChpbnN0ZWFkIG9mIHBhc3NlZCBhcyBhbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgTUlESSBmaWxlKSAqLwotICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9CT09MIGJMb2FkRGVmYXVsdFNvdW5kOyAgICAvKio8IFdoZXRoZXIgdG8gbG9hZCBkZWZhdWx0IHNvdW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmsgYXQgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUgZU1pZGlGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiB0aGUgTUlESSBmaWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRTsKLQotCi0vKiogVHlwZSBvZiB0aGUgTUlESSBzb3VuZCBiYW5rIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIHsKLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1VudXNlZCA9IDAsICAgICAgICAgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMxLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAxICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMyLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAyICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNCYXNlLCAgICAgICAgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNQbHVzT3B0aW9ucywgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgc3BlY2lmaWNhdGlvbi1kZWZpbmVkIG9wdGlvbmFsIGZlYXR1cmUgc2V0ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEU7Ci0KLQotLyoqIEJhbmsgTGF5b3V0IGRlc2NyaWJlcyBob3cgYmFuayBNU0IgJiBMU0IgYXJlIHVzZWQgaW4gdGhlIERMUyBpbnN0cnVtZW50IGRlZmluaXRpb25zIHNvdW5kIGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgewotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVbnVzZWQgPSAwLCAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00sICAgICAgICAgICAvKio8IEdTIGxheW91dCAoYmFzZWQgb24gYmFuayBNU0IgMHgwMCkgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00yLCAgICAgICAgICAvKio8IEdlbmVyYWwgTUlESSAyIGxheW91dCAodXNpbmcgTVNCIDB4NzgvMHg3OSwgTFNCIDB4MDApICovCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVzZXIsICAgICAgICAgLyoqPCBEb2VzIG5vdCBjb25mb3JtIHRvIGFueSBiYW5rIG51bWJlcmluZyBzdGFuZGFyZHMgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRTsKLQotCi0vKiogTUlESSBwYXJhbXMgdG8gbG9hZC91bmxvYWQgdXNlciBzb3VuZGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkRMU0luZGV4OyAgICAgICAgLyoqPCBETFMgZmlsZSBpbmRleCB0byBiZSBsb2FkZWQgKi8KLSAgICBPTVhfVTMyIG5ETFNTaXplOyAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcyAqLwotICAgIE9NWF9QVFIgcERMU0RhdGE7ICAgICAgICAgLyoqPCBQb2ludGVyIHRvIERMUyBmaWxlIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgZU1pZGlTb3VuZEJhbms7ICAgLyoqPCBNaWRpIHNvdW5kIGJhbmsgdHlwZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSBlTWlkaVNvdW5kQmFua0xheW91dDsgLyoqPCBNaWRpIHNvdW5kIGJhbmsgbGF5b3V0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEU7Ci0KLQotLyoqIFN0cnVjdHVyZSBmb3IgTGl2ZSBNSURJIGV2ZW50cyBhbmQgTUlQIG1lc3NhZ2VzLiAKLSAqIChNSVAgPSBNYXhpbXVtIEluc3RhbnRhbmVvdXMgUG9seXBob255OyBwYXJ0IG9mIHRoZSBTUC1NSURJIHN0YW5kYXJkLikgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuTWlkaUV2ZW50U2l6ZTsgICAvKio8IFNpemUgb2YgaW1tZWRpYXRlIE1JREkgZXZlbnRzIG9yIE1JUCBtZXNzYWdlIGluIGJ5dGVzICAqLwotICAgIE9NWF9VOCBuTWlkaUV2ZW50c1sxXTsgICAgLyoqPCBNSURJIGV2ZW50IGFycmF5IHRvIGJlIHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvciBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBmb3IgdGhlIE1JUCBtZXNzYWdlIGJ1ZmZlciwgd2hlcmUgdGhlIHNpemUgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSBuTWlkaUV2ZW50U2l6ZSAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEU7Ci0KLQotLyoqIE1JREkgc291bmQgYmFuay8gcHJvZ3JhbSBwYWlyIGluIGEgZ2l2ZW4gY2hhbm5lbCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IFZhbGlkIGNoYW5uZWwgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAxNiAqLwotICAgIE9NWF9VMTYgbklEUHJvZ3JhbTsgICAgICAgICAvKio8IFZhbGlkIHByb2dyYW0gSUQgcmFuZ2UgaXMgMSB0byAxMjggKi8KLSAgICBPTVhfVTE2IG5JRFNvdW5kQmFuazsgICAgICAgLyoqPCBTb3VuZCBiYW5rIElEICovCi0gICAgT01YX1UzMiBuVXNlclNvdW5kQmFua0luZGV4Oy8qKjwgVXNlciBzb3VuZGJhbmsgaW5kZXgsIGVhc2llciB0byBhY2Nlc3Mgc291bmRiYW5rcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBpbmRleCBpZiBtdWx0aXBsZSBiYW5rcyBhcmUgcHJlc2VudCAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRTsKLQotCi0vKiogTUlESSBjb250cm9sIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JTMzIgc1BpdGNoVHJhbnNwb3NpdGlvbjsgLyoqPCBQaXRjaCB0cmFuc3Bvc2l0aW9uIGluIHNlbWl0b25lcywgc3RvcmVkIGFzIFEyMi4xMCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBiYXNlZCBvbiBKQVZBIE1NQVBJIChKU1ItMTM1KSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9CVTMyIHNQbGF5QmFja1JhdGU7ICAgICAgIC8qKjwgUmVsYXRpdmUgcGxheWJhY2sgcmF0ZSwgc3RvcmVkIGFzIFExNC4xNyBmaXhlZC1wb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KLSAgICBPTVhfQlUzMiBzVGVtcG8gOyAgICAgICAgICAgICAvKio8IFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSksIHN0b3JlZCBhcyBRMjIuMTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1wb2ludCBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9VMzIgbk1heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLwotICAgIE9NWF9VMzIgbk51bVJlcGVhdDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBwbGF5YmFjayAqLwotICAgIE9NWF9VMzIgblN0b3BUaW1lOyAgICAgICAgICAgIC8qKjwgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gaW5kaWNhdGUgd2hlbiBwbGF5YmFjayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RvcCBhdXRvbWF0aWNhbGx5LiAgU2V0IHRvIHplcm8gaWYgbm90IHVzZWQgKi8KLSAgICBPTVhfVTE2IG5DaGFubmVsTXV0ZU1hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIG11dGUgc3RhdHVzICovCi0gICAgT01YX1UxNiBuQ2hhbm5lbFNvbG9NYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBzb2xvIHN0YXR1cyAqLwotICAgIE9NWF9VMzIgblRyYWNrMDAzMU11dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLwotICAgIE9NWF9VMzIgblRyYWNrMzI2M011dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KLSAgICBPTVhfVTMyIG5UcmFjazAwMzFTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KLSAgICBPTVhfVTMyIG5UcmFjazMyNjNTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCi0KLX0gT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEU7Ci0KLQotLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSB7Ci0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVVua25vd24gPSAwLCAgICAgIC8qKjwgVW5rbm93biBzdGF0ZSBvciBzdGF0ZSBkb2VzIG5vdCBtYXAgdG8gCi0gIAkJCQkJCQkJCQkJCQlvdGhlciBkZWZpbmVkIHN0YXRlcyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVDbG9zZWRFbmdhZ2VkLCAgICAvKio8IE5vIE1JREkgcmVzb3VyY2UgaXMgY3VycmVudGx5IG9wZW4uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGV2ZW50cy4gKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGFyc2luZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgaXMgYmVpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWVkLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU9wZW5FbmdhZ2VkLCAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIHByaW1lZCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiBUaGUgdHJhbnNpdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RhdGUgaXMgb25seSBwb3NzaWJsZSBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdwbGF5YmFjayBoZWFkJyByZWFjaGVzIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZWRpYSBkYXRhIG9yIHRoZSBwbGF5YmFjayBzdG9wcyBkdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9wIHRpbWUgc2V0LiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdQYXJ0aWFsbHksIC8qKjwgQmVzdC1lZmZvcnQgcGxheWJhY2sgZHVlIHRvIFNQLU1JREkvRExTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgY29uc3RyYWludHMgKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1NpbGVudGx5LCAgLyoqPCBEdWUgdG8gc3lzdGVtIHJlc291cmNlIGNvbnN0cmFpbnRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQLU1JREkgY29udGVudCBjb25zdHJhaW50cywgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBhdWRpYmxlIE1JREkgY29udGVudCBkdXJpbmcgcGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkuIFRoZSBzaXR1YXRpb24gbWF5IGNoYW5nZSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBhcmUgZnJlZWQgbGF0ZXIuKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEU7Ci0KLQotLyoqIE1JREkgc3RhdHVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTE2IG5OdW1UcmFja3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTUlESSB0cmFja3MgaW4gdGhlIGZpbGUsIHJlYWQgb25seSBmaWVsZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5EdXJhdGlvbjsgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBNSURJIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcy4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8gIAotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgICAvKio8IEN1cnJlbnQgUG9zaXRpb24gb2YgdGhlIE1JREkgcmVzb3VyY2UgYmVpbmcgcGxheWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE9NWF9CT09MIGJWaWJyYTsgICAgICAgICAgICAvKio8IERvZXMgVmlicmEgdHJhY2sgZXhpc3Q/IE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KLSAgICBPTVhfVTMyIG5OdW1NZXRhRXZlbnRzOyAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgTUlESSBNZXRhIEV2ZW50cyBpbiB0aGUgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5OdW1BY3RpdmVWb2ljZXM7ICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIHZvaWNlcyBpbiB0aGUgY3VycmVudGx5IHBsYXlpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLwotICAgIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgZU1JRElQbGF5QmFja1N0YXRlOyAgLyoqPCBNSURJIHBsYXliYWNrIHN0YXRlIGVudW1lcmF0aW9uLCByZWFkIG9ubHkgZmllbGQgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRTsKLQotCi0vKiogTUlESSBNZXRhIEV2ZW50IHN0cnVjdHVyZSBvbmUgcGVyIE1ldGEgRXZlbnQuCi0gKiAgTUlESSBNZXRhIEV2ZW50cyBhcmUgbGlrZSBhdWRpbyBtZXRhZGF0YSwgZXhjZXB0IHRoYXQgdGhleSBhcmUgaW50ZXJzcGVyc2VkIAotICogIHdpdGggdGhlIE1JREkgY29udGVudCB0aHJvdWdob3V0IHRoZSBmaWxlIGFuZCBhcmUgbm90IGxvY2FsaXplZCBpbiB0aGUgaGVhZGVyLiAKLSAqICBBcyBzdWNoLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgTWV0YSBFdmVudHMgZnJvbSAKLSAqICB0aGUgZW5naW5lLCBhcyBpdCBlbmNvdW50ZXJzIHRoZXNlIE1ldGEgRXZlbnRzIHdpdGhpbiB0aGUgTUlESSBjb250ZW50LiAKLSAqICBGb3IgZXhhbXBsZSwgU01GIGZpbGVzIGNhbiBoYXZlIHVwIHRvIDE0IHR5cGVzIG9mIE1JREkgTWV0YSBFdmVudHMgKGNvcHlyaWdodCwgCi0gKiAgYXV0aG9yLCBkZWZhdWx0IHRlbXBvLCBldGMuKSBzY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgZmlsZS4gCi0gKiAgQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKLSAgICBPTVhfVTggbk1ldGFFdmVudFR5cGU7ICAgIC8qKjwgTWV0YSBFdmVudCBUeXBlLCA3Yml0cyAoaS5lLiAwIC0gMTI3KSAqLyAKLSAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKLSAgICBPTVhfVTMyIG5UcmFjazsgICAgICAgICAgIC8qKjwgdHJhY2sgbnVtYmVyIGZvciB0aGUgbWV0YSBldmVudCAqLwotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgLyoqPCBQb3NpdGlvbiBvZiB0aGUgbWV0YS1ldmVudCBpbiBtaWxsaXNlY29uZHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRTsgCi0KLQotLyoqIE1JREkgTWV0YSBFdmVudCBEYXRhIHN0cnVjdHVyZSAtIG9uZSBwZXIgTWV0YSBFdmVudC4gCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCi0gICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1U4IG5EYXRhWzFdOyAgICAgICAgICAvKio8IGFycmF5IG9mIG9uZSBvciBtb3JlIGJ5dGVzIG9mIG1ldGEgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLyAKLX0gT01YX0FVRElPX0NPTkZJR19fTUlESU1FVEFFVkVOVERBVEFUWVBFOyAKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgcG9ydCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgVGhlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2b2x1bWUgYXJlIGluIG1CIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGdhaW4gb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi19IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRTsKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgY2hhbm5lbCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IHZvbHVtZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3Igdm9sdW1lIGFyZSBpbiBtQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlIHRvIGEgZ2FpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIGJhbGFuY2Ugc2V0dGluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBiYWxhbmNlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlLiAqLwotICAgIE9NWF9TMzIgbkJhbGFuY2U7ICAgICAgICAgICAvKio8IGJhbGFuY2Ugc2V0dGluZyBmb3IgdGhpcyBwb3J0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAwIHRvIDEwMCwgd2hlcmUgLTEwMCBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgbGVmdCwgYW5kIG5vIHJpZ2h0ICovCi19IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIFBvcnQgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBtdXRlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlLiAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBwb3J0ICovCi19IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEU7Ci0KLQotLyoqIEF1ZGlvIENoYW5uZWwgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgbXV0ZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovIAotfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRTsKLQotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBsb3VkbmVzcyBjb250cm9sLCB3aGljaCBib29zdHMgYmFzcyBhbmQgdG8gYSAKLSAqICBzbWFsbGVyIGV4dGVudCBoaWdoIGVuZCBmcmVxdWVuY2llcyB0byBjb21wZW5zYXRlIGZvciBoZWFyaW5nCi0gKiAgYWJpbGl0eSBhdCB0aGUgZXh0cmVtZSBlbmRzIG9mIHRoZSBhdWRpbyBzcGVjdHJ1bQotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJMb3VkbmVzczsgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGxvdWRuZXNzICovCi19IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBiYXNzLCB3aGljaCBjb250cm9scyBsb3cgZnJlcXVlbmNpZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGJhc3MgY29udHJvbCAqLwotICAgIE9NWF9TMzIgbkJhc3M7ICAgICAgICAgICAgIC8qKjwgYmFzcyBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gYmFzcyBsZXZlbCkqLwotfSBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciB0cmVibGUsIHdoaWNoIGNvbnRyb2xzIGhpZ2ggZnJlcXVlbmNpZXMgdG9uZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgdHJlYmxlIGNvbnRyb2wgKi8KLSAgICBPTVhfUzMyICBuVHJlYmxlOyAgICAgICAgICAvKio8IHRyZWJsZSBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiB0cmVibGUgbGV2ZWwpICovCi19IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRTsKLQotCi0vKiogQW4gZXF1YWxpemVyIGlzIHR5cGljYWxseSB1c2VkIGZvciB0d28gcmVhc29uczogdG8gY29tcGVuc2F0ZSBmb3IgYW4gCi0gKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsIAotICogIG9yIHRvIGNyZWF0ZSBpbnRlbnRpb25hbGx5IHNvbWUgdW5uYXR1cmFsIGNvbG9yaW5nIHRvIHRoZSBzb3VuZCB0byBjcmVhdGUKLSAqICBhbiBlZmZlY3QuCi0gKiAgQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGVxdWFsaXplciAqLwotICAgIE9NWF9CVTMyIHNCYW5kSW5kZXg7ICAgICAgIC8qKjwgQmFuZCBudW1iZXIgdG8gYmUgc2V0LiAgVXBwZXIgTGltaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLTEsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBiYW5kcywgbG93ZXIgbGltaXQgaXMgMCAqLwotICAgIE9NWF9CVTMyIHNDZW50ZXJGcmVxOyAgICAgIC8qKjwgQ2VudGVyIGZyZXF1ZWNpZXMgaW4gSHouICBUaGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb25seSBlbGVtZW50IGFuZCBpcyB1c2VkIHRvIGRldGVybWluZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb3dlciwgY2VudGVyIGFuZCB1cHBlciBmcmVxdWVuY3kgb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhbmQuICAqLwotICAgIE9NWF9CUzMyIHNCYW5kTGV2ZWw7ICAgICAgIC8qKjwgYmFuZCBsZXZlbCBpbiBtaWxsaWJlbHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFOwotCi0KLS8qKiBTdGVyZW8gd2lkZW5pbmcgbW9kZSB0eXBlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0hlYWRwaG9uZXMsICAgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBsb3Vkc3BlYWtlcnMgKi8KLSAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdMb3Vkc3BlYWtlcnMsICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgY2xvc2VseSBzcGFjZWQgbG91ZHNwZWFrZXJzICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBDb250cm9sIGZvciBzdGVyZW8gd2lkZW5pbmcsIHdoaWNoIGlzIGEgc3BlY2lhbCAyLWNoYW5uZWwKLSAqICBjYXNlIG9mIHRoZSBhdWRpbyB2aXJ0dWFsaXplciBlZmZlY3QuIEZvciBleGFtcGxlLCBmb3IgNS4xLWNoYW5uZWwgCi0gKiAgb3V0cHV0LCBpdCB0cmFuc2xhdGVzIHRvIHZpcnR1YWwgc3Vycm91bmQgc291bmQuIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHN0ZXJlbyB3aWRlbmluZyBjb250cm9sICovCi0gICAgT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSBlV2lkZW5pbmdUeXBlOyAvKio8IFN0ZXJlbyB3aWRlbmluZyBhbGdvcml0aG0gdHlwZSAqLwotICAgIE9NWF9VMzIgIG5TdGVyZW9XaWRlbmluZzsgIC8qKjwgc3RlcmVvIHdpZGVuaW5nIHNldHRpbmcgZm9yIHRoZSBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBjb250aW51b3VzIHZhbHVlIGZyb20gMCB0byAxMDAgICovCi19IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBUaGUgY2hvcnVzIGVmZmVjdCAob3IgYGBjaG9yYWxpemVyJycpIGlzIGFueSBzaWduYWwgcHJvY2Vzc29yIHdoaWNoIG1ha2VzCi0gKiAgb25lIHNvdW5kIHNvdXJjZSAoc3VjaCBhcyBhIHZvaWNlKSBzb3VuZCBsaWtlIG1hbnkgc3VjaCBzb3VyY2VzIHNpbmdpbmcgCi0gKiAgKG9yIHBsYXlpbmcpIGluIHVuaXNvbi4gU2luY2UgcGVyZm9ybWFuY2UgaW4gdW5pc29uIGlzIG5ldmVyIGV4YWN0LCBjaG9ydXMgCi0gKiAgZWZmZWN0cyBzaW11bGF0ZSB0aGlzIGJ5IG1ha2luZyBpbmRlcGVuZGVudGx5IG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgaW5wdXQgCi0gKiAgc2lnbmFsLiBNb2RpZmljYXRpb25zIG1heSBpbmNsdWRlICgxKSBkZWxheSwgKDIpIGZyZXF1ZW5jeSBzaGlmdCwgYW5kIAotICogICgzKSBhbXBsaXR1ZGUgbW9kdWxhdGlvbi4KLSAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBjaG9ydXMgKi8KLSAgICBPTVhfQlUzMiBzRGVsYXk7ICAgICAgICAgICAvKio8IGF2ZXJhZ2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc01vZHVsYXRpb25SYXRlOyAgLyoqPCByYXRlIG9mIG1vZHVsYXRpb24gaW4gbWlsbGloZXJ0eiAqLwotICAgIE9NWF9VMzIgbk1vZHVsYXRpb25EZXB0aDsgIC8qKjwgZGVwdGggb2YgbW9kdWxhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSAoaS5lLiAwIHRvIDEwMCkgKi8KLSAgICBPTVhfQlUzMiBuRmVlZGJhY2s7ICAgICAgICAvKio8IEZlZWRiYWNrIGZyb20gY2hvcnVzIG91dHB1dCB0byBpbnB1dCBpbiBwZXJjZW50YWdlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRTsKLQotCi0vKiogUmV2ZXJiZXJhdGlvbiBpcyBwYXJ0IG9mIHRoZSByZWZsZWN0ZWQgc291bmQgdGhhdCBmb2xsb3dzIHRoZSBlYXJseSAKLSAqICByZWZsZWN0aW9ucy4gSW4gYSB0eXBpY2FsIHJvb20sIHRoaXMgY29uc2lzdHMgb2YgYSBkZW5zZSBzdWNjZXNzaW9uIG9mIAotICogIGVjaG9lcyB3aG9zZSBlbmVyZ3kgZGVjYXlzIGV4cG9uZW50aWFsbHkuIFRoZSByZXZlcmJlcmF0aW9uIGVmZmVjdCBzdHJ1Y3R1cmUgCi0gKiAgYXMgZGVmaW5lZCBoZXJlIGluY2x1ZGVzIGJvdGggKGVhcmx5KSByZWZsZWN0aW9ucyBhcyB3ZWxsIGFzIChsYXRlKSByZXZlcmJlcmF0aW9ucy4gCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHJldmVyYmVyYXRpb24gY29udHJvbCAqLwotICAgIE9NWF9CUzMyIHNSb29tTGV2ZWw7ICAgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIGZvciB0aGUgd2hvbGUgcm9vbSBlZmZlY3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBib3RoIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCBsYXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJiZXJhdGlvbikgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1Jvb21IaWdoRnJlcUxldmVsOyAgLyoqPCBBdHRlbnVhdGlvbiBhdCBoaWdoIGZyZXF1ZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgaW50ZW5zaXR5IGF0IGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1JlZmxlY3Rpb25zTGV2ZWw7ICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgZWFybHkgcmVmbGVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSB0byByb29tIHZhbHVlKSwgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JVMzIgc1JlZmxlY3Rpb25zRGVsYXk7ICAgLyoqPCBEZWxheSB0aW1lIG9mIHRoZSBmaXJzdCByZWZsZWN0aW9uIHJlbGF0aXZlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRpcmVjdCBwYXRoLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlMzMiBzUmV2ZXJiTGV2ZWw7ICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBsYXRlIHJldmVyYmVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHJvb20gbGV2ZWwsIGluIG1pbGxpYmVscyAqLwotICAgIE9NWF9CVTMyIHNSZXZlcmJEZWxheTsgICAgICAgIC8qKjwgVGltZSBkZWxheSBmcm9tIHRoZSBmaXJzdCBlYXJseSByZWZsZWN0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc0RlY2F5VGltZTsgICAgICAgICAgLyoqPCBMYXRlIHJldmVyYmVyYXRpb24gZGVjYXkgdGltZSBhdCBsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBuRGVjYXlIaWdoRnJlcVJhdGlvOyAvKio8IFJhdGlvIG9mIGhpZ2ggZnJlcXVlbmN5IGRlY2F5IHRpbWUgcmVsYXRpdmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb3cgZnJlcXVlbmN5IGRlY2F5IHRpbWUgaW4gcGVyY2VudCAgKi8KLSAgICBPTVhfVTMyIG5EZW5zaXR5OyAgICAgICAgICAgICAvKio8IE1vZGFsIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KLSAgICBPTVhfVTMyIG5EaWZmdXNpb247ICAgICAgICAgICAvKio8IEVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLwotICAgIE9NWF9CVTMyIHNSZWZlcmVuY2VIaWdoRnJlcTsgIC8qKjwgUmVmZXJlbmNlIGhpZ2ggZnJlcXVlbmN5IGluIEhlcnR6LiBUaGlzIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoaWdoLWZyZXF1ZW5jeSBzZXR0aW5ncyBhYm92ZSAqLwotCi19IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEU7Ci0KLQotLyoqIFBvc3NpYmxlIHNldHRpbmdzIGZvciB0aGUgRWNobyBDYW5jZWxhdGlvbiBzdHJ1Y3R1cmUgdG8gdXNlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0VDSE9DQU5UWVBFIHsKLSAgIE9NWF9BVURJT19FY2hvQ2FuT2ZmID0gMCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBpcyBkaXNhYmxlZCAqLwotICAgT01YX0FVRElPX0VjaG9DYW5Ob3JtYWwsICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG5vcm1hbCBvcGVyYXRpb24gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGZyb20gcGxhc3RpY3MgYW5kIGZhY2UgKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuSEZyZWUsICAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzIEZyZWUgb3BlcmF0aW9uICovCi0gICBPTVhfQVVESU9fRWNob0NhbkNhcktpdCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhciBLaXQgKGxvbmdlciBlY2hvKSAqLwotICAgT01YX0FVRElPX0VjaG9DYW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfQVVESU9fRWNob0NhblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfQVVESU9fRWNob0Nhbk1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0VDSE9DQU5UWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBlY2hvIGNhbmNlbGF0aW9uLCB3aGljaCByZW1vdmVzIHVuZGVzaXJlZCBlY2hvJ3MKLSAqICBmcm9tIHRoZSBhdWRpbwotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQVVESU9fRUNIT0NBTlRZUEUgZUVjaG9DYW5jZWxhdGlvbjsgLyoqPCBFY2hvIGNhbmNlbGF0aW9uIHNldHRpbmdzICovCi19IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRTsKLQotCi0vKiogRW5hYmxlIC8gRGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uLCB3aGljaCB1bmRlc2lyZWQgbm9pc2UgZnJvbQotICogdGhlIGF1ZGlvCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYk5vaXNlUmVkdWN0aW9uOyAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uICovCi19IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbXBvbmVudC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db21wb25lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNzg0ZWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db21wb25lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX0NvbXBvbmVudC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db21wb25lbnQgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCi0gKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYSBjb21wb25lbnQuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCi0gKiAgYmUgdXNlZCBieSBib3RoIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4KLSAqLwotCi0jaWZuZGVmIE9NWF9Db21wb25lbnRfaAotI2RlZmluZSBPTVhfQ29tcG9uZW50X2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQotICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KLSNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxPTVhfSW1hZ2UuaD4KLSNpbmNsdWRlIDxPTVhfT3RoZXIuaD4KLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgZW51bSBPTVhfUE9SVERPTUFJTlRZUEUgeyAKLSAgICBPTVhfUG9ydERvbWFpbkF1ZGlvLCAKLSAgICBPTVhfUG9ydERvbWFpblZpZGVvLCAKLSAgICBPTVhfUG9ydERvbWFpbkltYWdlLCAKLSAgICBPTVhfUG9ydERvbWFpbk90aGVyLAotICAgIE9NWF9Qb3J0RG9tYWluS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9Qb3J0RG9tYWluVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfUG9ydERvbWFpbk1heCA9IDB4N2ZmZmZmZgotfSBPTVhfUE9SVERPTUFJTlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCBudW1iZXIgdGhlIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RJUlRZUEUgZURpcjsgICAgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uIChpbnB1dCBvciBvdXRwdXQpIG9mIHRoaXMgcG9ydCAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50QWN0dWFsOyAgICAvKio8IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIG9uIHRoaXMgcG9ydCAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50TWluOyAgICAgICAvKio8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRoaXMgcG9ydCByZXF1aXJlcyAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlclNpemU7ICAgICAgICAgICAvKio8IFNpemUsIGluIGJ5dGVzLCBmb3IgYnVmZmVycyB0byBiZSB1c2VkIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgICAgICAgICAgLyoqPCBQb3J0cyBkZWZhdWx0IHRvIGVuYWJsZWQgYW5kIGFyZSBlbmFibGVkL2Rpc2FibGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlL09NWF9Db21tYW5kUG9ydERpc2FibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBkaXNhYmxlZCBhIHBvcnQgaXMgdW5wb3B1bGF0ZWQuIEEgZGlzYWJsZWQgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwb3B1bGF0ZWQgd2l0aCBidWZmZXJzIG9uIGEgdHJhbnNpdGlvbiB0byBJRExFLiAqLwotICAgIE9NWF9CT09MIGJQb3B1bGF0ZWQ7ICAgICAgICAgICAvKio8IFBvcnQgaXMgcG9wdWxhdGVkIHdpdGggYWxsIG9mIGl0cyBidWZmZXJzIGFzIGluZGljYXRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CdWZmZXJDb3VudEFjdHVhbC4gQSBkaXNhYmxlZCBwb3J0IGlzIGFsd2F5cyB1bnBvcHVsYXRlZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZW5hYmxlZCBwb3J0IGlzIHBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gT01YX1N0YXRlSWRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1bnBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gbG9hZGVkLiAqLwotICAgIE9NWF9QT1JURE9NQUlOVFlQRSBlRG9tYWluOyAgICAvKio8IERvbWFpbiBvZiB0aGUgcG9ydC4gRGV0ZXJtaW5lcyB0aGUgY29udGVudHMgb2YgbWV0YWRhdGEgYmVsb3cuICovCi0gICAgdW5pb24gewotICAgICAgICBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFIGF1ZGlvOwotICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHZpZGVvOwotICAgICAgICBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFIGltYWdlOwotICAgICAgICBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIG90aGVyOwotICAgIH0gZm9ybWF0OwotICAgIE9NWF9CT09MIGJCdWZmZXJzQ29udGlndW91czsKLSAgICBPTVhfVTMyIG5CdWZmZXJBbGlnbm1lbnQ7Ci19IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fVTMyVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuVTMyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVTMyIHZhbHVlICovCi19IE9NWF9QQVJBTV9VMzJUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIHsKLSAgICBPTVhfU3VzcGVuc2lvbkRpc2FibGVkLCAvKio8IE5vIHN1c3BlbnNpb247IHYxLjAgYmVoYXZpb3IgKi8KLSAgICBPTVhfU3VzcGVuc2lvbkVuYWJsZWQsICAvKio8IFN1c3BlbnNpb24gYWxsb3dlZCAqLyAgIAotICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5U3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3VzcGVuc2lvblBvbGljeU1heCA9IDB4N2ZmZmZmZmYKLX0gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgCi0gICAgT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIGVQb2xpY3k7Ci19IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OVFlQRSB7Ci0gICAgT01YX05vdFN1c3BlbmRlZCwgLyoqPCBjb21wb25lbnQgaXMgbm90IHN1c3BlbmRlZCAqLwotICAgIE9NWF9TdXNwZW5kZWQsICAgIC8qKjwgY29tcG9uZW50IGlzIHN1c3BlbmRlZCAqLwotICAgIE9NWF9TdXNwZW5zaW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdXNwZW5zaW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3VzcGVuZE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1NVU1BFTlNJT05UWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAKLSAgICBPTVhfU1VTUEVOU0lPTlRZUEUgZVR5cGU7ICAgICAgICAgICAgIAotfSBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgCi19IE9NWF9DT05GSUdfQk9PTEVBTlRZUEU7Ci0KLS8qIFBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBjb250ZW50IHVyaSB0byB1c2UuICovCi0vKiogQGluZ3JvdXAgY3AgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBVUkkgbmFtZSAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCBjb250ZW50VVJJWzFdOyAgICAgICAgICAgICAgIC8qKjwgVGhlIFVSSSBuYW1lICovCi19IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRTsKLQotLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHBpcGUgdG8gdXNlLiAqLwotLyoqIEBpbmdyb3VwIGNwICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9IQU5ETEVUWVBFIGhQaXBlOyAgICAgICAvKio8IFRoZSBwaXBlIGhhbmRsZSovCi19IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiUmVzb3VyY2VDb25jZWFsbWVudEZvcmJpZGRlbjsgLyoqPCBkaXNhbGxvdyB0aGUgdXNlIG9mIHJlc291cmNlIGNvbmNlYWxtZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIChsaWtlIGRlZ3JhZGluZyBhbGdvcml0aG0gcXVhbGl0eSB0byAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gb3IgZnVuY3Rpb25hbCBieXBhc3MpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGNvbXBvbmVudCBhcyBhIHJlc29sdXRpb24gdG8gcmVzb3VyY2UgY29uZmxpY3RzLiAqLwotfSBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEU7Ci0KLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIGVudW0gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgewotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVbmtub3duID0gMCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QVNDSUksCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEJpbmFyeSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0Q29kZVBhZ2UxMjUyLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEY4LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRKYXZhQ29uZm9ybWFudFVURjgsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjcsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEltYXBVVEY3LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkxFLCAKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGMTZCRSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxMjM0NSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SFpHQjIzMTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEdCMjMxMiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxODAzMCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0JLLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRCaWc1LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkzLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk2LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTgsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk5LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTE0LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFNoaWZ0SklTLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU08yMDIySlAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUDEsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTT0VVQ0pQLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRTTVM3Qml0LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFR5cGVNYXg9IDB4N0ZGRkZGRkYKLX0gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNDT1BFVFlQRQotewotICAgIE9NWF9NZXRhZGF0YVNjb3BlQWxsTGV2ZWxzLAotICAgIE9NWF9NZXRhZGF0YVNjb3BlVG9wTGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVQb3J0TGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVOb2RlTGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhU2NvcGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NZXRhZGF0YVNjb3BlVHlwZU1heCA9IDB4N2ZmZmZmZmYKLX0gT01YX01FVEFEQVRBU0NPUEVUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRQotewotICAgIE9NWF9NZXRhZGF0YVNlYXJjaFZhbHVlU2l6ZUJ5SW5kZXgsCi0gICAgT01YX01ldGFkYXRhU2VhcmNoSXRlbUJ5SW5kZXgsCi0gICAgT01YX01ldGFkYXRhU2VhcmNoTmV4dEl0ZW1CeUtleSwKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhU2VhcmNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hUeXBlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRTsKLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKLSAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKLSAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1Db3VudDsKLX0gT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX01FVEFEQVRBU0NPUEVUWVBFIGVTY29wZU1vZGU7Ci0gICAgT01YX1UzMiBuU2NvcGVTcGVjaWZpZXI7Ci0gICAgT01YX1UzMiBuTWV0YWRhdGFJdGVtSW5kZXg7ICAKLSAgICBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRSBlU2VhcmNoTW9kZTsKLSAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKLSAgICBPTVhfVTggbktleVNpemVVc2VkOwotICAgIE9NWF9VOCBuS2V5WzEyOF07Ci0gICAgT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgZVZhbHVlQ2hhcnNldDsKLSAgICBPTVhfU1RSSU5HIHNMYW5ndWFnZUNvdW50cnk7Ci0gICAgT01YX1UzMiBuVmFsdWVNYXhTaXplOwotICAgIE9NWF9VMzIgblZhbHVlU2l6ZVVzZWQ7Ci0gICAgT01YX1U4IG5WYWx1ZVsxXTsKLX0gT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFOwotCi0vKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFQ09VTlRUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkFsbEtleXM7Ci0gICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOwotICAgIE9NWF9VMzIgbk51bU5vZGVzOwotfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkFsbEtleXM7Ci0gICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOwotICAgIE9NWF9VMzIgbk5vZGVJbmRleDsgCi0gICAgT01YX1UzMiBuTm9kZUlEOyAKLSAgICBPTVhfU1RSSU5HIGNOb2RlTmFtZTsKLSAgICBPTVhfQk9PTCBiSXNMZWFmVHlwZTsKLX0gT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgCi17IAotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX0JPT0wgYkFsbEtleXM7CS8qIGlmIHRydWUgdGhlbiB0aGlzIHN0cnVjdHVyZSByZWZlcnMgdG8gYWxsIGtleXMgYW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHRocmVlIGtleSBmaWVsZHMgYmVsb3cgYXJlIGlnbm9yZWQgKi8KLSAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKLSAgICBPTVhfVTMyIG5LZXlTaXplVXNlZDsgCi0gICAgT01YX1U4ICAgbktleSBbMTI4XTsgCi0gICAgT01YX1UzMiBuTGFuZ3VhZ2VDb3VudHJ5U2l6ZVVzZWQ7Ci0gICAgT01YX1U4IG5MYW5ndWFnZUNvdW50cnlbMTI4XTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsJLyogaWYgdHJ1ZSB0aGVuIGtleSBpcyBwYXJ0IG9mIGZpbHRlciAoZS5nLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldGFpbmVkIGZvciBxdWVyeSBsYXRlcikuIElmIGZhbHNlIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGtleSBpcyBub3QgcGFydCBvZiBmaWx0ZXIgKi8KLX0gT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRTsgCi0KLS8qKiBUaGUgT01YX0hBTkRMRVRZUEUgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbXBvbmVudCBoYW5kbGUuICBUaGUgY29tcG9uZW50IAotICogIGhhbmRsZSBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNvbXBvbmVudCdzIHB1YmxpYyBtZXRob2RzIGFuZCBhbHNvCi0gKiAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGNvbXBvbmVudCdzIHByaXZhdGUgZGF0YSBhcmVhLiAgVGhlIGNvbXBvbmVudAotICogIGhhbmRsZSBpcyBpbml0aWFsaXplZCBieSB0aGUgT01YIGNvcmUgKHdpdGggaGVscCBmcm9tIHRoZSBjb21wb25lbnQpCi0gKiAgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcgdGhlIGNvbXBvbmVudC4gIEFmdGVyIHRoZSBjb21wb25lbnQgaXMKLSAqICBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIHNhZmVseSBhY2Nlc3MgYW55IG9mIHRoZQotICogIGNvbXBvbmVudCdzIHB1YmxpYyBmdW5jdGlvbnMgKGFsdGhvdWdoIHNvbWUgbWF5IHJldHVybiBhbiBlcnJvciBiZWNhdXNlCi0gKiAgdGhlIHN0YXRlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBhY2Nlc3MpLgotICogCi0gKiAgQGluZ3JvdXAgY29tcAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UVFlQRQotewotICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gYnl0ZXMuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAgICAgICAgb2YgdGhlIGFsbG9jYXRvciBvZiB0aGlzIHN0cnVjdHVyZSB0byBmaWxsIGluIHRoaXMgdmFsdWUuICBTaW5jZQotICAgICAgICB0aGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIEdldEhhbmRsZSBmdW5jdGlvbiwgdGhpcwotICAgICAgICBmdW5jdGlvbiB3aWxsIGZpbGwgaW4gdGhpcyB2YWx1ZS4gKi8KLSAgICBPTVhfVTMyIG5TaXplOwotCi0gICAgLyoqIG5WZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBPTVggc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBzdHJ1Y3R1cmUgCi0gICAgICAgIGlzIGJ1aWx0IGFnYWluc3QuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNyZWF0b3Igb2YgdGhpcyAKLSAgICAgICAgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhpcyB2YWx1ZSBhbmQgZXZlcnkgdXNlciBvZiB0aGlzIHN0cnVjdHVyZSAKLSAgICAgICAgc2hvdWxkIHZlcmlmeSB0aGF0IGl0IGtub3dzIGhvdyB0byB1c2UgdGhlIGV4YWN0IHZlcnNpb24gb2YgCi0gICAgICAgIHRoaXMgc3RydWN0dXJlIGZvdW5kIGhlcmVpbi4gKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0KLSAgICAvKiogcENvbXBvbmVudFByaXZhdGUgaXMgYSBwb2ludGVyIHRvIHRoZSBjb21wb25lbnQgcHJpdmF0ZSBkYXRhIGFyZWEuICAKLSAgICAgICAgVGhpcyBtZW1iZXIgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBieSB0aGUgY29tcG9uZW50IHdoZW4gdGhlIAotICAgICAgICBjb21wb25lbnQgaXMgZmlyc3QgbG9hZGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYWNjZXNzIHRoaXMgCi0gICAgICAgIGRhdGEgYXJlYS4gKi8KLSAgICBPTVhfUFRSIHBDb21wb25lbnRQcml2YXRlOwotCi0gICAgLyoqIHBBcHBsaWNhdGlvblByaXZhdGUgaXMgYSBwb2ludGVyIHRoYXQgaXMgYSBwYXJhbWV0ZXIgdG8gdGhlIAotICAgICAgICBPTVhfR2V0SGFuZGxlIG1ldGhvZCwgYW5kIGNvbnRhaW5zIGFuIGFwcGxpY2F0aW9uIHByaXZhdGUgdmFsdWUgCi0gICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBJTCBjbGllbnQuICBUaGlzIGFwcGxpY2F0aW9uIHByaXZhdGUgZGF0YSBpcyAKLSAgICAgICAgcmV0dXJuZWQgdG8gdGhlIElMIENsaWVudCBieSBPTVggaW4gYWxsIGNhbGxiYWNrcyAqLwotICAgIE9NWF9QVFIgcEFwcGxpY2F0aW9uUHJpdmF0ZTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbXBvbmVudFZlcnNpb24gbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRDb21wb25lbnRWZXJzaW9uKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUUklORyBwQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwQ29tcG9uZW50VmVyc2lvbiwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwU3BlY1ZlcnNpb24sCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSogcENvbXBvbmVudFVVSUQpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZW5kQ29tbWFuZCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNlbmRDb21tYW5kIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2VuZENvbW1hbmQpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQ09NTUFORFRZUEUgQ21kLAotICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5QYXJhbTEsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENtZERhdGEpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRQYXJhbWV0ZXIgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRQYXJhbWV0ZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuUGFyYW1JbmRleCwgIAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfU2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0UGFyYW1ldGVyIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2V0UGFyYW1ldGVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LAotICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbmZpZyBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldENvbmZpZykoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX1NldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNldENvbmZpZyBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlNldENvbmZpZykoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRFeHRlbnNpb25JbmRleCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldEV4dGVuc2lvbkluZGV4IG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0RXh0ZW5zaW9uSW5kZXgpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfU1RSSU5HIGNQYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFKiBwSW5kZXhUeXBlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRTdGF0ZSBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFN0YXRlIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0U3RhdGUpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX09VVCBPTVhfU1RBVEVUWVBFKiBwU3RhdGUpOwotCi0gICAgCi0gICAgLyoqIFRoZSBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB3aWxsIGludGVyYWN0IHdpdGggYW5vdGhlciBPTVgKLSAgICAgICAgY29tcG9uZW50IHRvIGRldGVybWluZSBpZiB0dW5uZWxpbmcgaXMgcG9zc2libGUgYW5kIHRvIHNldHVwIHRoZQotICAgICAgICB0dW5uZWxpbmcuICBUaGUgcmV0dXJuIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBub3QgcG9zc2libGUsIG9yIGlmIHR1bm5lbGluZyBpcyBub3QKLSAgICAgICAgc3VwcG9ydGVkLiAgCi0gICAgICAgIAotICAgICAgICBCYXNlIHByb2ZpbGUgY29tcG9uZW50cyAoaS5lLiBub24taW50ZXJvcCkgZG8gbm90IHN1cHBvcnQgdGhpcwotICAgICAgICBtZXRob2QgYW5kIHNob3VsZCByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgCi0KLSAgICAgICAgVGhlIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgTVVTVCBzdXBwb3J0IHR1bm5lbGluZyB0byBhbm90aGVyIAotICAgICAgICBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IHdpdGggYSBjb21wYXRpYmxlIHBvcnQgcGFyYW1ldGVycy4gIAotICAgICAgICBBIGNvbXBvbmVudCBtYXkgYWxzbyBzdXBwb3J0IHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24uCi0gICAgICAgIAotICAgICAgICBJZiBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIHN1cHBvcnRlZCB0aGUgbmVnb3RpYXRpb24gb2YgCi0gICAgICAgIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgZG9uZSBvdXRzaWRlIG9mIE9NWCBpbiBhIHZlbmRvciAKLSAgICAgICAgc3BlY2lmaWMgd2F5LiBJdCBpcyBvbmx5IHJlcXVpcmVkIHRoYXQgdGhlIHByb3BlciByZXN1bHQgYmUgCi0gICAgICAgIHJldHVybmVkIGFuZCB0aGUgZGV0YWlscyBvZiBob3cgdGhlIHNldHVwIGlzIGRvbmUgaXMgbGVmdCAKLSAgICAgICAgdG8gdGhlIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4gIAotICAgIAotICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBvdXRwdXQgcG9ydCwgdGhlCi0gICAgICAgIGNvbXBvbmVudCB3aWxsOgotICAgICAgICAxLiAgUG9wdWxhdGUgdGhlIHBUdW5uZWxTZXR1cCBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3V0cHV0IHBvcnQncyAKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cyBhbmQgY29uc3RyYWludHMgZm9yIHRoZSB0dW5uZWwuCi0KLSAgICAgICAgV2hlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gblBvcnQgaW4gYW4gaW5wdXQgcG9ydCwgdGhlCi0gICAgICAgIGNvbXBvbmVudCB3aWxsOgotICAgICAgICAxLiAgUXVlcnkgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIG91dHB1dCBwb3J0IHRvIAotICAgICAgICAgICAgZGV0ZXJtaW5lIGlmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSBmb3IgdHVubmVsaW5nCi0gICAgICAgIDIuICBJZiB0aGUgcG9ydHMgYXJlIGNvbXBhdGlibGUsIHRoZSBjb21wb25lbnQgc2hvdWxkIHN0b3JlCi0gICAgICAgICAgICB0aGUgdHVubmVsIHN0ZXAgcHJvdmlkZWQgYnkgdGhlIG91dHB1dCBwb3J0Ci0gICAgICAgIDMuICBEZXRlcm1pbmUgd2hpY2ggcG9ydCAoZWl0aGVyIGlucHV0IG9yIG91dHB1dCkgaXMgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgc3VwcGxpZXIsIGFuZCBjYWxsIE9NWF9TZXRQYXJhbWV0ZXIgb24gdGhlIG91dHB1dCBwb3J0IHRvCi0gICAgICAgICAgICBpbmRpY2F0ZSB0aGlzIHNlbGVjdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICAgICAgQHBhcmFtIFtpbl0gaENvbXAKLSAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kLgotICAgICAgICBAcGFyYW0gW2luXSBuUG9ydAotICAgICAgICAgICAgblBvcnQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0byBiZSB1c2VkCi0gICAgICAgICAgICBmb3IgdHVubmVsaW5nLgotICAgICAgICBAcGFyYW0gW2luXSBoVHVubmVsZWRDb21wCi0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byB0dW5uZWwgd2l0aC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudCAKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuICBXaGVuCi0gICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyAweDAgdGhlIGNvbXBvbmVudCBzaG91bGQgc2V0dXAgdGhlIHBvcnQgZm9yCi0gICAgICAgICAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgotICAgICAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAotICAgICAgICAgICAgblBvcnRPdXRwdXQgaXMgdXNlZCBpbmRpY2F0ZSB0aGUgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZAotICAgICAgICAgICAgdHVubmVsIHdpdGguCi0gICAgICAgIEBwYXJhbSBbaW5dIHBUdW5uZWxTZXR1cAotICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgdHVubmVsIHNldHVwIHN0cnVjdHVyZS4gIFdoZW4gblBvcnQgaXMgYW4gb3V0cHV0IHBvcnQKLSAgICAgICAgICAgIHRoZSBjb21wb25lbnQgc2hvdWxkIHBvcHVsYXRlIHRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUuICBXaGVuCi0gICAgICAgICAgICBXaGVuIG5Qb3J0IGlzIGFuIGlucHV0IHBvcnQgdGhlIGNvbXBvbmVudCBzaG91bGQgcmV2aWV3IHRoZSBzZXR1cAotICAgICAgICAgICAgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBvdXRwdXQgcG9ydC4KLSAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgICAgQGluZ3JvdXAgdHVuCi0gICAgKi8KLQotICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRUdW5uZWxSZXF1ZXN0KSgKLSAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0LAotICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCi0gICAgICAgIE9NWF9JTiAgT01YX1UzMiBuVHVubmVsZWRQb3J0LAotICAgICAgICBPTVhfSU5PVVQgIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHBUdW5uZWxTZXR1cCk7IAotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9Vc2VCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBVc2VCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqVXNlQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuU2l6ZUJ5dGVzLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VOCogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0FsbG9jYXRlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgQWxsb2NhdGVCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqQWxsb2NhdGVCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlciwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9GcmVlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRnJlZUJ1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpGcmVlQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0VtcHR5VGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEVtcHR5VGhpc0J1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpFbXB0eVRoaXNCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0ZpbGxUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRmlsbFRoaXNCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRmlsbFRoaXNCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogVGhlIFNldENhbGxiYWNrcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgY29yZSB0byBzcGVjaWZ5IHRoZSBjYWxsYmFjawotICAgICAgICBzdHJ1Y3R1cmUgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZwotICAgICAgICBjYWxsLiAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBbaW5dIHBDYWxsYmFja3MKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSAKLSAgICAgICAgICAgIGNhbGxiYWNrIGluZm9ybWF0aW9uIHRvIHRoZSBjb21wb25lbnQKLSAgICAgICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZS4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgCi0gICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCBwYXNzIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIG9yIGEgInRoaXMKLSAgICAgICAgICAgIHBvaW50ZXIiIGluIHRoaXMgYXJlYSB0byBhbGxvdyB0aGUgY2FsbGJhY2sgKGluIHRoZSBhcHBsaWNhdGlvbikKLSAgICAgICAgICAgIHRvIGRldGVybWluZSB0aGUgY29udGV4dCBvZiB0aGUgY2FsbAotICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRDYWxsYmFja3MpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQ0FMTEJBQ0tUWVBFKiBwQ2FsbGJhY2tzLCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSk7Ci0KLSAgICAvKiogQ29tcG9uZW50RGVJbml0IG1ldGhvZCBpcyB1c2VkIHRvIGRlaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50Ci0gICAgICAgIHByb3ZpZGluZyBhIG1lYW5zIHRvIGZyZWUgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYXQgY29tcG9uZW50Ci0gICAgICAgIGluaXRpYWxpemF0aW9uLiAgTk9URTogIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29tcG9uZW50IGhhbmRsZSBpcwotICAgICAgICBub3QgdmFsaWQgZm9yIGZ1cnRoZXIgdXNlLgotICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudERlSW5pdCkoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOwotCi0gICAgLyoqIEBpbmdyb3VwIGJ1ZiAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VFR0xJbWFnZSkoCi0gICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVySGRyLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAotICAgICAgICAgICAgT01YX0lOIHZvaWQqIGVnbEltYWdlKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRSb2xlRW51bSkoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotCQlPTVhfT1VUIE9NWF9VOCAqY1JvbGUsCi0JCU9NWF9JTiBPTVhfVTMyIG5JbmRleCk7Ci0KLX0gT01YX0NPTVBPTkVOVFRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5ZTRkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbnRlbnRQaXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9Db250ZW50UGlwZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db250ZW50UGlwZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKLSAqICB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgY29udGVudCBwaXBsZXMuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCi0gKiAgYmUgdXNlZCBieSB0aGUgY29tcG9uZW50LgotICovCi0KLSNpZm5kZWYgT01YX0NPTlRFTlRQSVBFX0gKLSNkZWZpbmUgT01YX0NPTlRFTlRQSVBFX0gKLQotI2lmbmRlZiBLRF9FQUNDRVMKLS8qIE9wZW5LT0RFIGVycm9yIGNvZGVzLiBDUFJlc3VsdCB2YWx1ZXMgbWF5IGJlIHplcm8gKGluZGljYXRpbmcgc3VjY2VzcwotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzKSAqLwotI2RlZmluZSBLRF9FQUNDRVMgKDEpCi0jZGVmaW5lIEtEX0VBRERSSU5VU0UgKDIpCi0jZGVmaW5lIEtEX0VBR0FJTiAoNSkKLSNkZWZpbmUgS0RfRUJBREYgKDcpCi0jZGVmaW5lIEtEX0VCVVNZICg4KQotI2RlZmluZSBLRF9FQ09OTlJFRlVTRUQgKDkpCi0jZGVmaW5lIEtEX0VDT05OUkVTRVQgKDEwKQotI2RlZmluZSBLRF9FREVBRExLICgxMSkKLSNkZWZpbmUgS0RfRURFU1RBRERSUkVRICgxMikKLSNkZWZpbmUgS0RfRVJBTkdFICgzNSkKLSNkZWZpbmUgS0RfRUVYSVNUICgxMykKLSNkZWZpbmUgS0RfRUZCSUcgKDE0KQotI2RlZmluZSBLRF9FSE9TVFVOUkVBQ0ggKDE1KQotI2RlZmluZSBLRF9FSU5WQUwgKDE3KQotI2RlZmluZSBLRF9FSU8gKDE4KQotI2RlZmluZSBLRF9FSVNDT05OICgyMCkKLSNkZWZpbmUgS0RfRUlTRElSICgyMSkKLSNkZWZpbmUgS0RfRU1GSUxFICgyMikKLSNkZWZpbmUgS0RfRU5BTUVUT09MT05HICgyMykKLSNkZWZpbmUgS0RfRU5PRU5UICgyNCkKLSNkZWZpbmUgS0RfRU5PTUVNICgyNSkKLSNkZWZpbmUgS0RfRU5PU1BDICgyNikKLSNkZWZpbmUgS0RfRU5PU1lTICgyNykKLSNkZWZpbmUgS0RfRU5PVENPTk4gKDI4KQotI2RlZmluZSBLRF9FUEVSTSAoMzMpCi0jZGVmaW5lIEtEX0VUSU1FRE9VVCAoMzYpCi0jZGVmaW5lIEtEX0VJTFNFUSAoMTkpCi0jZW5kaWYKLQotLyoqIE1hcCB0eXBlcyBmcm9tIE9NWCBzdGFuZGFyZCB0eXBlcyBvbmx5IGhlcmUgc28gaW50ZXJmYWNlIGlzIGFzIGdlbmVyaWMgYXMgcG9zc2libGUuICovCi10eXBlZGVmIE9NWF9VMzIgICAgQ1ByZXN1bHQ7Ci10eXBlZGVmIGNoYXIgKiAgICAgQ1BzdHJpbmc7ICAKLXR5cGVkZWYgdm9pZCAqICAgICBDUGhhbmRsZTsKLXR5cGVkZWYgT01YX1UzMiAgICBDUHVpbnQ7Ci10eXBlZGVmIE9NWF9TMzIgICAgQ1BpbnQ7ICAKLXR5cGVkZWYgY2hhciAgICAgICBDUGJ5dGU7ICAKLXR5cGVkZWYgT01YX0JPT0wgICBDUGJvb2w7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiBvcmlnaW4gdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBTZWVrIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX09SSUdJTlRZUEUgewotICAgIENQX09yaWdpbkJlZ2luLCAgICAgIAotICAgIENQX09yaWdpbkN1ciwgICAgICAKLSAgICBDUF9PcmlnaW5FbmQsICAgICAgCi0gICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX09yaWdpblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfT3JpZ2luTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9PUklHSU5UWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGFjdCBhY2Nlc3MgdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBPcGVuIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0FDQ0VTU1RZUEUgewotICAgIENQX0FjY2Vzc1JlYWQsICAgICAgCi0gICAgQ1BfQWNjZXNzV3JpdGUsICAKLSAgICBDUF9BY2Nlc3NSZWFkV3JpdGUgLCAgCi0gICAgQ1BfQWNjZXNzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0FjY2Vzc1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfQWNjZXNzTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9BQ0NFU1NUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgQ1BfUElQRVRZUEUncyBDaGVja0F2YWlsYWJsZUJ5dGVzIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0NIRUNLQllURVNSRVNVTFRUWVBFCi17Ci0gICAgQ1BfQ2hlY2tCeXRlc09rLCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGVyZSBhcmUgYXQgbGVhc3QgdGhlIHJlcXVlc3QgbnVtYmVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLwotICAgIENQX0NoZWNrQnl0ZXNOb3RSZWFkeSwgICAgICAgICAgICAgIC8qKjwgVGhlIHBpcGUgaXMgc3RpbGwgcmV0cmlldmluZyBieXRlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJlc2VudGx5IGxhY2tzIHN1ZmZpY2llbnQgYnl0ZXMuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzSW5zdWZmaWNpZW50Qnl0ZXMgICwgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJldHJpZXZlZCBhbGwgYnl0ZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRob3NlIGF2YWlsYWJsZSBhcmUgbGVzcyB0aGFuIHRob3NlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCAqLwotICAgIENQX0NoZWNrQnl0ZXNBdEVuZE9mU3RyZWFtLCAgICAgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNPdXRPZkJ1ZmZlcnMsICAgICAgICAgIC8qKjwgQWxsIHJlYWQvd3JpdGUgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0NoZWNrQnl0ZXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIENQX0NoZWNrQnl0ZXNNYXggPSAwWDdGRkZGRkZGCi19IENQX0NIRUNLQllURVNSRVNVTFRUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2suIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0VWRU5UVFlQRXsKLSAgICBDUF9CeXRlc0F2YWlsYWJsZSwgICAgICAJICAgIC8qKiBieXRlcyByZXF1ZXN0ZWQgaW4gYSBDaGVja0F2YWlsYWJsZUJ5dGVzIGNhbGwgYXJlIG5vdyBhdmFpbGFibGUqLwotICAgIENQX092ZXJmbG93LCAgCQkgICAgICAgICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCi0gICAgQ1BfUGlwZURpc2Nvbm5lY3RlZCAgLCAgCQkgICAgLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrKi8KLSAgICBDUF9FdmVudEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBDUF9FdmVudFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfRXZlbnRNYXggPSAwWDdGRkZGRkZGCi19IENQX0VWRU5UVFlQRTsKLQotLyoqIGNvbnRlbnQgcGlwZSBkZWZpbml0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BfUElQRVRZUEUKLXsKLSAgICAvKiogT3BlbiBhIGNvbnRlbnQgc3RyZWFtIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovIAotICAgIENQcmVzdWx0ICgqT3BlbikoIENQaGFuZGxlKiBoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkksIENQX0FDQ0VTU1RZUEUgZUFjY2VzcyApOwotCi0gICAgLyoqIENsb3NlIGEgY29udGVudCBzdHJlYW0uICovIAotICAgIENQcmVzdWx0ICgqQ2xvc2UpKCBDUGhhbmRsZSBoQ29udGVudCApOwotCi0gICAgLyoqIENyZWF0ZSBhIGNvbnRlbnQgc291cmNlIGFuZCBvcGVuIGl0IGZvciB3cml0aW5nLiAqLyAKLSAgICBDUHJlc3VsdCAoKkNyZWF0ZSkoIENQaGFuZGxlICpoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkkgKTsKLQotICAgIC8qKiBDaGVjayB0aGUgdGhhdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyAoZGVwZW5kaW5nIG9uIGFjY2VzcyB0eXBlKS4qLwotICAgIENQcmVzdWx0ICgqQ2hlY2tBdmFpbGFibGVCeXRlcykoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgbkJ5dGVzUmVxdWVzdGVkLCBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRSAqZVJlc3VsdCApOwotCi0gICAgLyoqIFNlZWsgdG8gY2VydGFpbiBwb3NpdGlvbiBpbiB0aGUgY29udGVudCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbi4gKi8KLSAgICBDUHJlc3VsdCAoKlNldFBvc2l0aW9uKSggQ1BoYW5kbGUgIGhDb250ZW50LCBDUGludCBuT2Zmc2V0LCBDUF9PUklHSU5UWVBFIGVPcmlnaW4pOwotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gKi8KLSAgICBDUHJlc3VsdCAoKkdldFBvc2l0aW9uKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQdWludCAqcFBvc2l0aW9uKTsKLQotICAgIC8qKiBSZXRyaWV2ZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBmcm9tIHRoZSBjb250ZW50IHN0cmVhbSAoYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgc2l6ZSBvZiBkYXRhKS4KLSAgICAgICBOb3RlOiBwaXBlIGNsaWVudCBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBzbWFsbCBoaWdoIGZyZXF1ZW5jeSByZWFkcy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWQpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwRGF0YSwgQ1B1aW50IG5TaXplKTsgCi0KLSAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuIAotICAgICAgIEJ1ZmZlciBjb250YWlucyB0aGUgbmV4dCBibG9jayBvZiBieXRlcywgYXMgc3BlY2lmaWVkIGJ5IG5TaXplLCBvZiB0aGUgY29udGVudC4gblNpemUgYWxzbwotICAgICAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFjdHVhbGx5IHJlYWQuIENvbnRlbnQgcG9pbnRlciBhZHZhbmNlcyB0aGUgYnkgdGhlIHJldHVybmVkIHNpemUuIAotICAgICAgIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgcmVhZHMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIAotICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4gCi0KLSAgICAgICBJbiBzb21lIGNhc2VzIHRoZSByZXF1ZXN0ZWQgYmxvY2sgbWF5IG5vdCByZXNpZGUgaW4gY29udGlndW91cyBtZW1vcnkgd2l0aGluIHRoZQotICAgICAgIHBpcGUgaW1wbGVtZW50YXRpb24uIEZvciBpbnN0YW5jZSBpZiB0aGUgcGlwZSBsZXZlcmFnZXMgYSBjaXJjdWxhciBidWZmZXIgdGhlbiB0aGUgcmVxdWVzdGVkIAotICAgICAgIGJsb2NrIG1heSBzdHJhZGRsZSB0aGUgYm91bmRhcnkgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4gQnkgZGVmYXVsdCBhIHBpcGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgcGVyZm9ybXMgYSBjb3B5IGluIHRoaXMgY2FzZSB0byBwcm92aWRlIHRoZSBibG9jayB0byB0aGUgcGlwZSBjbGllbnQgaW4gb25lIGNvbnRpZ3VvdXMgYnVmZmVyLgotICAgICAgIElmLCBob3dldmVyLCB0aGUgY2xpZW50IHNldHMgYkZvcmJpZENvcHksIHRoZW4gdGhlIHBpcGUgcmV0dXJucyBvbmx5IHRob3NlIGJ5dGVzIHByZWNlZGluZyB0aGUgbWVtb3J5IAotICAgICAgIGJvdW5kYXJ5LiBIZXJlIHRoZSBjbGllbnQgbWF5IHJldHJpZXZlIHRoZSBkYXRhIGluIHNlZ21lbnRzIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWRCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCAqblNpemUsIENQYm9vbCBiRm9yYmlkQ29weSk7Ci0KLSAgICAvKiogUmVsZWFzZSBhIGJ1ZmZlciBvYnRhaW5lZCBieSBSZWFkQnVmZmVyIGJhY2sgdG8gdGhlIHBpcGUuICovCi0gICAgQ1ByZXN1bHQgKCpSZWxlYXNlUmVhZEJ1ZmZlcikoQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlcik7Ci0KLSAgICAvKiogV3JpdGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgdG8gdGhlIGNvbnRlbnQgKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCi0gICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgd3JpdGVzLiAqLwotICAgIENQcmVzdWx0ICgqV3JpdGUpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpkYXRhLCBDUHVpbnQgblNpemUpOyAKLQotICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBjb250ZW50LiAKLSAgICAgICBDbGllbnQgd2lsbCBmaWxsIGJ1ZmZlciB3aXRoIG91dHB1dCBkYXRhLiBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUKLSAgICAgICBmb3IgbGFyZ2Ugd3JpdGVzLiBUaGUgY2xpZW50IG11c3QgY2FsbCBXcml0ZUJ1ZmZlciB3aGVuIGRvbmUgaXQgaGFzIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggZGF0YS4qLwotICAgIENQcmVzdWx0ICgqR2V0V3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCBuU2l6ZSk7Ci0KLSAgICAvKiogRGVsaXZlciBhIGJ1ZmZlciBvYnRhaW5lZCB2aWEgR2V0V3JpdGVCdWZmZXIgdG8gdGhlIHBpcGUuIFBpcGUgd2lsbCB3cml0ZSB0aGUgCi0gICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gY29udGVudCBhbmQgYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLwotICAgIENQcmVzdWx0ICgqV3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwQnVmZmVyLCBDUHVpbnQgbkZpbGxlZFNpemUpOwotCi0gICAgLyoqIFJlZ2lzdGVyIGEgcGVyLWhhbmRsZSBjbGllbnQgY2FsbGJhY2sgd2l0aCB0aGUgY29udGVudCBwaXBlLiAqLwotICAgIENQcmVzdWx0ICgqUmVnaXN0ZXJDYWxsYmFjaykoIENQaGFuZGxlIGhDb250ZW50LCBDUHJlc3VsdCAoKkNsaWVudENhbGxiYWNrKShDUF9FVkVOVFRZUEUgZUV2ZW50LCBDUHVpbnQgaVBhcmFtKSk7Ci0KLX0gQ1BfUElQRVRZUEU7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvcmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmIwZjZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX0NvcmUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfQ29yZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSBib3RoIHRoZQotICogIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IHRvIGFjY2VzcyBjb21tb24gaXRlbXMuCi0gKi8KLQotI2lmbmRlZiBPTVhfQ29yZV9oCi0jZGVmaW5lIE9NWF9Db3JlX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9JbmRleC5oPgotCi0KLS8qKiBUaGUgT01YX0NPTU1BTkRUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWN0aW9uIGluIHRoZQotICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4gIAotICogIEBpbmdyb3VwIGNvcmUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9DT01NQU5EVFlQRQotewotICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsICAgIC8qKjwgQ2hhbmdlIHRoZSBjb21wb25lbnQgc3RhdGUgKi8KLSAgICBPTVhfQ29tbWFuZEZsdXNoLCAgICAgICAvKio8IEZsdXNoIHRoZSBkYXRhIHF1ZXVlKHMpIG9mIGEgY29tcG9uZW50ICovCi0gICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgLyoqPCBEaXNhYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KLSAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUsICAvKio8IEVuYWJsZSBhIHBvcnQgb24gYSBjb21wb25lbnQuICovCi0gICAgT01YX0NvbW1hbmRNYXJrQnVmZmVyLCAgLyoqPCBNYXJrIGEgY29tcG9uZW50L2J1ZmZlciBmb3Igb2JzZXJ2YXRpb24gKi8KLSAgICBPTVhfQ29tbWFuZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQ29tbWFuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbW1hbmRNYXggPSAwWDdGRkZGRkZGCi19IE9NWF9DT01NQU5EVFlQRTsKLQotCi0KLS8qKiBUaGUgT01YX1NUQVRFVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIG9yIGNoYW5nZSB0aGUgY29tcG9uZW50Ci0gKiAgc3RhdGUuICBUaGlzIGVudW1lcmF0aW9uIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21wb25lbnQgd2hlbgotICogIHVzZWQgd2l0aCB0aGUgT01YX0dldFN0YXRlIG1hY3JvIG9yIGJlY29tZXMgdGhlIHBhcmFtZXRlciBpbiBhIHN0YXRlIGNoYW5nZQotICogIGNvbW1hbmQgd2hlbiB1c2VkIHdpdGggdGhlIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4KLSAqCi0gKiAgVGhlIGNvbXBvbmVudCB3aWxsIGJlIGluIHRoZSBMb2FkZWQgc3RhdGUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkKLSAqICBsb2FkZWQgaW50byBtZW1vcnkuICBJbiB0aGUgTG9hZGVkIHN0YXRlLCB0aGUgY29tcG9uZW50IGlzIG5vdCBhbGxvd2VkIHRvCi0gKiAgYWxsb2NhdGUgb3IgaG9sZCByZXNvdXJjZXMgb3RoZXIgdGhhbiB0byBidWlsZCBpdCdzIGludGVybmFsIHBhcmFtZXRlcgotICogIGFuZCBjb25maWd1cmF0aW9uIHRhYmxlcy4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHNlbmQgb25lIG9yIG1vcmUKLSAqICBTZXRQYXJhbWV0ZXJzL0dldFBhcmFtZXRlcnMgYW5kIFNldENvbmZpZy9HZXRDb25maWcgY29tbWFuZHMgdG8gdGhlCi0gKiAgY29tcG9uZW50IGFuZCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVyIGFuZAotICogIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgdXNlIGxhdGVyLiAgV2hlbiB0aGUgYXBwbGljYXRpb24gc2VuZHMgdGhlCi0gKiAgSWRsZSBjb21tYW5kLCB0aGUgY29tcG9uZW50IHdpbGwgYWNxdWlyZSB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlCi0gKiAgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgaWRsZSBzdGF0ZSBpZiB0aGUKLSAqICBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwuICBJZiB0aGUgY29tcG9uZW50IGNhbm5vdCBzdWNjZXNzZnVsbHkKLSAqICB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGZvciBhbnkgcmVhc29uLCB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudAotICogIHNoYWxsIGJlIGZ1bGx5IHJvbGxlZCBiYWNrIHRvIHRoZSBMb2FkZWQgc3RhdGUgKGUuZy4gYWxsIGFsbG9jYXRlZCAKLSAqICByZXNvdXJjZXMgc2hhbGwgYmUgcmVsZWFzZWQpLiAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBjb21tYW5kCi0gKiAgdG8gZ28gdG8gdGhlIEV4ZWN1dGluZyBzdGF0ZSwgaXQgc2hhbGwgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzIGJ5Ci0gKiAgc2VuZGluZyBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgYXBwbGljYXRpb24uICBXaGlsZQotICogIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIElkbGUgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBzZW5kIHRoZQotICogIFBhdXNlIGNvbW1hbmQuICBJZiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kIHdoaWxlIGluIHRoZQotICogIElkbGUgc3RhdGUsIHRoZSBjb21wb25lbnQgc2hhbGwgc2VuZCBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgCi0gKiAgYXBwbGljYXRpb24sIGJ1dCBzaGFsbCBub3QgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzLiAgVGhpcyB3aWxsIGFsbG93IHRoZQotICogIGFwcGxpY2F0aW9uIHRvIHByZWZpbGwgYnVmZmVycy4KLSAqIAotICogIEBpbmdyb3VwIGNvbXAKLSAqLwotCi10eXBlZGVmIGVudW0gT01YX1NUQVRFVFlQRQotewotICAgIE9NWF9TdGF0ZUludmFsaWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIHRoYXQgaXQncyBpbnRlcm5hbCBkYXRhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBjb3JydXB0ZWQgdG8gdGhlIHBvaW50IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGRldGVybWluZSBpdCdzIHN0YXRlIHByb3Blcmx5ICovCi0gICAgT01YX1N0YXRlTG9hZGVkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZCBidXQgaGFzIG5vdCBjb21wbGV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uICBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gYXJlIHRoZSBvbmx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIHRoaXMgc3RhdGUuICovCi0gICAgT01YX1N0YXRlSWRsZSwgICAgICAgIC8qKjwgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgYW5kIHRoZSBjb21wb25lbnQgaXMgcmVhZHkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQuICovCi0gICAgT01YX1N0YXRlRXhlY3V0aW5nLCAgIC8qKjwgY29tcG9uZW50IGhhcyBhY2NlcHRlZCB0aGUgc3RhcnQgY29tbWFuZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJvY2Vzc2luZyBkYXRhIChpZiBkYXRhIGlzIGF2YWlsYWJsZSkgKi8KLSAgICBPTVhfU3RhdGVQYXVzZSwgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIHJlY2VpdmVkIHBhdXNlIGNvbW1hbmQgKi8KLSAgICBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzLCAvKio8IGNvbXBvbmVudCBpcyB3YWl0aW5nIGZvciByZXNvdXJjZXMsIGVpdGhlciBhZnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdGlvbiBvciBiZWZvcmUgaXQgZ2V0cyB0aGUgcmVzb3VyY2VzIHJlcXVlc3RlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRldGFpbHMuICovCi0gICAgT01YX1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1N0YXRlTWF4ID0gMFg3RkZGRkZGRgotfSBPTVhfU1RBVEVUWVBFOwotCi0vKiogVGhlIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgc3RhbmRhcmQgT01YIEVycm9ycy4gIFRoZXNlIAotICogIGVycm9ycyBzaG91bGQgY292ZXIgbW9zdCBvZiB0aGUgY29tbW9uIGZhaWx1cmUgY2FzZXMuICBIb3dldmVyLCAKLSAqICB2ZW5kb3JzIGFyZSBmcmVlIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2VzIG9mIHRoZWlyIG93biBhcyAKLSAqICBsb25nIGFzIHRoZXkgZm9sbG93IHRoZXNlIHJ1bGVzOgotICogIDEuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIDB4OTAwMDAwMDAgdG8KLSAqICAgICAgMHg5MDAwRkZGRi4KLSAqICAyLiAgVmVuZG9yIGVycm9yIG1lc3NhZ2VzIHNoYWxsIGJlIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBwcm92aWRlZAotICogICAgICB3aXRoIHRoZSBjb21wb25lbnQuICBObyBlcnJvciBtZXNzYWdlcyBhcmUgYWxsb3dlZCB0aGF0IGFyZQotICogICAgICBub3QgZGVmaW5lZC4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FUlJPUlRZUEUKLXsKLSAgT01YX0Vycm9yTm9uZSA9IDAsCi0KLSAgLyoqIFRoZXJlIHdlcmUgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uICovCi0gIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyA9IChPTVhfUzMyKSAweDgwMDAxMDAwLAotCi0gIC8qKiBUaGVyZSB3YXMgYW4gZXJyb3IsIGJ1dCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICovCi0gIE9NWF9FcnJvclVuZGVmaW5lZCA9IChPTVhfUzMyKSAweDgwMDAxMDAxLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IG5hbWUgc3RyaW5nIHdhcyBub3QgdmFsaWQgKi8KLSAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWUgPSAoT01YX1MzMikgMHg4MDAwMTAwMiwKLQotICAvKiogTm8gY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHN0cmluZyB3YXMgZm91bmQgKi8KLSAgT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQgPSAoT01YX1MzMikgMHg4MDAwMTAwMywKLQotICAvKiogVGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgZGlkIG5vdCBoYXZlIGEgIk9NWF9Db21wb25lbnRJbml0IiBvcgotICAgICAgIk9NWF9Db21wb25lbnREZUluaXQgZW50cnkgcG9pbnQgKi8KLSAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCA9IChPTVhfUzMyKSAweDgwMDAxMDA0LAotCi0gIC8qKiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHdlcmUgbm90IHZhbGlkICovCi0gIE9NWF9FcnJvckJhZFBhcmFtZXRlciA9IChPTVhfUzMyKSAweDgwMDAxMDA1LAotCi0gIC8qKiBUaGUgcmVxdWVzdGVkIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotICBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDA2LAotCi0gIC8qKiBUaGUgYnVmZmVyIHdhcyBlbXB0aWVkIGJlZm9yZSB0aGUgbmV4dCBidWZmZXIgd2FzIHJlYWR5ICovCi0gIE9NWF9FcnJvclVuZGVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA3LAotCi0gIC8qKiBUaGUgYnVmZmVyIHdhcyBub3QgYXZhaWxhYmxlIHdoZW4gaXQgd2FzIG5lZWRlZCAqLwotICBPTVhfRXJyb3JPdmVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA4LAotCi0gIC8qKiBUaGUgaGFyZHdhcmUgZmFpbGVkIHRvIHJlc3BvbmQgYXMgZXhwZWN0ZWQgKi8KLSAgT01YX0Vycm9ySGFyZHdhcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwOSwKLQotICAvKiogVGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgc3RhdGUgT01YX1N0YXRlSW52YWxpZCAqLwotICBPTVhfRXJyb3JJbnZhbGlkU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAwQSwKLQotICAvKiogU3RyZWFtIGlzIGZvdW5kIHRvIGJlIGNvcnJ1cHQgKi8KLSAgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCA9IChPTVhfUzMyKSAweDgwMDAxMDBCLAotCi0gIC8qKiBQb3J0cyBiZWluZyBjb25uZWN0ZWQgYXJlIG5vdCBjb21wYXRpYmxlICovCi0gIE9NWF9FcnJvclBvcnRzTm90Q29tcGF0aWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDBDLAotCi0gIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGlkbGUgY29tcG9uZW50IGhhdmUgYmVlbgotICAgICAgbG9zdCByZXN1bHRpbmcgaW4gdGhlIGNvbXBvbmVudCByZXR1cm5pbmcgdG8gdGhlIGxvYWRlZCBzdGF0ZSAqLwotICBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEQsCi0KLSAgLyoqIE5vIG1vcmUgaW5kaWNpZXMgY2FuIGJlIGVudW1lcmF0ZWQgKi8KLSAgT01YX0Vycm9yTm9Nb3JlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEUsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgZGV0ZWN0ZWQgYSB2ZXJzaW9uIG1pc21hdGNoICovCi0gIE9NWF9FcnJvclZlcnNpb25NaXNtYXRjaCA9IChPTVhfUzMyKSAweDgwMDAxMDBGLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IGlzIG5vdCByZWFkeSB0byByZXR1cm4gZGF0YSBhdCB0aGlzIHRpbWUgKi8KLSAgT01YX0Vycm9yTm90UmVhZHkgPSAoT01YX1MzMikgMHg4MDAwMTAxMCwKLQotICAvKiogVGhlcmUgd2FzIGEgdGltZW91dCB0aGF0IG9jY3VycmVkICovCi0gIE9NWF9FcnJvclRpbWVvdXQgPSAoT01YX1MzMikgMHg4MDAwMTAxMSwKLQotICAvKiogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBzdGF0ZSB5b3UgYXJlIGFscmVhZHkgaW4gKi8KLSAgT01YX0Vycm9yU2FtZVN0YXRlID0gKE9NWF9TMzIpIDB4ODAwMDEwMTIsCi0KLSAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gZXhlY3V0aW5nIG9yIHBhdXNlZCBjb21wb25lbnQgaGF2ZSBiZWVuIAotICAgICAgcHJlZW1wdGVkLCBjYXVzaW5nIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIHRvIHRoZSBpZGxlIHN0YXRlICovCi0gIE9NWF9FcnJvclJlc291cmNlc1ByZWVtcHRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDEzLCAKLQotICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgTE9BREVEIHRvIHRoZSBJRExFIHN0YXRlIG9yCi0gICAgICBvbiBhIHBvcnQgcmVzdGFydCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAotICAgICAgdG8gc2VuZCBpdCBhbiBhbGxvY2F0ZWQgYnVmZmVyIHZpYSBhIFVzZUJ1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nQWxsb2NhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE0LAotCi0gIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBkZWFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIHN0YXRlIG9yIAotICAgICAgb24gYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKLSAgICAgIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvbiBvZiBhIGJ1ZmZlciBoZWFkZXIgdmlhIGEgRnJlZUJ1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTUsCi0KLSAgLyoqIEEgc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgc3RvcHBpbmcgb2YgYSBwb3J0IChlaXRoZXIgb24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIAotICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIAotICAgICAgdGhlIG5vbi1zdXBwbGllciB0byByZXR1cm4gYSBidWZmZXIgdmlhIGFuIEVtcHR5VGhpc0J1ZmZlciBvciBGaWxsVGhpc0J1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nU3RvcCA9IChPTVhfUzMyKSAweDgwMDAxMDE2LAotCi0gIC8qKiBBdHRlbXB0aW5nIGEgc3RhdGUgdHJhbnN0aW9uIHRoYXQgaXMgbm90IGFsbG93ZWQgKi8KLSAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTcsCi0KLSAgLyogQXR0ZW1wdGluZyBhIGNvbW1hbmQgdGhhdCBpcyBub3QgYWxsb3dlZCBkdXJpbmcgdGhlIHByZXNlbnQgc3RhdGUuICovCi0gIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTgsIAotCi0gIC8qKiBUaGUgdmFsdWVzIGVuY2Fwc3VsYXRlZCBpbiB0aGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBzdHJ1Y3R1cmUgYXJlIG5vdCBzdXBwb3J0ZWQuICovCi0gIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyA9IChPTVhfUzMyKSAweDgwMDAxMDE5LAotCi0gIC8qKiBUaGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIGluZGV4IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQSwKLQotICAvKiogVGhlIHBvcnQgaW5kZXggc3VwcGxpZWQgaXMgaW5jb3JyZWN0LiAqLwotICBPTVhfRXJyb3JCYWRQb3J0SW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQiwKLQotICAvKiogVGhlIHBvcnQgaGFzIGxvc3Qgb25lIG9yIG1vcmUgb2YgaXRzIGJ1ZmZlcnMgYW5kIGl0IHRodXMgdW5wb3B1bGF0ZWQuICovCi0gIE9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDFDLAotCi0gIC8qKiBDb21wb25lbnQgc3VzcGVuZGVkIGR1ZSB0byB0ZW1wb3JhcnkgbG9zcyBvZiByZXNvdXJjZXMgKi8KLSAgT01YX0Vycm9yQ29tcG9uZW50U3VzcGVuZGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUQsCi0KLSAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIGFuIGluYWJpbGl0eSB0byBhY3F1aXJlIGR5bmFtaWMgcmVzb3VyY2VzICovCi0gIE9NWF9FcnJvckR5bmFtaWNSZXNvdXJjZXNVbmF2YWlsYWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDFFLAotCi0gIC8qKiBXaGVuIHRoZSBtYWNyb2Jsb2NrIGVycm9yIHJlcG9ydGluZyBpcyBlbmFibGVkIHRoZSBjb21wb25lbnQgcmV0dXJucyBuZXcgZXJyb3IgCi0gIGZvciBldmVyeSBmcmFtZSB0aGF0IGhhcyBlcnJvcnMgKi8KLSAgT01YX0Vycm9yTWJFcnJvcnNJbkZyYW1lID0gKE9NWF9TMzIpIDB4ODAwMDEwMUYsCi0KLSAgLyoqIEEgY29tcG9uZW50IHJlcG9ydHMgdGhpcyBlcnJvciB3aGVuIGl0IGNhbm5vdCBwYXJzZSBvciBkZXRlcm1pbmUgdGhlIGZvcm1hdCBvZiBhbiBpbnB1dCBzdHJlYW0uICovCi0gIE9NWF9FcnJvckZvcm1hdE5vdERldGVjdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjAsIAotCi0gIC8qKiBUaGUgY29udGVudCBvcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCi0gIE9NWF9FcnJvckNvbnRlbnRQaXBlT3BlbkZhaWxlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIxLAotCi0gIC8qKiBUaGUgY29udGVudCBjcmVhdGlvbiBvcGVyYXRpb24gZmFpbGVkLiAqLwotICBPTVhfRXJyb3JDb250ZW50UGlwZUNyZWF0aW9uRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjIsCi0KLSAgLyoqIFNlcGFyYXRlIHRhYmxlIGluZm9ybWF0aW9uIGlzIGJlaW5nIHVzZWQgKi8KLSAgT01YX0Vycm9yU2VwZXJhdGVUYWJsZXNVc2VkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjMsCi0KLSAgLyoqIFR1bm5lbGluZyBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50Ki8KLSAgT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyNCwKLQotICBPTVhfRXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IChPTVhfUzMyKTB4OEYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkID0gKE9NWF9TMzIpMHg5MDAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9FcnJvck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VSUk9SVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvcmUgKi8KLXR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKiBPTVhfQ09NUE9ORU5USU5JVFRZUEUpKE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7Ci0KLS8qKiBAaW5ncm91cCBjb3JlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgICAgKiBwTmFtZTsgICAgICAgLyogQ29tcG9uZW50IG5hbWUsIDEyOCBieXRlIGxpbWl0IChpbmNsdWRpbmcgJ1wwJykgYXBwbGllcyAqLwotICBPTVhfQ09NUE9ORU5USU5JVFRZUEUgcEluaXRpYWxpemU7IC8qIENvbXBvbmVudCBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLwotfSBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFOwotCi0vKiogQGluZ3JvdXAgY29yZSAqLwotZXh0ZXJuIE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUgT01YX0NvbXBvbmVudFJlZ2lzdGVyZWRbXTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BSSU9SSVRZTUdNVFRZUEUgewotIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gT01YX1UzMiBuR3JvdXBQcmlvcml0eTsgICAgICAgICAgICAvKio8IFByaW9yaXR5IG9mIHRoZSBjb21wb25lbnQgZ3JvdXAgKi8KLSBPTVhfVTMyIG5Hcm91cElEOyAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLwotfSBPTVhfUFJJT1JJVFlNR01UVFlQRTsKLQotLyogQ29tcG9uZW50IG5hbWUgYW5kIFJvbGUgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotI2RlZmluZSBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAxMjgKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCBjUm9sZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07ICAvKio8IG5hbWUgb2Ygc3RhbmRhcmQgY29tcG9uZW50IHdoaWNoIGRlZmluZXMgY29tcG9uZW50IHJvbGUgKi8KLX0gT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFOwotCi0vKiogRW5kIG9mIFN0cmVhbSBCdWZmZXIgRmxhZzogCi0gICoKLSAgKiBBIGNvbXBvbmVudCBzZXRzIEVPUyB3aGVuIGl0IGhhcyBubyBtb3JlIGRhdGEgdG8gZW1pdCBvbiBhIHBhcnRpY3VsYXIgCi0gICogb3V0cHV0IHBvcnQuIFRodXMgYW4gb3V0cHV0IHBvcnQgc2hhbGwgc2V0IEVPUyBvbiB0aGUgbGFzdCBidWZmZXIgaXQgCi0gICogZW1pdHMuIEEgY29tcG9uZW50J3MgZGV0ZXJtaW5hdGlvbiBvZiB3aGVuIGFuIG91dHB1dCBwb3J0IHNob3VsZCAKLSAgKiBjZWFzZSBzZW5kaW5nIGRhdGEgaXMgaW1wbGVtZW5hdGlvbiBzcGVjaWZpYy4KLSAgKiBAaW5ncm91cCBidWYKLSAgKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FT1MgMHgwMDAwMDAwMSAKLQotLyoqIFN0YXJ0IFRpbWUgQnVmZmVyIEZsYWc6IAotICoKLSAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIFNUQVJUVElNRQotICogZmxhZyBvbiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlCi0gKiBzdHJlYW0uIFRoZSBzdGFydGluZyB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGRhdGEgdGhhdAotICogc2hvdWxkIGJlIGRpc3BsYXllZCBhdCBzdGFydHVwIG9yIGFmdGVyIGEgc2Vlay4KLSAqIFRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHN0cmVhbSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHN0YXJ0IHRpbWUuCi0gKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgc2VlayB0byBhIHBhcnRpY3VsYXIgdmlkZW8gZnJhbWUsIAotICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mIAotICogdGhlIHN0cmVhbSB3aWxsIGJlIHRoZSBpbnRyYS1mcmFtZSBwcmVjZWRpbmcgdGhlIHRhcmdldCBmcmFtZSBhbmQKLSAqIHRoZSBzdGFydHRpbWUgd2lsbCBvY2N1ciB3aXRoIHRoZSB0YXJnZXQgZnJhbWUgKHdpdGggYW55IG90aGVyCi0gKiByZXF1aXJlZCBmcmFtZXMgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIHRhcmdldCBpbnRlcnZlbmluZykuCi0gKgotICogVGhlIFNUQVJUVElNRSBmbGFnIGlzIGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyJ3MgCi0gKiB0aW1lc3RhbXAgJyB0aHVzIGl0cyBhc3NvY2lhdGlvbiB0byBidWZmZXIgZGF0YSBhbmQgaXRzIAotICogcHJvcGFnYXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSB0aW1lc3RhbXAncy4KLSAqCi0gKiBXaGVuIGEgU3luYyBDb21wb25lbnQgY2xpZW50IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGggdGhlIAotICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0IAotICogdXNpbmcgT01YX0NvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUgYW5kIHBhc3NpbmcgdGhlIGJ1ZmZlcidzCi0gKiB0aW1lc3RhbXAuCi0gKiAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIDB4MDAwMDAwMDIKLQotIAotCi0vKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6IAotICoKLSAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIERFQ09ERU9OTFkKLSAqIGZsYWcgb24gYW55IGJ1ZmZlciB0aGF0IHNob3VsZCBzaGFsbCBiZSBkZWNvZGVkIGJ1dCBzaG91bGQgbm90IGJlCi0gKiBkaXNwbGF5ZWQuIFRoaXMgZmxhZyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsIHdoZW4gYSBzb3VyY2Ugc2Vla3MgdG8gCi0gKiBhIHRhcmdldCBpbnRlcmZyYW1lIHRoYXQgcmVxdWlyZXMgdGhlIGRlY29kZSBvZiBmcmFtZXMgcHJlY2VkaW5nIHRoZSAKLSAqIHRhcmdldCB0byBmYWNpbGl0YXRlIHRoZSB0YXJnZXQncyByZWNvbnN0cnVjdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSAKLSAqIHNvdXJjZSB3b3VsZCBlbWl0IHRoZSBmcmFtZXMgcHJlY2VkaW5nIHRoZSB0YXJnZXQgZG93bnN0cmVhbSAKLSAqIGJ1dCBtYXJrIHRoZW0gYXMgZGVjb2RlIG9ubHkuCi0gKgotICogVGhlIERFQ09ERU9OTFkgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciBkYXRhIGFuZCBwcm9wYWdhdGVkIGluIGEgCi0gKiBtYW5uZXIgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgdGltZXN0YW1wLgotICoKLSAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBkYXRhIHNob3VsZCBpZ25vcmUgYWxsIGJ1ZmZlcnMgd2l0aCAKLSAqIHRoZSBERUNPREVPTkxZIGZsYWcgc2V0LgotICogCi0gKiBAaW5ncm91cCBidWYKLSAqLwotCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0RFQ09ERU9OTFkgMHgwMDAwMDAwNAotCi0KLS8qIERhdGEgQ29ycnVwdCBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIElMIGNsaWVudCBiZWxpZXZlcyB0aGUgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBidWZmZXIgaXMgY29ycnVwdCAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREFUQUNPUlJVUFQgMHgwMDAwMDAwOAotCi0vKiBFbmQgb2YgRnJhbWU6IFRoZSBidWZmZXIgY29udGFpbnMgZXhhY3RseSBvbmUgZW5kIG9mIGZyYW1lIGFuZCBubyBkYXRhCi0gKiAgb2NjdXJzIGFmdGVyIHRoZSBlbmQgb2YgZnJhbWUuIFRoaXMgZmxhZyBpcyBhbiBvcHRpb25hbCBoaW50LiBUaGUgYWJzZW5jZQotICogIG9mIHRoaXMgZmxhZyBkb2VzIG5vdCBpbXBseSB0aGUgYWJzZW5jZSBvZiBhbiBlbmQgb2YgZnJhbWUgd2l0aGluIHRoZSBidWZmZXIuIAotICogQGluZ3JvdXAgYnVmCi0qLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIDB4MDAwMDAwMTAKLQotLyogU3luYyBGcmFtZSBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGJ1ZmZlciBjb250ZW50IGNvbnRhaW5zIGEgY29kZWQgc3luYyBmcmFtZSAnIAotICogIGEgZnJhbWUgdGhhdCBoYXMgbm8gZGVwZW5kZW5jeSBvbiBhbnkgb3RoZXIgZnJhbWUgaW5mb3JtYXRpb24gCi0gKiAgQGluZ3JvdXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FIDB4MDAwMDAwMjAKLQotLyogRXh0cmEgZGF0YSBwcmVzZW50IGZsYWc6IHRoZXJlIGlzIGV4dHJhIGRhdGEgYXBwZW5kZWQgdG8gdGhlIGRhdGEgc3RyZWFtCi0gKiByZXNpZGluZyBpbiB0aGUgYnVmZmVyIAotICogQGluZ3JvdXAgYnVmICAKLSAqLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FWFRSQURBVEEgMHgwMDAwMDA0MAotCi0vKiogQ29kZWMgQ29uZmlnIEJ1ZmZlciBGbGFnOiAKLSogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgaXMgYW4gb3B0aW9uYWwgZmxhZyB0aGF0IGlzIHNldCBieSBhbgotKiBvdXRwdXQgcG9ydCB3aGVuIGFsbCBieXRlcyBpbiB0aGUgYnVmZmVyIGZvcm0gcGFydCBvciBhbGwgb2YgYSBzZXQgb2YKLSogY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLiAgRXhhbXBsZXMgaW5jbHVkZSBTUFMvUFBTIG5hbCB1bml0cwotKiBmb3IgT01YX1ZJREVPX0NvZGluZ0FWQyBvciBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgZm9yCi0qIE9NWF9BVURJT19Db2RpbmdBQUMuICBBbnkgY29tcG9uZW50IHRoYXQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHNldHMgCi0qIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNoYWxsIG5vdCBtaXggY29kZWMgY29uZmlndXJhdGlvbiBieXRlcwotKiB3aXRoIGZyYW1lIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyLCBhbmQgc2hhbGwgc2VuZCBhbGwgYnVmZmVycwotKiBjb250YWluaW5nIGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMgYmVmb3JlIGFueSBidWZmZXJzIGNvbnRhaW5pbmcKLSogZnJhbWUgZGF0YSB0aGF0IHRob3NlIGNvbmZpZ3VyYXRpb25zIGJ5dGVzIGRlc2NyaWJlLgotKiBJZiB0aGUgc3RyZWFtIGZvcm1hdCBmb3IgYSBwYXJ0aWN1bGFyIGNvZGVjIGhhcyBhIGZyYW1lIHNwZWNpZmljCi0qIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCBmcmFtZSwgZm9yIGV4YW1wbGUgT01YX0FVRElPX0NvZGluZ01QMyBvcgotKiBPTVhfQVVESU9fQ29kaW5nQUFDIGluIEFEVFMgbW9kZSwgdGhlbiB0aGVzZSBzaGFsbCBiZSBwcmVzZW50ZWQgYXMKLSogbm9ybWFsIHdpdGhvdXQgc2V0dGluZyBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRy4KLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIDB4MDAwMDAwODAKLQotCi0KLS8qKiBAaW5ncm91cCBidWYgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCi0gICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICBPTVhfVTMyIG5PZmZzZXQ7ICAgICAgICAgICAgLyoqPCBzdGFydCBvZmZzZXQgb2YgdmFsaWQgZGF0YSBpbiBieXRlcyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBBcHBQcml2YXRlOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX1BUUiBwUGxhdGZvcm1Qcml2YXRlOyAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLyAKLSAgICBPTVhfUFRSIHBJbnB1dFBvcnRQcml2YXRlOyAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBpbnB1dCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBPdXRwdXRQb3J0UHJpdmF0ZTsgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBvdXRwdXQgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGV2ZW50IHVwb24gcHJvY2Vzc2luZyB0aGlzIGJ1ZmZlci4gKi8KLSAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLwotICAgIE9NWF9VMzIgblRpY2tDb3VudDsgICAgICAgICAvKio8IE9wdGlvbmFsIGVudHJ5IHRoYXQgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHdpdGggYSB0aWNrIGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGFjY2VzcyB0aGUgY29tcG9uZW50LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBpbiBtaWNyb3NlY29uZHMuICBTaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgYSB2YWx1ZSByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBwb2ludCwgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgdXNlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KLSBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgc2FtcGxlcyB3aXRoaW4gdGhlIGJ1ZmZlciBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmZlcnJlZCBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlciB0byB0aGUgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIuKi8KLSAgT01YX1UzMiAgICAgbkZsYWdzOyAgICAgICAgICAgLyoqPCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MgKi8KLSAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCi0gIE9NWF9VMzIgbklucHV0UG9ydEluZGV4OyAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBpbnB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KLX0gT01YX0JVRkZFUkhFQURFUlRZUEU7Ci0KLS8qKiBUaGUgT01YX0VYVFJBREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkZWZpbmUgdGhlIAotICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgotICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKLSAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAotICogT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbi4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFRSQURBVEFUWVBFCi17Ci0gICBPTVhfRXh0cmFEYXRhTm9uZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGF0IG5vIG1vcmUgZXh0cmEgZGF0YSBzZWN0aW9ucyBmb2xsb3cgKi8gICAgICAgIAotICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCi0gICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVhUUkFEQVRBVFlQRTsKLQotCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRVhUUkFEQVRBVFlQRSBlVHlwZTsgICAgICAgLyogRXh0cmEgRGF0YSB0eXBlICovCi0gICAgT01YX1UzMiBuRGF0YVNpemU7ICAgLyogU2l6ZSBvZiB0aGUgc3VwcG9ydGluZyBkYXRhIHRvIGZvbGxvdyAqLwotICAgIE9NWF9VOCAgZGF0YVsxXTsgICAgIC8qIFN1cHBvcnRpbmcgZGF0YSBoaW50ICAqLwotfSBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QT1JUX1BBUkFNX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLwotICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCi19IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKLXsKLSAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29tbWFuZCAqLwotICAgIE9NWF9FdmVudEVycm9yLCAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBlcnJvciBjb25kaXRpb24gKi8KLSAgICBPTVhfRXZlbnRNYXJrLCAgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBidWZmZXIgbWFyayAqLwotICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qKjwgY29tcG9uZW50IGlzIHJlcG9ydGVkIGEgcG9ydCBzZXR0aW5ncyBjaGFuZ2UgKi8KLSAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLCAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gRU9TICovIAotICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KLSAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLwotICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KLSAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLwotICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgIE9NWF9FdmVudE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VWRU5UVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NBTExCQUNLVFlQRQotewotICAgIC8qKiBUaGUgRXZlbnRIYW5kbGVyIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gd2hlbiBhbgotICAgICAgICBldmVudCBvZiBpbnRlcmVzdCBvY2N1cnMuICBFdmVudHMgYXJlIGRlZmluZWQgaW4gdGhlIE9NWF9FVkVOVFRZUEUKLSAgICAgICAgZW51bWVyYXRpb24uICBQbGVhc2Ugc2VlIHRoYXQgZW51bWVyYXRpb24gZm9yIGRldGFpbHMgb2Ygd2hhdCB3aWxsCi0gICAgICAgIGJlIHJldHVybmVkIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuIENhbGxiYWNrcyBzaG91bGQgbm90IHJldHVybgotICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgc2hhbGwgaGFuZGxlIGl0IGludGVybmFsbHkuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjIHRvIGF2b2lkCi0gICAgICAgIGJsb2NraW5nIHRoZSBjb21wb25lbnQgZm9yIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCi0KLSAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKLSAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KLSAgICAgICAgQHBhcmFtIGVFdmVudAotICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCi0gICAgICAgIEBwYXJhbSBuRGF0YTEKLSAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAotICAgICAgICAgICAgYW4gT01YX0NPTU1BTkRUWVBFIGZvciBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgYW5kIE9NWF9JTkRFWFRZUEUgZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCi0gICAgICAgICBAcGFyYW0gbkRhdGEyCi0gICAgICAgICAgICBuRGF0YTIgd2lsbCBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQuIENhbiBiZSBPTVhfU1RBVEVUWVBFIGZvcgotICAgICAgICAgICAgYSBPTVhfQ29tbWFuZFN0YXRlU2V0IGNvbW1hbmQgb3IgcG9ydCBpbmRleCBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KLSAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMCBpZiBub3QgdXNlZC4gKQotICAgICAgICBAcGFyYW0gcEV2ZW50RGF0YQotICAgICAgICAgICAgUG9pbnRlciB0byBhZGRpdGlvbmFsIGV2ZW50LXNwZWNpZmljIGRhdGEgKHNlZSBzcGVjIGZvciBtZWFuaW5nKS4KLSAgICAgICovCi0KLSAgIE9NWF9FUlJPUlRZUEUgKCpFdmVudEhhbmRsZXIpKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAotICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwotCi0gICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCi0gICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCi0gICAgICAgIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVmaWxsIHRoZSBidWZmZXJzIGR1cmluZyB0aGlzCi0gICAgICAgIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlbSBhbmQgcmVmaWxsIHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZQotICAgICAgICBpcyBubyBlcnJvciByZXR1cm4sIHNvIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQKLSAgICAgICAgaW50ZXJuYWxseS4gIAotICAgICAgICAKLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAgICAgCi0gICAgICAgIEBwYXJhbSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCi0gICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCi0gICAgICAgIEBwYXJhbSBwQnVmZmVyCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBlbXB0aWVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlCdWZmZXJEb25lKSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIFRoZSBGaWxsQnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZmlsbGVkIGJ1ZmZlcnMgZnJvbSBhbgotICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuICAKLSAgICAgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byAKLSAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycyAKLSAgICAgICAgYW5kIGVtcHR5IHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHNvIAotICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGludGVybmFsbHkuICBUaGUgCi0gICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgICAgIAotICAgICAgICBAcGFyYW0gaENvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHBhcmFtIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAotICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgotICAgICAgICBAcGFyYW0gcEJ1ZmZlcgotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZmlsbGVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRmlsbEJ1ZmZlckRvbmUpKAotICAgICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9PVVQgT01YX1BUUiBwQXBwRGF0YSwKLSAgICAgICAgT01YX09VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLX0gT01YX0NBTExCQUNLVFlQRTsKLQotLyoqIFRoZSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGljdGF0ZSBwb3J0IHN1cHBsaWVyCi0gICAgcHJlZmVyZW5jZSB3aGVuIHR1bm5lbGluZyBiZXR3ZWVuIHR3byBwb3J0cy4KLSAgICBAaW5ncm91cCB0dW4gYnVmCi0qLwotdHlwZWRlZiBlbnVtIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUKLXsKLSAgICBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQgPSAweDAsIC8qKjwgcG9ydCBzdXBwbHlpbmcgdGhlIGJ1ZmZlcnMgaXMgdW5zcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLwotICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQnVmZmVyU3VwcGx5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQnVmZmVyU3VwcGx5TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFOwotCi0KLS8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyIAotICogQGluZ3JvdXAgdHVuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVCdWZmZXJTdXBwbGllcjsgLyoqPCBidWZmZXIgc3VwcGxpZXIgKi8KLX0gT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRTsKLQotCi0vKio8IGluZGljYXRlcyB0aGF0IGJ1ZmZlcnMgcmVjZWl2ZWQgYnkgYW4gaW5wdXQgcG9ydCBvZiBhIHR1bm5lbCAKLSAgICAgbWF5IG5vdCBtb2RpZnkgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcnMgCi0gICAgIEBpbmdyb3VwIHR1bgotICovCi0jZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAotCi0KLS8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKLSAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKLSAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCi0gICAgQGluZ3JvdXAgdHVuCi0gKi8gICAKLXR5cGVkZWYgc3RydWN0IE9NWF9UVU5ORUxTRVRVUFRZUEUKLXsKLSAgICBPTVhfVTMyIG5UdW5uZWxGbGFnczsgICAgICAgICAgICAgLyoqPCBiaXQgZmxhZ3MgZm9yIHR1bm5lbGluZyAqLwotICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZVN1cHBsaWVyOyAvKio8IHN1cHBsaWVyIHByZWZlcmVuY2UgKi8KLX0gT01YX1RVTk5FTFNFVFVQVFlQRTsgCi0KLS8qIE9NWCBDb21wb25lbnQgaGVhZGVycyBpcyBpbmNsdWRlZCB0byBlbmFibGUgdGhlIGNvcmUgdG8gdXNlCi0gICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4gIAotICAgRGV2ZWxvcGVycyBzaG91bGQgbm90IGFjY2VzcyBhbnkgc3RydWN0dXJlcyBvciBkYXRhIGZyb20gd2l0aGluCi0gICB0aGUgY29tcG9uZW50IGhlYWRlciBkaXJlY3RseSAqLwotLyogVE8gQkUgUkVNT1ZFRCAtICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+ICovCi0KLS8qKiBHZXRDb21wb25lbnRWZXJzaW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wb25lbnQuICAKLSAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZQotICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYSBhIGNvcmUgbWFjcm8pLiAgVGhlCi0gICAgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudE5hbWUKLSAgICAgICAgcG9pbnRlciB0byBhbiBlbXB0eSBzdHJpbmcgb2YgbGVuZ3RoIDEyOCBieXRlcy4gIFRoZSBjb21wb25lbnQgCi0gICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUgCi0gICAgICAgIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLiAgVGhlIG5hbWUgb2YgYSBjb21wb25lbnQgd2lsbCAKLSAgICAgICAgYmUgMTI3IGJ5dGVzIG9yIGxlc3MgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4gIAotICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5BQkMuQ2hhbm5lbE1peGVyXDAiLgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VmVyc2lvbgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAotICAgICAgICBpbi4gIFRoZSBjb21wb25lbnQgd2lsbCBmaWxsIGluIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIAotICAgICAgICBjb21wb25lbnQgdmVyc2lvbi4gIE5PVEU6IHRoZSBjb21wb25lbnQgdmVyc2lvbiBpcyBOT1QgdGhlIHNhbWUgCi0gICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUgCi0gICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBvZiB0aGUgY29tcG9uZW50IGFuZCAKLSAgICAgICAgaXRzIHZhbHVlIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBjb21wb25lbnQgdmVuZG9yLgotICAgIEBwYXJhbSBbb3V0XSBwU3BlY1ZlcnNpb24KLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKLSAgICAgICAgaW4uICBUaGUgU3BlY1ZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdC4gIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgb3IgCi0gICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlIAotICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QgdGhlIDIuMCBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIAotICAgICAgICBhcHBsaWNhdGlvbiAod2hpY2ggY3JlYXRlcyB0aGUgc3RydWN0dXJlIGlzIGJ1aWx0IGFnYWluc3QgdGhlIAotICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAotICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCi0gICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAotICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX0dldENvbXBvbmVudFZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29tcG9uZW50VmVyc2lvbiggIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgY2FsbCBpcyBhIG5vbi1ibG9ja2luZyBjYWxsLgotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHF1ZXVlIHRoZSBjb21tYW5kCi0gICAgdG8gdGhlIGNvbXBvbmVudCB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuICBUaGUgY29tcG9uZW50IHRocmVhZCBzaGFsbCAKLSAgICBzZW5kIHRoZSBFdmVudEhhbmRsZXIoKSBjYWxsYmFjayBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgY29tbWFuZC4gCi0gICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQotICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgdGhlIGNvbXBvbmVudCB3aWxsIHF1ZXVlIGEKLSAgICBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUgaWRlbmZpZWQgaW4gblBhcmFtLgotICAgIAotICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kRmx1c2giLCB0byBmbHVzaCBhIHBvcnQncyBidWZmZXIgcXVldWVzLAotICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWSAKLSAgICBCRUlORyBQUk9DRVNTRUQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGJ1ZmZlcnMgCi0gICAgd2VyZSByZWNlaXZlZC4KLSAgICAKLSAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvciAKLSAgICAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgKGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZgotICAgIG5QYXJhbSkgd2lsbCBiZSBzdG9wcGVkIG9yIHJlc3RhcnRlZC4gCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIiBpcyB1c2VkIHRvIG1hcmsgYSBidWZmZXIsIHRoZQotICAgIHBDbWREYXRhIHdpbGwgcG9pbnQgdG8gYSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAotICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGV4YW1pbmUgdGhlIGJ1ZmZlciBjaGFpbiBmb3IgdGhlIG1hcmsuICBuUGFyYW0xCi0gICAgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBwb3J0IG9uIHdoaWNoIHRoZSBidWZmZXIgbWFyayBpcyBhcHBsaWVkLgotCi0gICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuIAotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCi0gICAgQHBhcmFtIFtpbl0gQ21kCi0gICAgICAgIENvbW1hbmQgZm9yIHRoZSBjb21wb25lbnQgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSBbaW5dIG5QYXJhbQotICAgICAgICBQYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAKLSAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgdmFsdWUgaXMgYSBtZW1iZXIgb2YgT01YX1NUQVRFVFlQRS4gIFdoZW4gQ21kIGhhcyAKLSAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKSAKLSAgICAgICAgdG8gZmx1c2guIC0xIGlzIHVzZWQgdG8gZmx1c2ggYWxsIHBvcnRzIGEgc2luZ2xlIHBvcnQgaW5kZXggd2lsbCAKLSAgICAgICAgb25seSBmbHVzaCB0aGF0IHBvcnQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIgotICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkgCi0gICAgICAgIHRoZSB2YWx1ZSBvZiBuUGFyYW0uICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiCi0gICAgICAgIHRoZSBjb21wb25lbnRzIHBvdCBpcyBnaXZlbiBieSB0aGUgdmFsdWUgb2YgblBhcmFtLgotICAgIEBwYXJhbSBbaW5dIHBDbWREYXRhCi0gICAgICAgIFBhcmFtZXRlciBwb2ludGluZyB0byB0aGUgT01YX01BUktUWVBFIHN0cnVjdHVyZSB3aGVuIENtZCBoYXMgdGhlIHZhbHVlCi0gICAgICAgICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiLiAgICAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZW5kQ29tbWFuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZW5kQ29tbWFuZCggICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIAotICAgIHNldHRpbmdzIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2Fubm90IG9ubHkgYmUgaW52b2tlZCB3aGVuIAotICAgIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUludmFsaWQgc3RhdGUuICBUaGUgblBhcmFtSW5kZXgKLSAgICBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20KLSAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSAKLSAgICBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIAotICAgIGludm9raW5nIHRoaXMgbWFjcm8uICBXaGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQsIHRoZQotICAgIGNhbGxlciBzaGFsbCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBuUG9ydEluZGV4IHZhbHVlIGluZGljYXRpbmcgdGhlCi0gICAgcG9ydCBvbiB3aGljaCB0aGUgcGFyYW1ldGVyIGFwcGxpZXMuIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgCi0gICAgYW55IHNldHRpbmdzIGNoYW5nZWQsIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIAotICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgCi0gICAgY2FsbC4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUGFyYW1JbmRleAotICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQotICAgICAgICBQb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKLSAgICAgICAgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgc2VuZCBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLSAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCi0gICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKLSAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKLSAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCi0gICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCi0gICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAotICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKLSAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgotICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKLSAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKLSAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgotICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfU2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAotICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAotICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKLSAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKLSAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAotICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCi0gICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKLSAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAotICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgotICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAotICAgICAgICBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotKi8gICAgICAgIAotI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29uZmlnKCAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCi0gICAgc3RydWN0dXJlcyB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKLSAgICBlYWNoIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIAotICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgCi0gICAgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSAKLSAgICBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyAKLSAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciAKLSAgICB0aGUgY2FsbCBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuQ29uZmlnSW5kZXgKLSAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGFib3ZlLgotICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCi0gICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRDb25maWcoICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUgCi0gICAgYSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYW4gT01YIAotICAgIHN0cnVjdHVyZSBpbmRleC4gIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgdmVuZG9yIHRvIHN1cHBvcnQgCi0gICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFIAotICAgIGVudW1lcmF0aW9uICh0aGlzIGlzIGRvbmUgdG8gc2F2ZSBzcGFjZSBpbiBzbWFsbCBjb21wb25lbnRzKS4gIFRoZSAKLSAgICBjb21wb25lbnQgc2hhbGwgc3VwcG9ydCBhbGwgdmVuZG9yIHN1cHBsaWVkIGV4dGVuc2lvbiBpbmRleGVzIG5vdCBmb3VuZAotICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBjUGFyYW1ldGVyTmFtZQotICAgICAgICBPTVhfU1RSSU5HIHRoYXQgc2hhbGwgYmUgbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nCi0gICAgICAgIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGdldCAKLSAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgotICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCi0gICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9HZXRFeHRlbnNpb25JbmRleCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldEV4dGVuc2lvbkluZGV4KCAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQgCi0gICAgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgcGxhY2UgdGhlIHN0YXRlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uCi0gICAgcG9pbnRlZCB0byBieSBwU3RhdGUuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcFN0YXRlCi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCi0gICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0U3RhdGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRTdGF0ZSggICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX1VzZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQotICAgIGEgYnVmZmVyIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKSBhbHJlYWR5IGFsbG9jYXRlZCAKLSAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nIAotICAgIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotCi0jZGVmaW5lIE9NWF9Vc2VCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUJ1ZmZlciggICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpCi0KLQotLyoqIFRoZSBPTVhfQWxsb2NhdGVCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZSAKLSAgICBhIG5ldyBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuICBUaGUgY29tcG9uZW50IHdpbGwgYWxsb2NhdGUgdGhlIAotICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAKLSAgICBoZWFkZXIuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAotICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKLSAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAotICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKLSAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKLSAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAotICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KLSAgICBAcGFyYW0gW2luXSBuU2l6ZUJ5dGVzCi0gICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZS4gIFVzZWQgd2hlbiBiQWxsb2NhdGVOZXcgaXMgdHJ1ZS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovICAgIAotI2RlZmluZSBPTVhfQWxsb2NhdGVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5BbGxvY2F0ZUJ1ZmZlciggICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0ZyZWVCdWZmZXIgbWFjcm8gd2lsbCByZWxlYXNlIGEgYnVmZmVyIGhlYWRlciBmcm9tIHRoZSBjb21wb25lbnQKLSAgICB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBPTVhfQWxsb2NhdGVCdWZmZXIgb3IgT01YX1VzZUJ1ZmZlci4gSWYgIAotICAgIHRoZSBjb21wb25lbnQgYWxsb2NhdGVkIHRoZSBidWZmZXIgKHNlZSB0aGUgT01YX1VzZUJ1ZmZlciBtYWNybykgdGhlbiAKLSAgICB0aGUgY29tcG9uZW50IHNoYWxsIGZyZWUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gVGhpcyBpcyBhIAotICAgIGJsb2NraW5nIGNhbGwuIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZyZWVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RnJlZUJ1ZmZlciggICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKLSAgICBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBFbXB0eUJ1ZmZlckRvbmUgY2FsbCBiYWNrLgotICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgotICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZW1wdHkgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCi0gICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKLSAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0Ci0gICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgotICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovCi0jZGVmaW5lIE9NWF9FbXB0eVRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkVtcHR5VGhpc0J1ZmZlciggICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKLSAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCi0gICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCi0gICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAotICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCi0gICAgaXMgaW4gdGhlIE9NWF9FeGVjdXRpbmdTdGF0ZS4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQKLSAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZpbGxUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RmlsbFRoaXNCdWZmZXIoICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0KLS8qKiBUaGUgT01YX1VzZUVHTEltYWdlIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCi0gICAgYSBFR0xJbWFnZSBwcm92aWRlZCBieSBFR0wgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gdXNlZAotICAgICAgICBmb3IgdGhpcyBidWZmZXIgaXMgTk9UIHZpc2libGUgdG8gdGhlIElMIENsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4Ci0gICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgotICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCi0gICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKLSAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCi0gICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKLSAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQotICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKLSAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKLSAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX1VzZUVHTEltYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlRUdMSW1hZ2UoICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpCi0KLS8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKLSAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKLSAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLQotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfSW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9EZWluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIAotICAgIHRoZSBsYXN0IGNhbGwgbWFkZSBpbnRvIE9NWC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcmUgZGV0ZXJtaW5lcyB0aGF0IAotICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuIAotICAgIHdpdGggYW4gZXJyb3IgcmF0aGVyIHRoYW4gdHJ5IHRvIHVubG9hZCB0aGUgY29tcG9uZW50cy4KLSAgICAgICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb3JlCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9Db21wb25lbnROYW1lRW51bSBtZXRob2Qgd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgdGhlIG5hbWVzIG9mCi0gICAgcmVjb2duaXNlZCB2YWxpZCBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQKLSAgICBhcyBhIG1lYW5zIHRvIGRldGVjdCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBydW4tdGltZS4gVGhlcmUgaXMKLSAgICBubyBzdHJpY3Qgb3JkZXJpbmcgdG8gdGhlIGVudW1lcmF0aW9uIG9yZGVyIG9mIGNvbXBvbmVudCBuYW1lcywgYWx0aG91Z2gKLSAgICBlYWNoIG5hbWUgd2lsbCBvbmx5IGJlIGVudW1lcmF0ZWQgb25jZS4gIElmIHRoZSBPTVggY29yZSBzdXBwb3J0cyBydW4tdGltZQotICAgIGluc3RhbGxhdGlvbiBvZiBuZXcgY29tcG9uZW50cywgaXQgaXMgb25seSByZXF1cmllZCB0byBkZXRlY3QgbmV3bHkKLSAgICBpbnN0YWxsZWQgY29tcG9uZW50cyB3aGVuIHRoZSBmaXJzdCBjYWxsIHRvIGVudW1lcmF0ZSBjb21wb25lbnQgbmFtZXMKLSAgICBpcyBtYWRlIChpLmUuIHdoZW4gbkluZGV4IGlzIDB4MCkuCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbb3V0XSBjQ29tcG9uZW50TmFtZQotICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQotICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAotICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAotICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAotICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKLSAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgotICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCi0gICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKLSAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKLSAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKLSAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgotICAgIEBwYXJhbSBbaW5dIG5JbmRleAotICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAotICAgICAgICBNdWx0aXBsZSBjYWxscyB0byBPTVhfQ29tcG9uZW50TmFtZUVudW0gd2l0aCBpbmNyZWFzaW5nIHZhbHVlcwotICAgICAgICBvZiBuSW5kZXggd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgY29tcG9uZW50IG5hbWVzIGluIHRoZQotICAgICAgICBzeXN0ZW0gdW50aWwgT01YX0Vycm9yTm9Nb3JlIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlIG9mIG5JbmRleAotICAgICAgICBpcyAwIHRvIChOLTEpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW5zdGFsbGVkIGNvbXBvbmVudHMKLSAgICAgICAgaW4gdGhlIHN5c3RlbS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZiAKLSAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIG1pbnVzIDEsIE9NWF9FcnJvck5vTW9yZSB3aWxsIGJlCi0gICAgICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfQ29tcG9uZW50TmFtZUVudW0oCi0gICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KTsKLQotCi0vKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQotICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQotICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW291dF0gcEhhbmRsZQotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9IQU5ETEVUWVBFIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgbWV0aG9kLgotICAgIEBwYXJhbSBbaW5dIGNDb21wb25lbnROYW1lCi0gICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCi0gICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCi0gICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCi0gICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAotICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZAotICAgICAgICBkdXJpbmcgY2FsbGJhY2tzIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSB0aGUgc291cmNlCi0gICAgICAgIG9mIHRoZSBjYWxsYmFjay4KLSAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCi0gICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCi0gICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKLSAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsQmFja3MpOwotCi0KLS8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUgCi0gICAgbWV0aG9kLiAgSWYgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY29tcG9uZW50IHdpbGwKLSAgICBiZSB1bmxvYWRlZCBmcm9tIG1lbW9yeS4gIAotICAgIAotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMgd2hlbiB0aGUgY29tcG9uZW50IGlzIAotICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCi0KLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRnJlZUhhbmRsZSgKLSAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOwotCi0KLQotLyoqIFRoZSBPTVhfU2V0dXBUdW5uZWwgbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIGNvbXBvbmVudHMKLSAgICB0byBzZXR1cCB0aGUgc3BlY2lmaWVkIHR1bm5lbCB0aGUgdHdvIGNvbXBvbmVudHMuICBOT1RFOiBUaGlzIGlzCi0gICAgYW4gYWN0dWFsIG1ldGhvZCAobm90IGEgI2RlZmluZSBtYWNybykuICBUaGlzIG1ldGhvZCB3aWxsIG1ha2UgY2FsbHMgaW50bwotICAgIHRoZSBjb21wb25lbnQgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB0dW5uZWwgCi0gICAgY29ubmVjdGlvbi4gIAotCi0gICAgVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIG9uIGJvdGggY29tcG9uZW50cyB3aWxsIGJlIGNhbGxlZC4gCi0gICAgVGhpcyBtZXRob2Qgc2hhbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgCi0gICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQotICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCi0gICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKLQotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaE91dHB1dAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCi0gICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKLSAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAotICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhPdXRwdXQgYmUgdGhlIHNvdXJjZSBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRPdXRwdXQgaXMgYW4gb3V0cHV0IHBvcnQpLiAgSWYgMHgwLCB0aGUgY29tcG9uZW50Ci0gICAgICAgIHNwZWNpZmllZCBpbiBoSW5wdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRJbnB1dAotICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAotICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc291cmNlIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCi0gICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4gCi0gICAgQHBhcmFtIFtpbl0gaElucHV0Ci0gICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQotICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQotICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCi0gICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaElucHV0IGJlIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRJbnV0IGlzIGFuIGlucHV0IHBvcnQpLiAgIElmIDB4MCwgdGhlIGNvbXBvbmVudAotICAgICAgICBzcGVjaWZpZWQgaW4gaE91dHB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydFBPdXRwdXQKLSAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCi0gICAgQHBhcmFtIFtpbl0gblBvcnRJbnB1dAotICAgICAgICBuUG9ydElucHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQotICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgIFdoZW4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQsIG9uZSBvciBib3RoIGNvbXBvbmVudHMgaXMgCi0gICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KLSAgICAgICAgCi0gICAgICAgIE9uIGZhaWx1cmUsIHRoZSBwb3J0cyBvZiBib3RoIGNvbXBvbmVudHMgYXJlIHNldHVwIGZvciBjb21tdW5pY2F0aW9uCi0gICAgICAgIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgotICAgIEBpbmdyb3VwIGNvcmUgdHVuCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX1NldHVwVHVubmVsKAotICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaE91dHB1dCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCi0gICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCi0gICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOwotICAgIAotLyoqIEBpbmdyb3VwIGNwICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgICBPTVhfR2V0Q29udGVudFBpcGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCi0gICAgT01YX0lOIE9NWF9TVFJJTkcgc3pVUkkpOwotCi0vKiogVGhlIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgIHJvbGUgYW5kIChpZiB0aGUgY29tcE5hbWVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2UgY29tcG9uZW50cy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAotICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKLSAgICBjbGllbnQgc2hvdWxkOgotICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb21wb25lbnQgbmFtZXMKLSAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gcm9sZQotICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKLSAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCi0gICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCi0gICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAotIAotICAgICAgICBJZiBjb21wTmFtZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IGNvbXBvbmVudHMgc3VwcG9ydAotICAgICAgICB0aGUgZ2l2ZW4gcm9sZS4KLSAgICAgCi0gICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAotICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIGNvbXBOYW1lcyBwYXJhbWV0ZXIuCi0gICAgQHBhcmFtIFtpbm91dF0gY29tcE5hbWVzCi0gICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIHdoaWNoIGFjY2VwdHMgCi0gICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4gCi0gICAgICAgIEVhY2ggbmFtZSBpcyBOVUxMIHRlcm1pbmF0ZWQuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlICggCi0JT01YX0lOICAgICAgT01YX1NUUklORyByb2xlLAotICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Db21wcywKLSAgICBPTVhfSU5PVVQgICBPTVhfVTggICoqY29tcE5hbWVzKTsKLQotLyoqIFRoZSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiByb2xlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuCi0gICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKLSAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCi0gICAgY2xpZW50IHNob3VsZDoKLSAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb2xlIG5hbWVzCi0gICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0KLSAgICBAcGFyYW0gW2luXSBjb21wTmFtZQotICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcXVlcmllZCBhYm91dC4KLSAgICBAcGFyYW0gW2lub3V0XSBwTnVtUm9sZXMKLSAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCi0gCi0gICAgICAgIElmIHJvbGVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSByb2xlcyB0aGUgY29tcG9uZW50IHN1cHBvcnRzLgotICAgICAKLSAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCi0gICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KLSAgICBAcGFyYW0gW291dF0gcm9sZXMKLSAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCi0gICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCi0gICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgKCAKLQlPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLCAKLSAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtUm9sZXMsCi0gICAgT01YX09VVCAgICAgT01YX1U4ICoqcm9sZXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiNGRlZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLS8qKgotICogQGZpbGUgT01YX0lWQ29tbW9uLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgVmlkZW8gYW5kIEltYWdlIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KLSAqLwotI2lmbmRlZiBPTVhfSVZDb21tb25faAotI2RlZmluZSBPTVhfSVZDb21tb25faAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSBoZWFkZXIKLSAqIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGhlYWRlcgotICogZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQotICovCi0KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0vKiogQGRlZmdyb3VwIGl2IE9wZW5NQVggSUwgSW1hZ2luZyBhbmQgVmlkZW8gRG9tYWluCi0gKiBDb21tb24gc3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBkb21haW5zCi0gKiBAewotICovCi0KLQotLyoqCi0gKiBFbnVtZXJhdGlvbiBkZWZpbmluZyBwb3NzaWJsZSB1bmNvbXByZXNzZWQgaW1hZ2UvdmlkZW8gZm9ybWF0cy4KLSAqCi0gKiBFTlVNUzoKLSAqICBVbnVzZWQgICAgICAgICAgICAgICAgIDogUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BCi0gKiAgTW9ub2Nocm9tZSAgICAgICAgICAgICA6IGJsYWNrIGFuZCB3aGl0ZQotICogIDhiaXRSR0IzMzIgICAgICAgICAgICAgOiBSZWQgNzo1LCBHcmVlbiA0OjIsIEJsdWUgMTowCi0gKiAgMTJiaXRSR0I0NDQgICAgICAgICAgICA6IFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCi0gKiAgMTZiaXRBUkdCNDQ0NCAgICAgICAgICA6IEFscGhhIDE1OjEyLCBSZWQgMTE6OCwgR3JlZW4gNzo0LCBCbHVlIDM6MAotICogIDE2Yml0QVJHQjE1NTUgICAgICAgICAgOiBBbHBoYSAxNSwgUmVkIDE0OjEwLCBHcmVlbiA5OjUsIEJsdWUgNDowCi0gKiAgMTZiaXRSR0I1NjUgICAgICAgICAgICA6IFJlZCAxNToxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKLSAqICAxNmJpdEJHUjU2NSAgICAgICAgICAgIDogQmx1ZSAxNToxMSwgR3JlZW4gMTA6NSwgUmVkIDQ6MAotICogIDE4Yml0UkdCNjY2ICAgICAgICAgICAgOiBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCi0gKiAgMThiaXRBUkdCMTY2NSAgICAgICAgICA6IEFscGhhIDE3LCBSZWQgMTY6MTEsIEdyZWVuIDEwOjUsIEJsdWUgNDowCi0gKiAgMTliaXRBUkdCMTY2NiAgICAgICAgICA6IEFscGhhIDE4LCBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCi0gKiAgMjRiaXRSR0I4ODggICAgICAgICAgICA6IFJlZCAyNDoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKLSAqICAyNGJpdEJHUjg4OCAgICAgICAgICAgIDogQmx1ZSAyNDoxNiwgR3JlZW4gMTU6OCwgUmVkIDc6MAotICogIDI0Yml0QVJHQjE4ODcgICAgICAgICAgOiBBbHBoYSAyMywgUmVkIDIyOjE1LCBHcmVlbiAxNDo3LCBCbHVlIDY6MAotICogIDI1Yml0QVJHQjE4ODggICAgICAgICAgOiBBbHBoYSAyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIDMyYml0QkdSQTg4ODggICAgICAgICAgOiBCbHVlIDMxOjI0LCBHcmVlbiAyMzoxNiwgUmVkIDE1OjgsIEFscGhhIDc6MAotICogIDMyYml0QVJHQjg4ODggICAgICAgICAgOiBBbHBoYSAzMToyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIFlVVjQxMVBsYW5hciAgICAgICAgICAgOiBVLFkgYXJlIHN1YnNhbXBsZWQgYnkgYSBmYWN0b3Igb2YgNCBob3Jpem9udGFsbHkKLSAqICBZVVY0MTFQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKLSAqICBZVVY0MjBQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgotICogIFlVVjQyMFBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMFNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCi0gKiAgWVVWNDIyUGxhbmFyICAgICAgICAgICA6IFRocmVlIGFycmF5cyBZLFUsVi4KLSAqICBZVVY0MjJQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKLSAqICBZVVY0MjJTZW1pUGxhbmFyICAgICAgIDogVHdvIGFycmF5cywgb25lIGlzIGFsbCBZLCB0aGUgb3RoZXIgaXMgVSBhbmQgVgotICogIFlDYllDciAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgWVVZViAoaS5lLiBZQ2JZQ3IpCi0gKiAgWUNyWUNiICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVllVIChpLmUuIFlDcllDYikKLSAqICBDYllDclkgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFVZVlkgKGkuZS4gQ2JZQ3JZKQotICogIENyWUNiWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVllVWSAoaS5lLiBDcllDYlkpCi0gKiAgWVVWNDQ0SW50ZXJsZWF2ZWQgICAgICA6IEVhY2ggcGl4ZWwgY29udGFpbnMgZXF1YWwgcGFydHMgWVVWCi0gKiAgUmF3QmF5ZXI4Yml0ICAgICAgICAgICA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKLSAqICBSYXdCYXllcjEwYml0ICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAotICogIFJhd0JheWVyOGJpdGNvbXByZXNzZWQgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0Ci0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQ09MT1JfRk9STUFUVFlQRSB7Ci0gICAgT01YX0NPTE9SX0Zvcm1hdFVudXNlZCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TW9ub2Nocm9tZSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0UkdCODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEJHUjg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NywKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ3JZQ2IsCi0gICAgT01YX0NPTE9SX0Zvcm1hdENiWUNyWSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0Q3JZQ2JZLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjEwYml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEw4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMTYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwyNCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDMyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgLyoqPFJlc2VydmVkIGFuZHJvaWQgb3BhcXVlIGNvbG9yZm9ybWF0LiBUZWxscyB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICogdGhlIGFjdHVhbCBjb2xvcmZvcm1hdCB3aWxsIGJlICByZWxheWVkIGJ5IHRoZQotICAgICAqIEdyYWxsb2MgQnVmZmVycy4KLSAgICAgKiBGSVhNRTogSW4gdGhlIHByb2Nlc3Mgb2YgcmVzZXJ2aW5nIHNvbWUgZW51bSB2YWx1ZXMgZm9yCi0gICAgICogQW5kcm9pZC1zcGVjaWZpYyBPTVggSUwgY29sb3Jmb3JtYXRzLiBDaGFuZ2UgdGhpcyBlbnVtIHRvCi0gICAgICogYW4gYWNjZXB0YWJsZSByYW5nZSBvbmNlIHRoYXQgaXMgZG9uZS4KLSAgICAgKiAqLwotICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlID0gMHg3RjAwMDc4OSwKLSAgICBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N0YwMDAxMDAsCi0gICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCi0gICAgT01YX0NPTE9SX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0NPTE9SX0ZPUk1BVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBSR0IgdG8gWVVWIG9yIHZpY2UgdmVyc2EuCi0gKiBpQ29sb3JNYXRyaXggc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGZpeGVkIHBvaW50IHZhbHVlcwotICogdXNlZCBpbiBjb252ZXJ0aW5nIGJldHdlZW4gZm9ybWF0cy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwotICAgIE9NWF9TMzIgeENvbG9yTWF0cml4WzNdWzNdOyAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotICAgIE9NWF9TMzIgeENvbG9yT2Zmc2V0WzRdOyAgICAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotfU9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBkZWZpbmluZyBwZXJjZW50IHRvIHNjYWxlIGVhY2ggZnJhbWUgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6Ci0gKiBUbyBtYWtlIHRoZSB3aWR0aCA1MCUgbGFyZ2VyLCB1c2UgZldpZHRoID0gMS41IGFuZCB0byBtYWtlIHRoZSB3aWR0aAotICogMS8yIHRoZSBvcmlnaW5hbCBzaXplLCB1c2UgZldpZHRoID0gMC41Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwotICAgIE9NWF9TMzIgeFdpZHRoOyAgICAgICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCi0gICAgT01YX1MzMiB4SGVpZ2h0OyAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KLX1PTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRTsKLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGltYWdlIGZpbHRlciB0eXBlcwotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFRklMVEVSVFlQRSB7Ci0gICAgT01YX0ltYWdlRmlsdGVyTm9uZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJOb2lzZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJFbWJvc3MsCi0gICAgT01YX0ltYWdlRmlsdGVyTmVnYXRpdmUsCi0gICAgT01YX0ltYWdlRmlsdGVyU2tldGNoLAotICAgIE9NWF9JbWFnZUZpbHRlck9pbFBhaW50LAotICAgIE9NWF9JbWFnZUZpbHRlckhhdGNoLAotICAgIE9NWF9JbWFnZUZpbHRlckdwZW4sCi0gICAgT01YX0ltYWdlRmlsdGVyQW50aWFsaWFzLAotICAgIE9NWF9JbWFnZUZpbHRlckRlUmluZywKLSAgICBPTVhfSW1hZ2VGaWx0ZXJTb2xhcml6ZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSW1hZ2VGaWx0ZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JbWFnZUZpbHRlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFRklMVEVSVFlQRTsKLQotCi0vKioKLSAqIEltYWdlIGZpbHRlciBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUltYWdlRmlsdGVyIDogSW1hZ2UgZmlsdGVyIHR5cGUgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfSU1BR0VGSUxURVJUWVBFIGVJbWFnZUZpbHRlcjsKLX0gT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEU7Ci0KLQotLyoqCi0gKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYkNvbG9yRW5oYW5jZW1lbnQgOiBFbmFibGUvZGlzYWJsZSBjb2xvciBlbmhhbmNlbWVudAotICogIG5DdXN0b21pemVkVSAgICAgIDogUHJhY3RpY2FsIHZhbHVlczogMTYtMjQwLCByYW5nZTogMC0yNTUsIHZhbHVlIHNldCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIFUgY29tcG9uZW50Ci0gKiAgbkN1c3RvbWl6ZWRWICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvcgotICogICAgICAgICAgICAgICAgICAgICAgViBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJDb2xvckVuaGFuY2VtZW50OwotICAgIE9NWF9VOCBuQ3VzdG9taXplZFU7Ci0gICAgT01YX1U4IG5DdXN0b21pemVkVjsKLX0gT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRTsKLQotCi0vKioKLSAqIERlZmluZSBjb2xvciBrZXkgYW5kIGNvbG9yIGtleSBtYXNrCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkFSR0JDb2xvciA6IDMyYml0IEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIENvbG9yCi0gKiAgbkFSR0JNYXNrICA6IDMyYml0IE1hc2sgZm9yIEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIGNoYW5uZWxzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQVJHQkNvbG9yOwotICAgIE9NWF9VMzIgbkFSR0JNYXNrOwotfSBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRTsKLQotCi0vKioKLSAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcKLSAqCi0gKiBFTlVNUzoKLSAqICBOb25lICAgICAgICAgIDogTm8gY29sb3IgYmxlbmRpbmcgcHJlc2VudAotICogIEFscGhhQ29uc3RhbnQgOiBGdW5jdGlvbiBpcyAoYWxwaGFfY29uc3RhbnQgKiBzcmMpICsKLSAqICAgICAgICAgICAgICAgICAgKDEgLSBhbHBoYV9jb25zdGFudCkgKiBkc3QpCi0gKiAgQWxwaGFQZXJQaXhlbCA6IEZ1bmN0aW9uIGlzIChhbHBoYSAqIHNyYykgKyAoMSAtIGFscGhhKSAqIGRzdCkKLSAqICBBbHRlcm5hdGUgICAgIDogRnVuY3Rpb24gaXMgYWx0ZXJuYXRpbmcgcGl4ZWxzIGZyb20gc3JjIGFuZCBkc3QKLSAqICBBbmQgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyAmIGRzdCkKLSAqICBPciAgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyB8IGRzdCkKLSAqICBJbnZlcnQgICAgICAgIDogRnVuY3Rpb24gaXMgfnNyYwotICovCi10eXBlZGVmIGVudW0gT01YX0NPTE9SQkxFTkRUWVBFIHsKLSAgICBPTVhfQ29sb3JCbGVuZE5vbmUsCi0gICAgT01YX0NvbG9yQmxlbmRBbHBoYUNvbnN0YW50LAotICAgIE9NWF9Db2xvckJsZW5kQWxwaGFQZXJQaXhlbCwKLSAgICBPTVhfQ29sb3JCbGVuZEFsdGVybmF0ZSwKLSAgICBPTVhfQ29sb3JCbGVuZEFuZCwKLSAgICBPTVhfQ29sb3JCbGVuZE9yLAotICAgIE9NWF9Db2xvckJsZW5kSW52ZXJ0LAotICAgIE9NWF9Db2xvckJsZW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbG9yQmxlbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9Db2xvckJsZW5kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQ09MT1JCTEVORFRZUEU7Ci0KLQotLyoqCi0gKiBDb2xvciBibGVuZCBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblJHQkFscGhhQ29uc3RhbnQgOiBDb25zdGFudCBnbG9iYWwgYWxwaGEgdmFsdWVzIHdoZW4gZ2xvYmFsIGFscGhhIGlzIHVzZWQKLSAqICBlQ29sb3JCbGVuZCAgICAgICA6IENvbG9yIGJsZW5kIHR5cGUgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblJHQkFscGhhQ29uc3RhbnQ7Ci0gICAgT01YX0NPTE9SQkxFTkRUWVBFICBlQ29sb3JCbGVuZDsKLX0gT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRTsKLQotCi0vKioKLSAqIEhvbGQgZnJhbWUgZGltZW5zaW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbldpZHRoICAgICA6IEZyYW1lIHdpZHRoIGluIHBpeGVscwotICogIG5IZWlnaHQgICAgOiBGcmFtZSBoZWlnaHQgaW4gcGl4ZWxzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9GUkFNRVNJWkVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuV2lkdGg7Ci0gICAgT01YX1UzMiBuSGVpZ2h0OwotfSBPTVhfRlJBTUVTSVpFVFlQRTsKLQotCi0vKioKLSAqIFJvdGF0aW9uIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUm90YXRpb24gIDogKy8tIGludGVnZXIgcm90YXRpb24gdmFsdWUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5Sb3RhdGlvbjsKLX0gT01YX0NPTkZJR19ST1RBVElPTlRZUEU7Ci0KLQotLyoqCi0gKiBQb3NzaWJsZSBtaXJyb3JpbmcgZGlyZWN0aW9ucyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZwotICoKLSAqIEVOVU1TOgotICogIE5vbmUgICAgICAgOiBObyBtaXJyb3JpbmcKLSAqICBWZXJ0aWNhbCAgIDogVmVydGljYWwgbWlycm9yaW5nLCBmbGlwIG9uIFggYXhpcwotICogIEhvcml6b250YWwgOiBIb3Jpem9udGFsIG1pcnJvcmluZywgZmxpcCBvbiBZIGF4aXMKLSAqICBCb3RoICAgICAgIDogQm90aCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBtaXJyb3JpbmcKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NSVJST1JUWVBFIHsKLSAgICBPTVhfTWlycm9yTm9uZSA9IDAsCi0gICAgT01YX01pcnJvclZlcnRpY2FsLAotICAgIE9NWF9NaXJyb3JIb3Jpem9udGFsLAotICAgIE9NWF9NaXJyb3JCb3RoLAotICAgIE9NWF9NaXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWlycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWlycm9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfTUlSUk9SVFlQRTsKLQotCi0vKioKLSAqIE1pcnJvcmluZyBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZU1pcnJvciAgICA6IE1pcnJvciB0eXBlIGVudW1lcmF0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUlSUk9SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9NSVJST1JUWVBFICBlTWlycm9yOwotfSBPTVhfQ09ORklHX01JUlJPUlRZUEU7Ci0KLQotLyoqCi0gKiBQb3NpdGlvbiBpbmZvcm1hdGlvbiBvbmx5Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblggICAgICAgICA6IFggY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50Ci0gKiAgblkgICAgICAgICA6IFkgY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUE9JTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuWDsKLSAgICBPTVhfUzMyIG5ZOwotfSBPTVhfQ09ORklHX1BPSU5UVFlQRTsKLQotCi0vKioKLSAqIEZyYW1lIHNpemUgcGx1cyBwb3NpdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5MZWZ0ICAgICAgOiBYIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCi0gKiAgblRvcCAgICAgICA6IFkgQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKLSAqICBuV2lkdGggICAgIDogV2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICogIG5IZWlnaHQgICAgOiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JFQ1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuTGVmdDsKLSAgICBPTVhfUzMyIG5Ub3A7Ci0gICAgT01YX1UzMiBuV2lkdGg7Ci0gICAgT01YX1UzMiBuSGVpZ2h0OwotfSBPTVhfQ09ORklHX1JFQ1RUWVBFOwotCi0KLS8qKgotICogRGVibG9ja2luZyBzdGF0ZTsgaXQgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHVwIGJlZm9yZSBzdGFydGluZyB0aGUgY29kZWMKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRGVibG9ja2luZyA6IEVuYWJsZS9kaXNhYmxlIGRlYmxvY2tpbmcgbW9kZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRGVibG9ja2luZzsKLX0gT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFOwotCi0KLS8qKgotICogU3RhYmlsaXphdGlvbiBzdGF0ZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJTdGFiICAgICAgOiBFbmFibGUvZGlzYWJsZSBmcmFtZSBzdGFiaWxpemF0aW9uIHN0YXRlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJTdGFiOwotfSBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEU7Ci0KLQotLyoqCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgdHlwZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIFN1bkxpZ2h0IDogUmVmZXJlbmNlZCBpbiBKU1ItMjM0Ci0gKiAgRmxhc2ggICAgOiBPcHRpbWFsIGZvciBkZXZpY2UncyBpbnRlZ3JhdGVkIGZsYXNoCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSB7Ci0gICAgT01YX1doaXRlQmFsQ29udHJvbE9mZiA9IDAsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEF1dG8sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFN1bkxpZ2h0LAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xDbG91ZHksCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFNoYWRlLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xUdW5nc3RlbiwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sRmx1b3Jlc2NlbnQsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEluY2FuZGVzY2VudCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sRmxhc2gsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEhvcml6b24sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9XSElURUJBTENPTlRST0xUWVBFOwotCi0KLS8qKgotICogV2hpdGUgQmFsYW5jZSBjb250cm9sIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlV2hpdGVCYWxDb250cm9sIDogV2hpdGUgYmFsYW5jZSBlbnVtZXJhdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSBlV2hpdGVCYWxDb250cm9sOwotfSBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEU7Ci0KLQotLyoqCi0gKiBFeHBvc3VyZSBjb250cm9sIHR5cGUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIHsKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sT2ZmID0gMCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sQXV0bywKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sTmlnaHQsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJhY2tMaWdodCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sU3BvdExpZ2h0LAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG9ydHMsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFNub3csCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJlYWNoLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xMYXJnZUFwZXJ0dXJlLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTbWFsbEFwcGVydHVyZSwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEU7Ci0KLQotLyoqCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVFeHBvc3VyZUNvbnRyb2wgOiBFeHBvc3VyZSBjb250cm9sIGVudW1lcmF0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIGVFeHBvc3VyZUNvbnRyb2w7Ci19IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgc2Vuc29yIHN1cHBvcnRlZCBtb2RlLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5GcmFtZVJhdGUgOiBTaW5nbGUgc2hvdCBtb2RlIGlzIGluZGljYXRlZCBieSBhIDAKLSAqICBiT25lU2hvdCAgIDogRW5hYmxlIGZvciBzaW5nbGUgc2hvdCwgZGlzYWJsZSBmb3Igc3RyZWFtaW5nCi0gKiAgc0ZyYW1lU2l6ZSA6IEZyYW1lc2l6ZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5GcmFtZVJhdGU7Ci0gICAgT01YX0JPT0wgYk9uZVNob3Q7Ci0gICAgT01YX0ZSQU1FU0laRVRZUEUgc0ZyYW1lU2l6ZTsKLX0gT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBjb250cmFzdCBsZXZlbAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5Db250cmFzdCAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgY29udHJhc3QgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuQ29udHJhc3Q7Ci19IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBicmlnaHRuZXNzIGxldmVsCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkJyaWdodG5lc3MgOiAwLTEwMCUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkJyaWdodG5lc3M7Ci19IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGJhY2tsaWdodCBsZXZlbCBjb25maWd1cmF0aW9uIGZvciBhIHZpZGVvIHNpbmssIGUuZy4gTENEIHBhbmVsCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkJhY2tsaWdodCA6IFZhbHVlcyBhbGxvd2VkIGZvciBiYWNrbGlnaHQgMC0xMDAlCi0gKiAgblRpbWVvdXQgICA6IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGJhY2tsaWdodCBhdXRvbWF0aWNhbGx5IHR1cm5zCi0gKiAgICAgICAgICAgICAgIG9mZi4gIEEgdmFsdWUgb2YgMHgwIGRpc2FibGVzIGJhY2tpZ2h0IHRpbWVvdXQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CQUNLTElHSFRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQmFja2xpZ2h0OwotICAgIE9NWF9VMzIgblRpbWVvdXQ7Ci19IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuR2FtbWEgICAgIDogVmFsdWVzIGFsbG93ZWQgZm9yIGdhbW1hIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIGNoYW5nZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0dBTU1BVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbkdhbW1hOwotfSBPTVhfQ09ORklHX0dBTU1BVFlQRTsKLQotCi0vKioKLSAqIERlZmluZSBmb3Igc2V0dGluZyBzYXR1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNhdHVyYXRpb24gOiBWYWx1ZXMgYWxsb3dlZCBmb3Igc2F0dXJhdGlvbiAtMTAwIHRvIDEwMCwgemVybyBtZWFucwotICogICAgICAgICAgICAgICAgbm8gY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5TYXR1cmF0aW9uOwotfSBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFOwotCi0KLS8qKgotICogRGVmaW5lIGZvciBzZXR0aW5nIExpZ2h0bmVzcwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5MaWdodG5lc3MgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgbGlnaHRuZXNzIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vCi0gKiAgICAgICAgICAgICAgIGNoYW5nZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5MaWdodG5lc3M7Ci19IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRTsKLQotCi0vKioKLSAqIFBsYW5lIGJsZW5kIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogSW5kZXggb2YgaW5wdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYW5lLgotICogIG5EZXB0aCAgICAgOiBEZXB0aCBvZiB0aGUgcGxhbmUgaW4gcmVsYXRpb24gdG8gdGhlIHNjcmVlbi4gSGlnaGVyCi0gKiAgICAgICAgICAgICAgIG51bWJlcmVkIGRlcHRocyBhcmUgImJlaGluZCIgbG93ZXIgbnVtYmVyIGRlcHRocy4KLSAqICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgZGVmYXVsdHMgdG8gdGhlIFBvcnQgSW5kZXggbnVtYmVyLgotICogIG5BbHBoYSAgICAgOiBUcmFuc3BhcmVuY3kgYmxlbmRpbmcgY29tcG9uZW50IGZvciB0aGUgZW50aXJlIHBsYW5lLgotICogICAgICAgICAgICAgICBTZWUgYmxlbmRpbmcgbW9kZXMgZm9yIG1vcmUgZGV0YWlsLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRGVwdGg7Ci0gICAgT01YX1UzMiBuQWxwaGE7Ci19IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmUgaW50ZXJsYWNlIHR5cGUKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRW5hYmxlICAgICAgICAgICAgICAgOiBFbmFibGUgY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBiZWxvdykKLSAqICBuSW50ZXJsZWF2ZVBvcnRJbmRleCAgOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJsZWF2ZWQgcGxhbmUuCi0gKiAgcFBsYW5hclBvcnRJbmRleGVzWzRdIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBsYW5hciBwb3J0cy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLSAgICBPTVhfVTMyIG5JbnRlcmxlYXZlUG9ydEluZGV4OwotfSBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBwaWN0dXJlIGVmZmVjdCB1c2VkIGZvciBhbiBpbnB1dCBwaWN0dXJlCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgewotICAgIE9NWF9FZmZlY3ROb25lLAotICAgIE9NWF9FZmZlY3RGYWRlRnJvbUJsYWNrLAotICAgIE9NWF9FZmZlY3RGYWRlVG9CbGFjaywKLSAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRUaHJvdWdoQ29uc3RhbnRDb2xvciwKLSAgICBPTVhfRWZmZWN0RGlzc29sdmUsCi0gICAgT01YX0VmZmVjdFdpcGUsCi0gICAgT01YX0VmZmVjdFVuc3BlY2lmaWVkTWl4T2ZUd29TY2VuZXMsCi0gICAgT01YX0VmZmVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FZmZlY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FZmZlY3RNYXggPSAweDdGRkZGRkZGCi19IE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHRyYW5zaXRpb24gZWZmZWN0Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiBlRWZmZWN0ICAgIDogRWZmZWN0IHRvIGVuYWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFIGVFZmZlY3Q7Ci19IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGRhdGEgdW5pdCB0eXBlcyBmb3IgZW5jb2RlZCB2aWRlbyBkYXRhLiBUaGUgZGF0YSB1bml0Ci0gKiB0eXBlcyBhcmUgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvciBwbGF5YmFjayBhcyB3ZWxsIGFzCi0gKiBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVFRZUEUgewotICAgIE9NWF9EYXRhVW5pdENvZGVkUGljdHVyZSwKLSAgICBPTVhfRGF0YVVuaXRWaWRlb1NlZ21lbnQsCi0gICAgT01YX0RhdGFVbml0U2V2ZXJhbFNlZ21lbnRzLAotICAgIE9NWF9EYXRhVW5pdEFyYml0cmFyeVN0cmVhbVNlY3Rpb24sCi0gICAgT01YX0RhdGFVbml0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0RhdGFVbml0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YVVuaXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9EQVRBVU5JVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGVuY2Fwc3VsYXRpb24gdHlwZXMgZm9yIGNvZGVkIHZpZGVvIGRhdGEgdW5pdC4gVGhlCi0gKiBlbmNhcHN1bGF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IKLSAqIHBsYXliYWNrIGFzIHdlbGwgYXMgZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSB7Ci0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uRWxlbWVudGFyeVN0cmVhbSwKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25HZW5lcmljUGF5bG9hZCwKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25SdHBQYXlsb2FkLAotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiBiZWluZyBkZWNvZGVkL2VuY29kZWQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0RBVEFVTklUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RBVEFVTklUVFlQRSBlVW5pdFR5cGU7Ci0gICAgT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEUgZUVuY2Fwc3VsYXRpb25UeXBlOwotfSBPTVhfUEFSQU1fREFUQVVOSVRUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBkaXRoZXIgdHlwZXMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9ESVRIRVJUWVBFIHsKLSAgICBPTVhfRGl0aGVyTm9uZSwKLSAgICBPTVhfRGl0aGVyT3JkZXJlZCwKLSAgICBPTVhfRGl0aGVyRXJyb3JEaWZmdXNpb24sCi0gICAgT01YX0RpdGhlck90aGVyLAotICAgIE9NWF9EaXRoZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGl0aGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGl0aGVyTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRElUSEVSVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHR5cGUgb2YgZGl0aGVyaW5nCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRElUSEVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RJVEhFUlRZUEUgZURpdGhlcjsgICAvKio8IFR5cGUgb2YgZGl0aGVyaW5nIHRvIHVzZSAqLwotfSBPTVhfQ09ORklHX0RJVEhFUlRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkNvbnRpbnVvdXM7ICAgLyoqPCBJZiB0cnVlIHRoZW4gaWdub3JlIGZyYW1lIHJhdGUgYW5kIGVtaXQgY2FwdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGF0YSBhcyBmYXN0IGFzIHBvc3NpYmxlIChvdGhlcndpc2Ugb2JleSBwb3J0J3MgZnJhbWUgcmF0ZSkuICovCi0gICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcyAob3RoZXJ3aXNlIHRoZSBwb3J0IGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgdW50aWwgaW5zdHJ1Y3RlZCB0byBkbyBzbyBieSB0aGUgY2xpZW50KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC4gKi8KLSAgICBPTVhfVTMyIG5GcmFtZUxpbWl0OyAgICAgIC8qKjwgTGltaXQgb24gbnVtYmVyIG9mIGZyYW1lcyBlbWl0dGVkIGR1cmluZyBhIGNhcHR1cmUgKG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsaWQgaWYgYkZyYW1lTGltaXRlZCBpcyBzZXQpLiAqLwotfSBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRTsKLQotdHlwZWRlZiBlbnVtIE9NWF9NRVRFUklOR1RZUEUgewotCi0gICAgT01YX01ldGVyaW5nTW9kZUF2ZXJhZ2UsICAgICAvKio8IENlbnRlci13ZWlnaHRlZCBhdmVyYWdlIG1ldGVyaW5nLiAqLwotICAgIE9NWF9NZXRlcmluZ01vZGVTcG90LCAgCSAgICAgIC8qKjwgU3BvdCAocGFydGlhbCkgbWV0ZXJpbmcuICovCi0gICAgT01YX01ldGVyaW5nTW9kZU1hdHJpeCwgICAgICAvKio8IE1hdHJpeCBvciBldmFsdWF0aXZlIG1ldGVyaW5nLiAqLwotCi0gICAgT01YX01ldGVyaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGVyaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRVZNb2RlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVURVJJTkdUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX01FVEVSSU5HVFlQRSBlTWV0ZXJpbmc7Ci0gICAgT01YX1MzMiB4RVZDb21wZW5zYXRpb247ICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCi0gICAgT01YX1UzMiBuQXBlcnR1cmVGTnVtYmVyOyAgICAgLyoqPCBlLmcuIG5BcGVydHVyZUZOdW1iZXIgPSAyIGltcGxpZXMgImYvMiIgLSBRMTYgZm9ybWF0ICovCi0gICAgT01YX0JPT0wgYkF1dG9BcGVydHVyZTsJCS8qKjwgV2hldGhlciBhcGVydHVyZSBudW1iZXIgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgT01YX1UzMiBuU2h1dHRlclNwZWVkTXNlYzsgICAgLyoqPCBTaHV0dGVyc3BlZWQgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JPT0wgYkF1dG9TaHV0dGVyU3BlZWQ7CS8qKjwgV2hldGhlciBzaHV0dGVyIHNwZWVkIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLwotICAgIE9NWF9VMzIgblNlbnNpdGl2aXR5OyAgICAgICAgIC8qKjwgZS5nLiBuU2Vuc2l0aXZpdHkgPSAxMDAgaW1wbGllcyAiSVNPIDEwMCIgKi8KLSAgICBPTVhfQk9PTCBiQXV0b1NlbnNpdGl2aXR5OwkvKio8IFdoZXRoZXIgc2Vuc2l0aXZpdHkgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi19IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEU7Ci0KLS8qKgotICogRm9jdXMgcmVnaW9uIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiQ2VudGVyICAgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiTGVmdCAgICAgICAgICAgOiBVc2UgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlJpZ2h0ICAgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wICAgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tICAgICAgICAgOiBVc2UgYm90dG9tIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wTGVmdCAgICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BSaWdodCAgICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b21MZWZ0ICAgICA6IFVzZSBib3R0b20gbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbVJpZ2h0ICAgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkNlbnRlcjsKLSAgICBPTVhfQk9PTCBiTGVmdDsKLSAgICBPTVhfQk9PTCBiUmlnaHQ7Ci0gICAgT01YX0JPT0wgYlRvcDsKLSAgICBPTVhfQk9PTCBiQm90dG9tOwotICAgIE9NWF9CT09MIGJUb3BMZWZ0OwotICAgIE9NWF9CT09MIGJUb3BSaWdodDsKLSAgICBPTVhfQk9PTCBiQm90dG9tTGVmdDsKLSAgICBPTVhfQk9PTCBiQm90dG9tUmlnaHQ7Ci19IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFOwotCi0vKioKLSAqIEZvY3VzIFN0YXR1cyB0eXBlCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfRk9DVVNTVEFUVVNUWVBFIHsKLSAgICBPTVhfRm9jdXNTdGF0dXNPZmYgPSAwLAotICAgIE9NWF9Gb2N1c1N0YXR1c1JlcXVlc3QsCi0gICAgT01YX0ZvY3VzU3RhdHVzUmVhY2hlZCwKLSAgICBPTVhfRm9jdXNTdGF0dXNVbmFibGVUb1JlYWNoLAotICAgIE9NWF9Gb2N1c1N0YXR1c0xvc3QsCi0gICAgT01YX0ZvY3VzU3RhdHVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0ZvY3VzU3RhdHVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRm9jdXNTdGF0dXNNYXggPSAweDdGRkZGRkZGCi19IE9NWF9GT0NVU1NUQVRVU1RZUEU7Ci0KLS8qKgotICogRm9jdXMgc3RhdHVzIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9jdXNTdGF0dXMgICAgICAgIDogU3BlY2lmaWVzIHRoZSBmb2N1cyBzdGF0dXMKLSAqICBiQ2VudGVyU3RhdHVzICAgICAgIDogVXNlIGNlbnRlciByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkxlZnRTdGF0dXMgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiUmlnaHRTdGF0dXMgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wU3RhdHVzICAgICAgICAgIDogVXNlIHRvcCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbVN0YXR1cyAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BMZWZ0U3RhdHVzICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BSaWdodFN0YXR1cyAgICAgOiBVc2UgdG9wIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tTGVmdFN0YXR1cyAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tUmlnaHRTdGF0dXMgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRk9DVVNTVEFUVVNUWVBFIGVGb2N1c1N0YXR1czsKLSAgICBPTVhfQk9PTCBiQ2VudGVyU3RhdHVzOwotICAgIE9NWF9CT09MIGJMZWZ0U3RhdHVzOwotICAgIE9NWF9CT09MIGJSaWdodFN0YXR1czsKLSAgICBPTVhfQk9PTCBiVG9wU3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21TdGF0dXM7Ci0gICAgT01YX0JPT0wgYlRvcExlZnRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYlRvcFJpZ2h0U3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0U3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21SaWdodFN0YXR1czsKLX0gT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRTsKLQotLyoqIEB9ICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW1hZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlMzllYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0ltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKi8KLQotLyoqIAotICogQGZpbGUgT01YX0ltYWdlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgYW5kIAotICogY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCi0gKi8KLSNpZm5kZWYgT01YX0ltYWdlX2gKLSNkZWZpbmUgT01YX0ltYWdlX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSAKLSAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCAgCi0gKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgaW1hZ2luZyBPcGVuTUFYIElMIEltYWdpbmcgRG9tYWluCi0gKiBAaW5ncm91cCBpdgotICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGRvbWFpbgotICogQHsKLSAqLwotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgaW1hZ2UgY29tcHJlc3Npb24gY29kaW5nLiAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9DT0RJTkdUWVBFIHsKLSAgICBPTVhfSU1BR0VfQ29kaW5nVW51c2VkLCAgICAgIC8qKjwgVmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IEF1dG8gZGV0ZWN0aW9uIG9mIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHLCAgICAgICAgLyoqPCBKUEVHL0pGSUYgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0pQRUcySywgICAgICAvKio8IEpQRUcgMjAwMCBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nRVhJRiwgICAgICAgIC8qKjwgRVhJRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nVElGRiwgICAgICAgIC8qKjwgVElGRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nR0lGLCAgICAgICAgIC8qKjwgR3JhcGhpY3MgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ1BORywgICAgICAgICAvKio8IFBORyBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nTFpXLCAgICAgICAgIC8qKjwgTFpXIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdCTVAsICAgICAgICAgLyoqPCBXaW5kb3dzIEJpdG1hcCBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9DT0RJTkdUWVBFOwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW4gaW1hZ2UgcGF0aC4gVGhlIG51bWJlciBvZiBpbWFnZSBwYXRocyAKLSAqIGZvciBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBpbWFnZSBjb21wb25lbnQuICAKLSAqIAotICogIElucHV0IChha2EgU291cmNlKSA6IFplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAotICogIFNwbGl0dGVyICAgICAgICAgICA6IE9uZSBJbnB1dCwgMiBvciBtb3JlIE91dHB1dHMsCi0gKiAgUHJvY2Vzc2luZyBFbGVtZW50IDogT25lIElucHV0LCBvbmUgb3V0cHV0LAotICogIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCi0gKiAgT3V0cHV0IChha2EgU2luaykgIDogT25lIElucHV0LCB6ZXJvIG91dHB1dHMuCi0gKiAKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgIAotICogaW1hZ2UgcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCAgCi0gKiBiZSB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgIAotICogQ29tcGxpYW50IGNvbXBvbmVudHMgd2lsbCBwcmVwb3B1bGF0ZSB0aGlzIHN0cnVjdHVyZSB3aXRoIG9wdGltYWwgIAotICogdmFsdWVzIGR1cmluZyB0aGUgT01YX0dldFBhcmFtZXRlcigpIGNvbW1hbmQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCi0gKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKLSAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIGVDb2xvckZvcm1hdCBpcyB2YWxpZAotICogIGVDb2xvckZvcm1hdCAgICAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHBOYXRpdmVXaW5kb3cgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSB3aW5kb3cgb2JqZWN0IGlmIGEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBzaW5rICwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMHgwLiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1NUUklORyBjTUlNRVR5cGU7Ci0gICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7Ci0gICAgT01YX1UzMiBuRnJhbWVXaWR0aDsgCi0gICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7Ci0gICAgT01YX1MzMiBuU3RyaWRlOyAgICAgCi0gICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7Ci0gICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OwotICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Ci0gICAgT01YX05BVElWRV9XSU5ET1dUWVBFIHBOYXRpdmVXaW5kb3c7Ci19IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLQotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAotICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKLSAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSW5kZXg7Ci0gICAgT01YX0lNQUdFX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLX0gT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgdHlwZSAKLSAqCi0gKiBFTlVNUwotICogIFRvcmNoIDogRmxhc2ggZm9yY2VkIGNvbnN0YW50bHkgb24KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT24gPSAwLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xPZmYsCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEF1dG8sCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFJlZEV5ZVJlZHVjdGlvbiwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sRmlsbGluLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xUb3JjaCwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRmxhc2hDb250cm9sIDogRmxhc2ggY29udHJvbCB0eXBlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEUgZUZsYXNoQ29udHJvbDsKLX0gT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogRm9jdXMgY29udHJvbCB0eXBlIAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEUgewotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPbiA9IDAsCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9mZiwKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0bywKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0b0xvY2ssCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRTsKLQotIAotLyoqIAotICogRm9jdXMgY29udHJvbCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb2N1c0NvbnRyb2wgICA6IEZvY3VzIGNvbnRyb2wKLSAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LiAKLSAqICAgICAgICAgICAgICAgICAgICBJbnRlcmVzdCBpcyBvbmx5IGluIG51bWJlciBvZiBzdGVwcyBvdmVyIHRoaXMgcmFuZ2UuCi0gKiAgbkZvY3VzU3RlcEluZGV4IDogQ3VycmVudCBmb2N1cyBzdGVwIGluZGV4Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIGVGb2N1c0NvbnRyb2w7Ci0gICAgT01YX1UzMiBuRm9jdXNTdGVwczsKLSAgICBPTVhfVTMyIG5Gb2N1c1N0ZXBJbmRleDsKLX0gT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIFEgRmFjdG9yIGZvciBKUEVHIGNvbXByZXNzaW9uLCB3aGljaCBjb250cm9scyB0aGUgdHJhZGVvZmYgYmV0d2VlbiBpbWFnZQotICogcXVhbGl0eSBhbmQgc2l6ZS4gIFEgRmFjdG9yIHByb3ZpZGVzIGEgbW9yZSBzaW1wbGUgbWVhbnMgb2YgY29udHJvbGxpbmcKLSAqIEpQRUcgY29tcHJlc3Npb24gcXVhbGl0eSwgd2l0aG91dCBkaXJlY3RseSBwcm9ncmFtbWluZyBRdWFudGl6YXRpb24KLSAqIHRhYmxlcyBmb3IgY2hyb21hIGFuZCBsdW1hIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgblFGYWN0b3IgICA6IEpQRUcgUSBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDEtMTAwLiBBIGZhY3RvciBvZiAxIAotICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IgCi0gKiAgICAgICAgICAgICAgIG9mIDEwMCBwcm9kdWNlcyB0aGUgbGFyZ2VzdCwgYmVzdCBxdWFsaXR5IGltYWdlcy4gIEEgCi0gKiAgICAgICAgICAgICAgIHR5cGljYWwgZGVmYXVsdCBpcyA3NSBmb3Igc21hbGwgZ29vZCBxdWFsaXR5IGltYWdlcyAgICAgICAgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9VMzIgblFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfSBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEU7Ci0KLS8qKiAKLSAqIFF1YW50aXphdGlvbiB0YWJsZSB0eXBlIAotICovCi0KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVMdW1hID0gMCwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWEsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ2IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ3IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFOwotCi0vKiogCi0gKiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIERDVCBjb21wcmVzc2lvbiBmb3IKLSAqIFlVViBkYXRhLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIFEgZmFjdG9yLCBwcm92aWRpbmcgZXhhY3QgCi0gKiBjb250cm9sIG9mIGNvbXByZXNzaW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlUXVhbnRpemF0aW9uVGFibGUgICAgICA6IFF1YW50aXphdGlvbiB0YWJsZSB0eXBlCi0gKiAgblF1YW50aXphdGlvbk1hdHJpeFs2NF0gOiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZSBvZiBjb2VmZmljaWVudHMgc3RvcmVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW5jcmVhc2luZyBjb2x1bW5zIHRoZW4gYnkgcm93cyBvZiBkYXRhIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDEsIC4uLiByb3cgOCkuIFF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmdlIDAtMjU1IGFuZCBzdG9yZWQgaW4gbGluZWFyIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgY29tcG9uZW50IHdpbGwgemlnLXphZyB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gdGFibGUgZGF0YSBpZiByZXF1aXJlZCBpbnRlcm5hbGx5KSAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEUgZVF1YW50aXphdGlvblRhYmxlOwotICAgIE9NWF9VOCBuUXVhbnRpemF0aW9uTWF0cml4WzY0XTsKLX0gT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKLQotCi0vKiogCi0gKiBIdWZmbWFuIHRhYmxlIHR5cGUsIHRoZSBzYW1lIEh1ZmZtYW4gdGFibGUgaXMgYXBwbGllZCBmb3IgY2hyb21hIGFuZCAKLSAqIGx1bWEgY29tcG9uZW50IAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgewotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQyA9IDAsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEU7Ci0KLS8qKiAKLSAqIEpQRUcgSHVmZm1hbiB0YWJsZSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlSHVmZm1hblRhYmxlICAgICAgICAgICAgICAgICAgICA6IEh1ZmZtYW4gdGFibGUgdHlwZQotICogIG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdIDogMC0xNiwgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgZWFjaCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxlbmd0aAotICogIG5IdWZmbWFuVGFibGVbMjU2XSAgICAgICAgICAgICAgIDogMC0yNTUsIHRoZSBzaXplIHVzZWQgZm9yIEFDIGFuZCBEQyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZSBhcmUgMTYgYW5kIDE2MiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgZUh1ZmZtYW5UYWJsZTsKLSAgICBPTVhfVTggbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl07Ci0gICAgT01YX1U4IG5IdWZmbWFuVGFibGVbMjU2XTsKLX1PTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEU7Ci0KLS8qKiBAfSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGI4ZDkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW5kZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogQGZpbGUgT01YX0luZGV4LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgT01YX0luZGV4IGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgYm90aCBhcHBsaWNhdGlvbnMKLSAqICBhbmQgY29tcG9uZW50cyAuCi0gKi8KLQotCi0jaWZuZGVmIE9NWF9JbmRleF9oCi0jZGVmaW5lIE9NWF9JbmRleF9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLSNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KLQotCi0vKiogVGhlIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYSBzdHJ1Y3R1cmUgd2hlbiBlaXRoZXIKLSAqICBnZXR0aW5nIG9yIHNldHRpbmcgcGFyYW1ldGVycyBhbmQvb3IgY29uZmlndXJhdGlvbiBkYXRhLiAgRWFjaCBlbnRyeSBpbiAKLSAqICB0aGlzIGVudW1lcmF0aW9uIG1hcHMgdG8gYW4gT01YIHNwZWNpZmllZCBzdHJ1Y3R1cmUuICBXaGVuIHRoZSAKLSAqICBPTVhfR2V0UGFyYW1ldGVyLCBPTVhfU2V0UGFyYW1ldGVyLCBPTVhfR2V0Q29uZmlnIG9yIE9NWF9TZXRDb25maWcgbWV0aG9kcwotICogIGFyZSB1c2VkLCB0aGUgc2Vjb25kIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBiZSBhbiBlbnRyeSBmcm9tIHRoaXMgZW51bWVyYXRpb24KLSAqICBhbmQgdGhlIHRoaXJkIGVudHJ5IHdpbGwgYmUgdGhlIHN0cnVjdHVyZSBzaG93biBpbiB0aGUgY29tbWVudHMgZm9yIHRoZSBlbnRyeS4KLSAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZyBhIGNyb3BwaW5nIGZ1bmN0aW9uLCB0aGUgCi0gKiAgT01YX1NldENvbmZpZyBjb21tYW5kIHdvdWxkIGhhdmUgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIAotICogIGFuZCB3b3VsZCBzZW5kIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBPTVhfUkVDVFRZUEUgc3RydWN0dXJlIGFzIHRoZSAKLSAqICB0aGlyZCBwYXJhbWV0ZXIuCi0gKiAgCi0gKiAgVGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUgT01YX0NvbmZpZyBwcmVmaXggYXJlIHNlbnQgdXNpbmcKLSAqICB0aGUgT01YX1NldENvbmZpZyBjb21tYW5kIGFuZCB0aGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZQotICogIE9NWF9QQVJBTV8gcHJlZml4IGFyZSBzZW50IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIGNvbW1hbmQuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfSU5ERVhUWVBFIHsKLQotICAgIE9NWF9JbmRleENvbXBvbmVudFN0YXJ0VW51c2VkID0gMHgwMTAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1JbWFnZUluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1PdGhlckluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1OdW1BdmFpbGFibGVTdHJlYW1zLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQWN0aXZlU3RyZWFtLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVN1c3BlbnNpb25Qb2xpY3ksICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tcG9uZW50U3VzcGVuZGVkLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyaW5nLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAotICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmVNb2RlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgKi8gCi0gICAgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAotICAgIE9NWF9JbmRleFBhcmFtQ29udGVudFVSSSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFICovIAotICAgIE9NWF9JbmRleFBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW1Db3VudCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29udGFpbmVyTm9kZUNvdW50LCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW0sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvdW50ZXJOb2RlSUQsICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUZpbHRlclR5cGUsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUtleUZpbHRlciwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnUHJpb3JpdHlNZ210LCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUFJJT1JJVFlNR01UVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICovCi0KLSAgICBPTVhfSW5kZXhQb3J0U3RhcnRVbnVzZWQgPSAweDAyMDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqLyAKLSAgICBPTVhfSW5kZXhSZXNlcnZlZFN0YXJ0VW51c2VkID0gMHgwMzAwMDAwMCwKLQotICAgIC8qIEF1ZGlvIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4QXVkaW9TdGFydFVudXNlZCA9IDB4MDQwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1JhLCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUkFUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb01wMywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BZHBjbSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzIzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjksICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1dtYSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TYmMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTWlkaSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpTG9hZFVzZXJTb3VuZCwgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI2LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRUZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0hSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9GUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRUZSLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHA4LCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwMTMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRXZyYywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICovCi0KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlJbW1lZGlhdGVFdmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUNvbnRyb2wsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtLCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTdGF0dXMsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnREYXRhLCAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0JhbGFuY2UsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxNdXRlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9NdXRlLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Mb3VkbmVzcywgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvRWNob0NhbmNlbGF0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Ob2lzZVJlZHVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFzcywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvVHJlYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9TdGVyZW9XaWRlbmluZywgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hvcnVzLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9FcXVhbGl6ZXIsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1JldmVyYmVyYXRpb24sICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxWb2x1bWUsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgKi8KLQotICAgIC8qIEltYWdlIHNwZWNpZmljIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4SW1hZ2VTdGFydFVudXNlZCA9IDB4MDUwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1JbWFnZVBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUZsYXNoQ29udHJvbCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnRm9jdXNDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVFGYWN0b3IsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtUXVhbnRpemF0aW9uVGFibGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtSHVmZm1hblRhYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnRmxhc2hDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSAqLwotCi0gICAgLyogVmlkZW8gc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhWaWRlb1N0YXJ0VW51c2VkID0gMHgwNjAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvRmFzdFVwZGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTW90aW9uVmVjdG9yLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvVkJTTUMsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzIsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvV212LCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1J2LCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUlZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFNQlJlZnJlc2gsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9NQkVycm9yUmVwb3J0aW5nLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb01hY3JvYmxvY2tzUGVyRnJhbWUsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9NYWNyb0Jsb2NrRXJyb3JNYXAsIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvU2xpY2VGTU8sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFICovCi0KLSAgICAvKiBJbWFnZSAmIFZpZGVvIGNvbW1vbiBDb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleENvbW1vblN0YXJ0VW51c2VkID0gMHgwNzAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkRlYmxvY2tpbmcsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uU2Vuc29yTW9kZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25JbnRlcmxlYXZlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckZvcm1hdENvbnZlcnNpb24sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW1hZ2VGaWx0ZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRW5oYW5jZW1lbnQsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yS2V5LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUktFWVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25GcmFtZVN0YWJpbGlzYXRpb24sLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ST1RBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25NaXJyb3IsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUlSUk9SVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dFBvc2l0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19QT0lOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25EaWdpdGFsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3B0aWNhbFpvb20sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uV2hpdGVCYWxhbmNlLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbnRyYXN0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UUkFTVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25CcmlnaHRuZXNzLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25CYWNrbGlnaHQsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkdhbW1hLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19HQU1NQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25TYXR1cmF0aW9uLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25MaWdodG5lc3MsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4Y2x1c2lvblJlY3QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpdGhlcmluZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ESVRIRVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUGxhbmVCbGVuZCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhwb3N1cmVWYWx1ZSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0U2l6ZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfRlJBTUVTSVpFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRXh0cmFRdWFudERhdGEsICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0VYVFJBREFUQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1JlZ2lvbiwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRm9jdXNTdGF0dXMsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uVHJhbnNpdGlvbkVmZmVjdCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFICovCi0KLSAgICAvKiBSZXNlcnZlZCBDb25maWd1cmF0aW9uIHJhbmdlICovCi0gICAgT01YX0luZGV4T3RoZXJTdGFydFVudXNlZCA9IDB4MDgwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1PdGhlclBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdPdGhlclBvd2VyLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnT3RoZXJTdGF0cywgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRSAqLwotCi0KLSAgICAvKiBSZXNlcnZlZCBUaW1lIHJhbmdlICovCi0gICAgT01YX0luZGV4VGltZVN0YXJ0VW51c2VkID0gMHgwOTAwMDAwMCwKLSAgICBPTVhfSW5kZXhDb25maWdUaW1lU2NhbGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xvY2tTdGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVBY3RpdmVSZWZDbG9jaywgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIChyZWFkIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lTWVkaWFUaW1lUmVxdWVzdCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRSAod3JpdGUgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lLCAgICAgLyoqPHJlZmVyZW5jZTogIE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVQb3NpdGlvbiwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lU2Vla01vZGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgKi8KLQotCi0gICAgT01YX0luZGV4S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIC8qIFZlbmRvciBzcGVjaWZpYyBhcmVhICovCi0gICAgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIC8qIFZlbmRvciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg3RjAwMDAwMCAKLSAgICAgICB0byAweDdGRkZGRkZFLiAgVGhpcyByYW5nZSBpcyBub3QgYnJva2VuIG91dCBieSB2ZW5kb3IsIHNvCi0gICAgICAgcHJpdmF0ZSBpbmRleGVzIGFyZSBub3QgZ3VhcmFudGVlZCB1bmlxdWUgYW5kIHRoZXJlZm9yZSBzaG91bGQKLSAgICAgICBvbmx5IGJlIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4gKi8KLQotICAgIE9NWF9JbmRleE1heCA9IDB4N0ZGRkZGRkYKLQotfSBPTVhfSU5ERVhUWVBFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYmNlODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9PdGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBAZmlsZSBPTVhfT3RoZXIuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBPdGhlciBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCi0gKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCi0gKi8KLQotI2lmbmRlZiBPTVhfT3RoZXJfaAotI2RlZmluZSBPTVhfT3RoZXJfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQotICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRhdGEgdHlwZXMgd2hpY2ggbWF0Y2ggdG8gbXVsdGlwbGUgZG9tYWlucyBvciBubwotICogZG9tYWluIGF0IGFsbC4gIEZvciB0eXBlcyB3aGljaCBhcmUgdmVuZG9yIHNwZWNpZmljLCBhIHZhbHVlIGFib3ZlCi0gKiBPTVhfT1RIRVJfVkVORE9SVFNUQVJUIHNob3VsZCBiZSB1c2VkLgotICovCi10eXBlZGVmIGVudW0gT01YX09USEVSX0ZPUk1BVFRZUEUgewotICAgIE9NWF9PVEhFUl9Gb3JtYXRUaW1lID0gMCwgLyoqPCBUcmFuc21pc3Npb24gb2YgdmFyaW91cyB0aW1lc3RhbXBzLCBlbGFwc2VkIHRpbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGRlbHRhcywgZXRjICovCi0gICAgT01YX09USEVSX0Zvcm1hdFBvd2VyLCAgICAvKio8IFBlcmhhcHMgdXNlZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHBvd2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50LCBzZXR0aW5nIGNsb2Nrcz8gKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0U3RhdHMsICAgIC8qKjwgQ291bGQgYmUgdGhpbmdzIHN1Y2ggYXMgZnJhbWUgcmF0ZSwgZnJhbWVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLCBldGMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0QmluYXJ5LCAgIC8qKjwgQXJiaXRyYXJ5IGJpbmFyeSBkYXRhICovCi0gICAgT01YX09USEVSX0Zvcm1hdFZlbmRvclJlc2VydmVkID0gMTAwMCwgLyoqPCBTdGFydGluZyB2YWx1ZSBmb3IgdmVuZG9yIHNwZWNpZmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyAqLwotCi0gICAgT01YX09USEVSX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfT1RIRVJfRk9STUFUVFlQRTsKLQotLyoqIAotICogRW51bWVyYXRpb24gb2Ygc2VlayBtb2Rlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1NFRUtNT0RFVFlQRSB7Ci0gICAgT01YX1RJTUVfU2Vla01vZGVGYXN0ID0gMCwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byBhbiBhcHByb3hpbWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIG92ZXIgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgYWN0dWFsIHNlZWsgcG9zaXRpb24gaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXN1bHRzIGluIGEgZmFzdGVyIHNlZWsuICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVBY2N1cmF0ZSwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byB0aGUgYWN0dWFsIHNlZWsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9zaXRpb24gb3ZlciBhbiBhcHByb3hpbWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIGV2ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiBpdCByZXN1bHRzIGluIGEgc2xvd2VyIHNlZWsuICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1RJTUVfU2Vla01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9USU1FX1NlZWtNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9TRUVLTU9ERVRZUEU7Ci0KLS8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHNlZWttb2RlIG9mIHRoZSBjb21wb25lbnQgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX1NFRUtNT0RFVFlQRSBlVHlwZTsgICAgLyoqPCBUaGUgc2VlayBtb2RlICovCi19IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEU7Ci0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdGltZSBzdGFtcCB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWdzIAotICogb24gdGhlIENsb2NrIENvbXBvbmVudCAoQ0MpOgotICogCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IHdhbGwgIAotICogICAgIHRpbWUKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IG1lZGlhCi0gKiAgICAgdGltZQotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSBhbmQgIAotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZTogYXVkaW8vdmlkZW8gcmVmZXJlbmNlIAotICogICAgIGNsb2NrIHNlbmRpbmcgU0MgaXRzIHJlZmVyZW5jZSB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lOiBhIENsb2NrIENvbXBvbmVudCBjbGllbnQgc2VuZHMgCi0gKiAgICAgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcgb24gaXRzIAotICogICAgIGNsaWVudCBwb3J0IHdoZW4gaXQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aAotICogICAgIE9NWF9CVUZGRVJGTEFHX1NUQVJUVElNRSBzZXQuIEl0IG11c3QgdXNlIHRoZSB0aW1lc3RhbXAKLSAqICAgICBzcGVjaWZpZWQgYnkgdGhhdCBidWZmZXIgZm9yIG5TdGFydFRpbWVzdGFtcC4gCi0gKgotICogSXSScyBhbHNvIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZyBvbiBjb21wb25lbnRzIGluIGdlbmVyYWw6Ci0gKgotICogT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOiBJTCBjbGllbnQgcXVlcnlpbmcgY29tcG9uZW50IHBvc2l0aW9uIAotICogKEdldENvbmZpZykgb3IgY29tbWFuZGluZyBhIGNvbXBvbmVudCB0byBzZWVrIHRvIHRoZSBnaXZlbiBsb2NhdGlvbgotICogKFNldENvbmZpZykKLSAqLwkKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1RJQ0tTIG5UaW1lc3RhbXA7ICAJICAgICAvKio8IHRpbWVzdGFtcCAuKi8gCi19IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFOyAgCi0KLS8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1VQREFURVRZUEUgewotICAgICAgT01YX1RJTUVfVXBkYXRlUmVxdWVzdEZ1bGZpbGxtZW50LCAgICAvKio8IFVwZGF0ZSBpcyB0aGUgZnVsZmlsbG1lbnQgb2YgYSBtZWRpYSB0aW1lIHJlcXVlc3QuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVTY2FsZUNoYW5nZWQsCSAgICAgICAgLyoqPCBVcGRhdGUgd2FzIGdlbmVyYXRlZCBiZWNhdXNlIHRoZSBzY2FsZSBjaGFnbmVkLiAqLwotICAgICAgT01YX1RJTUVfVXBkYXRlQ2xvY2tTdGF0ZUNoYW5nZWQsICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGNsb2NrIHN0YXRlIGNoYW5nZWQuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgICBPTVhfVElNRV9VcGRhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgICAgT01YX1RJTUVfVXBkYXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9VUERBVEVUWVBFOwotCi0vKiogRW51bWVyYXRpb24gb2YgcG9zc2libGUgcmVmZXJlbmNlIGNsb2NrcyB0byB0aGUgbWVkaWEgdGltZS4gKi8KLXR5cGVkZWYgZW51bSBPTVhfVElNRV9SRUZDTE9DS1RZUEUgewotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tOb25lLCAgICAvKio8IFVzZSBubyByZWZlcmVuY2VzLiAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tBdWRpbywJLyoqPCBVc2UgcmVmZXJlbmNlcyBzZW50IHRocm91Z2ggT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWaWRlbywgICAvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9SRUZDTE9DS1RZUEU7Ci0KLS8qKiBFbnVtZXJhdGlvbiBvZiBjbG9jayBzdGF0ZXMuICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfQ0xPQ0tTVEFURSB7Ci0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZywgICAgICAgICAgICAgLyoqPCBDbG9jayBydW5uaW5nLiAqLwotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUsIC8qKjwgQ2xvY2sgd2FpdGluZyB1bnRpbCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBwcmVzY3JpYmVkIGNsaWVudHMgZW1pdCB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3RhcnQgdGltZS4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVTdG9wcGVkLCAgICAgICAgICAgICAvKio8IENsb2NrIHN0b3BwZWQuICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9DTE9DS1NUQVRFOwotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIG1lZGlhIHRpbWUgcmVxdWVzdCB0byB0aGUgY2xvY2sgY29tcG9uZW50LgotICoKLSAqICBBIGNsaWVudCBjb21wb25lbnQgc2VuZHMgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcKLSAqICBvbiBpdHMgY2xpZW50IHBvcnQgdG8gc3BlY2lmeSBhIG1lZGlhIHRpbWVzdGFtcCB0aGUgQ2xvY2sgQ29tcG9uZW50Ci0gKiAgc2hvdWxkIGVtaXQuICBUaGUgQ2xvY2sgQ29tcG9uZW50IHNob3VsZCBmdWxmaWxsIHRoZSByZXF1ZXN0IGJ5IHNlbmRpbmcgYQotICogIE9NWF9USU1FX01FRElBVElNRVRZUEUgd2hlbiBpdHMgbWVkaWEgY2xvY2sgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIAotICogIHRpbWVzdGFtcC4KLSAqCi0gKiAgVGhlIGNsaWVudCBtYXkgcmVxdWlyZSBhIG1lZGlhIHRpbWUgcmVxdWVzdCBiZSBmdWxmaWxsZWQgc2xpZ2h0bHkKLSAqICBlYXJsaWVyIHRoYW4gdGhlIG1lZGlhIHRpbWUgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2UgdGhlIGNsaWVudCBzcGVjaWZpZXMgCi0gKiAgYW4gb2Zmc2V0IHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgCi0gKiAgdG8gdGhlIHJlcXVlc3RlZCBtZWRpYSB0aW1lIGFuZCB0aGUgd2FsbCB0aW1lIHdoZW4gaXQgd2lsbCBiZSAKLSAqICBmdWxmaWxsZWQuIAotICoKLSAqICBBIGNsaWVudCBjb21wb25lbnQgbWF5IHVzZXMgdGhlc2UgcmVxdWVzdHMgYW5kIHRoZSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvCi0gKiAgdGltZSBldmVudHMgYWNjb3JkaW5nIHRvIHRpbWVzdGFtcHMuIElmIGEgY2xpZW50IG11c3QgcGVyZm9ybSBhbiBvcGVyYXRpb24gTyBhdAotICogIGEgdGltZSBUIChlLmcuIGRlbGl2ZXIgYSB2aWRlbyBmcmFtZSBhdCBpdHMgY29ycmVzcG9uZGluZyB0aW1lc3RhbXApLCBpdCBtYWtlcyBhIAotICogIG1lZGlhIHRpbWUgcmVxdWVzdCBhdCBUIChwZXJoYXBzIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IHRvIGVuc3VyZSB0aGUgcmVxdWVzdCBmdWxmaWxsbWVudAotICogIGlzIGEgbGl0dGxlIGVhcmx5KS4gV2hlbiB0aGUgY2xvY2sgY29tcG9uZW50IHBhc3NlcyB0aGUgcmVzdWx0aW5nIE9NWF9USU1FX01FRElBVElNRVRZUEUKLSAqICBzdHJ1Y3R1cmUgYmFjayB0byB0aGUgY2xpZW50IGNvbXBvbmVudCwgdGhlIGNsaWVudCBtYXkgcGVyZm9ybSBvcGVyYXRpb24gTyAocGVyaGFwcyBoYXZpbmcKLSAqICB0byB3YWl0IGEgc2xpZ2h0IGFtb3VudCBtb3JlIHRpbWUgaXRzZWxmIGFzIHNwZWNpZmllZCBieSB0aGUgcmV0dXJuIHZhbHVlcykuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfUFRSIHBDbGllbnRQcml2YXRlOyAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBmcm9tIG90aGVycyAoZS5nLiB0aGUgbnVtYmVyIG9mIHRoZSBmcmFtZSB0byBkZWxpdmVyKS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRHVwbGljYXRlZCBpbiB0aGUgbWVkaWEgdGltZSBzdHJ1Y3R1cmUgdGhhdCBmdWxmaWxscyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGlzIHJlcXVlc3QuIEEgdmFsdWUgb2YgemVybyBpcyByZXNlcnZlZCBmb3IgdGltZSBzY2FsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB1cGRhdGVzLiAqLwotICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAvKio8IE1lZGlhIHRpbWVzdGFtcCByZXF1ZXN0ZWQuKi8gCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgQW1vdW50IG9mIHdhbGwgY2xvY2sgdGltZSBieSB3aGljaCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCBzaG91bGQgYmUgZnVsZmlsbGVkIGVhcmx5ICovCi19IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRTsKLQotLyoqPCBTdHJ1Y3R1cmUgc2VudCBmcm9tIHRoZSBjbG9jayBjb21wb25lbnQgY2xpZW50IGVpdGhlciB3aGVuIGZ1bGZpbGxpbmcgCi0gKiAgIGEgbWVkaWEgdGltZSByZXF1ZXN0IG9yIHdoZW4gdGhlIHRpbWUgc2NhbGUgaGFzIGNoYW5nZWQuIAotICoKLSAqICAgSW4gdGhlIGZvcm1lciBjYXNlIHRoZSBDbG9jayBDb21wb25lbnQgZmlsbHMgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRpbWVzIGl0cyBlbWlzc2lvbiAKLSAqICAgdG8gYSBjbGllbnQgY29tcG9uZW50ICh2aWEgdGhlIGNsaWVudCBwb3J0KSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWVkaWEgCi0gKiAgIHRpbWUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQuIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIHRpbWUgdGhlIGVtaXNzaW9uIHRvIG9jY3VyCi0gKiAgIHdoZW4gdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgbWF0Y2hlcyB0aGUgQ2xvY2sgQ29tcG9uZW50J3MgbWVkaWEgdGltZSBidXQgYWxzbyB0aGUgCi0gKiAgIHByZXNjcmliZWQgb2Zmc2V0IGVhcmx5LiAKLSAqCi0gKiAgIFVwb24gc2NhbGUgY2hhbmdlcyB0aGUgY2xvY2sgY29tcG9uZW50IGNsZWFycyB0aGUgbkNsaWVudFByaXZhdGUgZGF0YSwgc2VuZHMgdGhlIGN1cnJlbnQKLSAqICAgbWVkaWEgdGltZSBhbmQgc2V0cyB0aGUgblNjYWxlIHRvIHRoZSBuZXcgc2NhbGUgdmlhIHRoZSBjbGllbnQgcG9ydC4gSXQgZW1pdHMgYSAKLSAqICAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB0byBhbGwgY2xpZW50cyBpbmRlcGVuZGVudCBvZiBhbnkgcmVxdWVzdHMuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gCi0gKiAgIGFsdGVyIHByb2Nlc3NpbmcgdG8gYWNjb21vZGF0ZSBzY2FsaW5nLiBGb3IgaW5zdGFuY2UgYSB2aWRlbyBjb21wb25lbnQgbWlnaHQgc2tpcCBpbnRlci1mcmFtZXMgCi0gKiAgIGluIHRoZSBjYXNlIG9mIGV4dHJlbWUgZmFzdGZvcndhcmQuIExpa2V3aXNlIGFuIGF1ZGlvIGNvbXBvbmVudCBtaWdodCBhZGQgb3IgcmVtb3ZlIHNhbXBsZXMgCi0gKiAgIGZyb20gYW4gYXVkaW8gZnJhbWUgdG8gc2NhbGUgYXVkaW8gZGF0YS4gCi0gKgotICogICBJdCBpcyBleHBlY3RlZCB0aGF0IHNvbWUgY2xvY2sgY29tcG9uZW50cyBtYXkgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0cwotICogICBhdCBleGFjdGx5IHRoZSBwcmVzY3JpYmVkIHRpbWUuIFRoaXMgaXMgYWNjZXB0YWJsZSBzbyBsb25nIGFzIHRoZSByZXF1ZXN0IGlzIAotICogICBmdWxmaWxsZWQgYXQgbGVhc3QgYXMgZWFybHkgYXMgZGVzY3JpYmVkIGFuZCBub3QgbGF0ZXIuIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIAotICogICBmaWVsZHMgdGhlIGNsaWVudCBtYXkgdXNlIHRvIHdhaXQgZm9yIHRoZSByZW1haW5pbmcgdGltZS4KLSAqCi0gKiAgIFRoZSBjbGllbnQgbWF5IHVzZSBlaXRoZXIgdGhlIG5PZmZzZXQgb3IgbldhbGxUaW1lQXRNZWRpYSBmaWVsZHMgdG8gZGV0ZXJtaW5lIHRoZSAKLSAqICAgd2FsbCB0aW1lIHVudGlsIHRoZSBuTWVkaWFUaW1lc3RhbXAgYWN0dWFsbHkgb2NjdXJzLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCi0gKiAgIGNsaWVudCBjYW4gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB2YWx1ZSBmb3Igb2Zmc2V0IGJ5IGdldHRpbmcgdGhlIGN1cnJlbnQgd2FsbAotICogICBmcm9tIHRoZSBjbG9jIGNvbXBvbmVudCBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSBuV2FsbFRpbWVBdE1lZGlhLiAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5DbGllbnRQcml2YXRlOyAgICAgICAgIC8qKjwgQ2xpZW50IHByaXZhdGUgZGF0YSB0byBkaXNhYmlndWF0ZSB0aGlzIG1lZGlhIHRpbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzLiBDb3BpZWQgZnJvbSB0aGUgbWVkaWEgdGltZSByZXF1ZXN0LiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIHVwZGF0ZXMuICovCi0gICAgT01YX1RJTUVfVVBEQVRFVFlQRSBlVXBkYXRlVHlwZTsgLyoqPCBSZWFzb24gZm9yIHRoZSB1cGRhdGUgKi8KLSAgICBPTVhfVElDS1Mgbk1lZGlhVGltZXN0YW1wOyAgICAgIC8qKjwgTWVkaWEgdGltZSByZXF1ZXN0ZWQuIElmIG5vIG1lZGlhIHRpbWUgd2FzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0ZWQgdGhlbiB0aGlzIGlzIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUuICovIAotICAgIE9NWF9USUNLUyBuT2Zmc2V0OyAgICAgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCB3YXMgYWN0dWFsbHkgZnVsZmlsbGVkIGVhcmx5ICovCi0KLSAgICBPTVhfVElDS1MgbldhbGxUaW1lQXRNZWRpYVRpbWU7IC8qKjwgV2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gbk1lZGlhVGltZVN0YW1wLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIGNsaWVudCBtYXkgY29tcGFyZSB0aGlzIHZhbHVlIHRvIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbWVkaWEgdGltZSBvYnRhaW5lZCBmcm9tIHRoZSBDbG9jayBDb21wb25lbnQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSB3YWxsIHRpbWUgdW50aWwgdGhlIG1lZGlhIHRpbWVzdGFtcCBpcyByZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY3VycmVudC4gKi8KLSAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGluIFExNiBmb3JtYXQuICovCi0gICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7ICAgICAvKiBTZWVraW5nIENoYW5nZS4gQWRkZWQgNy8xMi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KLX0gT01YX1RJTUVfTUVESUFUSU1FVFlQRTsgIAotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGZhY3Rvci4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrIAotICogIGNvbXBvbmVudCwgb3RoZXIgY29tcG9uZW50cyBzZWUgc2NhbGUgY2hhbmdlcyB2aWEgT01YX1RJTUVfTUVESUFUSU1FVFlQRSBidWZmZXJzIHNlbnQgdmlhCi0gKiAgdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgcG9ydHMuIFVwb24gcmVjaWV2aW5nIHRoaXMgY29uZmlnIHRoZSBjbG9jayBjb21wb25lbnQgY2hhbmdlcyAKLSAqICB0aGUgcmF0ZSBieSB3aGljaCB0aGUgbWVkaWEgdGltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGVmZmVjdGl2ZWx5IGltcGxlbWVudGluZyB0cmljayBtb2Rlcy4gCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgVGhpcyBpcyBhIHZhbHVlIGluIFExNiBmb3JtYXQgd2hpY2ggaXMgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNjYWxpbmcgdGhlIG1lZGlhIHRpbWUgKi8KLX0gT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRTsKLSAKLS8qKiBCaXRzIHVzZWQgdG8gaWRlbnRpZnkgYSBjbG9jayBwb3J0LiBVc2VkIGluIE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRZJzIG5XYWl0TWFzayBmaWVsZCAqLwotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMCAweDAwMDAwMDAxCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQxIDB4MDAwMDAwMDIKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDIgMHgwMDAwMDAwNAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMyAweDAwMDAwMDA4Ci0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ0IDB4MDAwMDAwMTAKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDUgMHgwMDAwMDAyMAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNiAweDAwMDAwMDQwCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ3IDB4MDAwMDAwODAKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgbWVkaWEgY2xvY2suIAotICogIElMIENsaWVudCB1c2VzIHRoaXMgY29uZmlnIHRvIGNoYW5nZSBvciBxdWVyeSB0aGUgbW9kZSBvZiB0aGUgCi0gKiAgbWVkaWEgY2xvY2sgb2YgdGhlIGNsb2NrIGNvbXBvbmVudC4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrCi0gKiAgY29tcG9uZW50LiAKLSAqICAKLSAqICBPbiBhIFNldENvbmZpZyBpZiBlU3RhdGUgaXMgT01YX1RJTUVfQ2xvY2tTdGF0ZVJ1bm5pbmcgbWVkaWEgdGltZQotICogIHN0YXJ0cyBpbW1lZGlhdGVseSBhdCB0aGUgcHJlc2NyaWJlZCBzdGFydCB0aW1lLiBJZgotICogIE9NWF9USU1FX0Nsb2NrU3RhdGVXYWl0aW5nRm9yU3RhcnRUaW1lIHRoZSBDbG9jayBDb21wb25lbnQgaWdub3JlcwotICogIHRoZSBnaXZlbiBuU3RhcnRUaW1lIGFuZCB3YWl0cyBmb3IgYWxsIGNsaWVudHMgc3BlY2lmaWVkIGluIHRoZSAKLSAqICBuV2FpdE1hc2sgdG8gc2VuZCBzdGFydHRpbWVzICh2aWEgCi0gKiAgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSkuIFRoZSBDbG9jayBDb21wb25lbnQgdGhlbiBzdGFydHMgCi0gKiAgdGhlIG1lZGlhIGNsb2NrIHVzaW5nIHRoZSBlYXJsaWVzdCBzdGFydCB0aW1lIHN1cHBsaWVkLiAqLyAgICAKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX0NMT0NLU1RBVEUgZVN0YXRlOyAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotICAgIE9NWF9USUNLUyBuU3RhcnRUaW1lOyAgICAgICAvKio8IFN0YXJ0IHRpbWUgb2YgdGhlIG1lZGlhIHRpbWUuICovCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgVGltZSB0byBvZmZzZXQgdGhlIG1lZGlhIHRpbWUgYnkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlLmcuIHByZXJvbGwpLiBNZWRpYSB0aW1lIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVwb3J0ZWQgdG8gYmUgbk9mZnNldCB0aWNrcyBlYXJsaWVyLiAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VMzIgbldhaXRNYXNrOyAgICAgICAgICAvKio8IE1hc2sgb2YgT01YX0NMT0NLUE9SVCB2YWx1ZXMuICovCi19IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRTsKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHJlZmVyZW5jZSBjbG9jayBjdXJyZW50bHkgYmVpbmcgdXNlZCB0bwotICogIGNvbXB1dGUgbWVkaWEgdGltZS4gSUwgY2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSAKLSAqICBjbG9jayBjb21wb25lbnQncyBhY3RpdmUgcmVmZXJlbmNlIGNsb2NrICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVElNRV9SRUZDTE9DS1RZUEUgZUNsb2NrOyAgIC8qKjwgUmVmZXJlbmNlIGNsb2NrIHVzZWQgdG8gY29tcHV0ZSBtZWRpYSB0aW1lICovICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEU7Ci0KLS8qKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHNwZWNpZmljcyBvZiBwb3dlciB0eXBlLgotICogIE5vdGU6IHRoaXMgc3RydWN0dXJlIGlzIGxpc3RlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZVBNOyAgICAgICAvKio8IEZsYWcgdG8gZW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgKi8KLX0gT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEU7Ci0KLQotLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHN0YXRzIHR5cGUuCi0gKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICAvKiB3aGF0IGdvZXMgaGVyZSAqLwotfSBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRTsKLQotCi0vKioKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgb3RoZXIgCi0gKiBwYXRoLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgY2hhbm5lbCAqLwotfSBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFOwotCi0vKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCi0gICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCi0gICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0ICovCi0gICAgT01YX1UzMiBuSW5kZXg7IC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KLSAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCi19IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRTsgCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmZDRiYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9UeXBlcy5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9UeXBlcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgcHJpbWl0aXZlIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSAKLSAqICB0aGUgY29yZSwgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LiAgVGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCi0gKiAgbW9kaWZpZWQgdG8gYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgImNoYXIiIHNldCB0byA4IGJpdHMsIAotICogICJzaG9ydCIgc2V0IHRvIDE2IGJpdHMgYW5kICJsb25nIiBzZXQgdG8gMzIgYml0cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9UeXBlc19oCi0jZGVmaW5lIE9NWF9UeXBlc19oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqIFRoZSBPTVhfQVBJIGFuZCBPTVhfQVBJRU5UUlkgYXJlIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zIHVzZWQKLSAqICB0byBkZWNsYXJlIE9NWCBmdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhleSBhcmUgbW9kaWZpZWQgdG8gbWVldCB0aGUKLSAqICByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSAqLwotI2lmZGVmIF9fU1lNQklBTjMyX18gICAKLSMgICBpZmRlZiBfX09NWF9FWFBPUlRTCi0jICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgIGVsc2UKLSMgICAgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgCi0jICAgICAgIGVsc2UKLSMgICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgICBlbmRpZgotIyAgIGVuZGlmCi0jZWxzZQotIyAgIGlmZGVmIF9XSU4zMgotIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKLSMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZWxzZQotLy8jICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotI2RlZmluZSBPTVhfQVBJCi0jICAgICAgZW5kaWYKLSMgICBlbHNlCi0jICAgICAgaWZkZWYgX19PTVhfRVhQT1JUUwotIyAgICAgICAgICBkZWZpbmUgT01YX0FQSQotIyAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgZXh0ZXJuCi0jICAgICAgZW5kaWYKLSMgICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT01YX0FQSUVOVFJZCi0jZGVmaW5lIE9NWF9BUElFTlRSWSAKLSNlbmRpZiAKLQotLyoqIE9NWF9JTiBpcyB1c2VkIHRvIGlkZW50aWZ5IGlucHV0cyB0byBhbiBPTVggZnVuY3Rpb24uICBUaGlzIGRlc2lnbmF0aW9uIAotICAgIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBhcmFtZXRlciAKLSAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLwotI2lmbmRlZiBPTVhfSU4KLSNkZWZpbmUgT01YX0lOCi0jZW5kaWYKLQotLyoqIE9NWF9PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyAKLSAgICBkZXNpZ25hdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgCi0gICAgdG8gYSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0LiAqLwotI2lmbmRlZiBPTVhfT1VUCi0jZGVmaW5lIE9NWF9PVVQKLSNlbmRpZgotCi0KLS8qKiBPTVhfSU5PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIGVpdGhlciBpbnB1dHMgb3IKLSAgICBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwgCi0gICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdCAKLSAgICBpcyB1c2VkIGJvdGggYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dC4gKi8KLSNpZm5kZWYgT01YX0lOT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotI2VuZGlmCi0KLS8qKiBPTVhfQUxMIGlzIHVzZWQgdG8gYXMgYSB3aWxkY2FyZCB0byBzZWxlY3QgYWxsIGVudGl0aWVzIG9mIHRoZSBzYW1lIHR5cGUKLSAqICB3aGVuIHNwZWNpZnlpbmcgdGhlIGluZGV4LCBvciByZWZlcnJpbmcgdG8gYSBvYmplY3QgYnkgYW4gaW5kZXguICAoaS5lLgotICogIHVzZSBPTVhfQUxMIHRvIGluZGljYXRlIGFsbCBOIGNoYW5uZWxzKS4gV2hlbiB1c2VkIGFzIGEgcG9ydCBpbmRleAotICogIGZvciBhIGNvbmZpZyBvciBwYXJhbWV0ZXIgdGhpcyBPTVhfQUxMIGRlbm90ZXMgdGhhdCB0aGUgY29uZmlnIG9yCi0gKiAgcGFyYW1ldGVyIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb25lbnQgbm90IGp1c3Qgb25lIHBvcnQuICovCi0jZGVmaW5lIE9NWF9BTEwgMHhGRkZGRkZGRgotCi0vKiogSW4gdGhlIGZvbGxvd2luZyB3ZSBkZWZpbmUgZ3JvdXBzIHRoYXQgaGVscCBidWlsZGluZyBkb3h5Z2VuIGRvY3VtZW50YXRpb24gKi8KLQotLyoqIEBkZWZncm91cCBjb3JlIE9wZW5NQVggSUwgY29yZQotICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvcmUKLSAqLwotIAotIC8qKiBAZGVmZ3JvdXAgY29tcCBPcGVuTUFYIElMIGNvbXBvbmVudAotICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvbXBvbmVudAotICovCi0gCi0vKiogQGRlZmdyb3VwIHJwbSBSZXNvdXJjZSBhbmQgUG9saWN5IE1hbmFnZW1lbnQgCi0gKiBTdHJ1Y3R1cmVzIGZvciByZXNvdXJjZSBhbmQgcG9saWN5IG1hbmFnZW1lbnQgb2YgY29tcG9uZW50cwotICovCi0KLS8qKiBAZGVmZ3JvdXAgYnVmIEJ1ZmZlciBNYW5hZ2VtZW50Ci0gKiBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzCi0gKi8KLSAgCi0vKiogQGRlZmdyb3VwIHR1biBUdW5uZWxpbmcKLSAqIEBpbmdyb3VwIGNvcmUgY29tcAotICogU3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHRvIG1hbmFnZSB0dW5uZWxzIGFtb25nIGNvbXBvbmVudCBwb3J0cwotICovCi0gCi0vKiogQGRlZmdyb3VwIGNwIENvbnRlbnQgUGlwZXMKLSAqICBAaW5ncm91cCBjb3JlCi0gKi8KLSAKLSAvKiogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhIGhhbmRsaW5nCi0gICogCi0gICovIAotCi0vKiogT01YX1U4IGlzIGFuIDggYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotCi0vKiogT01YX1M4IGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7Ci0KLS8qKiBPTVhfVTE2IGlzIGEgMTYgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBPTVhfVTE2OwotCi0vKiogT01YX1MxNiBpcyBhIDE2IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBPTVhfUzE2OwotCi0vKiogT01YX1UzMiBpcyBhIDMyIGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBPTVhfVTMyOwotCi0vKiogT01YX1MzMiBpcyBhIDMyIGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIE9NWF9TMzI7Ci0KLQotLyogVXNlcnMgd2l0aCBjb21waWxlcnMgdGhhdCBjYW5ub3QgYWNjZXB0IHRoZSAibG9uZyBsb25nIiBkZXNpZ25hdGlvbiBzaG91bGQKLSAgIGRlZmluZSB0aGUgT01YX1NLSVA2NEJJVCBtYWNyby4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgbWF5IGNhdXNlIAotICAgc29tZSBjb21wb25lbnRzIHRvIGZhaWwgdG8gY29tcGlsZSBpZiB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuIHRvIHJlcXVpcmUKLSAgIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gIEhvd2V2ZXIsIHRoZXNlIGNvbXBvbmVudHMgd291bGQgTk9UIGNvbXBpbGUgYW55d2F5Ci0gICBzaW5jZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgd2F5IHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4uCi0qLwotI2lmbmRlZiBPTVhfU0tJUDY0QklUCi0jaWZkZWYgX19TWU1CSUFOMzJfXwotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OwotCi0vKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKLQotI2VsaWYgZGVmaW5lZChXSU4zMikKLQotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovICAgCi10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIE9NWF9VNjQ7Ci0KLS8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgT01YX1M2NDsKLQotI2Vsc2UgLyogV0lOMzIgKi8KLQotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OwotCi0vKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKLQotI2VuZGlmIC8qIFdJTjMyICovCi0jZW5kaWYKLQotCi0vKiogVGhlIE9NWF9CT09MIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0cnVlIG9yIGEgZmFsc2UgCi0gICAgdmFsdWUgd2hlbiBwYXNzaW5nIHBhcmFtZXRlcnMgdG8gYW5kIGZyb20gdGhlIE9NWCBjb3JlIGFuZCBjb21wb25lbnRzLiAgVGhlCi0gICAgT01YX0JPT0wgaXMgYSAzMiBiaXQgcXVhbnRpdHkgYW5kIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgd29yZCBib3VuZGFyeS4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9CT09MIHsKLSAgICBPTVhfRkFMU0UgPSAwLAotICAgIE9NWF9UUlVFID0gIU9NWF9GQUxTRSwKLSAgICBPTVhfQk9PTF9NQVggPSAweDdGRkZGRkZGCi19IE9NWF9CT09MOyAKLSAKLS8qKiBUaGUgT01YX1BUUiB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBwb2ludGVycyBiZXR3ZWVuIHRoZSBPTVgKLSAgICBhcHBsaWNhdGlvbnMgYW5kIHRoZSBPTVggQ29yZSBhbmQgY29tcG9uZW50cy4gIFRoaXMgaXMgYSAzMiBiaXQgcG9pbnRlciBhbmQKLSAgICBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotICovCi10eXBlZGVmIHZvaWQqIE9NWF9QVFI7Ci0KLS8qKiBUaGUgT01YX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4KLSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIgCi0gICAgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQgYWxpZ25lZCBhbmQgCi0gICAgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuICAKLSAqLwotdHlwZWRlZiBjaGFyKiBPTVhfU1RSSU5HOwotCi0vKiogVGhlIE9NWF9CWVRFIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIGFycmF5cyBvZiBieXRlcyBzdWNoIGFzCi0gICAgYnVmZmVycyBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudCBhbmQgY29yZS4gIFRoZSBPTVhfQllURSAKLSAgICB0eXBlIGlzIGEgMzIgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQKLSAgICBhbGlnbmVkIGFuZCB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiBPTVhfQllURTsKLQotLyoqIE9NWF9VVUlEVFlQRSBpcyBhIHZlcnkgbG9uZyB1bmlxdWUgaWRlbnRpZmllciB0byB1bmlxdWVseSBpZGVudGlmeQotICAgIGF0IHJ1bnRpbWUuICBUaGlzIGlkZW50aWZpZXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSBhIGNvbXBvbmVudCBpbiBhIHdheQotICAgIHRoYXQgZ3VhcmFudGVlcyB0aGF0IGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBpZGVudGlmaWVyIHJ1bm5pbmcgb24gdGhlIHN5c3RlbQotICAgIGlzIHVuaXF1ZS4gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVVVJRFRZUEVbMTI4XTsKLQotLyoqIFRoZSBPTVhfRElSVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBvcgotICAgIGFuIG91dHB1dCBwb3J0LiAgVGhpcyBlbnVtZXJhdGlvbiBpcyBjb21tb24gYWNyb3NzIGFsbCBjb21wb25lbnQgdHlwZXMuICAgIAotICovCi10eXBlZGVmIGVudW0gT01YX0RJUlRZUEUKLXsKLSAgICBPTVhfRGlySW5wdXQsICAgICAgICAgICAgICAvKio8IFBvcnQgaXMgYW4gaW5wdXQgcG9ydCAqLwotICAgIE9NWF9EaXJPdXRwdXQsICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBvdXRwdXQgcG9ydCAqLwotICAgIE9NWF9EaXJNYXggPSAweDdGRkZGRkZGCi19IE9NWF9ESVJUWVBFOwotCi0vKiogVGhlIE9NWF9FTkRJQU5UWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGJpdCBvcmRlcmluZyAKLSAgICBmb3IgbnVtZXJpY2FsIGRhdGEgKGkuZS4gYmlnIGVuZGlhbiwgb3IgbGl0dGxlIGVuZGlhbikuICAgIAotICovCi10eXBlZGVmIGVudW0gT01YX0VORElBTlRZUEUKLXsKLSAgICBPTVhfRW5kaWFuQmlnLCAvKio8IGJpZyBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTGl0dGxlLCAvKio8IGxpdHRsZSBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRU5ESUFOVFlQRTsKLQotCi0vKiogVGhlIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGRhdGEgCi0gICAgaXMgc2lnbmVkIG9yIHVuc2lnbmVkCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfTlVNRVJJQ0FMREFUQVRZUEUKLXsKLSAgICBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZCwgLyoqPCBzaWduZWQgZGF0YSAqLwotICAgIE9NWF9OdW1lcmljYWxEYXRhVW5zaWduZWQsIC8qKjwgdW5zaWduZWQgZGF0YSAqLwotICAgIE9NWF9OdW1lcmNpYWxEYXRhTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfTlVNRVJJQ0FMREFUQVRZUEU7Ci0KLQotLyoqIFVuc2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0JVMzIgewotICAgIE9NWF9VMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLwotICAgIE9NWF9VMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLwotICAgIE9NWF9VMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLwotfSBPTVhfQlUzMjsKLQotCi0vKiogU2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0JTMzIgewotICAgIE9NWF9TMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLwotICAgIE9NWF9TMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLwotICAgIE9NWF9TMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLwotfSBPTVhfQlMzMjsKLQotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBzb21lIHRpbWUgb3IgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLiBUaGlzIHN0cnVjdHVyZQotICAqICBtdXN0IGJlIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS4gVGhlIHF1YW50aXR5IGlzIHNpZ25lZCB0byBhY2NvbW1vZGF0ZSAKLSAgKiAgbmVnYXRpdmUgZGVsdGFzIGFuZCBwcmVyb2xsIHNjZW5hcmlvcy4gVGhlIHF1YW50aXR5IGlzIHJlcHJlc2VudGVkIGluIG1pY3Jvc2Vjb25kcyAKLSAgKiAgdG8gYWNjb21vZGF0ZSBoaWdoIHJlc29sdXRpb24gdGltZXN0YW1wcyAoZS5nLiBEVkQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgYmFzZWQKLSAgKiAgb24gYSA5MGtIeiBjbG9jaykgYW5kIHRvIGFsbG93IG1vcmUgYWNjdXJhdGUgYW5kIHN5bmNocm9uaXplZCBkZWxpdmVyeSAoZS5nLiAKLSAgKiAgaW5kaXZpZHVhbCBhdWRpbyBzYW1wbGVzIGRlbGl2ZXJlZCBhdCAxOTIga0h6KS4gVGhlIHF1YW50aXR5IGlzIDY0IGJpdCB0byAKLSAgKiAgYWNjb21tb2RhdGUgYSBsYXJnZSBkeW5hbWljIHJhbmdlIChzaWduZWQgMzIgYml0IHZhbHVlcyB3b3VsZCBhbGxvdyBvbmx5IGZvciBwbHVzCi0gICogIG9yIG1pbnVzIDM1IG1pbnV0ZXMpLgotICAqCi0gICogIEltcGxlbWVudGF0aW9ucyB3aXRoIGxpbWl0ZWQgcHJlY2lzaW9uIG1heSBjb252ZXJ0IHRoZSBzaWduZWQgNjQgYml0IHZhbHVlIHRvIAotICAqICBhIHNpZ25lZCAzMiBiaXQgdmFsdWUgaW50ZXJuYWxseSBidXQgcmlzayBsb3NzIG9mIHByZWNpc2lvbi4gIAotICAqLwotI2lmbmRlZiBPTVhfU0tJUDY0QklUCi10eXBlZGVmIE9NWF9TNjQgT01YX1RJQ0tTOwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IE9NWF9USUNLUwotewotICAgIE9NWF9VMzIgbkxvd1BhcnQ7ICAgIC8qKiBsb3cgYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCi0gICAgT01YX1UzMiBuSGlnaFBhcnQ7ICAgLyoqIGhpZ2ggYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCi19IE9NWF9USUNLUzsKLSNlbmRpZgotI2RlZmluZSBPTVhfVElDS1NfUEVSX1NFQ09ORCAxMDAwMDAwCi0KLS8qKiBEZWZpbmUgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIHRoZSBPTVggSGFuZGxlLiAgVGhlIGNvcmUgd2lsbCBub3QgdXNlCi0gICAgdGhpcyB2YWx1ZSBpbnRlcm5hbGx5LCBidXQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IHVzZSB0aGlzIHZhbHVlLgotICovCi10eXBlZGVmIHZvaWQqIE9NWF9IQU5ETEVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfTUFSS1RZUEUKLXsKLSAgICBPTVhfSEFORExFVFlQRSBoTWFya1RhcmdldENvbXBvbmVudDsgICAvKio8IFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSBtYXJrIGV2ZW50IHVwb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBtYXJrLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCi19IE9NWF9NQVJLVFlQRTsKLQotCi0vKiogT01YX05BVElWRV9ERVZJQ0VUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCi0gKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkaXNwbGF5IAotICogIG9yIGNhbiBiZSB1c2VkIGJ5IGEgYXVkaW8gcG9ydCBmb3IgbmF0aXZlIGF1ZGlvIHJlbmRlcmluZyAqLwotdHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX0RFVklDRVRZUEU7Ci0KLS8qKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKLSAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIHdpbmRvdyAqLwotdHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEU7Ci0KLS8qKiBUaGUgT01YX1ZFUlNJT05UWVBFIHVuaW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmVyc2lvbiBmb3IKLSAgICBhIHN0cnVjdHVyZSBvciBjb21wb25lbnQuICBGb3IgYSBjb21wb25lbnQsIHRoZSB2ZXJzaW9uIGlzIGVudGlyZWx5Ci0gICAgc3BlY2lmaWVkIGJ5IHRoZSBjb21wb25lbnQgdmVuZG9yLiAgQ29tcG9uZW50cyBkb2luZyB0aGUgc2FtZSBmdW5jdGlvbgotICAgIGZyb20gZGlmZmVyZW50IHZlbmRvcnMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uLiAgRm9yIAotICAgIHN0cnVjdHVyZXMsIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCBieSB0aGUgZW50aXR5IHRoYXQgYWxsb2NhdGVzIHRoZQotICAgIHN0cnVjdHVyZS4gIEZvciBzdHJ1Y3R1cmVzIHNwZWNpZmllZCBpbiB0aGUgT01YIDEuMSBzcGVjaWZpY2F0aW9uLCB0aGUKLSAgICB2YWx1ZSBvZiB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgdG8gMS4xLjAuMCBpbiBhbGwgY2FzZXMuICBBY2Nlc3MgdG8gdGhlCi0gICAgT01YX1ZFUlNJT05UWVBFIGNhbiBiZSBieSBhIHNpbmdsZSAzMiBiaXQgYWNjZXNzIChlLmcuIGJ5IG5WZXJzaW9uKSBvcgotICAgIGJ5IGFjY2Vzc2luZyBvbmUgb2YgdGhlIHN0cnVjdHVyZSBlbGVtZW50cyB0bywgZm9yIGV4YW1wbGUsIGNoZWNrIG9ubHkKLSAgICB0aGUgTWFqb3IgcmV2aXNpb24uCi0gKi8KLXR5cGVkZWYgdW5pb24gT01YX1ZFUlNJT05UWVBFCi17Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBPTVhfVTggblZlcnNpb25NYWpvcjsgICAvKio8IE1ham9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblZlcnNpb25NaW5vcjsgICAvKio8IE1pbm9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblJldmlzaW9uOyAgICAgICAvKio8IFJldmlzaW9uIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblN0ZXA7ICAgICAgICAgICAvKio8IFN0ZXAgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCi0gICAgfSBzOwotICAgIE9NWF9VMzIgblZlcnNpb247ICAgICAgICAgICAvKio8IDMyIGJpdCB2YWx1ZSB0byBtYWtlIGFjY2Vzc2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZWFzaWx5IGRvbmUgaW4gYSBzaW5nbGUgd29yZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBjb3B5L2NvbXBhcmUgb3BlcmF0aW9uICovCi19IE9NWF9WRVJTSU9OVFlQRTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg0ODVkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiAKLSAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCi0gKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgotICovCi0jaWZuZGVmIE9NWF9WaWRlb19oCi0jZGVmaW5lIE9NWF9WaWRlb19oCi0KLS8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KLSAqIEBpbmdyb3VwIGl2Ci0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgotICogQHsKLSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCi0gKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAotICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAotICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCi0gKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAotICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCi0gKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgewotICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLwotICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCi0gICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nVlBYLCAgICAgICAgLyoqPCBHb29nbGUgVlBYLCBmb3JtZXJseSBrbm93biBhcyBPbjIgVlA4ICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fQ09ESU5HVFlQRTsKLQotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGEgdmlkZW8gcGF0aC4gIFRoZSBudW1iZXIgb2YgVmlkZW8gcGF0aHMgZm9yIAotICogaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgVmlkZW8gY29tcG9uZW50LiAgCi0gKiAKLSAqICAgIElucHV0IChha2EgU291cmNlKSA6IHplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAotICogICAgU3BsaXR0ZXIgICAgICAgICAgIDogb25lIElucHV0LCAyIG9yIG1vcmUgT3V0cHV0cywKLSAqICAgIFByb2Nlc3NpbmcgRWxlbWVudCA6IG9uZSBJbnB1dCwgb25lIG91dHB1dCwKLSAqICAgIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCi0gKiAgICBPdXRwdXQgKGFrYSBTaW5rKSAgOiBvbmUgSW5wdXQsIHplcm8gb3V0cHV0cy4KLSAqIAotICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCB2aWRlbyAKLSAqIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgCi0gKiB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgQ29tcGxpYW50IAotICogY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbCB2YWx1ZXMgZHVyaW5nIHRoZSAKLSAqIEdldERlZmF1bHRJbml0UGFyYW1zIGNvbW1hbmQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCi0gKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciB1bmtub3duLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKLSAqICBuRnJhbWVIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKLSAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIG5CaXRyYXRlICAgICAgICAgICAgICA6IEJpdCByYXRlIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIHhGcmFtZXJhdGUgICAgICAgICAgICA6IEZyYW1lIHJhdGUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIHVuY29tcHJlc3NlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sIGRvbid0IGNhcmUgb3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBVbml0cyBhcmUgUTE2IGZyYW1lcyBwZXIgc2Vjb25kLgotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgZUNvbG9yRm9ybWF0IGlzIHVzZWQKLSAqICBlQ29sb3JGb3JtYXQgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqICBwTmF0aXZlV2luZG93IDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHNpbmsgLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAweDAuIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsKLSAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsKLSAgICBPTVhfVTMyIG5GcmFtZVdpZHRoOwotICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OwotICAgIE9NWF9TMzIgblN0cmlkZTsKLSAgICBPTVhfVTMyIG5TbGljZUhlaWdodDsKLSAgICBPTVhfVTMyIG5CaXRyYXRlOwotICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKLSAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7Ci0gICAgT01YX1ZJREVPX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLSAgICBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgcE5hdGl2ZVdpbmRvdzsKLX0gT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRTsKLQotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAotICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZCAKLSAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqICB4RnJhbWVSYXRlICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIHZpZGVvIGZyYW1lIHJhdGUgaW4gUTE2IGZvcm1hdAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7IAotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLSAgICBPTVhfVTMyIHhGcmFtZXJhdGU7Ci19IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRTsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyaW5nIHZpZGVvIGNvbXByZXNzaW9uIHF1YW50aXphdGlvbiAKLSAqIHBhcmFtZXRlciB2YWx1ZXMuICBDb2RlY3MgbWF5IHN1cHBvcnQgZGlmZmVyZW50IFFQIHZhbHVlcyBmb3IgZGlmZmVyZW50Ci0gKiBmcmFtZSB0eXBlcy4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5RcEkgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIGluZGV4IGZyYW1lcwotICogIG5RcFAgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIFAgZnJhbWVzCi0gKiAgblFwQiAgICAgICA6IFFQIHZhbHVlcyB0byB1c2UgZm9yIGJpZGlyZWN0aW9uYWwgZnJhbWVzIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblFwSTsKLSAgICBPTVhfVTMyIG5RcFA7Ci0gICAgT01YX1UzMiBuUXBCOwotfSBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRTsKLQotCi0vKiogCi0gKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgdmlkZW8gZmFzdCB1cGRhdGUgcGFyYW1ldGVycy4gCi0gKiAgCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRW5hYmxlVkZVIDogRW5hYmxlL0Rpc2FibGUgdmlkZW8gZmFzdCB1cGRhdGUKLSAqICBuRmlyc3RHT0IgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgcm93Ci0gKiAgbkZpcnN0TUIgICA6IHNwZWNpZmllcyB0aGUgZmlyc3QgTUIgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBmaXJzdCBHT0IKLSAqICBuTnVtTUJzICAgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgTUJzIHRvIGJlIHJlZnJlc2hlZCBmcm9tIG5GaXJzdEdPQiAKLSAqICAgICAgICAgICAgICAgYW5kIG5GaXJzdE1CCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOyAgICAgIAotICAgIE9NWF9VMzIgbkZpcnN0R09COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5GaXJzdE1COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5OdW1NQnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfSBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiaXRyYXRlIGNvbnRyb2wgdHlwZXMgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIHsKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50LAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlU2tpcEZyYW1lcywKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFNraXBGcmFtZXMsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCi0gKiAgZUNvbnRyb2xSYXRlICAgOiBDb250cm9sIHJhdGUgdHlwZSBlbnVtCi0gKiAgblRhcmdldEJpdHJhdGUgOiBUYXJnZXQgYml0cmF0ZSB0byBlbmNvZGUgd2l0aAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOyAKLSAgICBPTVhfVTMyIG5UYXJnZXRCaXRyYXRlOyAgICAgICAgICAgICAgICAgCi19IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtb3Rpb24gdmVjdG9yIChNVikgdHlwZXMgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRSB7Ci0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclBpeGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JIYWxmUGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JRdWFydGVyUGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JFaWdodGhQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3Rvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdGhlIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB1c2VkIGFzIHdlbGwKLSAqIGFzIHRoZWlyIGFjY3VyYWN5LgotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggICAgICAgOiBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVBY2N1cmFjeSAgICAgICAgOiBFbnVtZXJhdGVkIE1WIGFjY3VyYWN5Ci0gKiAgYlVucmVzdHJpY3RlZE1WcyA6IEFsbG93IHVucmVzdHJpY3RlZCBNVnMKLSAqICBiRm91ck1WICAgICAgICAgIDogQWxsb3cgdXNlIG9mIDQgTVZzCi0gKiAgc1hTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgTVZzCi0gKiAgc1lTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gZm9yIE1WcwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIGVBY2N1cmFjeTsKLSAgICBPTVhfQk9PTCBiVW5yZXN0cmljdGVkTVZzOwotICAgIE9NWF9CT09MIGJGb3VyTVY7Ci0gICAgT01YX1MzMiBzWFNlYXJjaFJhbmdlOwotICAgIE9NWF9TMzIgc1lTZWFyY2hSYW5nZTsKLX0gT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEU7Ci0KLQotLyoqIAotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgbWV0aG9kcyB0byB1c2UgZm9yIEludHJhIFJlZnJlc2ggCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSB7Ci0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYywKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQWRhcHRpdmUsCi0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEJvdGgsCi0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgaW50cmEgcmVmcmVzaCBtb2RlIAotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlUmVmcmVzaE1vZGUgOiBDeWNsaWMsIEFkYXB0aXZlLCBvciBCb3RoCi0gKiAgbkFpck1CcyAgICAgIDogTnVtYmVyIG9mIGludHJhIG1hY3JvYmxvY2tzIHRvIHJlZnJlc2ggaW4gYSBmcmFtZSB3aGVuIAotICogICAgICAgICAgICAgICAgIEFJUiBpcyBlbmFibGVkCi0gKiAgbkFpclJlZiAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgbW90aW9uIG1hcmtlZCBtYWNyb2Jsb2NrIGhhcyB0byBiZSAgCi0gKiAgICAgICAgICAgICAgICAgaW50cmEgY29kZWQKLSAqICBuQ2lyTUJzICAgICAgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWFjcm9ibG9ja3MgdG8gYmUgY29kZWQgYXMgImludHJhIiAgCi0gKiAgICAgICAgICAgICAgICAgd2hlbiBDSVIgaXMgZW5hYmxlZAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIGVSZWZyZXNoTW9kZTsKLSAgICBPTVhfVTMyIG5BaXJNQnM7Ci0gICAgT01YX1UzMiBuQWlyUmVmOwotICAgIE9NWF9VMzIgbkNpck1CczsKLX0gT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEU7Ci0KLQotLyoqCi0gKiBTdHJ1Y3R1cmUgZm9yIGVuYWJsaW5nIHZhcmlvdXMgZXJyb3IgY29ycmVjdGlvbiBtZXRob2RzIGZvciB2aWRlbyAKLSAqIGNvbXByZXNzaW9uLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgYkVuYWJsZUhFQyAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBoZWFkZXIgZXh0ZW5zaW9uIGNvZGVzIChIRUMpCi0gKiAgYkVuYWJsZVJlc3luYyAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXN5bmNocm9uaXphdGlvbiBtYXJrZXJzCi0gKiAgblJlc3luY2hNYXJrZXJTcGFjaW5nICAgOiBSZXN5bmNoIG1hcmtlcnMgaW50ZXJ2YWwgKGluIGJpdHMpIHRvIGJlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBpbiB0aGUgc3RyZWFtIAotICogIGJFbmFibGVEYXRhUGFydGl0aW9uaW5nIDogRW5hYmxlL2Rpc2FibGUgZGF0YSBwYXJ0aXRpb25pbmcgCi0gKiAgYkVuYWJsZVJWTEMgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGVIRUM7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVJlc3luYzsKLSAgICBPTVhfVTMyICBuUmVzeW5jaE1hcmtlclNwYWNpbmc7Ci0gICAgT01YX0JPT0wgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVJWTEM7Ci19IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFOwotCi0KLS8qKiAKLSAqIENvbmZpZ3VyYXRpb24gb2YgdmFyaWFibGUgYmxvY2stc2l6ZSBtb3Rpb24gY29tcGVuc2F0aW9uIChWQlNNQykgCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiMTZ4MTYgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCAxNngxNgotICogIGIxNng4ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDgKLSAqICBiOHgxNiAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDE2Ci0gKiAgYjh4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg4Ci0gKiAgYjh4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg0Ci0gKiAgYjR4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg4Ci0gKiAgYjR4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfQk9PTCBiMTZ4MTY7IAotICAgIE9NWF9CT09MIGIxNng4OyAKLSAgICBPTVhfQk9PTCBiOHgxNjsKLSAgICBPTVhfQk9PTCBiOHg4OwotICAgIE9NWF9CT09MIGI4eDQ7Ci0gICAgT01YX0JPT0wgYjR4ODsKLSAgICBPTVhfQk9PTCBiNHg0OwotfSBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFOwotCi0KLS8qKiAKLSAqIEguMjYzIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKLSAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCi0gKgotICogRU5VTVM6Ci0gKiAgQmFzZWxpbmUgICAgICAgICAgIDogQmFzZWxpbmUgUHJvZmlsZTogSC4yNjMgKFYxKSwgbm8gb3B0aW9uYWwgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSDMyMCBDb2RpbmcgICAgICAgIDogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAKLSAqICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlOiBILjI2MysgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBMLjQKLSAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgVAotICogIEJhY2t3YXJkQ29tcGF0aWJsZSA6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgUHJvZmlsZTogSC4yNjMgKFYxKSwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYW5uZXggRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogIElTV1YyICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBLIGFuZCBUICAgICAgICAgICAgICAgICAKLSAqICBJU1dWMyAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrKyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZSAzIGFuZCBhbm5leGVzIFYgYW5kIFcuNi4zLjggICAKLSAqICBIaWdoQ29tcHJlc3Npb24gICAgOiBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIFByb2ZpbGU6IEguMjYzKysgIAotICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGVzIDEgJiAyIGFuZCBhbm5leGVzIEQgYW5kIFUgICAKLSAqICBJbnRlcm5ldCAgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCBQcm9maWxlOiBILjI2MysrIChWMyksICAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IEsgICAgICAgICAgICAgICAgICAgICAgIAotICogIEludGVybGFjZSAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlOiBILjI2MysrIChWMyksICAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IFcuNi4zLjExICAgICAgICAgICAgICAgCi0gKiAgSGlnaExhdGVuY3kgICAgICAgIDogSGlnaCBMYXRlbmN5IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgaW5jbHVkZXMgIAotICogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgNiBhbmQgYW5uZXhlcyBPLjEgYW5kIFAuNSAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgID0gMHgwMSwgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcgICAgICAgICAgPSAweDAyLCAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgID0gMHgwNCwgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyICAgICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzICAgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiAgICAgPSAweDIwLCAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQgICAgICAgICAgICA9IDB4NDAsICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICA9IDB4ODAsICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgID0gMHgxMDAsICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlTWF4ICAgICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIEguMjYzIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKLSAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgID0gMHgwMSwgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwyMCAgPSAweDAyLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwzMCAgPSAweDA0LCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0MCAgPSAweDA4LCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0NSAgPSAweDEwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw1MCAgPSAweDIwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw2MCAgPSAweDQwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw3MCAgPSAweDgwLCAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU7Ci0KLQotLyoqIAotICogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGUuIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgT1InZCB0byBzaWduYWwgYWxsIAotICogcGljdHVyZXMgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQuCi0gKgotICogRU5VTVM6Ci0gKiAgR2VuZXJpYyBQaWN0dXJlIFR5cGVzOiAgICAgICAgICBJLCBQIGFuZCBCCi0gKiAgSC4yNjMgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogICBTSSBhbmQgU1AKLSAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIEVJIGFuZCBFUAotICogIE1QRUctNCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgUwotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFIHsKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJICAgPSAweDAxLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVAgICA9IDB4MDIsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlQiAgID0gMHgwNCwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTSSAgPSAweDA4LAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNQICA9IDB4MTAsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRUkgID0gMHgxMSwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFUCAgPSAweDEyLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVMgICA9IDB4MTQsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fUElDVFVSRVRZUEU7Ci0KLQotLyoqIAotICogSC4yNjMgUGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBlUHJvZmlsZSAgICAgICAgICAgICAgICAgOiBILjI2MyBwcm9maWxlKHMpIHRvIHVzZQotICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICA6IEguMjYzIGxldmVsKHMpIHRvIHVzZQotICogIGJQTFVTUFRZUEVBbGxvd2VkICAgICAgICA6IEluZGljYXRpbmcgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZSBQTFVTUFRZUEUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBpbiB0aGUgMTk5OCB2ZXJzaW9uIG9mIEguMjYzKSB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jayAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyAKLSAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiAgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvIDogdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCAoYml0IDYgb2YgTVBQVFlQRSkgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgZm9yIGVhY2ggcmVmZXJlbmNlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaW4gZXJyb3ItZnJlZSBjb21tdW5pY2F0aW9uCi0gKiAgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uIDogU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgb2YgcGljdHVyZSBoZWFkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbgotICogIG5HT0JIZWFkZXJJbnRlcnZhbCAgICAgICA6IFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgb2Ygbm9uLWVtcHR5IEdPQiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyBpbiB1bml0cyBvZiBHT0JzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblBGcmFtZXM7Ci0gICAgT01YX1UzMiBuQkZyYW1lczsKLSAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19IMjYzTEVWRUxUWVBFIGVMZXZlbDsKLSAgICBPTVhfQk9PTCBiUExVU1BUWVBFQWxsb3dlZDsKLSAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOwotICAgIE9NWF9CT09MIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybzsKLSAgICBPTVhfVTMyIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbjsKLSAgICBPTVhfVTMyIG5HT0JIZWFkZXJJbnRlcnZhbDsKLX0gT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUgPSAwLCAgLyoqPCBTaW1wbGUgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluLCAgICAgICAgLyoqPCBNYWluIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCAgICAgICAgIC8qKjwgNDoyOjIgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTTlIsICAgICAgICAgLyoqPCBTTlIgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTcGF0aWFsLCAgICAgLyoqPCBTcGF0aWFsIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCwgICAgICAgIC8qKjwgSGlnaCBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWF4ID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKLSAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsTUwsICAgICAgLyoqPCBNYWluIExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsSDE0LCAgICAgLyoqPCBIaWdoIDE0NDAgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBwYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblBGcmFtZXMgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIG5CRnJhbWVzICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBlUHJvZmlsZSAgIDogTVBFRy0yIHByb2ZpbGUocykgdG8gdXNlCi0gKiAgZUxldmVsICAgICA6IE1QRUctMiBsZXZlbHMocykgdG8gdXNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgIAotICAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAgICAKLSAgICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci0JT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGVMZXZlbDsgICAKLX0gT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqIAotICogRU5VTVM6Ci0gKiAgLSBTaW1wbGUgUHJvZmlsZSwgTGV2ZWxzIDEtMwotICogIC0gU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gTWFpbiBQcm9maWxlLCBMZXZlbHMgMi00Ci0gKiAgLSBOLWJpdCBQcm9maWxlLCBMZXZlbCAyCi0gKiAgLSBTY2FsYWJsZSBUZXh0dXJlIFByb2ZpbGUsIExldmVsIDEKLSAqICAtIFNpbXBsZSBGYWNlIEFuaW1hdGlvbiBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBTaW1wbGUgRmFjZSBhbmQgQm9keSBBbmltYXRpb24gKEZCQSkgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQmFzaWMgQW5pbWF0ZWQgVGV4dHVyZSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBIeWJyaWQgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQWR2YW5jZWQgUmVhbCBUaW1lIFNpbXBsZSBQcm9maWxlcywgTGV2ZWxzIDEtNAotICogIC0gQ29yZSBTY2FsYWJsZSBQcm9maWxlLCBMZXZlbHMgMS0zCi0gKiAgLSBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeSBQcm9maWxlLCBMZXZlbHMgMS00Ci0gKiAgLSBBZHZhbmNlZCBDb3JlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIEFkdmFuY2VkIFNjYWxhYmxlIFRleHR1cmUsIExldmVscyAyLTMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICA9IDB4MDEsICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICA9IDB4MDIsICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlICAgICAgICAgICAgID0gMHgwNCwgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgPSAweDIwLCAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlICAgICAgID0gMHg0MCwgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEgICAgICAgID0gMHg4MCwgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCAgICA9IDB4MTAwLCAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCAgICAgICAgICAgPSAweDIwMCwgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSA9IDB4NDAwLCAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgPSAweDgwMCwgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgICA9IDB4MTAwMCwgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSAgICAgPSAweDIwMDAsICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgPSAweDQwMDAsCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlICAgPSAweDgwMDAsCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWF4ICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTQgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCi0gKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICA9IDB4MDEsICAgLyoqPCBMZXZlbCAwICovICAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiA9IDB4MDIsICAgLyoqPCBMZXZlbCAwYiAqLyAgIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgPSAweDA0LCAgIC8qKjwgTGV2ZWwgMSAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgID0gMHgwOCwgICAvKio8IExldmVsIDIgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICA9IDB4MTAsICAgLyoqPCBMZXZlbCAzICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgPSAweDIwLCAgIC8qKjwgTGV2ZWwgNCAqLyAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0YSA9IDB4NDAsICAgLyoqPCBMZXZlbCA0YSAqLyAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICA9IDB4ODAsICAgLyoqPCBMZXZlbCA1ICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctNCBjb25maWd1cmF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaGFuZGxlcyBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSAqIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBNUEVHNCBhbGdvcml0aG1zCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIgKEgyNjMrIAotICogICAgICAgICAgICAgICAgICAgICAgICAgQW5uZXggSykuIFB1dCB6ZXJvIGlmIG5vdCB1c2VkCi0gKiAgYlNWSCAgICAgICAgICAgICAgICAgOiBFbmFibGUgU2hvcnQgVmlkZW8gSGVhZGVyIG1vZGUKLSAqICBiR292ICAgICAgICAgICAgICAgICA6IEZsYWcgdG8gZW5hYmxlIEdPVgotICogIG5QRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lIChhbHNvIGNhbGxlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEdPViBwZXJpb2QpCi0gKiAgbkJGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuSURDVkxDVGhyZXNob2xkICAgICA6IFZhbHVlIG9mIGludHJhIERDIFZMQyB0aHJlc2hvbGQKLSAqICBiQUNQcmVkICAgICAgICAgICAgICA6IEZsYWcgdG8gdXNlIGFjIHByZWRpY3Rpb24KLSAqICBuTWF4UGFja2V0U2l6ZSAgICAgICA6IE1heGltdW0gc2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMuCi0gKiAgblRpbWVJbmNSZXMgICAgICAgICAgOiBVc2VkIHRvIHBhc3MgVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gZm9yIE1QRUc0LiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGVkIGFzIGRlc2NyaWJlZCBpbiBNUEVHNCBzdGFuZGFyZC4KLSAqICBlUHJvZmlsZSAgICAgICAgICAgICA6IE1QRUctNCBwcm9maWxlKHMpIHRvIHVzZS4KLSAqICBlTGV2ZWwgICAgICAgICAgICAgICA6IE1QRUctNCBsZXZlbChzKSB0byB1c2UuCi0gKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgYml0c3RyZWFtCi0gKiAgbkhlYWRlckV4dGVuc2lvbiAgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2aWRlbyBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgd2l0aGluIGEgVk9QCi0gKiAgYlJldmVyc2libGVWTEMgICAgICAgOiBTcGVjaWZpZXMgd2hldGhlciByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCBjb2RpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiB1c2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsKLSAgICBPTVhfQk9PTCBiU1ZIOwotICAgIE9NWF9CT09MIGJHb3Y7Ci0gICAgT01YX1UzMiBuUEZyYW1lczsKLSAgICBPTVhfVTMyIG5CRnJhbWVzOwotICAgIE9NWF9VMzIgbklEQ1ZMQ1RocmVzaG9sZDsKLSAgICBPTVhfQk9PTCBiQUNQcmVkOwotICAgIE9NWF9VMzIgbk1heFBhY2tldFNpemU7Ci0gICAgT01YX1UzMiBuVGltZUluY1JlczsKLSAgICBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgZUxldmVsOwotICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7Ci0gICAgT01YX1UzMiBuSGVhZGVyRXh0ZW5zaW9uOwotICAgIE9NWF9CT09MIGJSZXZlcnNpYmxlVkxDOwotfSBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFOwotCi0KLS8qKiAKLSAqIFdNViBWZXJzaW9ucyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIHsKLSAgICBPTVhfVklERU9fV01WRm9ybWF0VW51c2VkID0gMHgwMSwgICAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ3ICAgICAgPSAweDAyLCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgNyAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ4ICAgICAgPSAweDA0LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOCAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ5ICAgICAgPSAweDA4LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOSAqLwotICAgIE9NWF9WSURFT19XTUZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1dNRkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1dNVkZvcm1hdE1heCAgICA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogV01WIFBhcmFtcyAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9ybWF0ICAgIDogVmVyc2lvbiBvZiBXTVYgc3RyZWFtIC8gZGF0YQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fV01WVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVklERU9fV01WRk9STUFUVFlQRSBlRm9ybWF0OwotfSBPTVhfVklERU9fUEFSQU1fV01WVFlQRTsKLQotCi0vKiogCi0gKiBSZWFsIFZpZGVvIFZlcnNpb24gCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fUlZGT1JNQVRUWVBFIHsKLSAgICBPTVhfVklERU9fUlZGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdDgsICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOCAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdDksICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOSAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdEcyLCAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBGb3JtYXQgRzIgKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19SVkZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogUmVhbCBWaWRlbyBQYXJhbXMgCi0gKgotICogU1RVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICAgICAgICAgIDogVmVyc2lvbiBvZiBSViBzdHJlYW0gLyBkYXRhCi0gKiAgbkJpdHNQZXJQaXhlbCAgICAgIDogQml0cyBwZXIgcGl4ZWwgY29kZWQgaW4gdGhlIGZyYW1lCi0gKiAgblBhZGRlZFdpZHRoICAgICAgIDogUGFkZGVkIHdpZHRoIGluIHBpeGVsIG9mIGEgdmlkZW8gZnJhbWUKLSAqICBuUGFkZGVkSGVpZ2h0ICAgICAgOiBQYWRkZWQgSGVpZ2h0IGluIHBpeGVscyBvZiBhIHZpZGVvIGZyYW1lCi0gKiAgbkZyYW1lUmF0ZSAgICAgICAgIDogUmF0ZSBvZiB2aWRlbyBpbiBmcmFtZXMgcGVyIHNlY29uZAotICogIG5CaXRzdHJlYW1GbGFncyAgICA6IEZsYWdzIHdoaWNoIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRzdHJlYW0KLSAqICBuQml0c3RyZWFtVmVyc2lvbiAgOiBCaXRzdHJlYW0gdmVyc2lvbgotICogIG5NYXhFbmNvZGVGcmFtZVNpemU6IE1heCBlbmNvZGVkIGZyYW1lIHNpemUKLSAqICBiRW5hYmxlUG9zdEZpbHRlciAgOiBUdXJuIG9uL29mZiBwb3N0IGZpbHRlcgotICogIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb24gOiBUdXJuIG9uL29mZiB0ZW1wb3JhbCBpbnRlcnBvbGF0aW9uCi0gKiAgYkVuYWJsZUxhdGVuY3lNb2RlIDogV2hlbiBlbmFibGVkLCB0aGUgZGVjb2RlciBkb2VzIG5vdCBkaXNwbGF5IGEgZGVjb2RlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB1bnRpbCBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCBubyBlbmhhbmNlbWVudCBsYXllciAKLSAqICAJCQkJCSBmcmFtZXMgb3IgZGVwZW5kZW50IEIgZnJhbWVzIHdpbGwgYmUgY29taW5nLiBUaGlzIAotICogIAkJCQkJIGRldGVjdGlvbiB1c3VhbGx5IG9jY3VycyB3aGVuIGEgc3Vic2VxdWVudCBub24tQiAKLSAqICAJCQkJCSBmcmFtZSBpcyBlbmNvdW50ZXJlZCAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1JWVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgICBPTVhfVTE2IG5CaXRzUGVyUGl4ZWw7Ci0gICAgT01YX1UxNiBuUGFkZGVkV2lkdGg7Ci0gICAgT01YX1UxNiBuUGFkZGVkSGVpZ2h0OwotICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKLSAgICBPTVhfVTMyIG5CaXRzdHJlYW1GbGFnczsKLSAgICBPTVhfVTMyIG5CaXRzdHJlYW1WZXJzaW9uOwotICAgIE9NWF9VMzIgbk1heEVuY29kZUZyYW1lU2l6ZTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlUG9zdEZpbHRlcjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlVGVtcG9yYWxJbnRlcnBvbGF0aW9uOwotICAgIE9NWF9CT09MIGJFbmFibGVMYXRlbmN5TW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX1JWVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSA9IDB4MDEsICAgLyoqPCBCYXNlbGluZSBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICA9IDB4MDIsICAgLyoqPCBNYWluIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkID0gMHgwNCwgICAvKio8IEV4dGVuZGVkIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgID0gMHgwOCwgICAvKio8IEhpZ2ggcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICAgPSAweDEwLCAgIC8qKjwgSGlnaCAxMCBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjAsICAgLyoqPCBIaWdoIDQ6MjoyIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MCwgICAvKio8IEhpZ2ggNDo0OjQgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19BVkNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAotICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19BVkNMZXZlbDEgICA9IDB4MDEsICAgICAvKio8IExldmVsIDEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiAgPSAweDAyLCAgICAgLyoqPCBMZXZlbCAxYiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDExICA9IDB4MDQsICAgICAvKio8IExldmVsIDEuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDEyICA9IDB4MDgsICAgICAvKio8IExldmVsIDEuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDEzICA9IDB4MTAsICAgICAvKio8IExldmVsIDEuMyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDIgICA9IDB4MjAsICAgICAvKio8IExldmVsIDIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwyMSAgPSAweDQwLCAgICAgLyoqPCBMZXZlbCAyLjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiAgPSAweDgwLCAgICAgLyoqPCBMZXZlbCAyLjIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwzICAgPSAweDEwMCwgICAgLyoqPCBMZXZlbCAzICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMzEgID0gMHgyMDAsICAgIC8qKjwgTGV2ZWwgMy4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMzIgID0gMHg0MDAsICAgIC8qKjwgTGV2ZWwgMy4yICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgID0gMHg4MDAsICAgIC8qKjwgTGV2ZWwgNCAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDQxICA9IDB4MTAwMCwgICAvKio8IExldmVsIDQuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDQyICA9IDB4MjAwMCwgICAvKio8IExldmVsIDQuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDUgICA9IDB4NDAwMCwgICAvKio8IExldmVsIDUgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw1MSAgPSAweDgwMDAsICAgLyoqPCBMZXZlbCA1LjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgbG9vcCBmaWx0ZXIgbW9kZXMgCi0gKgotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZQotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlICAgICAgICAgICAgICA6IERpc2FibGUKLSAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZVNsaWNlQm91bmRhcnkgOiBEaXNhYmxlZCBvbiBzbGljZSBib3VuZGFyaWVzCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgewotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlID0gMCwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUsCi0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgcGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TbGljZUhlYWRlclNwYWNpbmcgICAgICAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIsIHB1dCAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gaWYgbm90IHVzZWQKLSAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgbkJGcmFtZXMgICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIGJVc2VIYWRhbWFyZCAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBIYWRhbWFyZCB0cmFuc2Zvcm0KLSAqICBuUmVmRnJhbWVzICAgICAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIHRvIHVzZSBmb3IgaW50ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHNlYXJjaCAoMS0xNikKLSAqICBuUmVmSWR4VHJhaWxpbmcgICAgICAgICAgIDogUGljIHBhcmFtIHNldCByZWYgZnJhbWUgaW5kZXggKGluZGV4IGludG8gcmVmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGJ1ZmZlciBvZiB0cmFpbGluZyBmcmFtZXMgbGlzdCksIEIgZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICogIG5SZWZJZHhGb3J3YXJkICAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIGZvcndhcmQgZnJhbWVzIGxpc3QpLCBCIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKLSAqICBiRW5hYmxlVUVQICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgdW5lcXVhbCBlcnJvciBwcm90ZWN0aW9uLiBUaGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHZhbGlkIG9mIGRhdGEgcGFydGl0aW9uaW5nIGlzIGVuYWJsZWQuCi0gKiAgYkVuYWJsZUZNTyAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcKLSAqICBiRW5hYmxlQVNPICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgYXJiaXRyYXJ5IHNsaWNlIG9yZGVyaW5nCi0gKiAgYkVuYWJsZVJTICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHNlbmRpbmcgb2YgcmVkdW5kYW50IHNsaWNlcwotICogIGVQcm9maWxlICAgICAgICAgICAgICAgICAgOiBBVkMgcHJvZmlsZShzKSB0byB1c2UKLSAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgIDogQVZDIGxldmVsKHMpIHRvIHVzZQotICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogIGJGcmFtZU1Cc09ubHkgICAgICAgICAgICAgOiBzcGVjaWZpZXMgdGhhdCBldmVyeSBjb2RlZCBwaWN0dXJlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgdmlkZW8gc2VxdWVuY2UgaXMgYSBjb2RlZCBmcmFtZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBvbmx5IGZyYW1lIG1hY3JvYmxvY2tzCi0gKiAgYk1CQUZGICAgICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHN3aXRjaGluZyBiZXR3ZWVuIGZyYW1lIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbWFjcm9ibG9ja3Mgd2l0aGluIGEgcGljdHVyZQotICogIGJFbnRyb3B5Q29kaW5nQ0FCQUMgICAgICAgOiBFbnRyb3B5IGRlY29kaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkIGZvciB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCBlbGVtZW50cyBmb3Igd2hpY2ggdHdvIGRlc2NyaXB0b3JzIGFwcGVhciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN5bnRheCB0YWJsZXMKLSAqICBiV2VpZ2h0ZWRQUHJlZGljdGlvbiAgICAgIDogRW5hYmxlL2Rpc2FibGUgd2VpZ2h0ZWQgcHJlZGljdGlvbiBzaGFsbCBub3QgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gUCBhbmQgU1Agc2xpY2VzCi0gKiAgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZSA6IERlZmF1bHQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBpcyBhcHBsaWVkIHRvIEIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyAKLSAqICBiY29uc3RJcHJlZCAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaW50cmEgcHJlZGljdGlvbgotICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGZvciBsdW1hIG1vdGlvbiB2ZWN0b3JzIGZvciBCX1NraXAsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX0RpcmVjdF8xNngxNiBhbmQgQl9EaXJlY3RfOHg4IGFzIHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjIAotICogIGJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgICAgOiBGbGFnIGluZGljYXRpbmcgc3BhdGlhbCBvciB0ZW1wb3JhbCBkaXJlY3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB1c2VkIGluIEIgc2xpY2UgY29kaW5nIChyZWxhdGVkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlyZWN0OHg4SW5mZXJlbmNlKSAuIFNwYXRpYWwgZGlyZWN0IG1vZGUgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgY29tbW9uIGFuZCBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCi0gKiAgbkNhYmFjSW5pdElkeCAgICAgICAgICAgICA6IEluZGV4IHVzZWQgdG8gaW5pdCBDQUJBQyBjb250ZXh0cwotICogIGVMb29wRmlsdGVyTW9kZSAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBsb29wIGZpbHRlcgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOyAgCi0gICAgT01YX1UzMiBuUEZyYW1lczsgICAgIAotICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAKLSAgICBPTVhfQk9PTCBiVXNlSGFkYW1hcmQ7Ci0gICAgT01YX1UzMiBuUmVmRnJhbWVzOyAgCi0JT01YX1UzMiBuUmVmSWR4MTBBY3RpdmVNaW51czE7Ci0JT01YX1UzMiBuUmVmSWR4MTFBY3RpdmVNaW51czE7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVVFUDsgIAotICAgIE9NWF9CT09MIGJFbmFibGVGTU87ICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlQVNPOyAgCi0gICAgT01YX0JPT0wgYkVuYWJsZVJTOyAgIAotICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fQVZDTEVWRUxUWVBFIGVMZXZlbDsgCi0gICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsgIAotCU9NWF9CT09MIGJGcmFtZU1Cc09ubHk7ICAgICAgICAJCQkJCQkJCQkKLSAgICBPTVhfQk9PTCBiTUJBRkY7ICAgICAgICAgICAgICAgCi0gICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsgIAotICAgIE9NWF9CT09MIGJXZWlnaHRlZFBQcmVkaWN0aW9uOyAKLSAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7IAotICAgIE9NWF9CT09MIGJjb25zdElwcmVkIDsKLSAgICBPTVhfQk9PTCBiRGlyZWN0OHg4SW5mZXJlbmNlOyAgCi0JT01YX0JPT0wgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbDsKLQlPTVhfVTMyIG5DYWJhY0luaXRJZGM7Ci0JT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGVMb29wRmlsdGVyTW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKLSAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKLSAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKLSAgIE9NWF9VMzIgZVByb2ZpbGU7ICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLwotICAgT01YX1UzMiBlTGV2ZWw7ICAgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KLSAgIE9NWF9VMzIgblByb2ZpbGVJbmRleDsgLyoqPCBVc2VkIHRvIHF1ZXJ5IGZvciBpbmRpdmlkdWFsIHByb2ZpbGUgc3VwcG9ydCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGFsbCBvdGhlciBpbmRpY2VzIHRoaXMgcGFyYW1ldGVyIGlzIHRvIGJlIGlnbm9yZWQuICovCi19IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFOwotCi0vKiogCi0gKiBTdHJ1Y3R1cmUgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyaW5nIGJpdHJhdGUgbW9kZSBvZiBhIGNvZGVjLiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdCBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0bwotICogIG5FbmNvZGVCaXRyYXRlIDogVGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB0byBiZSBnZW5lcmF0ZWQgaW4gYnBzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbkVuY29kZUJpdHJhdGU7ICAgICAgICAgICAgICAgICAKLX0gT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRTsKLQotLyoqIAotICogRGVmaW5lcyBFbmNvZGVyIEZyYW1lIFJhdGUgc2V0dGluZwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICB4RW5jb2RlRnJhbWVyYXRlIDogRW5jb2RpbmcgZnJhbWVyYXRlIHJlcHJlc2VudGVkIGluIFExNiBmb3JtYXQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiB4RW5jb2RlRnJhbWVyYXRlOyAvKiBRMTYgZm9ybWF0ICovCi19IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgSW50cmFSZWZyZXNoVk9QOwotfSBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkVyck1hcFNpemU7ICAgICAgICAgICAvKiBTaXplIG9mIHRoZSBFcnJvciBNYXAgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTggIEVyck1hcFsxXTsgICAgICAgICAgICAgLyogRXJyb3IgbWFwIGhpbnQgKi8KLX0gT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZWQ7Ci19IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5NYWNyb2Jsb2NrczsKLX0gT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRTsKLQotLyoqIAotICogQVZDIFNsaWNlIE1vZGUgbW9kZXMgCi0gKgotICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ICAgOiBOb3JtYWwgZnJhbWUgZW5jb2RpbmcsIG9uZSBzbGljZSBwZXIgZnJhbWUKLSAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSAgIDogTkFMIG1vZGUsIG51bWJlciBvZiBNQnMgcGVyIGZyYW1lCi0gKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSA6IE5BTCBtb2RlLCBudW1iZXIgb2YgYnl0ZXMgcGVyIGZyYW1lCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSB7Ci0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ID0gMCwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ01CU2xpY2UsCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNCeXRlU2xpY2UsCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFOwotCi0vKiogCi0gKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5OdW1TbGljZUdyb3VwcyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICogIG5TbGljZUdyb3VwTWFwVHlwZSA6IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBzbGljZSBncm91cHMKLSAqICBlU2xpY2VNb2RlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTggbk51bVNsaWNlR3JvdXBzOwotICAgIE9NWF9VOCBuU2xpY2VHcm91cE1hcFR5cGU7Ci0gICAgT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEUgZVNsaWNlTW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1POwotCi0vKiogCi0gKiBBVkMgSURSIFBlcmlvZCBDb25maWdzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbklEUlBlcmlvZCA6IFNwZWNpZmllcyBwZXJpb2RpY2l0eSBvZiBJRFIgZnJhbWVzCi0gKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgaW50ZXJuYWwgb2YgY29kaW5nIEludHJhIGZyYW1lcwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbklEUlBlcmlvZDsKLSAgICBPTVhfVTMyIG5QRnJhbWVzOwotfSBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EOwotCi0vKiogCi0gKiBBVkMgTkFMIFNpemUgQ29uZmlncwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5OYWx1Qnl0ZXMgOiBTcGVjaWZpZXMgdGhlIE5BTCB1bml0IHNpemUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbk5hbHVCeXRlczsKLX0gT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCmluZGV4IGVmZWRiNmUuLmI5NzUyZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCkBAIC0zNywyNiArMzcsMjYgQEAKIAogICAgIH5UaW1lZFRleHREcml2ZXIoKTsKIAotICAgIC8vIFRPRE86IHBhdXNlLXJlc3VtZSBwYWlyIHNlZW1zIGVxdWl2YWxlbnQgdG8gc3RvcC1zdGFydCBwYWlyLgotICAgIC8vIENoZWNrIGlmIGl0IGlzIHJlcGxhY2VhYmxlIHdpdGggc3RvcC1zdGFydC4KICAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKICAgICBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHN0YXR1c190IHJlc3VtZSgpOworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKGludDMyX3QgaW5kZXgpOworICAgIHN0YXR1c190IHVuc2VsZWN0VHJhY2soaW50MzJfdCBpbmRleCk7CiAKICAgICBzdGF0dXNfdCBzZWVrVG9Bc3luYyhpbnQ2NF90IHRpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBhZGRJbkJhbmRUZXh0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKLSAgICBzdGF0dXNfdCBhZGRPdXRPZkJhbmRUZXh0U291cmNlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgc3RhdHVzX3QgYWRkT3V0T2ZCYW5kVGV4dFNvdXJjZShjb25zdCBjaGFyICp1cmksIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKKyAgICAvLyBDYWxsZXIgb3ducyB0aGUgZmlsZSBkZXNyaXB0b3IgYW5kIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdC4KKyAgICBzdGF0dXNfdCBhZGRPdXRPZkJhbmRUZXh0U291cmNlKAorICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3Qgc2V0VGltZWRUZXh0VHJhY2tJbmRleChpbnQzMl90IGluZGV4KTsKKyAgICB2b2lkIGdldFRyYWNrSW5mbyhQYXJjZWwgKnBhcmNlbCk7CiAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBlbnVtIFN0YXRlIHsKICAgICAgICAgVU5JTklUSUFMSVpFRCwKLSAgICAgICAgU1RPUFBFRCwKICAgICAgICAgUExBWUlORywKICAgICAgICAgUEFVU0VELAogICAgIH07CkBAIC02NywxMSArNjcsMTEgQEAKIAogICAgIC8vIFZhcmlhYmxlcyB0byBiZSBndWFyZGVkIGJ5IG1Mb2NrLgogICAgIFN0YXRlIG1TdGF0ZTsKLSAgICBWZWN0b3I8c3A8VGltZWRUZXh0U291cmNlPiA+IG1UZXh0SW5CYW5kVmVjdG9yOwotICAgIFZlY3RvcjxzcDxUaW1lZFRleHRTb3VyY2U+ID4gbVRleHRPdXRPZkJhbmRWZWN0b3I7CisgICAgaW50MzJfdCBtQ3VycmVudFRyYWNrSW5kZXg7CisgICAgVmVjdG9yPHNwPFRpbWVkVGV4dFNvdXJjZT4gPiBtVGV4dFNvdXJjZVZlY3RvcjsKICAgICAvLyAtLSBFbmQgb2YgdmFyaWFibGVzIHRvIGJlIGd1YXJkZWQgYnkgbUxvY2sKIAotICAgIHN0YXR1c190IHNldFRpbWVkVGV4dFRyYWNrSW5kZXhfbChpbnQzMl90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFja19sKGludDMyX3QgaW5kZXgpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0RHJpdmVyKTsKIH07CmRpZmYgLS1naXQgYS9saWJzL2FuZHJvaWRmdy9JbnB1dC5jcHAgYi9saWJzL2FuZHJvaWRmdy9JbnB1dC5jcHAKaW5kZXggY2EwOWNhZi4uZGE1NzgzOSAxMDA2NDQKLS0tIGEvbGlicy9hbmRyb2lkZncvSW5wdXQuY3BwCisrKyBiL2xpYnMvYW5kcm9pZGZ3L0lucHV0LmNwcApAQCAtNjgzLDYgKzY4Myw1OCBAQAogfQogCiAKKy8vIC0tLSBQb29sZWRJbnB1dEV2ZW50RmFjdG9yeSAtLS0KKworUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OlBvb2xlZElucHV0RXZlbnRGYWN0b3J5KHNpemVfdCBtYXhQb29sU2l6ZSkgOgorICAgICAgICBtTWF4UG9vbFNpemUobWF4UG9vbFNpemUpIHsKK30KKworUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6On5Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeSgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1LZXlFdmVudFBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1LZXlFdmVudFBvb2wuaXRlbUF0KGkpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb3Rpb25FdmVudFBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1Nb3Rpb25FdmVudFBvb2wuaXRlbUF0KGkpOworICAgIH0KK30KKworS2V5RXZlbnQqIFBvb2xlZElucHV0RXZlbnRGYWN0b3J5OjpjcmVhdGVLZXlFdmVudCgpIHsKKyAgICBpZiAoIW1LZXlFdmVudFBvb2wuaXNFbXB0eSgpKSB7CisgICAgICAgIEtleUV2ZW50KiBldmVudCA9IG1LZXlFdmVudFBvb2wudG9wKCk7CisgICAgICAgIG1LZXlFdmVudFBvb2wucG9wKCk7CisgICAgICAgIHJldHVybiBldmVudDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBLZXlFdmVudCgpOworfQorCitNb3Rpb25FdmVudCogUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OmNyZWF0ZU1vdGlvbkV2ZW50KCkgeworICAgIGlmICghbU1vdGlvbkV2ZW50UG9vbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgTW90aW9uRXZlbnQqIGV2ZW50ID0gbU1vdGlvbkV2ZW50UG9vbC50b3AoKTsKKyAgICAgICAgbU1vdGlvbkV2ZW50UG9vbC5wb3AoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKyAgICByZXR1cm4gbmV3IE1vdGlvbkV2ZW50KCk7Cit9CisKK3ZvaWQgUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OnJlY3ljbGUoSW5wdXRFdmVudCogZXZlbnQpIHsKKyAgICBzd2l0Y2ggKGV2ZW50LT5nZXRUeXBlKCkpIHsKKyAgICBjYXNlIEFJTlBVVF9FVkVOVF9UWVBFX0tFWToKKyAgICAgICAgaWYgKG1LZXlFdmVudFBvb2wuc2l6ZSgpIDwgbU1heFBvb2xTaXplKSB7CisgICAgICAgICAgICBtS2V5RXZlbnRQb29sLnB1c2goc3RhdGljX2Nhc3Q8S2V5RXZlbnQqPihldmVudCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUlOUFVUX0VWRU5UX1RZUEVfTU9USU9OOgorICAgICAgICBpZiAobU1vdGlvbkV2ZW50UG9vbC5zaXplKCkgPCBtTWF4UG9vbFNpemUpIHsKKyAgICAgICAgICAgIG1Nb3Rpb25FdmVudFBvb2wucHVzaChzdGF0aWNfY2FzdDxNb3Rpb25FdmVudCo+KGV2ZW50KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlbGV0ZSBldmVudDsKK30KKworCiAvLyAtLS0gVmVsb2NpdHlUcmFja2VyIC0tLQogCiBjb25zdCB1aW50MzJfdCBWZWxvY2l0eVRyYWNrZXI6OkRFRkFVTFRfREVHUkVFOwpkaWZmIC0tZ2l0IGEvbGlicy9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuY3BwIGIvbGlicy9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuY3BwCmluZGV4IDFlYmQ3NWMuLjI5NDIzNmYgMTAwNjQ0Ci0tLSBhL2xpYnMvYW5kcm9pZGZ3L0lucHV0VHJhbnNwb3J0LmNwcAorKysgYi9saWJzL2FuZHJvaWRmdy9JbnB1dFRyYW5zcG9ydC5jcHAKQEAgLTUyNyw2ICs1MjcsMTAgQEAKICAgICByZXR1cm4gbUNoYW5uZWwtPnNlbmRNZXNzYWdlKCZtc2cpOwogfQogCitib29sIElucHV0Q29uc3VtZXI6Omhhc0RlZmVycmVkRXZlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nc2dEZWZlcnJlZDsKK30KKwogYm9vbCBJbnB1dENvbnN1bWVyOjpoYXNQZW5kaW5nQmF0Y2goKSBjb25zdCB7CiAgICAgcmV0dXJuICFtQmF0Y2hlcy5pc0VtcHR5KCk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2NwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL2xpYnMvY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCmluZGV4IGZmZWUwMzkuLjk5YjRjODM2MyAxMDA2NDQKLS0tIGEvbGlicy9jcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbGlicy9jcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKQEAgLTE0LDE4ICsxNCwyNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJUaHJlYWRDcHVVc2FnZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwogYm9vbCBUaHJlYWRDcHVVc2FnZTo6c2V0RW5hYmxlZChib29sIGlzRW5hYmxlZCkKIHsKICAgICBib29sIHdhc0VuYWJsZWQgPSBtSXNFbmFibGVkOwogICAgIC8vIG9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIGEgY2hhbmdlCiAgICAgaWYgKGlzRW5hYmxlZCAhPSB3YXNFbmFibGVkKSB7CisgICAgICAgIEFMT0dWKCJzZXRFbmFibGVkKCVkKSIsIGlzRW5hYmxlZCk7CiAgICAgICAgIGludCByYzsKICAgICAgICAgLy8gZW5hYmxpbmcKICAgICAgICAgaWYgKGlzRW5hYmxlZCkgewpAQCAtNjUsMjAgKzczLDI4IEBACiAgICAgcmV0dXJuIHdhc0VuYWJsZWQ7CiB9CiAKLXZvaWQgVGhyZWFkQ3B1VXNhZ2U6OnNhbXBsZUFuZEVuYWJsZSgpCitib29sIFRocmVhZENwdVVzYWdlOjpzYW1wbGVBbmRFbmFibGUoZG91YmxlJiBucykKIHsKKyAgICBib29sIHJldDsKICAgICBib29sIHdhc0V2ZXJFbmFibGVkID0gbVdhc0V2ZXJFbmFibGVkOwogICAgIGlmIChlbmFibGUoKSkgewogICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQsIHNvIGFkZCBhIG5ldyBzYW1wbGUgcmVsYXRpdmUgdG8gcHJldmlvdXMKLSAgICAgICAgc2FtcGxlKCk7CisgICAgICAgIHJldHVybiBzYW1wbGUobnMpOwogICAgIH0gZWxzZSBpZiAod2FzRXZlckVuYWJsZWQpIHsKICAgICAgICAgLy8gd2FzIGRpc2FibGVkLCBidXQgYWRkIHNhbXBsZSBmb3IgYWNjdW11bGF0ZWQgdGltZSB3aGlsZSBlbmFibGVkCi0gICAgICAgIG1TdGF0aXN0aWNzLnNhbXBsZSgoZG91YmxlKSBtQWNjdW11bGF0b3IpOworICAgICAgICBucyA9IChkb3VibGUpIG1BY2N1bXVsYXRvcjsKICAgICAgICAgbUFjY3VtdWxhdG9yID0gMDsKKyAgICAgICAgQUxPR1YoInNhbXBsZUFuZEVuYWJsZSAlLjBmIiwgbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmaXJzdCB0aW1lIGNhbGxlZAorICAgICAgICBucyA9IDAuMDsKKyAgICAgICAgQUxPR1YoInNhbXBsZUFuZEVuYWJsZSBmYWxzZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCi12b2lkIFRocmVhZENwdVVzYWdlOjpzYW1wbGUoKQorYm9vbCBUaHJlYWRDcHVVc2FnZTo6c2FtcGxlKGRvdWJsZSAmbnMpCiB7CiAgICAgaWYgKG1XYXNFdmVyRW5hYmxlZCkgewogICAgICAgICBpZiAobUlzRW5hYmxlZCkgewpAQCAtODcsNiArMTAzLDggQEAKICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJnRzKTsKICAgICAgICAgICAgIGlmIChyYykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKSBlcnJubz0lZCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBucyA9IDAuMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBkZWx0YSA9ICh0cy50dl9zZWMgLSBtUHJldmlvdXNUcy50dl9zZWMpICogMTAwMDAwMDAwMExMICsKICAgICAgICAgICAgICAgICAgICAgICAgICh0cy50dl9uc2VjIC0gbVByZXZpb3VzVHMudHZfbnNlYyk7CkBAIC05NiwxMCArMTE0LDE0IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtV2FzRXZlckVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBtU3RhdGlzdGljcy5zYW1wbGUoKGRvdWJsZSkgbUFjY3VtdWxhdG9yKTsKKyAgICAgICAgbnMgPSAoZG91YmxlKSBtQWNjdW11bGF0b3I7CisgICAgICAgIEFMT0dWKCJzYW1wbGUgJS4wZiIsIG5zKTsKICAgICAgICAgbUFjY3VtdWxhdG9yID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkNhbid0IGFkZCBzYW1wbGUgYmVjYXVzZSBtZWFzdXJlbWVudHMgaGF2ZSBuZXZlciBiZWVuIGVuYWJsZWQiKTsKKyAgICAgICAgbnMgPSAwLjA7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTEyMiwxMiArMTQ0LDEzIEBACiAgICAgICAgIEFMT0dXKCJDYW4ndCBjb21wdXRlIGVsYXBzZWQgdGltZSBiZWNhdXNlIG1lYXN1cmVtZW50cyBoYXZlIG5ldmVyIGJlZW4gZW5hYmxlZCIpOwogICAgICAgICBlbGFwc2VkID0gMDsKICAgICB9CisgICAgQUxPR1YoImVsYXBzZWQgJWxsZCIsIGVsYXBzZWQpOwogICAgIHJldHVybiBlbGFwc2VkOwogfQogCi12b2lkIFRocmVhZENwdVVzYWdlOjpyZXNldFN0YXRpc3RpY3MoKQordm9pZCBUaHJlYWRDcHVVc2FnZTo6cmVzZXRFbGFwc2VkKCkKIHsKLSAgICBtU3RhdGlzdGljcy5yZXNldCgpOworICAgIEFMT0dWKCJyZXNldEVsYXBzZWQiKTsKICAgICBpZiAobU1vbm90b25pY0tub3duKSB7CiAgICAgICAgIGludCByYzsKICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm1Nb25vdG9uaWNUcyk7CkBAIC0xMzcsMyArMTYwLDkzIEBACiAgICAgICAgIH0KICAgICB9CiB9CisKKy8qc3RhdGljKi8KK2ludCBUaHJlYWRDcHVVc2FnZTo6c1NjYWxpbmdGZHNbVGhyZWFkQ3B1VXNhZ2U6Ok1BWF9DUFVdOworcHRocmVhZF9vbmNlX3QgVGhyZWFkQ3B1VXNhZ2U6OnNPbmNlQ29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworaW50IFRocmVhZENwdVVzYWdlOjpzS2VybmVsTWF4OworCisvKnN0YXRpYyovCit2b2lkIFRocmVhZENwdVVzYWdlOjppbml0KCkKK3sKKyAgICAvLyByZWFkIHRoZSBudW1iZXIgb2YgQ1BVcworICAgIHNLZXJuZWxNYXggPSAxOworICAgIGludCBmZCA9IG9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2tlcm5lbF9tYXgiLCBPX1JET05MWSk7CisgICAgaWYgKGZkID49IDApIHsKKyNkZWZpbmUgS0VSTkVMX01BWF9TSVpFIDEyCisgICAgICAgIGNoYXIga2VybmVsTWF4W0tFUk5FTF9NQVhfU0laRV07CisgICAgICAgIHNzaXplX3QgYWN0dWFsID0gcmVhZChmZCwga2VybmVsTWF4LCBzaXplb2Yoa2VybmVsTWF4KSk7CisgICAgICAgIGlmIChhY3R1YWwgPj0gMiAmJiBrZXJuZWxNYXhbYWN0dWFsLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIHNLZXJuZWxNYXggPSBhdG9pKGtlcm5lbE1heCk7CisgICAgICAgICAgICBpZiAoc0tlcm5lbE1heCA+PSBNQVhfQ1BVIC0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJrZXJuZWxfbWF4ICVkIGJ1dCBNQVhfQ1BVICVkIiwgc0tlcm5lbE1heCwgTUFYX0NQVSk7CisgICAgICAgICAgICAgICAgc0tlcm5lbE1heCA9IE1BWF9DUFU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNLZXJuZWxNYXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImtlcm5lbF9tYXggaW52YWxpZCAlZCIsIHNLZXJuZWxNYXgpOworICAgICAgICAgICAgICAgIHNLZXJuZWxNYXggPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK3NLZXJuZWxNYXg7CisgICAgICAgICAgICAgICAgQUxPR1YoIm51bWJlciBvZiBDUFVzICVkIiwgc0tlcm5lbE1heCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQ2FuJ3QgcmVhZCBudW1iZXIgb2YgQ1BVcyIpOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkNhbid0IG9wZW4gbnVtYmVyIG9mIENQVXMiKTsKKyAgICB9CisKKyAgICAvLyBvcGVuIGZkIHRvIGVhY2ggZnJlcXVlbmN5IHBlciBDUFUKKyNkZWZpbmUgRlJFUV9TSVpFIDY0CisgICAgY2hhciBmcmVxX3BhdGhbRlJFUV9TSVpFXTsKKyNkZWZpbmUgRlJFUV9ESUdJVCAyNworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoTUFYX0NQVSA8PSAxMCk7CisgICAgc3RybGNweShmcmVxX3BhdGgsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHU/L2NwdWZyZXEvc2NhbGluZ19jdXJfZnJlcSIsIHNpemVvZihmcmVxX3BhdGgpKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NQVTsgKytpKSB7CisgICAgICAgIHNTY2FsaW5nRmRzW2ldID0gLTE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzS2VybmVsTWF4OyArK2kpIHsKKyAgICAgICAgZnJlcV9wYXRoW0ZSRVFfRElHSVRdID0gaSArICcwJzsKKyAgICAgICAgZmQgPSBvcGVuKGZyZXFfcGF0aCwgT19SRE9OTFkpOworICAgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgLy8ga2VlcCB0aGlzIGZkIHVudGlsIHByb2Nlc3MgZXhpdAorICAgICAgICAgICAgc1NjYWxpbmdGZHNbaV0gPSBmZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW4ndCBvcGVuIENQVSAlZCIsIGkpOworICAgICAgICB9CisgICAgfQorfQorCit1aW50MzJfdCBUaHJlYWRDcHVVc2FnZTo6Z2V0Q3B1a0h6KGludCBjcHVOdW0pCit7CisgICAgaWYgKGNwdU51bSA8IDAgfHwgY3B1TnVtID49IE1BWF9DUFUpIHsKKyAgICAgICAgQUxPR1coImdldENwdWtIeiBjYWxsZWQgd2l0aCBpbnZhbGlkIENQVSAlZCIsIGNwdU51bSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZmQgPSBzU2NhbGluZ0Zkc1tjcHVOdW1dOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgQUxPR1coImdldENwdWtIeiBjYWxsZWQgZm9yIHVub3BlbmVkIENQVSAlZCIsIGNwdU51bSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNkZWZpbmUgS0haX1NJWkUgMTIKKyAgICBjaGFyIGtIeltLSFpfU0laRV07ICAgLy8ga0h6IGJhc2UgMTAKKyAgICBzc2l6ZV90IGFjdHVhbCA9IHByZWFkKGZkLCBrSHosIHNpemVvZihrSHopLCAob2ZmX3QpIDApOworICAgIHVpbnQzMl90IHJldDsKKyAgICBpZiAoYWN0dWFsID49IDIgJiYga0h6W2FjdHVhbC0xXSA9PSAnXG4nKSB7CisgICAgICAgIHJldCA9IGF0b2koa0h6KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBpZiAocmV0ICE9IG1DdXJyZW50a0h6W2NwdU51bV0pIHsKKyAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJDUFUgJWQgZnJlcXVlbmN5ICV1IGtIeiIsIGNwdU51bSwgcmV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW4ndCByZWFkIENQVSAlZCBmcmVxdWVuY3kiLCBjcHVOdW0pOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50a0h6W2NwdU51bV0gPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCmluZGV4IDI0ZjUyZTAuLmE4ODRkOGUgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAKQEAgLTgyNiw3ICs4MjYsNyBAQAogICAgIHdoaWxlICghbVJlYWRlci5lb2YoKSkgewogICAgICAgICBpbnQgb3AgPSBtUmVhZGVyLnJlYWRJbnQoKTsKICAgICAgICAgaWYgKG9wICYgT1BfTUFZX0JFX1NLSVBQRURfTUFTSykgewotICAgICAgICAgICAgaW50MzJfdCBza2lwID0gbVJlYWRlci5yZWFkSW50KCkgKiA0OworICAgICAgICAgICAgaW50MzJfdCBza2lwID0gbVJlYWRlci5yZWFkSW50KCk7CiAgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKGZsYWdzICYga1JlcGxheUZsYWdfQ2xpcENoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgIG1SZWFkZXIuc2tpcChza2lwKTsKICAgICAgICAgICAgICAgICBESVNQTEFZX0xJU1RfTE9HRCgiJXMlcyBza2lwcGluZyAlZCBieXRlcyIsIChjaGFyKikgaW5kZW50LApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmgKaW5kZXggYWJlOGI4Mi4uNDM2MTdlNyAxMDA2NDQKLS0tIGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaAorKysgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5oCkBAIC02NTYsOSArNjU2LDggQEAKICAgICAgICAgaWYgKHJlamVjdCkgewogICAgICAgICAgICAgbVdyaXRlci53cml0ZUludChPUF9NQVlfQkVfU0tJUFBFRF9NQVNLIHwgZHJhd09wKTsKICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQoMHhkZWFkZGVhZCk7Ci0gICAgICAgICAgICB1aW50MzJfdCogbG9jYXRpb24gPSByZWplY3QgPwotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLnBlZWszMihtV3JpdGVyLnNpemUoKSAtIHNpemVvZihpbnQzMl90KSkgOiBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgICAgICAgICAgbUJ1ZmZlclNpemUgPSBtV3JpdGVyLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBtV3JpdGVyLnBlZWszMihtQnVmZmVyU2l6ZSAtIHNpemVvZihpbnQzMl90KSk7CiAgICAgICAgIH0KICAgICAgICAgbVdyaXRlci53cml0ZUludChkcmF3T3ApOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTY2Niw4ICs2NjUsNyBAQAogCiAgICAgaW5saW5lIHZvaWQgYWRkU2tpcCh1aW50MzJfdCogbG9jYXRpb24pIHsKICAgICAgICAgaWYgKGxvY2F0aW9uKSB7Ci0gICAgICAgICAgICAqbG9jYXRpb24gPSAoaW50MzJfdCkgKG1Xcml0ZXIucGVlazMyKAotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLnNpemUoKSAtIHNpemVvZihpbnQzMl90KSkgLSBsb2NhdGlvbik7CisgICAgICAgICAgICAqbG9jYXRpb24gPSAoaW50MzJfdCkgKG1Xcml0ZXIuc2l6ZSgpIC0gbUJ1ZmZlclNpemUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MjIsNiArODIwLDcgQEAKICAgICBWZWN0b3I8U2tNYXRyaXgqPiBtTWF0cmljZXM7CiAKICAgICBTa1dyaXRlcjMyIG1Xcml0ZXI7CisgICAgdWludDMyX3QgbUJ1ZmZlclNpemU7CiAKICAgICBpbnQgbVJlc3RvcmVTYXZlQ291bnQ7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvU2NyaXB0LmNwcCBiL2xpYnMvcnMvU2NyaXB0LmNwcAppbmRleCAyNWZhNjczLi5jODdkNDYwIDEwMDY0NAotLS0gYS9saWJzL3JzL1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9TY3JpcHQuY3BwCkBAIC0yNSwxMiArMjUsMTIgQEAKICNpbmNsdWRlICJBbGxvY2F0aW9uLmgiCiAjaW5jbHVkZSAiU2NyaXB0LmgiCiAKLXZvaWQgU2NyaXB0OjppbnZva2UodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdiwgc2l6ZV90IGxlbikgewordm9pZCBTY3JpcHQ6Omludm9rZSh1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2LCBzaXplX3QgbGVuKSBjb25zdCB7CiAgICAgcnNTY3JpcHRJbnZva2VWKG1SUy0+bUNvbnRleHQsIGdldElEKCksIHNsb3QsIHYsIGxlbik7CiB9CiAKIHZvaWQgU2NyaXB0Ojpmb3JFYWNoKHVpbnQzMl90IHNsb3QsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgY29uc3QgQWxsb2NhdGlvbiAqYW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdXNyLCBzaXplX3QgdXNyTGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnVzciwgc2l6ZV90IHVzckxlbikgY29uc3QgewogICAgIGlmICgoYWluID09IE5VTEwpICYmIChhb3V0ID09IE5VTEwpKSB7CiAgICAgICAgIG1SUy0+dGhyb3dFcnJvcigiQXQgbGVhc3Qgb25lIG9mIGFpbiBvciBhb3V0IGlzIHJlcXVpcmVkIHRvIGJlIG5vbi1udWxsLiIpOwogICAgIH0KQEAgLTQ0LDE2ICs0NCwxNiBAQAogfQogCiAKLXZvaWQgU2NyaXB0OjpiaW5kQWxsb2NhdGlvbihjb25zdCBBbGxvY2F0aW9uICp2YSwgdWludDMyX3Qgc2xvdCkgewordm9pZCBTY3JpcHQ6OmJpbmRBbGxvY2F0aW9uKGNvbnN0IEFsbG9jYXRpb24gKnZhLCB1aW50MzJfdCBzbG90KSBjb25zdCB7CiAgICAgcnNTY3JpcHRCaW5kQWxsb2NhdGlvbihtUlMtPm1Db250ZXh0LCBnZXRJRCgpLCBCYXNlT2JqOjpnZXRPYmpJRCh2YSksIHNsb3QpOwogfQogCiAKLXZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IEJhc2VPYmogKm8pIHsKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IEJhc2VPYmogKm8pIGNvbnN0IHsKICAgICByc1NjcmlwdFNldFZhck9iaihtUlMtPm1Db250ZXh0LCBnZXRJRCgpLCBpbmRleCwgKG8gPT0gTlVMTCkgPyAwIDogby0+Z2V0SUQoKSk7CiB9CiAKLXZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pIHsKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pIGNvbnN0IHsKICAgICByc1NjcmlwdFNldFZhclYobVJTLT5tQ29udGV4dCwgZ2V0SUQoKSwgaW5kZXgsIHYsIGxlbik7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvU2NyaXB0LmggYi9saWJzL3JzL1NjcmlwdC5oCmluZGV4IDU0ZDFlNDAuLjA3MDA4OTggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvU2NyaXB0LmgKKysrIGIvbGlicy9ycy9TY3JpcHQuaApAQCAtMzAsMjkgKzMwLDI5IEBACiBjbGFzcyBTY3JpcHQgOiBwdWJsaWMgQmFzZU9iaiB7CiBwcm90ZWN0ZWQ6CiAgICAgU2NyaXB0KHZvaWQgKmlkLCBSZW5kZXJTY3JpcHQgKnJzKTsKLSAgICB2b2lkIGZvckVhY2godWludDMyX3Qgc2xvdCwgY29uc3QgQWxsb2NhdGlvbiAqaW4sIGNvbnN0IEFsbG9jYXRpb24gKm91dCwgY29uc3Qgdm9pZCAqdiwgc2l6ZV90KTsKLSAgICB2b2lkIGJpbmRBbGxvY2F0aW9uKGNvbnN0IEFsbG9jYXRpb24gKnZhLCB1aW50MzJfdCBzbG90KTsKLSAgICB2b2lkIHNldFZhcih1aW50MzJfdCBpbmRleCwgY29uc3Qgdm9pZCAqLCBzaXplX3QgbGVuKTsKLSAgICB2b2lkIHNldFZhcih1aW50MzJfdCBpbmRleCwgY29uc3QgQmFzZU9iaiAqbyk7Ci0gICAgdm9pZCBpbnZva2UodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdiwgc2l6ZV90IGxlbik7CisgICAgdm9pZCBmb3JFYWNoKHVpbnQzMl90IHNsb3QsIGNvbnN0IEFsbG9jYXRpb24gKmluLCBjb25zdCBBbGxvY2F0aW9uICpvdXQsIGNvbnN0IHZvaWQgKnYsIHNpemVfdCkgY29uc3Q7CisgICAgdm9pZCBiaW5kQWxsb2NhdGlvbihjb25zdCBBbGxvY2F0aW9uICp2YSwgdWludDMyX3Qgc2xvdCkgY29uc3Q7CisgICAgdm9pZCBzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IHZvaWQgKiwgc2l6ZV90IGxlbikgY29uc3Q7CisgICAgdm9pZCBzZXRWYXIodWludDMyX3QgaW5kZXgsIGNvbnN0IEJhc2VPYmogKm8pIGNvbnN0OworICAgIHZvaWQgaW52b2tlKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pIGNvbnN0OwogCiAKLSAgICB2b2lkIGludm9rZSh1aW50MzJfdCBzbG90KSB7CisgICAgdm9pZCBpbnZva2UodWludDMyX3Qgc2xvdCkgY29uc3QgewogICAgICAgICBpbnZva2Uoc2xvdCwgTlVMTCwgMCk7CiAgICAgfQotICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IGluZGV4LCBmbG9hdCB2KSB7CisgICAgdm9pZCBzZXRWYXIodWludDMyX3QgaW5kZXgsIGZsb2F0IHYpIGNvbnN0IHsKICAgICAgICAgc2V0VmFyKGluZGV4LCAmdiwgc2l6ZW9mKHYpKTsKICAgICB9Ci0gICAgdm9pZCBzZXRWYXIodWludDMyX3QgaW5kZXgsIGRvdWJsZSB2KSB7CisgICAgdm9pZCBzZXRWYXIodWludDMyX3QgaW5kZXgsIGRvdWJsZSB2KSBjb25zdCB7CiAgICAgICAgIHNldFZhcihpbmRleCwgJnYsIHNpemVvZih2KSk7CiAgICAgfQotICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IGluZGV4LCBpbnQzMl90IHYpIHsKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBpbmRleCwgaW50MzJfdCB2KSBjb25zdCB7CiAgICAgICAgIHNldFZhcihpbmRleCwgJnYsIHNpemVvZih2KSk7CiAgICAgfQotICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IGluZGV4LCBpbnQ2NF90IHYpIHsKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBpbmRleCwgaW50NjRfdCB2KSBjb25zdCB7CiAgICAgICAgIHNldFZhcihpbmRleCwgJnYsIHNpemVvZih2KSk7CiAgICAgfQotICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IGluZGV4LCBib29sIHYpIHsKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBpbmRleCwgYm9vbCB2KSBjb25zdCB7CiAgICAgICAgIHNldFZhcihpbmRleCwgJnYsIHNpemVvZih2KSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL1NjcmlwdEMuY3BwIGIvbGlicy9ycy9TY3JpcHRDLmNwcAppbmRleCBhZDgyZmY0Li44MGU4ZWZjIDEwMDY0NAotLS0gYS9saWJzL3JzL1NjcmlwdEMuY3BwCisrKyBiL2xpYnMvcnMvU2NyaXB0Qy5jcHAKQEAgLTIyLDExICsyMiwxMSBAQAogI2luY2x1ZGUgIlNjcmlwdEMuaCIKIAogU2NyaXB0Qzo6U2NyaXB0QyhSZW5kZXJTY3JpcHQgKnJzLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb2RlVHh0LCBzaXplX3QgY29kZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29kZVR4dCwgc2l6ZV90IGNvZGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhY2hlZE5hbWUsIHNpemVfdCBjYWNoZWROYW1lTGVuZ3RoLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYWNoZURpciwgc2l6ZV90IGNhY2hlRGlyTGVuZ3RoKQogOiBTY3JpcHQoTlVMTCwgcnMpIHsKICAgICBtSUQgPSByc1NjcmlwdENDcmVhdGUocnMtPm1Db250ZXh0LCBjYWNoZWROYW1lLCBjYWNoZWROYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURpciwgY2FjaGVEaXJMZW5ndGgsIGNvZGVUeHQsIGNvZGVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURpciwgY2FjaGVEaXJMZW5ndGgsIChjb25zdCBjaGFyICopY29kZVR4dCwgY29kZUxlbmd0aCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvU2NyaXB0Qy5oIGIvbGlicy9ycy9TY3JpcHRDLmgKaW5kZXggZGNiYmUxMC4uYjY4ZjYxYyAxMDA2NDQKLS0tIGEvbGlicy9ycy9TY3JpcHRDLmgKKysrIGIvbGlicy9ycy9TY3JpcHRDLmgKQEAgLTI1LDcgKzI1LDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0IHsKIHByb3RlY3RlZDoKICAgICBTY3JpcHRDKFJlbmRlclNjcmlwdCAqcnMsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb2RlVHh0LCBzaXplX3QgY29kZUxlbmd0aCwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVUeHQsIHNpemVfdCBjb2RlTGVuZ3RoLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY2FjaGVkTmFtZSwgc2l6ZV90IGNhY2hlZE5hbWVMZW5ndGgsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjYWNoZURpciwgc2l6ZV90IGNhY2hlRGlyTGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy9ycy90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDE5N2U4NjIuLjYyN2ZmNzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvdGVzdHMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIyLDkgKzIyLDE1IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gIC4uIFwKLQlmcmFtZXdvcmtzL2Jhc2UvbGlicy9ycyBcCi0Jb3V0L3RhcmdldC9wcm9kdWN0L3N0aW5ncmF5L29iai9TSEFSRURfTElCUkFSSUVTL2xpYlJTX2ludGVybWVkaWF0ZXMJCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxUQVJHRVQsKQorbGlicnNfZ2VuZXJhdGVkX2hlYWRlcnMgOj0gXAorICAgICQoaW50ZXJtZWRpYXRlcykvcnNnQXBpU3RydWN0cy5oIFwKKyAgICAkKGludGVybWVkaWF0ZXMpL3JzZ0FwaUZ1bmNEZWNsLmgKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTIDo9ICQobGlicnNfZ2VuZXJhdGVkX2hlYWRlcnMpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9iYXNlL2xpYnMvcnMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChpbnRlcm1lZGlhdGVzKQorCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3Rlc3RzL1NjcmlwdENfbW9uby5jcHAgYi9saWJzL3JzL3Rlc3RzL1NjcmlwdENfbW9uby5jcHAKaW5kZXggN2Y4MzYxNi4uYTZjNjNhOCAxMDA2NDQKLS0tIGEvbGlicy9ycy90ZXN0cy9TY3JpcHRDX21vbm8uY3BwCisrKyBiL2xpYnMvcnMvdGVzdHMvU2NyaXB0Q19tb25vLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsNzQgKzE0LDEwNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiBETyBOT1QgTU9ESUZZIQorICogVGhlIHNvdXJjZSBSZW5kZXJzY3JpcHQgZmlsZTogbW9uby5ycworICovCisKKwogI2luY2x1ZGUgIlNjcmlwdENfbW9uby5oIgogCi1zdGF0aWMgY29uc3QgY2hhciBtb25vW10gPSBcCi0gICAgIlx4REVceEMwXHgxN1x4MEJceDAwXHgwMFx4MDBceDAwXHgxOFx4MDBceDAwXHgwMFx4RkNceDAzXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiBcCi0gICAgIlx4MTBceDAwXHgwMFx4MDBceDQyXHg0M1x4QzBceERFXHgyMVx4MENceDAwXHgwMFx4RkNceDAwXHgwMFx4MDBceDAxXHgxMFx4MDBceDAwIiBcCi0gICAgIlx4MTJceDAwXHgwMFx4MDBceDA3XHg4MVx4MjNceDkxXHg0MVx4QzhceDA0XHg0OVx4MDZceDEwXHgzMlx4MzlceDkyXHgwMVx4ODRceDBDIiBcCi0gICAgIlx4MjVceDA1XHgwOFx4MTlceDFFXHgwNFx4OEJceDYyXHg4MFx4MTRceDQ1XHgwMlx4NDJceDkyXHgwQlx4NDJceEE0XHgxMFx4MzJceDE0IiBcCi0gICAgIlx4MzhceDA4XHgxOFx4NDlceDBBXHgzMlx4NDRceDI0XHg0OFx4MEFceDkwXHgyMVx4MjNceEM0XHg1Mlx4ODBceDBDXHgxOVx4MjFceDcyIiBcCi0gICAgIlx4MjRceDA3XHhDOFx4NDhceDExXHg2Mlx4QThceEEwXHhBOFx4NDBceEM2XHhGMFx4MDFceDAwXHgwMFx4MDBceDQ5XHgxOFx4MDBceDAwIiBcCi0gICAgIlx4MDhceDAwXHgwMFx4MDBceDBCXHg4Q1x4MDBceDA0XHg0MVx4MTBceDA0XHgwOVx4MDFceDA0XHg0MVx4MTBceDA0XHg4OVx4RkZceEZGIiBcCi0gICAgIlx4RkZceEZGXHgxRlx4QzBceDYwXHg4MVx4RjBceEZGXHhGRlx4RkZceEZGXHgwM1x4MThceDAwXHgwMFx4MDBceDg5XHgyMFx4MDBceDAwIiBcCi0gICAgIlx4MTNceDAwXHgwMFx4MDBceDMyXHgyMlx4NDhceDA5XHgyMFx4NjRceDg1XHgwNFx4OTNceDIyXHhBNFx4ODRceDA0XHg5M1x4MjJceEUzIiBcCi0gICAgIlx4ODRceEExXHg5MFx4MTRceDEyXHg0Q1x4OEFceDhDXHgwQlx4ODRceEE0XHg0Q1x4MTBceDQ4XHgyM1x4MDBceDczXHgwNFx4QzhceDMwIiBcCi0gICAgIlx4MDJceDExXHg5MFx4MjhceDAzXHgxOFx4ODNceEM4XHgwQ1x4QzBceDMwXHgwMlx4NjFceDE0XHhFMVx4MDhceDQyXHhDM1x4MDhceDgzIiBcCi0gICAgIlx4NTFceDA2XHhBM1x4MTRceEFEXHgyMlx4MDhceDQ1XHg2RFx4MjBceDYwXHg4RVx4MDBceDBDXHg4Nlx4MTFceDA2XHgwOFx4MDBceDAwIiBcCi0gICAgIlx4MTNceEIwXHg3MFx4OTBceDg3XHg3Nlx4QjBceDg3XHgzQlx4NjhceDAzXHg3N1x4NzhceDA3XHg3N1x4MjhceDg3XHgzNlx4NjBceDg3IiBcCi0gICAgIlx4NzRceDcwXHg4N1x4N0FceEMwXHg4N1x4MzZceDM4XHgwN1x4NzdceEE4XHg4N1x4NzJceDA4XHgwN1x4NzFceDQ4XHg4N1x4MERceEYyIiBcCi0gICAgIlx4NTBceDBFXHg2RFx4MDBceDBGXHg3QVx4MzBceDA3XHg3Mlx4QTBceDA3XHg3M1x4MjBceDA3XHg3QVx4MzBceDA3XHg3Mlx4RDBceDA2IiBcCi0gICAgIlx4RTlceDEwXHgwN1x4N0FceDgwXHgwN1x4N0FceDgwXHgwN1x4NkRceDkwXHgwRVx4NzhceEEwXHgwN1x4NzhceEEwXHgwN1x4NzhceEQwIiBcCi0gICAgIlx4MDZceEU5XHgxMFx4MDdceDc2XHhBMFx4MDdceDcxXHg2MFx4MDdceDdBXHgxMFx4MDdceDc2XHhEMFx4MDZceEU5XHgzMFx4MDdceDcyIiBcCi0gICAgIlx4QTBceDA3XHg3M1x4MjBceDA3XHg3QVx4MzBceDA3XHg3Mlx4RDBceDA2XHhFOVx4NjBceDA3XHg3NFx4QTBceDA3XHg3Nlx4NDBceDA3IiBcCi0gICAgIlx4N0FceDYwXHgwN1x4NzRceEQwXHgwNlx4RTZceDMwXHgwN1x4NzJceEEwXHgwN1x4NzNceDIwXHgwN1x4N0FceDMwXHgwN1x4NzJceEQwIiBcCi0gICAgIlx4MDZceEU2XHg2MFx4MDdceDc0XHhBMFx4MDdceDc2XHg0MFx4MDdceDdBXHg2MFx4MDdceDc0XHhEMFx4MDZceEY2XHg2MFx4MDdceDc0IiBcCi0gICAgIlx4QTBceDA3XHg3Nlx4NDBceDA3XHg3QVx4NjBceDA3XHg3NFx4RDBceDA2XHhGNlx4MTBceDA3XHg3Mlx4ODBceDA3XHg3QVx4NjBceDA3IiBcCi0gICAgIlx4NzRceEEwXHgwN1x4NzFceDIwXHgwN1x4NzhceEQwXHgwNlx4RTFceDAwXHgwN1x4N0FceDAwXHgwN1x4N0FceDYwXHgwN1x4NzRceEQwIiBcCi0gICAgIlx4MDZceEVFXHgzMFx4MDdceDcyXHhEMFx4MDZceEIzXHg2MFx4MDdceDc0XHgzMFx4NDRceDI5XHgwMFx4MDBceDA4XHgwMFx4MDBceDAwIiBcCi0gICAgIlx4ODBceDIxXHg0QVx4MDJceDA0XHgwMFx4MDBceDAwXHgwMFx4MDBceDBDXHg1MVx4MThceDIwXHgwMFx4MDBceDAwXHgwMFx4MDBceDYwIiBcCi0gICAgIlx4ODhceEUyXHgwMFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4NzlceDE4XHgwMFx4NDVceDAwXHgwMFx4MDBceDQzXHg4OFx4MjdceDc4IiBcCi0gICAgIlx4ODRceDA1XHg4N1x4M0RceDk0XHg4M1x4M0NceENDXHg0M1x4M0FceEJDXHg4M1x4M0JceDJDXHgwOFx4RTJceDYwXHgwOFx4RjFceDEwIiBcCi0gICAgIlx4NEZceEIxXHgyMFx4NTJceDg3XHg3MFx4QjBceDg3XHg3MFx4RjhceDA1XHg3OFx4MDhceDg3XHg3MVx4NThceDg3XHg3MFx4MzhceDg3IiBcCi0gICAgIlx4NzJceEY4XHgwNVx4NzdceDA4XHg4N1x4NzZceDI4XHg4N1x4MDVceDYzXHgzMFx4MEVceEVGXHhEMFx4MEVceDZFXHg1MFx4MEVceEY4IiBcCi0gICAgIlx4MTBceDBFXHhFRFx4MDBceDBGXHhFQ1x4NTBceDBFXHg2RVx4MTBceDBFXHhFRVx4NDBceDBFXHhGMlx4RjBceDBFXHhFOVx4NDBceDBFIiBcCi0gICAgIlx4NkVceDIwXHgwRlx4RjNceEUwXHgwNlx4RThceDUwXHgwRVx4RUNceEMwXHgwRVx4RUZceDMwXHgwRVx4RUZceEQwXHgwRVx4RjBceDUwIiBcCi0gICAgIlx4MEZceEY0XHg1MFx4MEVceDQzXHg4NFx4RTdceDU4XHg0MFx4QzhceEMzXHgzQlx4QkNceDAzXHgzRFx4MENceDExXHg5RVx4NjRceDQxIiBcCi0gICAgIlx4MzBceDA3XHg0M1x4ODhceDY3XHg3OVx4OThceDA1XHhDRlx4M0JceEI0XHg4M1x4M0JceEE0XHgwM1x4M0NceEJDXHgwM1x4M0RceDk0IiBcCi0gICAgIlx4ODNceDNCXHhEMFx4MDNceDE4XHg4Q1x4MDNceDNBXHg4NFx4ODNceDNDXHgwQ1x4MjFceDlFXHgwNlx4MDBceDE2XHg0NFx4QjNceDkwIiBcCi0gICAgIlx4MEVceEVEXHgwMFx4MEZceEVDXHg1MFx4MEVceDYwXHgzMFx4MEFceDZGXHgzMFx4MEFceDZCXHhCMFx4MDZceDYwXHg0MFx4MEJceEEyIiBcCi0gICAgIlx4MTBceDBBXHhBMVx4MzBceEUyXHgxOFx4MDNceDc4XHg5MFx4ODdceDcwXHgzOFx4ODdceDc2XHgwOFx4ODdceDI5XHgwMlx4MzBceDhDIiBcCi0gICAgIlx4QjhceEM2XHg0MFx4MUVceEU2XHhFMVx4MTdceENBXHgwMVx4MUZceEUwXHhFMVx4MURceEU0XHg4MVx4MUVceDdFXHhDMVx4MUNceERFIiBcCi0gICAgIlx4NDFceDFFXHhDQVx4MjFceDFDXHhDNlx4MDFceDFEXHg3RVx4QzFceDFEXHhDMlx4QTFceDFEXHhDQVx4NjFceDRBXHg2MFx4OENceDkwIiBcCi0gICAgIlx4QzZceDQwXHgxRVx4RTZceEUxXHgxN1x4Q0FceDAxXHgxRlx4RTBceEUxXHgxRFx4RTRceDgxXHgxRVx4N0VceEMxXHgxQ1x4REVceDQxIiBcCi0gICAgIlx4MUVceENBXHgyMVx4MUNceEM2XHgwMVx4MURceEE2XHgwNFx4MDhceDAwXHgwMFx4NjFceDIwXHgwMFx4MDBceDI0XHgwMFx4MDBceDAwIiBcCi0gICAgIlx4MTNceDA0XHg0MVx4MkNceDEwXHgwMFx4MDBceDAwXHgwQ1x4MDBceDAwXHgwMFx4MDRceDhCXHhBMFx4MDRceDQ2XHgwMFx4RThceENDIiBcCi0gICAgIlx4MDBceDkwXHg5QVx4MDFceDk4XHg2M1x4NzBceDFBXHg4Nlx4Q0NceDE4XHg0MVx4NkRceEZBXHhCMlx4RUZceDhEXHgxMVx4ODhceDZEIiBcCi0gICAgIlx4Q0NceEM2XHhERlx4MThceEMxXHg0OVx4OTdceDcyXHhGQVx4NTFceDlDXHg2M1x4NDBceDBFXHg2M1x4MDRceDAwXHgwMFx4MDBceDAwIiBcCi0gICAgIlx4NDRceDhDXHgxMVx4MDNceDQyXHgwOFx4ODJceDY4XHg5MFx4NDFceDRBXHg5RVx4MTFceDgzXHg0Mlx4MDhceDg0XHg2OVx4OTlceDYzIiBcCi0gICAgIlx4NTBceDI4XHg2NFx4OTBceEExXHg1Mlx4QTBceDExXHgwM1x4NDJceDA4XHgwNlx4NkJceDMwXHhBMlx4QjhceDA2XHgwMFx4QzNceDgxIiBcCi0gICAgIlx4MDBceDAwXHgwMFx4MDBceDAzXHgwMFx4MDBceDAwXHg0Nlx4NDBceDU0XHgzRlx4RDJceDU4XHg0MVx4NTFceEZEXHgwRVx4MzVceDAxIiBcCi0gICAgIlx4MDFceDMxXHgwMFx4MDBceDAzXHgwMFx4MDBceDAwXHg1Qlx4MDZceDIwXHg1MFx4QjZceDBDXHg0N1x4QTBceDAwXHgwMFx4MDBceDAwIiBcCi0gICAgIlx4MDBceDAwXHgwMFx4MDBceDc5XHgxOFx4MDBceDAwXHgwQlx4MDBceDAwXHgwMFx4MzNceDA4XHg4MFx4MUNceEM0XHhFMVx4MUNceDY2IiBcCi0gICAgIlx4MTRceDAxXHgzRFx4ODhceDQzXHgzOFx4ODRceEMzXHg4Q1x4NDJceDgwXHgwN1x4NzlceDc4XHgwN1x4NzNceDk4XHhCMVx4MENceEU2IiBcCi0gICAgIlx4MDBceDBGXHhFMVx4MzBceDBFXHhFM1x4NTBceDBGXHhGMlx4MTBceDBFXHhFM1x4OTBceDBGXHgwMFx4MDBceDcxXHgyMFx4MDBceDAwIiBcCi0gICAgIlx4MEVceDAwXHgwMFx4MDBceDA2XHg0MFx4NDRceDhFXHgzM1x4NTlceDQwXHgxNFx4NDlceDZFXHhGM1x4MDBceDgyXHhDMlx4MzlceDhCIiBcCi0gICAgIlx4MTNceEYxXHgzQ1x4Q0ZceDlCXHg0MFx4RjNceENGXHhGN1x4RTBceDRDXHg1RFx4NzVceEZGXHgwNVx4RkJceERCXHg4MFx4RjZceENGIiBcCi0gICAgIlx4RjVceDFFXHg0OVx4MjlceDIwXHgyOFx4OUNceEIzXHgzOFx4NTFceEVCXHhGMFx4M0NceENGXHg3N1x4RDVceEZEXHgxN1x4MDBceDAwIiBcCi0gICAgIlx4MDBceDAwXHgwMFx4MDAiOwotCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfX3R4dFtdID0geworICAgIDB4ZGUsMHhjMCwweDE3LDB4MGIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4ZDAsMHgwNCwweDAwLDB4MDAsCisgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4NDIsMHg0MywweGMwLDB4ZGUsMHgyMSwweDBjLDB4MDAsMHgwMCwKKyAgICAweDMxLDB4MDEsMHgwMCwweDAwLDB4MDEsMHgxMCwweDAwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwweDA3LDB4ODEsMHgyMywweDkxLAorICAgIDB4NDEsMHhjOCwweDA0LDB4NDksMHgwNiwweDEwLDB4MzIsMHgzOSwweDkyLDB4MDEsMHg4NCwweDBjLDB4MjUsMHgwNSwweDA4LDB4MTksCisgICAgMHgxZSwweDA0LDB4OGIsMHg2MiwweDgwLDB4MTQsMHg0NSwweDAyLDB4NDIsMHg5MiwweDBiLDB4NDIsMHhhNCwweDEwLDB4MzIsMHgxNCwKKyAgICAweDM4LDB4MDgsMHgxOCwweDQ5LDB4MGEsMHgzMiwweDQ0LDB4MjQsMHg0OCwweDBhLDB4OTAsMHgyMSwweDIzLDB4YzQsMHg1MiwweDgwLAorICAgIDB4MGMsMHgxOSwweDIxLDB4NzIsMHgyNCwweDA3LDB4YzgsMHg0OCwweDExLDB4NjIsMHhhOCwweGEwLDB4YTgsMHg0MCwweGM2LDB4ZjAsCisgICAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDQ5LDB4MTgsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwYiwweDhjLDB4MDAsMHgwNCwKKyAgICAweDQxLDB4MTAsMHgwNCwweDA5LDB4MDEsMHgwNCwweDQxLDB4MTAsMHgwNCwweDg5LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgxZiwweGMwLAorICAgIDB4NjAsMHg4MSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMywweDE4LDB4MDAsMHgwMCwweDAwLDB4ODksMHgyMCwweDAwLDB4MDAsCisgICAgMHgxNCwweDAwLDB4MDAsMHgwMCwweDMyLDB4MjIsMHg0OCwweDA5LDB4MjAsMHg2NCwweDg1LDB4MDQsMHg5MywweDIyLDB4YTQsMHg4NCwKKyAgICAweDA0LDB4OTMsMHgyMiwweGUzLDB4ODQsMHhhMSwweDkwLDB4MTQsMHgxMiwweDRjLDB4OGEsMHg4YywweDBiLDB4ODQsMHhhNCwweDRjLAorICAgIDB4MTAsMHg1NCwweDczLDB4MDQsMHg2MCwweDQwLDB4NjAsMHgwNiwweDgwLDB4YzQsMHgxYywweDAxLDB4NDIsMHg2NCwweDA0LDB4NjAsCisgICAgMHgxOCwweDgxLDB4MjAsMHhlOCwweDk0LDB4YzEsMHgyMCwweDQ0LDB4NjksMHgxOCwweDgxLDB4MTAsMHg4YSwweGIwLDB4MGUsMHhiMSwKKyAgICAweDYxLDB4ODQsMHg0MSwweDI4LDB4ODMsMHg3MCwweDhlLDB4NWUsMHgxMSwweDhlLDB4YTMsMHgzOCwweDEwLDB4MzAsMHg4YywweDMwLAorICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywweGIwLDB4NzAsMHg5MCwweDg3LDB4NzYsMHhiMCwweDg3LDB4M2IsMHg2OCwweDAzLDB4NzcsCisgICAgMHg3OCwweDA3LDB4NzcsMHgyOCwweDg3LDB4MzYsMHg2MCwweDg3LDB4NzQsMHg3MCwweDg3LDB4N2EsMHhjMCwweDg3LDB4MzYsMHgzOCwKKyAgICAweDA3LDB4NzcsMHhhOCwweDg3LDB4NzIsMHgwOCwweDA3LDB4NzEsMHg0OCwweDg3LDB4MGQsMHhmMiwweDUwLDB4MGUsMHg2ZCwweDAwLAorICAgIDB4MGYsMHg3YSwweDMwLDB4MDcsMHg3MiwweGEwLDB4MDcsMHg3MywweDIwLDB4MDcsMHg3YSwweDMwLDB4MDcsMHg3MiwweGQwLDB4MDYsCisgICAgMHhlOSwweDEwLDB4MDcsMHg3YSwweDgwLDB4MDcsMHg3YSwweDgwLDB4MDcsMHg2ZCwweDkwLDB4MGUsMHg3OCwweGEwLDB4MDcsMHg3OCwKKyAgICAweGEwLDB4MDcsMHg3OCwweGQwLDB4MDYsMHhlOSwweDEwLDB4MDcsMHg3NiwweGEwLDB4MDcsMHg3MSwweDYwLDB4MDcsMHg3YSwweDEwLAorICAgIDB4MDcsMHg3NiwweGQwLDB4MDYsMHhlOSwweDMwLDB4MDcsMHg3MiwweGEwLDB4MDcsMHg3MywweDIwLDB4MDcsMHg3YSwweDMwLDB4MDcsCisgICAgMHg3MiwweGQwLDB4MDYsMHhlOSwweDYwLDB4MDcsMHg3NCwweGEwLDB4MDcsMHg3NiwweDQwLDB4MDcsMHg3YSwweDYwLDB4MDcsMHg3NCwKKyAgICAweGQwLDB4MDYsMHhlNiwweDMwLDB4MDcsMHg3MiwweGEwLDB4MDcsMHg3MywweDIwLDB4MDcsMHg3YSwweDMwLDB4MDcsMHg3MiwweGQwLAorICAgIDB4MDYsMHhlNiwweDYwLDB4MDcsMHg3NCwweGEwLDB4MDcsMHg3NiwweDQwLDB4MDcsMHg3YSwweDYwLDB4MDcsMHg3NCwweGQwLDB4MDYsCisgICAgMHhmNiwweDYwLDB4MDcsMHg3NCwweGEwLDB4MDcsMHg3NiwweDQwLDB4MDcsMHg3YSwweDYwLDB4MDcsMHg3NCwweGQwLDB4MDYsMHhmNiwKKyAgICAweDEwLDB4MDcsMHg3MiwweDgwLDB4MDcsMHg3YSwweDYwLDB4MDcsMHg3NCwweGEwLDB4MDcsMHg3MSwweDIwLDB4MDcsMHg3OCwweGQwLAorICAgIDB4MDYsMHhlMSwweDAwLDB4MDcsMHg3YSwweDAwLDB4MDcsMHg3YSwweDYwLDB4MDcsMHg3NCwweGQwLDB4MDYsMHhlZSwweDMwLDB4MDcsCisgICAgMHg3MiwweGQwLDB4MDYsMHhiMywweDYwLDB4MDcsMHg3NCwweGEwLDB4ZjMsMHg0MCwweDg2LDB4MDQsMHgzMiwweDQyLDB4NDQsMHgwNCwKKyAgICAweDYwLDB4MjAsMHgzMCwweDc3LDB4ODEsMHg1OSwweDBhLDB4MzQsMHg0NCwweDUxLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLAorICAgIDB4ODAsMHgyMSwweDRhLDB4MDMsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDUxLDB4MjAsMHgyMCwweDAwLDB4MDAsCisgICAgMHgwMCwweDAwLDB4MDAsMHg2MCwweDg4LDB4MjIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDU5LDB4MjAsMHgwMCwKKyAgICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MzIsMHgxZSwweDk4LDB4MTAsMHgxOSwweDExLDB4NGMsMHg5MCwweDhjLDB4MDksMHgyNiwweDQ3LAorICAgIDB4YzYsMHgwNCwweDQzLDB4MDIsMHg4NSwweDUwLDB4MDYsMHg0NCwweDRhLDB4ODAsMHhjNCwweDE4LDB4ODEsMHhjZSwweDlhLDB4NzMsCisgICAgMHhmZSwweDAxLDB4MDAsMHgwMCwweDc5LDB4MTgsMHgwMCwweDAwLDB4NjksMHgwMCwweDAwLDB4MDAsMHg0MywweDg4LDB4MjksMHg5OCwKKyAgICAweDg0LDB4MDUsMHg4NywweDNkLDB4OTQsMHg4MywweDNjLDB4Y2MsMHg0MywweDNhLDB4YmMsMHg4MywweDNiLDB4MmMsMHgwOCwweGUyLAorICAgIDB4NjAsMHgwOCwweDMxLDB4MTEsMHg1MywweGIxLDB4MjAsMHg1MiwweDg3LDB4NzAsMHhiMCwweDg3LDB4NzAsMHhmOCwweDA1LDB4NzgsCisgICAgMHgwOCwweDg3LDB4NzEsMHg1OCwweDg3LDB4NzAsMHgzOCwweDg3LDB4NzIsMHhmOCwweDA1LDB4NzcsMHgwOCwweDg3LDB4NzYsMHgyOCwKKyAgICAweDg3LDB4MDUsMHg2MywweDMwLDB4MGUsMHhlZiwweGQwLDB4MGUsMHg2ZSwweDUwLDB4MGUsMHhmOCwweDEwLDB4MGUsMHhlZCwweDAwLAorICAgIDB4MGYsMHhlYywweDUwLDB4MGUsMHg2ZSwweDEwLDB4MGUsMHhlZSwweDQwLDB4MGUsMHhmMiwweGYwLDB4MGUsMHhlOSwweDQwLDB4MGUsCisgICAgMHg2ZSwweDIwLDB4MGYsMHhmMywweGUwLDB4MDYsMHhlOCwweDUwLDB4MGUsMHhlYywweGMwLDB4MGUsMHhlZiwweDMwLDB4MGUsMHhlZiwKKyAgICAweGQwLDB4MGUsMHhmMCwweDUwLDB4MGYsMHhmNCwweDUwLDB4MGUsMHg0MywweDA0LDB4MDAsMHgxOSwweDQyLDB4NGMsMHhjOCwweDk0LAorICAgIDB4MmMsMHgyMCwweGNlLDB4MjEsMHgxNSwweGRjLDB4ODEsMHgxZSwweDE2LDB4MDQsMHg3NSwweDMwLDB4ODQsMHg5OCwweDk2LDB4NDksCisgICAgMHg1OCwweDYwLDB4OGMsMHg4MywweDI5LDB4YjAsMHhjMywweDNiLDB4ODQsMHgwMywweDNkLDB4MGMsMHgyMSwweGE2LDB4NjYsMHg3MiwKKyAgICAweDE2LDB4MTQsMHhlNywweDIwLDB4MGEsMHhlZiwweGYwLDB4MGUsMHhlYywweGIwLDB4NDAsMHg4OCwweDgzLDB4MzgsMHgxOCwweDIyLAorICAgIDB4NGMsMHhkMCwweDAyLDB4NDIsMHgxZSwweGRlLDB4ZTEsMHgxZCwweGU4LDB4NjEsMHg4OCwweDMwLDB4NDksMHgwYiwweDgyLDB4MzksCisgICAgMHgxOCwweDQyLDB4NGMsMHhkNCwweDU0LDB4MmQsMHg3OCwweGRlLDB4YTEsMHgxZCwweGRjLDB4MjEsMHgxZCwweGUwLDB4ZTEsMHgxZCwKKyAgICAweGU4LDB4YTEsMHgxYywweGRjLDB4ODEsMHgxZSwweGMwLDB4NjAsMHgxYywweGQwLDB4MjEsMHgxYywweGU0LDB4NjEsMHgwOCwweDMxLAorICAgIDB4NTksMHgwNiwweGIwLDB4MjAsMHg5YSwweDg1LDB4NzQsMHg2OCwweDA3LDB4NzgsMHg2MCwweDg3LDB4NzIsMHgwMCwweDgzLDB4NTEsCisgICAgMHg3OCwweDgzLDB4NTEsMHg1OCwweDgzLDB4MzUsMHgwMCwweDAzLDB4NWEsMHgxMCwweDg1LDB4NTAsMHgwOCwweDg1LDB4MTEsMHhjNywKKyAgICAweDE4LDB4YzAsMHg4MywweDNjLDB4ODQsMHhjMywweDM5LDB4YjQsMHg0MywweDM4LDB4NGMsMHgxMSwweDgwLDB4NjEsMHhjNCwweDM0LAorICAgIDB4MDYsMHhlZiwweDAwLDB4MGYsMHhmNCwweDkwLDB4MGUsMHhlZCwweDkwLDB4MGUsMHhmYSwweDEwLDB4MGUsMHhmNCwweDkwLDB4MGUsCisgICAgMHhlZiwweGUwLDB4MGUsMHhiZiwweGMwLDB4MGUsMHhlNSwweDYwLDB4MGYsMHhlNSwweGMwLDB4MGUsMHg1MywweDAyLDB4NjMsMHg4NCwKKyAgICAweDMzLDB4MDYsMHhmMiwweDMwLDB4MGYsMHhiZiwweDUwLDB4MGUsMHhmOCwweDAwLDB4MGYsMHhlZiwweDIwLDB4MGYsMHhmNCwweGYwLAorICAgIDB4MGIsMHhmNiwweDEwLDB4MGUsMHhmMiwweDMwLDB4NjUsMHgzOCwweDE0LDB4NjYsMHgwNCwweDM0LDB4MDYsMHhmMiwweDMwLDB4MGYsCisgICAgMHhiZiwweGYwLDB4MGUsMHhlMiwweGEwLDB4MGUsMHhlNSwweDMwLDB4MGUsMHhmNCwweGYwLDB4MGIsMHhmMywweGMwLDB4MGUsMHhlZiwKKyAgICAweDQwLDB4MGYsMHhmMywweDMwLDB4MDUsMHgxOCwweDcxLDB4OGQsMHg4MSwweDNjLDB4Y2MsMHhjMywweDJmLDB4OTQsMHgwMywweDNlLAorICAgIDB4YzAsMHhjMywweDNiLDB4YzgsMHgwMywweDNkLDB4ZmMsMHg4MiwweDM5LDB4YmMsMHg4MywweDNjLDB4OTQsMHg0MywweDM4LDB4OGMsCisgICAgMHgwMywweDNhLDB4ZmMsMHg4MiwweDNiLDB4ODQsMHg0MywweDNiLDB4OTQsMHhjMywweDk0LDB4ZTAsMHgxOSwweDIxLDB4OGQsMHg4MSwKKyAgICAweDNjLDB4Y2MsMHhjMywweDJmLDB4OTQsMHgwMywweDNlLDB4YzAsMHhjMywweDNiLDB4YzgsMHgwMywweDNkLDB4ZmMsMHg4MiwweDM5LAorICAgIDB4YmMsMHg4MywweDNjLDB4OTQsMHg0MywweDM4LDB4OGMsMHgwMywweDNhLDB4NGMsMHgwOSwweDIyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgMHg3OSwweDE4LDB4MDAsMHgwMCwweDBiLDB4MDAsMHgwMCwweDAwLDB4MzMsMHgwOCwweDgwLDB4MWMsMHhjNCwweGUxLDB4MWMsMHg2NiwKKyAgICAweDE0LDB4MDEsMHgzZCwweDg4LDB4NDMsMHgzOCwweDg0LDB4YzMsMHg4YywweDQyLDB4ODAsMHgwNywweDc5LDB4NzgsMHgwNywweDczLAorICAgIDB4OTgsMHhiMSwweDBjLDB4ZTYsMHgwMCwweDBmLDB4ZTEsMHgzMCwweDBlLDB4ZTMsMHg1MCwweDBmLDB4ZjIsMHgxMCwweDBlLDB4ZTMsCisgICAgMHg5MCwweDBmLDB4MDAsMHgwMCwweDcxLDB4MjAsMHgwMCwweDAwLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwNiwweDQwLDB4MTgsMHg2MiwKKyAgICAweDMzLDB4OTksMHg0MCwweDYxLDB4NmMsMHg4ZSwweGIzLDB4ZDgsMHgwMCwweDExLDB4MzksMHhjZSwweDY0LDB4MDQsMHg1MSwweDI0LAorICAgIDB4YjksMHhjZCwweDAzLDB4MDgsMHgwYSwweGU3LDB4MmMsMHg0ZSwweGM0LDB4ZjMsMHgzYywweDZmLDB4MDUsMHhjZCwweDNmLDB4ZGYsCisgICAgMHg4MywweDMzLDB4NzUsMHhkNSwweGZkLDB4MTcsMHhlYywweDZmLDB4MDEsMHg4NiwweGYwLDB4MmQsMHgwZSwweDMwLDB4OTksMHg4MSwKKyAgICAweGY2LDB4Y2YsMHhmNSwweDFlLDB4NDksMHgyOSwweDIwLDB4MjgsMHg5YywweGIzLDB4MzgsMHg1MSwweGViLDB4ZjAsMHgzYywweGNmLAorICAgIDB4NzcsMHhkNSwweGZkLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDYxLDB4MjAsMHgwMCwweDAwLDB4MjEsMHgwMCwweDAwLDB4MDAsCisgICAgMHgxMywweDA0LDB4NDEsMHgyYywweDEwLDB4MDAsMHgwMCwweDAwLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwNCwweDQ2LDB4MDAsMHg2OCwKKyAgICAweGNkLDB4MDAsMHg5MCwweDliLDB4MDEsMHgxOCwweDZiLDB4MzgsMHhlOSwweDUyLDB4NGUsMHgzZiwweGIxLDB4OGQsMHhkOSwweGY4LAorICAgIDB4YWIsMHg0ZCwweDVmLDB4ZjYsMHgzZCwweGEyLDB4NjMsMHgwZCwweDQwLDB4MjAsMHg4YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisgICAgMHhiNCwweDhjLDB4MTEsMHgwMywweDQyLDB4MDgsMHg4OCwweDY5LDB4OTAsMHg4MSwweDcyLDB4YTIsMHgxMSwweDgzLDB4NDIsMHgwOCwKKyAgICAweDhhLDB4MGEsMHg5YSwweDYzLDB4NzgsMHhhYywweDY2LDB4OTAsMHhlMSwweDdhLDB4YTQsMHgxMSwweDAzLDB4NDIsMHgwOCwweDBjLAorICAgIDB4NmMsMHgzMCwweDgyLDB4YzksMHgwNiwweDAwLDB4YzMsMHg4MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCisgICAgMHhiNiwweDQwLDB4NTQsMHgzZiwweGQyLDB4MTgsMHg0MywweDUxLDB4ZmQsMHgwZSwweDM1LDB4MDEsMHgwMSwweDMxLDB4MDAsMHgwMCwKKyAgICAweDAzLDB4MDAsMHgwMCwweDAwLDB4NWIsMHgwNiwweDIwLDB4OTgsMHhiNiwweDBjLDB4NDcsMHgzMCwweDAxLDB4MDAsMHgwMCwweDAwLAorICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKK307CiAKIFNjcmlwdENfbW9ubzo6U2NyaXB0Q19tb25vKFJlbmRlclNjcmlwdCAqcnMsIGNvbnN0IGNoYXIgKmNhY2hlRGlyLCBzaXplX3QgY2FjaGVEaXJMZW5ndGgpIDoKLSAgICBTY3JpcHRDKHJzLCBtb25vLCBzaXplb2YobW9ubykgLSAxLCAibW9ubyIsIDQsIGNhY2hlRGlyLCBjYWNoZURpckxlbmd0aCkgewotCi0gICAgcHJpbnRmKCJzaXplb2YgdGV4dCAlaSIsIHNpemVvZihtb25vKSk7Ci0KLQotCisgICAgICAgIFNjcmlwdEMocnMsIF9fdHh0LCBzaXplb2YoX190eHQpLCAibW9uby5ycyIsIDQsIGNhY2hlRGlyLCBjYWNoZURpckxlbmd0aCkgewogfQogCi12b2lkIFNjcmlwdENfbW9ubzo6Zm9yRWFjaF9yb290KGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgY29uc3QgQWxsb2NhdGlvbiAqYW91dCkgeworU2NyaXB0Q19tb25vOjp+U2NyaXB0Q19tb25vKCkgeworfQorCit2b2lkIFNjcmlwdENfbW9ubzo6Zm9yRWFjaF9yb290KGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgY29uc3QgQWxsb2NhdGlvbiAqYW91dCkgY29uc3QgewogICAgIGZvckVhY2goMCwgYWluLCBhb3V0LCBOVUxMLCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy90ZXN0cy9TY3JpcHRDX21vbm8uaCBiL2xpYnMvcnMvdGVzdHMvU2NyaXB0Q19tb25vLmgKaW5kZXggN2U0ZjYwMS4uNjljNDFhYyAxMDA2NDQKLS0tIGEvbGlicy9ycy90ZXN0cy9TY3JpcHRDX21vbm8uaAorKysgYi9saWJzL3JzL3Rlc3RzL1NjcmlwdENfbW9uby5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsNDIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gRE8gTk9UIE1PRElGWSEKKyAqIFRoZSBzb3VyY2UgUmVuZGVyc2NyaXB0IGZpbGU6IG1vbm8ucnMKKyAqLworCisKICNpbmNsdWRlICJTY3JpcHRDLmgiCiAKIGNsYXNzIFNjcmlwdENfbW9ubyA6IHByb3RlY3RlZCBTY3JpcHRDIHsKK3ByaXZhdGU6CisgICAgaW50MzJfdCBfX2dJbnQ7CisgICAgYm9vbCBfX2dCb29sOwogcHVibGljOgogICAgIFNjcmlwdENfbW9ubyhSZW5kZXJTY3JpcHQgKnJzLCBjb25zdCBjaGFyICpjYWNoZURpciwgc2l6ZV90IGNhY2hlRGlyTGVuZ3RoKTsKLQotICAgIHZvaWQgZm9yRWFjaF9yb290KGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgY29uc3QgQWxsb2NhdGlvbiAqYW91dCk7Ci0KKyAgICB2aXJ0dWFsIH5TY3JpcHRDX21vbm8oKTsKKyAgICAKKyAgICB2b2lkIHNldF9nSW50KGludDMyX3QgdikgeworICAgICAgICBzZXRWYXIoMCwgdik7CisgICAgICAgIF9fZ0ludCA9IHY7CisgICAgfQorICAgIGludDMyX3QgZ2V0X2dJbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2dJbnQ7CisgICAgfQorICAgIAorICAgIGZsb2F0IGdldF9jRmxvYXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAxLjJmOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldF9nQm9vbChib29sIHYpIHsKKyAgICAgICAgc2V0VmFyKDIsIHYpOworICAgICAgICBfX2dCb29sID0gdjsKKyAgICB9CisgICAgYm9vbCBnZXRfZ0Jvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfX2dCb29sOworICAgIH0KKyAgICAKKyAgICB2b2lkIGZvckVhY2hfcm9vdChjb25zdCBBbGxvY2F0aW9uICphaW4sIGNvbnN0IEFsbG9jYXRpb24gKmFvdXQpIGNvbnN0OwogfTsKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIuamF2YQppbmRleCAxMzlmZjAxLi5kOTIxODBkIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNDU1LDYgKzQ1NiwyMiBAQAogICogICAgIDx0ZD5TdWNjZXNzZnVsIGludm9rZSBvZiB0aGlzIG1ldGhvZCBpbiBhIHZhbGlkIHN0YXRlIHRyYW5zZmVycyB0aGUKICAqICAgICAgICAgb2JqZWN0IHRvIHRoZSA8ZW0+U3RvcHBlZDwvZW0+IHN0YXRlLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGluIGFuCiAgKiAgICAgICAgIGludmFsaWQgc3RhdGUgdHJhbnNmZXJzIHRoZSBvYmplY3QgdG8gdGhlIDxlbT5FcnJvcjwvZW0+IHN0YXRlLjwvcD48L3RkPjwvdHI+CisgKiA8dHI+PHRkPmdldFRyYWNrSW5mbyA8L3A+PC90ZD4KKyAqICAgICA8dGQ+e1ByZXBhcmVkLCBTdGFydGVkLCBTdG9wcGVkLCBQYXVzZWQsIFBsYXliYWNrQ29tcGxldGVkfTwvcD48L3RkPgorICogICAgIDx0ZD57SWRsZSwgSW5pdGlhbGl6ZWQsIEVycm9yfTwvcD48L3RkPgorICogICAgIDx0ZD5TdWNjZXNzZnVsIGludm9rZSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlLjwvcD48L3RkPjwvdHI+CisgKiA8dHI+PHRkPmFkZEV4dGVybmFsU291cmNlIDwvcD48L3RkPgorICogICAgIDx0ZD57UHJlcGFyZWQsIFN0YXJ0ZWQsIFN0b3BwZWQsIFBhdXNlZCwgUGxheWJhY2tDb21wbGV0ZWR9PC9wPjwvdGQ+CisgKiAgICAgPHRkPntJZGxlLCBJbml0aWFsaXplZCwgRXJyb3J9PC9wPjwvdGQ+CisgKiAgICAgPHRkPlN1Y2Nlc3NmdWwgaW52b2tlIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUuPC9wPjwvdGQ+PC90cj4KKyAqIDx0cj48dGQ+c2VsZWN0VHJhY2sgPC9wPjwvdGQ+CisgKiAgICAgPHRkPntQcmVwYXJlZCwgU3RhcnRlZCwgU3RvcHBlZCwgUGF1c2VkLCBQbGF5YmFja0NvbXBsZXRlZH08L3A+PC90ZD4KKyAqICAgICA8dGQ+e0lkbGUsIEluaXRpYWxpemVkLCBFcnJvcn08L3A+PC90ZD4KKyAqICAgICA8dGQ+U3VjY2Vzc2Z1bCBpbnZva2Ugb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZS48L3A+PC90ZD48L3RyPgorICogPHRyPjx0ZD5kaXNhYmxlVHJhY2sgPC9wPjwvdGQ+CisgKiAgICAgPHRkPntQcmVwYXJlZCwgU3RhcnRlZCwgU3RvcHBlZCwgUGF1c2VkLCBQbGF5YmFja0NvbXBsZXRlZH08L3A+PC90ZD4KKyAqICAgICA8dGQ+e0lkbGUsIEluaXRpYWxpemVkLCBFcnJvcn08L3A+PC90ZD4KKyAqICAgICA8dGQ+U3VjY2Vzc2Z1bCBpbnZva2Ugb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZS48L3A+PC90ZD48L3RyPgogICoKICAqIDwvdGFibGU+CiAgKgpAQCAtNTcyLDYgKzU4OSwxNSBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3NldFZpZGVvU3VyZmFjZShTdXJmYWNlIHN1cmZhY2UpOwogCisgICAgLyogRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMgKHN0YXJ0aW5nIHdpdGggSU5WT0tFX0lEKSB3aXRob3V0IHVwZGF0aW5nCisgICAgICogdGhlaXIgY291bnRlcnBhcnRzIGluIGluY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCEKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0UgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRV9GRCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVk9LRV9JRF9TRUxFQ1RfVFJBQ0sgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1OworCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcmVxdWVzdCBwYXJjZWwgd2hpY2ggY2FuIGJlIHJvdXRlZCB0byB0aGUgbmF0aXZlIG1lZGlhCiAgICAgICogcGxheWVyIHVzaW5nIHtAbGluayAjaW52b2tlKFBhcmNlbCwgUGFyY2VsKX0uIFRoZSBQYXJjZWwKQEAgLTExNTUsNiArMTE4MSwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgTWVkaWFQbGF5ZXIgdG8gc3RhcnQgd2hlbiB0aGlzIE1lZGlhUGxheWVyIGZpbmlzaGVzIHBsYXliYWNrCisgICAgICogKGkuZS4gcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0pLgorICAgICAqIFRoZSBtZWRpYSBmcmFtZXdvcmsgd2lsbCBhdHRlbXB0IHRvIHRyYW5zaXRpb24gZnJvbSB0aGlzIHBsYXllciB0bworICAgICAqIHRoZSBuZXh0IGFzIHNlYW1sZXNzbHkgYXMgcG9zc2libGUuIFRoZSBuZXh0IHBsYXllciBjYW4gYmUgc2V0IGF0CisgICAgICogYW55IHRpbWUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZSBuZXh0IHBsYXllciBtdXN0IGJlIHByZXBhcmVkIGJ5IHRoZQorICAgICAqIGFwcCwgYW5kIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGNhbGwgc3RhcnQoKSBvbiBpdC4KKyAgICAgKiBUaGUgbmV4dCBNZWRpYVBsYXllciBtdXN0IGJlIGRpZmZlcmVudCBmcm9tICd0aGlzJy4gQW4gZXhjZXB0aW9uCisgICAgICogd2lsbCBiZSB0aHJvd24gaWYgbmV4dCA9PSB0aGlzLgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgY2FsbCBzZXROZXh0TWVkaWFQbGF5ZXIobnVsbCkgdG8gaW5kaWNhdGUgbm8KKyAgICAgKiBuZXh0IHBsYXllciBzaG91bGQgYmUgc3RhcnRlZCBhdCB0aGUgZW5kIG9mIHBsYXliYWNrLgorICAgICAqIElmIHRoZSBjdXJyZW50IHBsYXllciBpcyBsb29waW5nLCBpdCB3aWxsIGtlZXAgbG9vcGluZyBhbmQgdGhlIG5leHQKKyAgICAgKiBwbGF5ZXIgd2lsbCBub3QgYmUgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXh0IHRoZSBwbGF5ZXIgdG8gc3RhcnQgYWZ0ZXIgdGhpcyBvbmUgY29tcGxldGVzIHBsYXliYWNrLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldE5leHRNZWRpYVBsYXllcihNZWRpYVBsYXllciBuZXh0KTsKKworICAgIC8qKgogICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNZWRpYVBsYXllciBvYmplY3QuCiAgICAgICogSXQgaXMgY29uc2lkZXJlZCBnb29kIHByYWN0aWNlIHRvIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB5b3UncmUKICAgICAgKiBkb25lIHVzaW5nIHRoZSBNZWRpYVBsYXllci4gSW4gcGFydGljdWxhciwgd2hlbmV2ZXIgYW4gQWN0aXZpdHkKQEAgLTEyOTMsMjMgKzEzMzgsNiBAQAogICAgIC8qIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIChzdGFydGluZyB3aXRoIEtFWV9QQVJBTUVURVIpIHdpdGhvdXQgdXBkYXRpbmcKICAgICAgKiB0aGVpciBjb3VudGVycGFydHMgaW4gaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIQogICAgICAqLwotICAgIC8qCi0gICAgICogS2V5IHVzZWQgaW4gc2V0UGFyYW1ldGVyIG1ldGhvZC4KLSAgICAgKiBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSB0aW1lZCB0ZXh0IHRyYWNrIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQuCi0gICAgICogVGhlIGluZGV4IGluY2x1ZGVzIGJvdGggdGhlIGluLWJhbmQgYW5kIG91dC1vZi1iYW5kIHRpbWVkIHRleHQuCi0gICAgICogVGhlIGluZGV4IHNob3VsZCBzdGFydCBmcm9tIGluLWJhbmQgdGV4dCBpZiBhbnkuIEFwcGxpY2F0aW9uIGNhbiByZXRyaWV2ZSB0aGUgbnVtYmVyCi0gICAgICogb2YgaW4tYmFuZCB0ZXh0IHRyYWNrcyBieSB1c2luZyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoKS4KLSAgICAgKiBOb3RlIGl0IG1pZ2h0IHRha2UgYSBmZXcgaHVuZHJlZCBtcyB0byBzY2FuIGFuIG91dC1vZi1iYW5kIHRleHQgZmlsZQotICAgICAqIGJlZm9yZSBkaXNwbGF5aW5nIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVggPSAxMDAwOwotICAgIC8qCi0gICAgICogS2V5IHVzZWQgaW4gc2V0UGFyYW1ldGVyIG1ldGhvZC4KLSAgICAgKiBVc2VkIHRvIGFkZCBvdXQtb2YtYmFuZCB0aW1lZCB0ZXh0IHNvdXJjZSBwYXRoLgotICAgICAqIEFwcGxpY2F0aW9uIGNhbiBhZGQgbXVsdGlwbGUgdGV4dCBzb3VyY2VzIGJ5IGNhbGxpbmcgc2V0UGFyYW1ldGVyKCkgd2l0aAotICAgICAqIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9BRERfT1VUX09GX0JBTkRfU09VUkNFIG11bHRpcGxlIHRpbWVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfQUREX09VVF9PRl9CQU5EX1NPVVJDRSA9IDEwMDE7CiAKICAgICAvLyBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGRlZmluZWQga2V5cyB1c2FibGUgZnJvbSBKYXZhIHdpdGggZ2V0KlBhcmFtZXRlci4KICAgICAvLyBCdXQgaWYgYW55IGtleXMgYXJlIGRlZmluZWQsIHRoZSBvcmRlciBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGluY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaC4KQEAgLTEzNTQsNyArMTM4Miw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgLyoqCisgICAgLyoKICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGluZGljYXRlZCBieSBrZXkuCiAgICAgICogQHBhcmFtIGtleSBrZXkgaW5kaWNhdGVzIHRoZSBwYXJhbWV0ZXIgdG8gZ2V0LgogICAgICAqIEBwYXJhbSByZXBseSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGdldC4KQEAgLTE0MTYsNyArMTQ0NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAKLSAgICAvKioKKyAgICAvKgogICAgICAqIEBwYXJhbSByZXF1ZXN0IFBhcmNlbCBkZXN0aW5hdGVkIHRvIHRoZSBtZWRpYSBwbGF5ZXIuIFRoZQogICAgICAqICAgICAgICAgICAgICAgIEludGVyZmFjZSB0b2tlbiBtdXN0IGJlIHNldCB0byB0aGUgSU1lZGlhUGxheWVyCiAgICAgICogICAgICAgICAgICAgICAgb25lIHRvIGJlIHJvdXRlZCBjb3JyZWN0bHkgdGhyb3VnaCB0aGUgc3lzdGVtLgpAQCAtMTQyNiw3ICsxNDU0LDcgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX2ludm9rZShQYXJjZWwgcmVxdWVzdCwgUGFyY2VsIHJlcGx5KTsKIAogCi0gICAgLyoqCisgICAgLyoKICAgICAgKiBAcGFyYW0gdXBkYXRlX29ubHkgSWYgdHJ1ZSBmZXRjaCBvbmx5IHRoZSBzZXQgb2YgbWV0YWRhdGEgdGhhdCBoYXZlCiAgICAgICogICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgaW52b2NhdGlvbiBvZiBnZXRNZXRhZGF0YS4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgVGhlIHNldCBpcyBidWlsdCB1c2luZyB0aGUgdW5maWx0ZXJlZApAQCAtMTQ0Myw3ICsxNDcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFwcGx5X2ZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwgcmVwbHkpOwogCi0gICAgLyoqCisgICAgLyoKICAgICAgKiBAcGFyYW0gcmVxdWVzdCBQYXJjZWwgd2l0aCB0aGUgMiBzZXJpYWxpemVkIGxpc3RzIG9mIGFsbG93ZWQKICAgICAgKiAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlcyBmb2xsb3dlZCBieSB0aGUgb25lIHRvIGJlCiAgICAgICogICAgICAgICAgICAgICAgZHJvcHBlZC4gRWFjaCBsaXN0IHN0YXJ0cyB3aXRoIGFuIGludGVnZXIKQEAgLTE0NTcsMzMgKzE0ODUsMjg5IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRleHQgdHJhY2sgdG8gYmUgdHVybmVkIG9uLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGV4dCB0cmFjayBpcyBlbmFibGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBDbGFzcyBmb3IgTWVkaWFQbGF5ZXIgdG8gcmV0dXJuIGVhY2ggYXVkaW8vdmlkZW8vc3VidGl0bGUgdHJhY2sncyBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIHtAc2VlICNnZXRUcmFja0luZm8oKX0uCiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVRpbWVkVGV4dFRyYWNrSW5kZXgoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGF0aWMgcHVibGljIGNsYXNzIFRyYWNrSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdHJhY2sgdHlwZS4KKyAgICAgICAgICogQHJldHVybiBUcmFja1R5cGUgd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSB0cmFjayBpcyB2aWRlbywgYXVkaW8sIHRpbWVkIHRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFRyYWNrVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHJhY2tUeXBlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIoS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX1RSQUNLX0lOREVYLCBpbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGxhbmd1YWdlIGNvZGUgb2YgdGhlIHRyYWNrLgorICAgICAgICAgKiBAcmV0dXJuIGEgbGFuZ3VhZ2UgY29kZSBpbiBlaXRoZXIgd2F5IG9mIElTTy02MzktMSBvciBJU08tNjM5LTIuCisgICAgICAgICAqIFdoZW4gdGhlIGxhbmd1YWdlIGlzIHVua25vd24gb3IgY291bGQgbm90IGJlIGRldGVybWluZWQsCisgICAgICAgICAqIElTTy02MzktMiBsYW5ndWFnZSBjb2RlLCAidW5kIiwgaXMgcmV0dXJuZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1MYW5ndWFnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RSQUNLX1RZUEVfVklERU8gPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9UUkFDS19UWVBFX0FVRElPID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQgPSAzOworCisgICAgICAgIGZpbmFsIGludCBtVHJhY2tUeXBlOworICAgICAgICBmaW5hbCBTdHJpbmcgbUxhbmd1YWdlOworCisgICAgICAgIFRyYWNrSW5mbyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1UcmFja1R5cGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBObyBzcGVjaWFsIHBhcmNlbCBjb250ZW50cy4gS2VlcCBpdCBhcyBoaWRlLgorICAgICAgICAgKiB7QGhpZGV9CisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiB7QGhpZGV9CisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFja1R5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTGFuZ3VhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgdG8gcmVhZCBhIFRyYWNrSW5mbyBmcm9tIGEgUGFyY2VsLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxUcmFja0luZm8+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8VHJhY2tJbmZvPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUcmFja0luZm8gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhY2tJbmZvKGluKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhY2tJbmZvW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhY2tJbmZvW3NpemVdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRyYWNrIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiB0cmFjayBpbmZvLiBudWxsIGlmIGFuIGVycm9yIG9jY3VyZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIC8vIEZJWE1FOiBJdCByZXR1cm5zIHRpbWVkIHRleHQgdHJhY2tzJyBpbmZvcm1hdGlvbiBmb3Igbm93LiBPdGhlciB0eXBlcyBvZiB0cmFja3Mgd2lsbCBiZQorICAgIC8vIHN1cHBvcnRlZCBpbiBmdXR1cmUuCisgICAgcHVibGljIFRyYWNrSW5mb1tdIGdldFRyYWNrSW5mbygpIHsKKyAgICAgICAgUGFyY2VsIHJlcXVlc3QgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgcmVxdWVzdC53cml0ZUludGVyZmFjZVRva2VuKElNRURJQV9QTEFZRVIpOworICAgICAgICByZXF1ZXN0LndyaXRlSW50KElOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTyk7CisgICAgICAgIGludm9rZShyZXF1ZXN0LCByZXBseSk7CisgICAgICAgIFRyYWNrSW5mbyB0cmFja0luZm9bXSA9IHJlcGx5LmNyZWF0ZVR5cGVkQXJyYXkoVHJhY2tJbmZvLkNSRUFUT1IpOworICAgICAgICByZXR1cm4gdHJhY2tJbmZvOworICAgIH0KKworICAgIC8qCisgICAgICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIG1pbWUgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgbWVkaWEgZnJhbWV3b3JrLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhdmFpbGFibGVNaW1lVHlwZUZvckV4dGVybmFsU291cmNlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBUT0RPOiBMaW1pdCB0aGUgdG90YWwgbnVtYmVyIG9mIGV4dGVybmFsIHRpbWVkIHRleHQgc291cmNlIHRvIGEgcmVhc29uYWJsZSBudW1iZXIuCisgICAgICovCisgICAgLyoqCisgICAgICogQWRkcyBhbiBleHRlcm5hbCBzb3VyY2UgZmlsZS4KKyAgICAgKgorICAgICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgZm9ybWF0IGlzIFN1YlJpcCB3aXRoIHRoZSBmaWxlIGV4dGVuc2lvbiAuc3J0LCBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSBleHRlcm5hbCBzb3VyY2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUgdHJhY2tzIGluIGl0LgorICAgICAqIE9uZSBjYW4gZmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFja3MgdXNpbmcge0BsaW5rICNnZXRUcmFja0luZm8oKX0gdG8gc2VlIHdoYXQKKyAgICAgKiBhZGRpdGlvbmFsIHRyYWNrcyBiZWNvbWUgYXZhaWxhYmxlIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoIG9mIGV4dGVybmFsIHNvdXJjZSBmaWxlLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICAvLyBGSVhNRTogZGVmaW5lIGVycm9yIGNvZGVzIGFuZCB0aHJvd3MgZXhjZXB0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGVycm9yIGNvZGVzLgorICAgIC8vIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uKS4KKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbFNvdXJjZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghYXZhaWxhYmxlTWltZVR5cGVGb3JFeHRlcm5hbFNvdXJjZShtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbWltZVR5cGUgZm9yIGV4dGVybmFsIHNvdXJjZTogIiArIG1pbWVUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCByZXF1ZXN0ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVJbnRlcmZhY2VUb2tlbihJTUVESUFfUExBWUVSKTsKKyAgICAgICAgcmVxdWVzdC53cml0ZUludChJTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRSk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVTdHJpbmcocGF0aCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVTdHJpbmcobWltZVR5cGUpOworICAgICAgICBpbnZva2UocmVxdWVzdCwgcmVwbHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMgdGhlIGZpcnN0IHRpbWVkIHRleHQgdHJhY2sgaWYgYW55LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGV4dCB0cmFjayBpcyBlbmFibGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEFkZHMgYW4gZXh0ZXJuYWwgc291cmNlIGZpbGUgKFVyaSkuCisgICAgICoKKyAgICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIGZvcm1hdCBpcyBTdWJSaXAgd2l0aCB0aGUgZmlsZSBleHRlbnNpb24gLnNydCwgY2FzZSBpbnNlbnNpdGl2ZS4KKyAgICAgKiBOb3RlIHRoYXQgYSBzaW5nbGUgZXh0ZXJuYWwgc291cmNlIG1heSBjb250YWluIG11bHRpcGxlIHRyYWNrcyBpbiBpdC4KKyAgICAgKiBPbmUgY2FuIGZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgdHJhY2tzIHVzaW5nIHtAbGluayAjZ2V0VHJhY2tJbmZvKCl9IHRvIHNlZSB3aGF0CisgICAgICogYWRkaXRpb25hbCB0cmFja3MgYmVjb21lIGF2YWlsYWJsZSBhZnRlciB0aGlzIG1ldGhvZCBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIENvbnRleHQgdG8gdXNlIHdoZW4gcmVzb2x2aW5nIHRoZSBVcmkKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBDb250ZW50IFVSSSBvZiB0aGUgZGF0YSB5b3Ugd2FudCB0byBwbGF5CiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVRpbWVkVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGVuYWJsZVRpbWVkVGV4dFRyYWNrSW5kZXgoMCk7CisgICAgLy8gRklYTUU6IGRlZmluZSBlcnJvciBjb2RlcyBhbmQgdGhyb3dzIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBlcnJvciBjb2Rlcy4KKyAgICAvLyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbikuCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZXJuYWxTb3VyY2UoQ29udGV4dCBjb250ZXh0LCBVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgIGlmKHNjaGVtZSA9PSBudWxsIHx8IHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgeworICAgICAgICAgICAgYWRkRXh0ZXJuYWxTb3VyY2UodXJpLmdldFBhdGgoKSwgbWltZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgZmQgPSByZXNvbHZlci5vcGVuQXNzZXRGaWxlRGVzY3JpcHRvcih1cmksICJyIik7CisgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEV4dGVybmFsU291cmNlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIG1pbWVUeXBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHRyeSBzZXJ2ZXIgc2lkZS4KKyAgICB9CisKKyAgICAvKiBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cworICAgICAqIGluIGluY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYW5kIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAhCisgICAgICovCisgICAgLyoqCisgICAgICogTUlNRSB0eXBlIGZvciBTdWJSaXAgKFNSVCkgY29udGFpbmVyLiBVc2VkIGluIHtAbGluayAjYWRkRXh0ZXJuYWxTb3VyY2UoKX0gQVBJcy4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAgPSAiYXBwbGljYXRpb24veC1zdWJyaXAiOworCisgICAgLyoqCisgICAgICogQWRkcyBhbiBleHRlcm5hbCBzb3VyY2UgZmlsZSAoRmlsZURlc2NyaXB0b3IpLgorICAgICAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqIEl0IGlzIHNhZmUgdG8gZG8gc28gYXMgc29vbiBhcyB0aGlzIGNhbGwgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgZm9ybWF0IGlzIFN1YlJpcCB3aXRoIHRoZSBmaWxlIGV4dGVuc2lvbiAuc3J0LCBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqIE5vdGUgdGhhdCBhIHNpbmdsZSBleHRlcm5hbCBzb3VyY2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUgdHJhY2tzIGluIGl0LgorICAgICAqIE9uZSBjYW4gZmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFja3MgdXNpbmcge0BsaW5rICNnZXRUcmFja0luZm8oKX0gdG8gc2VlIHdoYXQKKyAgICAgKiBhZGRpdGlvbmFsIHRyYWNrcyBiZWNvbWUgYXZhaWxhYmxlIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmQgdGhlIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgZmlsZSB5b3Ugd2FudCB0byBwbGF5CisgICAgICogQHBhcmFtIG1pbWVUeXBlIEEgTUlNRSB0eXBlIGZvciB0aGUgY29udGVudC4gSXQgY2FuIGJlIG51bGwuCisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI01FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQfQorICAgICAqIDwvdWw+CisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIC8vIEZJWE1FOiBkZWZpbmUgZXJyb3IgY29kZXMgYW5kIHRocm93cyBleGNlcHRpb25zIGFjY29yZGluZyB0byB0aGUgZXJyb3IgY29kZXMuCisgICAgLy8gKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24pLgorICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVybmFsU291cmNlKEZpbGVEZXNjcmlwdG9yIGZkLCBTdHJpbmcgbWltZVR5cGUpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gaW50ZW50aW9uYWxseSBsZXNzIHRoYW4gTE9OR19NQVgKKyAgICAgICAgYWRkRXh0ZXJuYWxTb3VyY2UoZmQsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmTCwgbWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc2FibGVzIHRpbWVkIHRleHQgZGlzcGxheS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRleHQgdHJhY2sgaXMgZGlzYWJsZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIEFkZHMgYW4gZXh0ZXJuYWwgdGltZWQgdGV4dCBmaWxlIChGaWxlRGVzY3JpcHRvcikuCisgICAgICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICogSXQgaXMgc2FmZSB0byBkbyBzbyBhcyBzb29uIGFzIHRoaXMgY2FsbCByZXR1cm5zLgorICAgICAqCisgICAgICogQ3VycmVudGx5IHN1cHBvcnRlZCBmb3JtYXQgaXMgU3ViUmlwIHdpdGggdGhlIGZpbGUgZXh0ZW5zaW9uIC5zcnQsIGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICogTm90ZSB0aGF0IGEgc2luZ2xlIGV4dGVybmFsIHNvdXJjZSBtYXkgY29udGFpbiBtdWx0aXBsZSB0cmFja3MgaW4gaXQuCisgICAgICogT25lIGNhbiBmaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNrcyB1c2luZyB7QGxpbmsgI2dldFRyYWNrSW5mbygpfSB0byBzZWUgd2hhdAorICAgICAqIGFkZGl0aW9uYWwgdHJhY2tzIGJlY29tZSBhdmFpbGFibGUgYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCB0aGUgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBmaWxlIHlvdSB3YW50IHRvIHBsYXkKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgZmlsZSB3aGVyZSB0aGUgZGF0YSB0byBiZSBwbGF5ZWQgc3RhcnRzLCBpbiBieXRlcworICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGF0YSB0byBiZSBwbGF5ZWQKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgQSBNSU1FIHR5cGUgZm9yIHRoZSBjb250ZW50LiBJdCBjYW4gYmUgbnVsbC4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZVRpbWVkVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNldFBhcmFtZXRlcihLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVgsIC0xKTsKKyAgICAvLyBGSVhNRTogZGVmaW5lIGVycm9yIGNvZGVzIGFuZCB0aHJvd3MgZXhjZXB0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGVycm9yIGNvZGVzLgorICAgIC8vIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uKS4KKyAgICBwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbFNvdXJjZShGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoLCBTdHJpbmcgbWltZVR5cGUpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFhdmFpbGFibGVNaW1lVHlwZUZvckV4dGVybmFsU291cmNlKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBtaW1lVHlwZSBmb3IgZXh0ZXJuYWwgc291cmNlOiAiICsgbWltZVR5cGUpOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCByZXF1ZXN0ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVJbnRlcmZhY2VUb2tlbihJTUVESUFfUExBWUVSKTsKKyAgICAgICAgcmVxdWVzdC53cml0ZUludChJTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRV9GRCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVMb25nKG9mZnNldCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVMb25nKGxlbmd0aCk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVTdHJpbmcobWltZVR5cGUpOworICAgICAgICBpbnZva2UocmVxdWVzdCwgcmVwbHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgYSB0cmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIE1lZGlhUGxheWVyIGlzIGluIGludmFsaWQgc3RhdGUsIGl0IHRocm93cyBleGNlcHRpb24uCisgICAgICogSWYgYSBNZWRpYVBsYXllciBpcyBpbiBTdGFydGVkIHN0YXRlLCB0aGUgc2VsZWN0ZWQgdHJhY2sgd2lsbCBiZSBwcmVzZW50ZWQgaW1tZWRpYXRlbHkuCisgICAgICogSWYgYSBNZWRpYVBsYXllciBpcyBub3QgaW4gU3RhcnRlZCBzdGF0ZSwgaXQganVzdCBtYXJrcyB0aGUgdHJhY2sgdG8gYmUgcGxheWVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiBhbnkgdmFsaWQgc3RhdGUsIGlmIGl0IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSB0eXBlIG9mIHRyYWNrIChpZS4gVmlkZW8sCisgICAgICogQXVkaW8sIFRpbWVkIFRleHQpLCB0aGUgbW9zdCByZWNlbnQgb25lIHdpbGwgYmUgY2hvc2VuLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZmlyc3QgYXVkaW8gYW5kIHZpZGVvIHRyYWNrcyB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQsIGV2ZW4gdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90CisgICAgICogY2FsbGVkLiBIb3dldmVyLCBubyB0aW1lZCB0ZXh0IHRyYWNrIHdpbGwgYmUgc2VsZWN0ZWQgdW50aWwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgICAgICogPC9wPgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICAvLyBGSVhNRTogZGVmaW5lIGVycm9yIGNvZGVzIGFuZCB0aHJvd3MgZXhjZXB0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGVycm9yIGNvZGVzLgorICAgIC8vIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pLgorICAgIHB1YmxpYyB2b2lkIHNlbGVjdFRyYWNrKGludCBpbmRleCkgeworICAgICAgICBQYXJjZWwgcmVxdWVzdCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICByZXF1ZXN0LndyaXRlSW50ZXJmYWNlVG9rZW4oSU1FRElBX1BMQVlFUik7CisgICAgICAgIHJlcXVlc3Qud3JpdGVJbnQoSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyk7CisgICAgICAgIHJlcXVlc3Qud3JpdGVJbnQoaW5kZXgpOworICAgICAgICBpbnZva2UocmVxdWVzdCwgcmVwbHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuc2VsZWN0IGEgdHJhY2suCisgICAgICogSWYgdGhlIHRyYWNrIGlkZW50aWZpZWQgYnkgaW5kZXggaGFzIG5vdCBiZWVuIHNlbGVjdGVkIGJlZm9yZSwgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgLy8gRklYTUU6IGRlZmluZSBlcnJvciBjb2RlcyBhbmQgdGhyb3dzIGV4Y2VwdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBlcnJvciBjb2Rlcy4KKyAgICAvLyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKS4KKyAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdFRyYWNrKGludCBpbmRleCkgeworICAgICAgICBQYXJjZWwgcmVxdWVzdCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICByZXF1ZXN0LndyaXRlSW50ZXJmYWNlVG9rZW4oSU1FRElBX1BMQVlFUik7CisgICAgICAgIHJlcXVlc3Qud3JpdGVJbnQoSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLKTsKKyAgICAgICAgcmVxdWVzdC53cml0ZUludChpbmRleCk7CisgICAgICAgIGludm9rZShyZXF1ZXN0LCByZXBseSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjIyLDE0ICsxOTA2LDE0IEBACiAgICAgICAgICAgICAgICAgLy8gTm8gcmVhbCBkZWZhdWx0IGFjdGlvbiBzbyBmYXIuCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgY2FzZSBNRURJQV9USU1FRF9URVhUOgotICAgICAgICAgICAgICAgIGlmIChtT25UaW1lZFRleHRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PblRpbWVkVGV4dExpc3RlbmVyLm9uVGltZWRUZXh0KG1NZWRpYVBsYXllciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVkVGV4dCB0ZXh0ID0gbmV3IFRpbWVkVGV4dCgoYnl0ZVtdKShtc2cub2JqKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9uVGltZWRUZXh0TGlzdGVuZXIub25UaW1lZFRleHQobU1lZGlhUGxheWVyLCB0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobU9uVGltZWRUZXh0TGlzdGVuZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGlmIChtc2cub2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uVGltZWRUZXh0TGlzdGVuZXIub25UaW1lZFRleHQobU1lZGlhUGxheWVyLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGltZWRUZXh0IHRleHQgPSBuZXcgVGltZWRUZXh0KChieXRlW10pKG1zZy5vYmopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PblRpbWVkVGV4dExpc3RlbmVyLm9uVGltZWRUZXh0KG1NZWRpYVBsYXllciwgdGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTY0NCw3ICsxOTI4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgorICAgIC8qCiAgICAgICogQ2FsbGVkIGZyb20gbmF0aXZlIGNvZGUgd2hlbiBhbiBpbnRlcmVzdGluZyBldmVudCBoYXBwZW5zLiAgVGhpcyBtZXRob2QKICAgICAgKiBqdXN0IHVzZXMgdGhlIEV2ZW50SGFuZGxlciBzeXN0ZW0gdG8gcG9zdCB0aGUgZXZlbnQgYmFjayB0byB0aGUgbWFpbiBhcHAgdGhyZWFkLgogICAgICAqIFdlIHVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBNZWRpYVBsYXllciBvYmplY3Qgc28gdGhhdCB0aGUgbmF0aXZlCkBAIC0xNjU5LDYgKzE5NDMsMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGlmICh3aGF0ID09IE1FRElBX0lORk8gJiYgYXJnMSA9PSBNRURJQV9JTkZPX1NUQVJURURfQVNfTkVYVCkgeworICAgICAgICAgICAgLy8gdGhpcyBhY3F1aXJlcyB0aGUgd2FrZWxvY2sgaWYgbmVlZGVkLCBhbmQgc2V0cyB0aGUgY2xpZW50IHNpZGUgc3RhdGUKKyAgICAgICAgICAgIG1wLnN0YXJ0KCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1wLm1FdmVudEhhbmRsZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgTWVzc2FnZSBtID0gbXAubUV2ZW50SGFuZGxlci5vYnRhaW5NZXNzYWdlKHdoYXQsIGFyZzEsIGFyZzIsIG9iaik7CiAgICAgICAgICAgICBtcC5tRXZlbnRIYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwpAQCAtMTkxMyw2ICsyMjAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfSU5GT19VTktOT1dOID0gMTsKIAorICAgIC8qKiBUaGUgcGxheWVyIHdhcyBzdGFydGVkIGJlY2F1c2UgaXQgd2FzIHVzZWQgYXMgdGhlIG5leHQgcGxheWVyIGZvciBhbm90aGVyCisgICAgICogcGxheWVyLCB3aGljaCBqdXN0IGNvbXBsZXRlZCBwbGF5YmFjay4KKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25JbmZvTGlzdGVuZXIKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX0lORk9fU1RBUlRFRF9BU19ORVhUID0gMjsKKwogICAgIC8qKiBUaGUgdmlkZW8gaXMgdG9vIGNvbXBsZXggZm9yIHRoZSBkZWNvZGVyOiBpdCBjYW4ndCBkZWNvZGUgZnJhbWVzIGZhc3QKICAgICAgKiAgZW5vdWdoLiBQb3NzaWJseSBvbmx5IHRoZSBhdWRpbyBwbGF5cyBmaW5lIGF0IHRoaXMgc3RhZ2UuCiAgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uSW5mb0xpc3RlbmVyCkBAIC0xOTQ3LDYgKzIyNDIsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSA9IDgwMjsKIAorICAgIC8qKiBGYWlsZWQgdG8gaGFuZGxlIHRpbWVkIHRleHQgdHJhY2sgcHJvcGVybHkuCisgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uSW5mb0xpc3RlbmVyCisgICAgICoKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfSU5GT19USU1FRF9URVhUX0VSUk9SID0gOTAwOworCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gb2YgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHRvIGNvbW11bmljYXRlIHNvbWUKICAgICAgKiBpbmZvIGFuZC9vciB3YXJuaW5nIGFib3V0IHRoZSBtZWRpYSBvciBpdHMgcGxheWJhY2suCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDA3MGQyZDkuLmE5ODI3NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24gXAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9tdHAgXAotICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggZjU3MmY3MS4uNzQ1ZTI1MyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzk1LDYgKzc5NSwzMyBAQAogICAgIHByb2Nlc3NfbWVkaWFfcGxheWVyX2NhbGwoZW52LCB0aGl6LCBtcC0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpLCBOVUxMLCBOVUxMICk7CiB9CiAKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3NldE5leHRNZWRpYVBsYXllcihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFfcGxheWVyKQoreworICAgIEFMT0dWKCJzZXROZXh0TWVkaWFQbGF5ZXIiKTsKKyAgICBzcDxNZWRpYVBsYXllcj4gdGhpc3BsYXllciA9IGdldE1lZGlhUGxheWVyKGVudiwgdGhpeik7CisgICAgaWYgKHRoaXNwbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgIlRoaXMgcGxheWVyIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE1lZGlhUGxheWVyPiBuZXh0cGxheWVyID0gKGphdmFfcGxheWVyID09IE5VTEwpID8gTlVMTCA6IGdldE1lZGlhUGxheWVyKGVudiwgamF2YV9wbGF5ZXIpOworICAgIGlmIChuZXh0cGxheWVyID09IE5VTEwgJiYgamF2YV9wbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgIlRoYXQgcGxheWVyIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG5leHRwbGF5ZXIgPT0gdGhpc3BsYXllcikgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIk5leHQgcGxheWVyIGNhbid0IGJlIHNlbGYiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB0aWUgdGhlIHR3byBwbGF5ZXJzIHRvZ2V0aGVyCisgICAgcHJvY2Vzc19tZWRpYV9wbGF5ZXJfY2FsbCgKKyAgICAgICAgICAgIGVudiwgdGhpeiwgdGhpc3BsYXllci0+c2V0TmV4dE1lZGlhUGxheWVyKG5leHRwbGF5ZXIpLAorICAgICAgICAgICAgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgInNldE5leHRNZWRpYVBsYXllciBmYWlsZWQuIiApOworICAgIDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CkBAIC04NDAsNiArODY3LDcgQEAKICAgICB7InNldFBhcmFtZXRlciIsICAgICAgICAiKElMYW5kcm9pZC9vcy9QYXJjZWw7KVoiLCAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfc2V0UGFyYW1ldGVyfSwKICAgICB7ImdldFBhcmFtZXRlciIsICAgICAgICAiKElMYW5kcm9pZC9vcy9QYXJjZWw7KVYiLCAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfZ2V0UGFyYW1ldGVyfSwKICAgICB7Im5hdGl2ZV9zZXRSZXRyYW5zbWl0RW5kcG9pbnQiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpSSIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfc2V0UmV0cmFuc21pdEVuZHBvaW50fSwKKyAgICB7InNldE5leHRNZWRpYVBsYXllciIsICAiKExhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyOylWIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfc2V0TmV4dE1lZGlhUGxheWVyfSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyIjsKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hdWRpb2VmZmVjdC9BbmRyb2lkLm1rIGIvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L0FuZHJvaWQubWsKaW5kZXggM2U0OTNiMS4uYjVkOGI3YiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDcgQEAKIAlsaWJtZWRpYQogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQlzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZWZmZWN0X2puaQogCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvbWVkaWFlZGl0b3IvQW5kcm9pZC5tayBiL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCmluZGV4IDYwMDM2MDguLjY4OGUxODAgMTAwNzU1Ci0tLSBhL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCkBAIC0zNiwxNCArMzYsMTUgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pL21lZGlhZWRpdG9yIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW91dGlscyBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYWhfcnRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYWhfcnRwL0FuZHJvaWQubWsKaW5kZXggNTRmZDllYy4uMWU4N2NmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWFoX3J0cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhaF9ydHAvQW5kcm9pZC5tawpAQCAtMjEsOSArMjEsOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhIFwKLSAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawppbmRleCAwMzQ4ZTFlLi45NWNhNmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawpAQCAtMjAsOCArMjAsOCBAQAogZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0Jc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0Jc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawppbmRleCAyZjJiOTc0Li42ZTY5MTUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawppbmRleCBmMDk3ZGQwLi40MzEzNDI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0yNiw3ICsyNiw3IEBACiAJJChMT0NBTF9QQVRIKS9CdW5kbGUgXAogCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKIAkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLyBcCi0Jc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKQEAgLTU1LDYgKzU1LDYgQEAKICAgICAkKExPQ0FMX1BBVEgpL1JldmVyYiBcCiAgICAgJChMT0NBTF9QQVRIKS8uLi9saWIvQ29tbW9uL2xpYi8gXAogICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL1JldmVyYi9saWIvIFwKLSAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCAzNzE0MjgzLi5jYTkzY2U1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8RWZmZWN0QnVuZGxlLmg+CisjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCiAKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmFzcyBib29zdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggMzU4MzU3ZS4uOTU5OWRjYyAxMDA3NTUKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0yNCw4ICsyNCw5IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPEVmZmVjdFJldmVyYi5oPgotI2luY2x1ZGUgPExWUkVWLmg+CisjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCisvLyBmcm9tIFJldmVyYi9saWIKKyNpbmNsdWRlICJMVlJFVi5oIgogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA3ZjdjN2UxLi5jMTNiOWQ0IDEwMDc1NQotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNyBAQAogICAgIGV4dGVybmFsL3dlYnJ0Yy9zcmMgXAogICAgIGV4dGVybmFsL3dlYnJ0Yy9zcmMvbW9kdWxlcy9pbnRlcmZhY2UgXAogICAgIGV4dGVybmFsL3dlYnJ0Yy9zcmMvbW9kdWxlcy9hdWRpb19wcm9jZXNzaW5nL2ludGVyZmFjZSBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZQorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiBMT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBzcGVleCkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KaW5kZXggMjQ5ZWJmNC4uMjk1NDkwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0yMyw3ICsyMyw3IEBACiBlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQlzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCkBAIC02MCw3ICs2MCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKLQlzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggMjE2MDE3Ny4uNzZiNTExMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAotCXN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKIAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCAyMzY3MGRmLi44YjAwOWFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTU3LDEwICs1NywxMCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICBleHRlcm5hbC9pY3U0Yy9jb21tb24gXAogICAgIGV4dGVybmFsL2V4cGF0L2xpYiBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggZjU4NmIwMi4uMGJiMjM3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC01NSw2ICs1NSw3IEBACiAgICAgU0VUX1BBUkFNRVRFUiwKICAgICBHRVRfUEFSQU1FVEVSLAogICAgIFNFVF9SRVRSQU5TTUlUX0VORFBPSU5ULAorICAgIFNFVF9ORVhUX1BMQVlFUiwKIH07CiAKIGNsYXNzIEJwTWVkaWFQbGF5ZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFQbGF5ZXI+CkBAIC0zMDcsNyArMzA4LDE1IEBACiAgICAgICAgIGlmIChPSyAhPSBlcnIpIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIAorICAgIHN0YXR1c190IHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYihwbGF5ZXItPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGIpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX05FWFRfUExBWUVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogfTsKQEAgLTQ4OSw3ICs0OTgsMTEgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UmV0cmFuc21pdEVuZHBvaW50KE5VTEwpKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9ORVhUX1BMQVlFUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TmV4dFBsYXllcihpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBhNzUzNmIzLi5jMjI0ZjA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGV4cGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggN2VhOTQ5MC4uYjUyYTM3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtNzg4LDQgKzc4OCwxMSBAQAogCiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBuZXh0KSB7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldE5leHRQbGF5ZXIobmV4dCA9PSBOVUxMID8gTlVMTCA6IG5leHQtPm1QbGF5ZXIpOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBlNTIxNjQ4Li40MWJjYWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMzYsMTMgKzM2LDEzIEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X251cGxheWVyICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3J0c3AgICAgICAgICAgICAgICAgICAgICBcCiAKLUxPQ0FMX0NfSU5DTFVERVMgOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSQoSk5JX0hfSU5DTFVERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgICAgICAgICAgICAgICAgICAgICAgIFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4ICAgICAgICAgICAgICAgICAgXAorCSQoVE9QKS9leHRlcm5hbC90cmVtb2xvL1RyZW1vbG8KIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYmJjNTNmMy4uMWNjMTIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTEwNjgsNiArMTA2OCwyMCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXROZXh0UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcikgeworICAgIEFMT0dWKCJzZXROZXh0UGxheWVyIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHNwPENsaWVudD4gYyA9IHN0YXRpY19jYXN0PENsaWVudCo+KHBsYXllci5nZXQoKSk7CisgICAgbU5leHRDbGllbnQgPSBjOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCAmJiBjICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXROZXh0T3V0cHV0KGMtPm1BdWRpb091dHB1dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIm5vIGN1cnJlbnQgYXVkaW8gb3V0cHV0Iik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2Vla1RvKGludCBtc2VjKQogewogICAgIEFMT0dWKCJbJWRdIHNlZWtUbyglZCkiLCBtQ29ubklkLCBtc2VjKTsKQEAgLTExODksNiArMTIwMywxNSBAQAogewogICAgIENsaWVudCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY29va2llKTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoY2xpZW50LT5tTG9jayk7CisgICAgICAgIGlmIChtc2cgPT0gTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgJiYgY2xpZW50LT5tTmV4dENsaWVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbGllbnQtPm1BdWRpb091dHB1dC0+c3dpdGNoVG9OZXh0T3V0cHV0KCk7CisgICAgICAgICAgICBjbGllbnQtPm1OZXh0Q2xpZW50LT5zdGFydCgpOworICAgICAgICAgICAgY2xpZW50LT5tTmV4dENsaWVudC0+bUNsaWVudC0+bm90aWZ5KE1FRElBX0lORk8sIE1FRElBX0lORk9fU1RBUlRFRF9BU19ORVhULCAwLCBvYmopOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKE1FRElBX0lORk8gPT0gbXNnICYmCiAgICAgICAgIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOwpAQCAtMTM3Niw5ICsxMzk5LDExIEBACiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkKQogICAgIDogbUNhbGxiYWNrKE5VTEwpLAogICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAorICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoIkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7CiAgICAgbVRyYWNrID0gMDsKKyAgICBtUmVjeWNsZWRUcmFjayA9IDA7CiAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgbUxlZnRWb2x1bWUgPSAxLjA7CiAgICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwpAQCAtMTM5Myw2ICsxNDE4LDggQEAKIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6On5BdWRpb091dHB1dCgpCiB7CiAgICAgY2xvc2UoKTsKKyAgICBkZWxldGUgbVJlY3ljbGVkVHJhY2s7CisgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKQpAQCAtMTQ3Myw3ICsxNTAwLDYgQEAKICAgICB9CiAgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAlZCwgJWQsICVkKSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkKTsKLSAgICBpZiAobVRyYWNrKSBjbG9zZSgpOwogICAgIGludCBhZlNhbXBsZVJhdGU7CiAgICAgaW50IGFmRnJhbWVDb3VudDsKICAgICBpbnQgZnJhbWVDb3VudDsKQEAgLTE0OTQsOSArMTUyMCw0OCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKG1SZWN5Y2xlZFRyYWNrKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBleGlzdGluZyB0cmFjayBjYW4gYmUgcmV1c2VkIGFzLWlzLCBvciBpZiBhIG5ldyB0cmFjayBuZWVkcyB0byBiZSBjcmVhdGVkLgorCisgICAgICAgIGJvb2wgcmV1c2UgPSB0cnVlOworICAgICAgICBpZiAoKG1DYWxsYmFja0RhdGEgPT0gTlVMTCAmJiBtQ2FsbGJhY2sgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAobUNhbGxiYWNrRGF0YSAhPSBOVUxMICYmIG1DYWxsYmFjayA9PSBOVUxMKSkgeworICAgICAgICAgICAgLy8gcmVjeWNsZWQgdHJhY2sgdXNlcyBjYWxsYmFja3MgYnV0IHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIHdyaXRlcywgb3IgdmljZSB2ZXJzYQorICAgICAgICAgICAgQUxPR1YoImNhbid0IGNoYWluIGNhbGxiYWNrIGFuZCB3cml0ZSIpOworICAgICAgICAgICAgcmV1c2UgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICgobVJlY3ljbGVkVHJhY2stPmdldFNhbXBsZVJhdGUoKSAhPSBzYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgIChtUmVjeWNsZWRUcmFjay0+Y2hhbm5lbENvdW50KCkgIT0gY2hhbm5lbENvdW50KSB8fAorICAgICAgICAgICAgICAgIChtUmVjeWNsZWRUcmFjay0+ZnJhbWVDb3VudCgpICE9IGZyYW1lQ291bnQpKSB7CisgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZSwgY2hhbm5lbGNvdW50IG9yIGZyYW1lY291bnQgZGlmZmVyIik7CisgICAgICAgICAgICByZXVzZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChyZXVzZSkgeworICAgICAgICAgICAgQUxPR1YoImNoYWluaW5nIHRvIG5leHQgb3V0cHV0Iik7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgbVRyYWNrID0gbVJlY3ljbGVkVHJhY2s7CisgICAgICAgICAgICBtUmVjeWNsZWRUcmFjayA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+c2V0T3V0cHV0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2UncmUgbm90IGdvaW5nIHRvIHJldXNlIHRoZSB0cmFjaywgdW5ibG9jayBhbmQgZmx1c2ggaXQKKyAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+c2V0T3V0cHV0KE5VTEwpOworICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKKyAgICAgICAgfQorICAgICAgICBtUmVjeWNsZWRUcmFjay0+Zmx1c2goKTsKKyAgICAgICAgZGVsZXRlIG1SZWN5Y2xlZFRyYWNrOworICAgICAgICBtUmVjeWNsZWRUcmFjayA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOworICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CiAKICAgICBBdWRpb1RyYWNrICp0OwogICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tEYXRhID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCkBAIC0xNTA1LDcgKzE1NzAsNyBAQAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YSwKICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgIH0gZWxzZSB7CkBAIC0xNTQ2LDYgKzE2MTEsOSBAQAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzdGFydCgpCiB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOworICAgIH0KICAgICBpZiAobVRyYWNrKSB7CiAgICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKQEAgLTE1NTMsOCArMTYyMSwyNyBAQAogICAgIH0KIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXROZXh0T3V0cHV0KGNvbnN0IHNwPEF1ZGlvT3V0cHV0PiYgbmV4dE91dHB1dCkgeworICAgIG1OZXh0T3V0cHV0ID0gbmV4dE91dHB1dDsKK30KIAogCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnN3aXRjaFRvTmV4dE91dHB1dCgpIHsKKyAgICBBTE9HVigic3dpdGNoVG9OZXh0T3V0cHV0Iik7CisgICAgaWYgKG1OZXh0T3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+YmVnaW5UcmFja1N3aXRjaCgpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YTsKKyAgICAgICAgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOworICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsKKyAgICAgICAgbU5leHRPdXRwdXQtPm1SZWN5Y2xlZFRyYWNrID0gbVRyYWNrOworICAgICAgICBtVHJhY2sgPSBOVUxMOworICAgICAgICBtTmV4dE91dHB1dC0+bVNhbXBsZVJhdGVIeiA9IG1TYW1wbGVSYXRlSHo7CisgICAgICAgIG1OZXh0T3V0cHV0LT5tTXNlY3NQZXJGcmFtZSA9IG1Nc2Vjc1BlckZyYW1lOworICAgIH0KK30KKwogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CkBAIC0xNjQ2LDEzICsxNzMzLDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBdWRpb091dHB1dCAqbWUgPSAoQXVkaW9PdXRwdXQgKiljb29raWU7CisgICAgQ2FsbGJhY2tEYXRhICpkYXRhID0gKENhbGxiYWNrRGF0YSopY29va2llOworICAgIGRhdGEtPmxvY2soKTsKKyAgICBBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOworICAgIGlmIChtZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vIG91dHB1dCBzZXQsIGxpa2VseSBiZWNhdXNlIHRoZSB0cmFjayB3YXMgc2NoZWR1bGVkIHRvIGJlIHJldXNlZAorICAgICAgICAvLyBieSBhbm90aGVyIHBsYXllciwgYnV0IHRoZSBmb3JtYXQgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUuCisgICAgICAgIGRhdGEtPnVubG9jaygpOworICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAogICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUpOwogCi0gICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwKSB7CisgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgRU9TIGJ1dCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LAogICAgICAgICAvLyBrZWVwIHBsYXlpbmcgc2lsZW5jZS4KIApAQCAtMTY2MSw2ICsxNzU3LDcgQEAKICAgICB9CiAKICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgIGRhdGEtPnVubG9jaygpOwogfQogCiBpbnQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA4NWNlYzIyLi5kNGUwZWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApAQCAtNjksNyArNzAsOSBAQAogCiAgICAgY2xhc3MgQXVkaW9PdXRwdXQgOiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKICAgICB7Ci0gICAgcHVibGljOgorICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CisKKyAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKQEAgLTEwNCwxNCArMTA3LDIxIEBACiAKICAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgaXNPbkVtdWxhdG9yKCk7CiAgICAgICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIGdldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE5leHRPdXRwdXQoY29uc3Qgc3A8QXVkaW9PdXRwdXQ+JiBuZXh0T3V0cHV0KTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc3dpdGNoVG9OZXh0T3V0cHV0KCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIG5lZWRzVHJhaWxpbmdQYWRkaW5nKCkgeyByZXR1cm4gbU5leHRPdXRwdXQgPT0gTlVMTDsgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKICAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyKAogICAgICAgICAgICAgICAgIGludCBldmVudCwgdm9pZCAqbWUsIHZvaWQgKmluZm8pOwogCiAgICAgICAgIEF1ZGlvVHJhY2sqICAgICAgICAgICAgIG1UcmFjazsKKyAgICAgICAgQXVkaW9UcmFjayogICAgICAgICAgICAgbVJlY3ljbGVkVHJhY2s7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0PiAgICAgICAgIG1OZXh0T3V0cHV0OwogICAgICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKKyAgICAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CkBAIC0xMjQsNyArMTM0LDM4IEBACiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CiAgICAgICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgIC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKIAotICAgIH07CisgICAgICAgIC8vIENhbGxiYWNrRGF0YSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgQXVkaW9UcmFjayBhcyB0aGUgInVzZXIiIGRhdGEuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byB0YXJnZXQgdGhpcyB0byBhIGRpZmZlcmVudCBPdXRwdXQgb24gdGhlIGZseSwKKyAgICAgICAgLy8gc28gd2UgY2FuJ3QgdXNlIHRoZSBPdXRwdXQgaXRzZWxmIGZvciB0aGlzLgorICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBDYWxsYmFja0RhdGEoQXVkaW9PdXRwdXQgKmNvb2tpZSkgeworICAgICAgICAgICAgICAgIG1EYXRhID0gY29va2llOworICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBnZXRPdXRwdXQoKSB7IHJldHVybiBtRGF0YTt9CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0T3V0cHV0KEF1ZGlvT3V0cHV0KiBuZXdjb29raWUpIHsgbURhdGEgPSBuZXdjb29raWU7IH0KKyAgICAgICAgICAgIC8vIGxvY2svdW5sb2NrIGFyZSB1c2VkIGJ5IHRoZSBjYWxsYmFjayBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwYXlsb2FkIG9mIHRoaXMgb2JqZWN0CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9jaygpIHsgbUxvY2subG9jaygpOyB9CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdW5sb2NrKCkgeyBtTG9jay51bmxvY2soKTsgfQorICAgICAgICAgICAgLy8gYmVnaW5UcmFja1N3aXRjaC9lbmRUcmFja1N3aXRjaCBhcmUgdXNlZCB3aGVuIHRoaXMgb2JqZWN0IGlzIGJlaW5nIGhhbmRlZCBvdmVyCisgICAgICAgICAgICAvLyB0byB0aGUgbmV4dCBzaW5rLgorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGJlZ2luVHJhY2tTd2l0Y2goKSB7IG1Mb2NrLmxvY2soKTsgbVN3aXRjaGluZyA9IHRydWU7IH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBlbmRUcmFja1N3aXRjaCgpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN3aXRjaGluZykgeworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIG1EYXRhOworICAgICAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1Td2l0Y2hpbmc7CisgICAgICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYWxsYmFja0RhdGEpOworICAgICAgICB9OworCisgICAgfTsgLy8gQXVkaW9PdXRwdXQKKwogCiAgICAgY2xhc3MgQXVkaW9DYWNoZSA6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawogICAgIHsKQEAgLTE4NCw3ICsyMjUsNyBAQAogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1Db21tYW5kQ29tcGxldGU7CiAKICAgICAgICAgc3A8VGhyZWFkPiAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQ7Ci0gICAgfTsKKyAgICB9OyAvLyBBdWRpb0NhY2hlCiAKIHB1YmxpYzoKICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUoKTsKQEAgLTI3OCw2ICszMTksNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKIAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBjcmVhdGVQbGF5ZXIocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CiAKQEAgLTM1MCw2ICszOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvd0JpbmRlcjsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQ7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQ7CisgICAgICAgICAgICAgICAgICAgIHNwPENsaWVudD4gICAgICAgICAgICAgICAgICBtTmV4dENsaWVudDsKIAogICAgICAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgogICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jawpAQCAtMzY0LDcgKzQwNyw3IEBACiAjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKICAgICAgICAgICAgICAgICAgICAgQW50YWdvbml6ZXIqICAgICAgICAgICAgICAgIG1BbnRhZ29uaXplcjsKICNlbmRpZgotICAgIH07CisgICAgfTsgLy8gQ2xpZW50CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggMDUyZWJmMC4uNjE5YzE0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC0xNjYsNyArMTY2LDggQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgQUxPR1YoImludm9rZSgpIik7CisgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7CiB9CiAKIHZvaWQgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggMzNlMmY5My4uOWI0ODVkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTEyLDExICsxMiwxMSBAQAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4ICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X251cGxheWVyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDVhZWE4ZDAuLjA0N2I0Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtNTcsOCArNTcsOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvZXhwYXQvbGliIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2ZsYWMvaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCAyM2MzYzc0Li45ZGIzYzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC00MTksNyArNDE5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVRvQ29tcGxldGlvblVzLCB0aW1lVG9Db21wbGV0aW9uVXMgLyAxRTYpOwogCiAgICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IHRpbWVUb0NvbXBsZXRpb25VcyArIG1MYXRlbmN5VXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IHRpbWVUb0NvbXBsZXRpb25VcyArIG1MYXRlbmN5VXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDllMDBiYjMuLmI0Y2IxYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0xMTE0LDcgKzExMTQsNyBAQAogICAgICAgICBtb2RpZnlGbGFncyhBVURJT19SVU5OSU5HLCBDTEVBUik7CiAgICAgfQogCi0gICAgaWYgKG1GbGFncyAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgeworICAgIGlmIChtRmxhZ3MgJiBURVhUUExBWUVSX0lOSVRJQUxJWkVEKSB7CiAgICAgICAgIG1UZXh0RHJpdmVyLT5wYXVzZSgpOwogICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKICAgICB9CkBAIC0xMjY4LDMyICsxMjY4LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW50MzJfdCBpbmRleCkgewotICAgIGlmIChtVGV4dERyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7IC8vIHRvIHR1cm4gb24gYSB0ZXh0IHRyYWNrCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVGV4dERyaXZlci0+c2V0VGltZWRUZXh0VHJhY2tJbmRleChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBTRVQpOwotICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVFBMQVlFUl9TVEFSVEVELCBTRVQpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGVsc2UgeyAvLyB0byB0dXJuIG9mZiB0aGUgdGV4dCB0cmFjayBkaXNwbGF5Ci0gICAgICAgICAgICBpZiAobUZsYWdzICAmIFRFWFRfUlVOTklORykgewotICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRfUlVOTklORywgQ0xFQVIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GbGFncyAgJiBURVhUUExBWUVSX1NUQVJURUQpIHsKLSAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUUExBWUVSX1NUQVJURUQsIENMRUFSKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG1UZXh0RHJpdmVyLT5zZXRUaW1lZFRleHRUcmFja0luZGV4KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNlZWtUb19sKGludDY0X3QgdGltZVVzKSB7CiAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7CiAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CkBAIC0xMzE1LDcgKzEyODksNyBAQAogCiAgICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwogCi0gICAgaWYgKG1GbGFncyAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgeworICAgIGlmIChtRmxhZ3MgJiBURVhUUExBWUVSX0lOSVRJQUxJWkVEKSB7CiAgICAgICAgIG1UZXh0RHJpdmVyLT5zZWVrVG9Bc3luYyhtU2Vla1RpbWVVcyk7CiAgICAgfQogCkBAIC0xNjkxLDggKzE2NjUsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKChtRmxhZ3MgJiBURVhUUExBWUVSX1NUQVJURUQpICYmICEobUZsYWdzICYgKFRFWFRfUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7Ci0gICAgICAgIG1UZXh0RHJpdmVyLT5yZXN1bWUoKTsKKyAgICBpZiAoKG1GbGFncyAmIFRFWFRQTEFZRVJfSU5JVElBTElaRUQpICYmICEobUZsYWdzICYgKFRFWFRfUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7CisgICAgICAgIG1UZXh0RHJpdmVyLT5zdGFydCgpOwogICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIFNFVCk7CiAgICAgfQogCkBAIC0yMjMyLDIwICsyMjA2LDYgQEAKIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgewogICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX1RSQUNLX0lOREVYOgotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVkVGV4dExvY2spOwotICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVkVGV4dFRyYWNrSW5kZXgocmVxdWVzdC5yZWFkSW50MzIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfQUREX09VVF9PRl9CQU5EX1NPVVJDRToKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lZFRleHRMb2NrKTsKLSAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtVGV4dERyaXZlci0+YWRkT3V0T2ZCYW5kVGV4dFNvdXJjZShyZXF1ZXN0KTsKLSAgICAgICAgfQogICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVM6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShyZXF1ZXN0KTsKQEAgLTIyOTQsNiArMjI1NCwxMDMgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBpZiAoTlVMTCA9PSByZXBseSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKyAgICBpbnQzMl90IG1ldGhvZElkOworICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7CisgICAgaWYgKHJldCAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzd2l0Y2gobWV0aG9kSWQpIHsKKyAgICAgICAgY2FzZSBJTlZPS0VfSURfR0VUX1RSQUNLX0lORk86CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UZXh0RHJpdmVyLT5nZXRUcmFja0luZm8ocmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGNhc2UgSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3RyaW5nIHZhbHVlcyB3cml0dGVuIGluIFBhcmNlbCBhcmUgVVRGLTE2IHZhbHVlcy4KKyAgICAgICAgICAgIFN0cmluZzE2IHVyaTE2ID0gcmVxdWVzdC5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSA9IE5VTEw7CisgICAgICAgICAgICBpZiAodXJpMTYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVyaSA9IFN0cmluZzgodXJpMTYpLnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgbWltZVR5cGUxNiA9IHJlcXVlc3QucmVhZFN0cmluZzE2KCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobWltZVR5cGUxNiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWltZVR5cGUgPSBTdHJpbmc4KG1pbWVUeXBlMTYpLnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1UZXh0RHJpdmVyLT5hZGRPdXRPZkJhbmRUZXh0U291cmNlKHVyaSwgbWltZVR5cGUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0VfRkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGZkICAgICAgICAgPSByZXF1ZXN0LnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSByZXF1ZXN0LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCAgPSByZXF1ZXN0LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgU3RyaW5nMTYgbWltZVR5cGUxNiA9IHJlcXVlc3QucmVhZFN0cmluZzE2KCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobWltZVR5cGUxNiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWltZVR5cGUgPSBTdHJpbmc4KG1pbWVUeXBlMTYpLnN0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVRleHREcml2ZXItPmFkZE91dE9mQmFuZFRleHRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZVR5cGUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lZFRleHRMb2NrKTsKKyAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVGV4dERyaXZlci0+c2VsZWN0VHJhY2soCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVhZEludDMyKCkpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRQTEFZRVJfSU5JVElBTElaRUQsIFNFVCk7CisgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIFBMQVlJTkcgJiYgIShtRmxhZ3MgJiBURVhUX1JVTk5JTkcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyLT5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIFNFVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIElOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lZFRleHRMb2NrKTsKKyAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRleHREcml2ZXItPnVuc2VsZWN0VHJhY2soCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVhZEludDMyKCkpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRQTEFZRVJfSU5JVElBTElaRUQsIENMRUFSKTsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorICAgIC8vIEl0IHdpbGwgbm90IHJlYWNoIGhlcmUuCisgICAgcmV0dXJuIE9LOworfQorCiBib29sIEF3ZXNvbWVQbGF5ZXI6OmlzU3RyZWFtaW5nSFRUUCgpIGNvbnN0IHsKICAgICByZXR1cm4gbUNhY2hlZFNvdXJjZSAhPSBOVUxMIHx8IG1XVk1FeHRyYWN0b3IgIT0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDQ0NGU4MjMuLjI1NDlkZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtNTIsNSArNTIsNiBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSA9ICJ2aWRlby93dm0iOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAgPSAidGV4dC8zZ3BwLXR0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQID0gImFwcGxpY2F0aW9uL3gtc3VicmlwIjsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCA5NjY0MTZlLi4yNzhlM2EyIDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggYWIyY2ZmMC4uNzQ4MWUyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgorI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgogCiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CkBAIC01NCw2ICs1NCw5IEBACiAgICAgQUxPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6U3VyZmFjZU1lZGlhU291cmNlIik7CiAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7CiAgICAgbUdyYXBoaWNCdWZmZXJBbGxvYyA9IGNvbXBvc2VyLT5jcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKTsKKyAgICBpZiAobUdyYXBoaWNCdWZmZXJBbGxvYyA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKSBmYWlsZWQgaW4gU3VyZmFjZU1lZGlhU291cmNlKCkiKTsKKyAgICB9CiB9CiAKIFN1cmZhY2VNZWRpYVNvdXJjZTo6flN1cmZhY2VNZWRpYVNvdXJjZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKaW5kZXggMjA5MTM4MS4uZTM2ZDYxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIHN0YXRpYyBib29sIHBhcnNlX3hpbmdfaGVhZGVyKAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywKICAgICAgICAgaW50MzJfdCAqZnJhbWVfbnVtYmVyID0gTlVMTCwgaW50MzJfdCAqYnl0ZV9udW1iZXIgPSBOVUxMLAotICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWJsZV9vZl9jb250ZW50cyA9IE5VTEwsCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhYmxlX29mX2NvbnRlbnRzID0gTlVMTCwgYm9vbCAqdG9jX2lzX3ZhbGlkID0gTlVMTCwKICAgICAgICAgaW50MzJfdCAqcXVhbGl0eV9pbmRpY2F0b3IgPSBOVUxMLCBpbnQ2NF90ICpkdXJhdGlvbiA9IE5VTEwpOwogCiAvLyBzdGF0aWMKQEAgLTM2LDcgKzM2LDcgQEAKIAogICAgIGlmICghcGFyc2VfeGluZ19oZWFkZXIoCiAgICAgICAgICAgICAgICAgc291cmNlLCBmaXJzdF9mcmFtZV9wb3MsCi0gICAgICAgICAgICAgICAgTlVMTCwgJnNlZWtlci0+bVNpemVCeXRlcywgc2Vla2VyLT5tVGFibGVPZkNvbnRlbnRzLAorICAgICAgICAgICAgICAgIE5VTEwsICZzZWVrZXItPm1TaXplQnl0ZXMsIHNlZWtlci0+bVRPQywgJnNlZWtlci0+bVRPQ1ZhbGlkLAogICAgICAgICAgICAgICAgIE5VTEwsICZzZWVrZXItPm1EdXJhdGlvblVzKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIGJvb2wgWElOR1NlZWtlcjo6Z2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcykgewotICAgIGlmIChtU2l6ZUJ5dGVzID09IDAgfHwgbVRhYmxlT2ZDb250ZW50c1swXSA8PSAwIHx8IG1EdXJhdGlvblVzIDwgMCkgeworICAgIGlmIChtU2l6ZUJ5dGVzID09IDAgfHwgIW1UT0NWYWxpZCB8fCBtRHVyYXRpb25VcyA8IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNzYsMTAgKzc2LDEwIEBACiAgICAgICAgIGlmICggYSA9PSAwICkgewogICAgICAgICAgICAgZmEgPSAwLjBmOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmEgPSAoZmxvYXQpbVRhYmxlT2ZDb250ZW50c1thLTFdOworICAgICAgICAgICAgZmEgPSAoZmxvYXQpbVRPQ1thLTFdOwogICAgICAgICB9CiAgICAgICAgIGlmICggYSA8IDk5ICkgewotICAgICAgICAgICAgZmIgPSAoZmxvYXQpbVRhYmxlT2ZDb250ZW50c1thXTsKKyAgICAgICAgICAgIGZiID0gKGZsb2F0KW1UT0NbYV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmYiA9IDI1Ni4wZjsKICAgICAgICAgfQpAQCAtOTQsNyArOTQsOCBAQAogc3RhdGljIGJvb2wgcGFyc2VfeGluZ19oZWFkZXIoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLAogICAgICAgICBpbnQzMl90ICpmcmFtZV9udW1iZXIsIGludDMyX3QgKmJ5dGVfbnVtYmVyLAotICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWJsZV9vZl9jb250ZW50cywgaW50MzJfdCAqcXVhbGl0eV9pbmRpY2F0b3IsCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhYmxlX29mX2NvbnRlbnRzLCBib29sICp0b2NfdmFsaWQsCisgICAgICAgIGludDMyX3QgKnF1YWxpdHlfaW5kaWNhdG9yLAogICAgICAgICBpbnQ2NF90ICpkdXJhdGlvbikgewogICAgIGlmIChmcmFtZV9udW1iZXIpIHsKICAgICAgICAgKmZyYW1lX251bWJlciA9IDA7CkBAIC0xMDIsOCArMTAzLDggQEAKICAgICBpZiAoYnl0ZV9udW1iZXIpIHsKICAgICAgICAgKmJ5dGVfbnVtYmVyID0gMDsKICAgICB9Ci0gICAgaWYgKHRhYmxlX29mX2NvbnRlbnRzKSB7Ci0gICAgICAgIHRhYmxlX29mX2NvbnRlbnRzWzBdID0gMDsKKyAgICBpZiAodG9jX3ZhbGlkKSB7CisgICAgICAgICp0b2NfdmFsaWQgPSBmYWxzZTsKICAgICB9CiAgICAgaWYgKHF1YWxpdHlfaW5kaWNhdG9yKSB7CiAgICAgICAgICpxdWFsaXR5X2luZGljYXRvciA9IDA7CkBAIC0xOTksMTAgKzIwMCwxMyBAQAogICAgICAgICBvZmZzZXQgKz0gNDsKICAgICB9CiAgICAgaWYgKGZsYWdzICYgMHgwMDA0KSB7ICAvLyBUT0MgZmllbGQgaXMgcHJlc2VudAotICAgICAgIGlmICh0YWJsZV9vZl9jb250ZW50cykgeworICAgICAgICBpZiAodGFibGVfb2ZfY29udGVudHMpIHsKICAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAxLCB0YWJsZV9vZl9jb250ZW50cywgOTkpIDwgOTkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9jX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgKnRvY192YWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IDEwMDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKaW5kZXggNjM3NzVmMS4uZTM3YjRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2Nocm9taXVtIFwKICAgICAgICAgZXh0ZXJuYWwvY2hyb21pdW0vYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKaW5kZXggMjBjN2JjMC4uZmQ2ZGU3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKaW5kZXggNTA5MTkzYy4uYjQ3Y2IxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tawpAQCAtOTQsOSArOTQsOSBAQAogICAgICAgICBTb2Z0QUFDRW5jb2Rlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUgXAorCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCAyM2EyMmVmLi5iODEzMDZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC02MSwxMiArNjEsMTIgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24gXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uCiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCmluZGV4IDk0ZTg3MjYuLjIxOTM3YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKQEAgLTg0LDcgKzg0LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCmluZGV4IDZjZTYxNzEuLjNhNDZlYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCkBAIC0xMjUsOSArMTI1LDkgQEAKICAgICAgICAgU29mdEFNUldCRW5jb2Rlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUgXAorCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCmluZGV4IGViMmUzMjAuLjU0Y2M5YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMjUsOCArMjUsOCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAogICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAtRF9fYXJtX18gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawppbmRleCA2NjkyNTMzLi40MjcwNmE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpAQCAtNiw3ICs2LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawppbmRleCAyZmZhNWYyLi44YzI0NWQxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDIsNyArNDIsNyBAQAogCSQoTE9DQUxfUEFUSCkvc3JjIFwKIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKQEAgLTU5LDcgKzU5LDcgQEAKIAkkKExPQ0FMX1BBVEgpL3NyYyBcCiAJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawppbmRleCA0MzMxOGU5Li4yYjdjOTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0zMSw3ICszMSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawppbmRleCBhMDhjOWYwLi5lZDUxYWE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCkBAIC02NSw3ICs2NSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCAzMmJiZDZiLi4yOTk3MjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTksNyArOSw3IEBACiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvdnB4X2NvZGVjIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfcG9ydHMgXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidnB4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCmluZGV4IDViM2M4NzYuLjQzYzIwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC0zNSw3ICszNSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uL2luYyBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKIE1ZX0FTTSA6PSBcCiAJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKaW5kZXggZjMzZjNhYy4uZmNhNzBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCkBAIC03LDcgKzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIGV4dGVybmFsL3RyZW1vbG8gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidm9yYmlzaWRlYyBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawppbmRleCA2MmJhNDBmLi41OWE2NGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawpAQCAtNiw3ICs2LDcgQEAKICAgICAgICAgU29mdHdhcmVSZW5kZXJlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9oYXJkd2FyZS9tc203awogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCA5MjI1ZTQxLi5hNTk5MGMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTksOSArOSw5IEBACiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCA0YzdiZmE2Li4wNmU5NDY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtOTAsNiArOTAsNyBAQAogCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworICAgIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwogICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwpAQCAtMTAwLDggKzEwMSw2IEBACiAgICAgdm9pZCBwb3N0QXVkaW9FT1MoaW50NjRfdCBkZWxheVVzID0gMGxsKTsKICAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwogCi0gICAgc3RhdHVzX3Qgc2V0VGltZWRUZXh0VHJhY2tJbmRleChpbnQzMl90IGluZGV4KTsKLQogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKQEAgLTEzNiw3ICsxMzUsNyBAQAogICAgICAgICBJTkNPR05JVE8gICAgICAgICAgID0gMHg4MDAwLAogCiAgICAgICAgIFRFWFRfUlVOTklORyAgICAgICAgPSAweDEwMDAwLAotICAgICAgICBURVhUUExBWUVSX1NUQVJURUQgID0gMHgyMDAwMCwKKyAgICAgICAgVEVYVFBMQVlFUl9JTklUSUFMSVpFRCAgPSAweDIwMDAwLAogCiAgICAgICAgIFNMT1dfREVDT0RFUl9IQUNLICAgPSAweDQwMDAwLAogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCmluZGV4IGVjNWJkOWIuLjg1MTA5NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCkBAIC0zNyw3ICszNyw4IEBACiAgICAgaW50MzJfdCBtU2l6ZUJ5dGVzOwogCiAgICAgLy8gVE9DIGVudHJpZXMgaW4gWElORyBoZWFkZXIuIFNraXAgdGhlIGZpcnN0IG9uZSBzaW5jZSBpdCdzIGFsd2F5cyAwLgotICAgIHVuc2lnbmVkIGNoYXIgbVRhYmxlT2ZDb250ZW50c1s5OV07CisgICAgdW5zaWduZWQgY2hhciBtVE9DWzk5XTsKKyAgICBib29sIG1UT0NWYWxpZDsKIAogICAgIFhJTkdTZWVrZXIoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggMWYxYzY4Yi4uZTY3ZGE0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC03LDcgKzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbWt2cGFyc2VyIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawppbmRleCA1NzhjNjY5Li5hYzRjMmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCkBAIC0xMSw4ICsxMSw4IEBACiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0CisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKaW5kZXggZDg0NGYzZC4uZjU4N2E5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAppbmRleCBmZWVlMWY5Li42MDY5NzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgT01YX01BU1RFUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oPgorI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCAwOTljNGY1Li5iZmYzZGVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjQsOCArMjQsOCBAQAogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKaW5kZXggZjkzYzMyMy4uYzg5Y2Q4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIFNPRlRfT01YX1BMVUdJTl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxPTVhQbHVnaW5CYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawppbmRleCAwYzBhNzBjLi4wN2Q0N2E4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFIDo9IG9teF90ZXN0cwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKaW5kZXggODIzMDM0Ny4uYjNiYzM3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpAQCAtMTksOSArMTksOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisJJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9ydHNwCiAKQEAgLTQ3LDcgKzQ3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDM1N2ZlYjEuLjY1NmE2MzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawpAQCAtMzgsNyArMzgsNyBAQAogICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IDNkY2Q5ZmMuLmZlNzdjZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0KCksIE5VTEwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5vIGFjdHVhbCBkaXNwbGF5LiBDaG9vc2luZyBFR0xTdXJmYWNlIGJhc2VkIG9uIFN1cmZhY2VNZWRpYVNvdXJjZSIpOwotICAgICAgICAgICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBzbXMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKAorICAgICAgICAgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzbXMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKAogICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKTsKICAgICAgICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiBzdGMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc21zKTsKICAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyA9IHN0YzsKQEAgLTM2MCw3ICszNjAsOCBAQAogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7CiAgICAgICAgIG1TTVMtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKTsKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChtU01TKTsKKyAgICAgICAgLy8gTWFudWFsIGNhc3QgaXMgcmVxdWlyZWQgdG8gYXZvaWQgY29uc3RydWN0b3IgYW1iaWd1aXR5CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3RhdGljX2Nhc3Q8c3A8SVN1cmZhY2VUZXh0dXJlPiA+KCBtU01TKSk7CiAgICAgICAgIG1BTlcgPSBtU1RDOwogICAgIH0KIApAQCAtMzk1LDcgKzM5Niw3IEBACiAgICAgICAgIEFMT0dWKCJTTVMtR0xUZXN0OjpTZXRVcCgpIik7CiAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChtU01TKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChzdGF0aWNfY2FzdDxzcDxJU3VyZmFjZVRleHR1cmU+ID4oIG1TTVMpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAKICAgICAgICAgLy8gRG9pbmcgdGhlIHNldHVwIHJlbGF0ZWQgdG8gdGhlIEdMIFNpZGUKQEAgLTc3Myw3ICs3NzQsNyBAQAogICAgIEFMT0dWKCJWZXJpZnkgY3JlYXRpbmcgYSBzdXJmYWNlIHcvIHJpZ2h0IGNvbmZpZyArIGR1bW15IHdyaXRlcioqKioqKioqKiIpOwogCiAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KG1TTVMpOworICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3RhdGljX2Nhc3Q8c3A8SVN1cmZhY2VUZXh0dXJlPiA+KCBtU01TKSk7CiAgICAgbUFOVyA9IG1TVEM7CiAKICAgICBEdW1teVJlY29yZGVyIHdyaXRlcihtU01TKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHQzR1BQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHQzR1BQU291cmNlLmNwcAppbmRleCA0YTNiZmQzLi5jNDIzZWYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0M0dQUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dDNHUFBTb3VyY2UuY3BwCkBAIC0xMTAsNCArMTEwLDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NwPE1ldGFEYXRhPiBUaW1lZFRleHQzR1BQU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dDNHUFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHQzR1BQU291cmNlLmgKaW5kZXggZGZjNjQxOC4uNGVjM2Q4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dDNHUFBTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0M0dQUFNvdXJjZS5oCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICAgICAgICBQYXJjZWwgKnBhcmNlbCwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZXh0cmFjdEdsb2JhbERlc2NyaXB0aW9ucyhQYXJjZWwgKnBhcmNlbCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5UaW1lZFRleHQzR1BQU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCmluZGV4IGM3MDg3MGUuLmVkODM4OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCkBAIC0yMCwxMCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNDcsMjQgKzUwLDIyIEBACiB9CiAKIFRpbWVkVGV4dERyaXZlcjo6flRpbWVkVGV4dERyaXZlcigpIHsKLSAgICBtVGV4dEluQmFuZFZlY3Rvci5jbGVhcigpOwotICAgIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLmNsZWFyKCk7CisgICAgbVRleHRTb3VyY2VWZWN0b3IuY2xlYXIoKTsKICAgICBtTG9vcGVyLT5zdG9wKCk7CiB9CiAKLXN0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c2V0VGltZWRUZXh0VHJhY2tJbmRleF9sKGludDMyX3QgaW5kZXgpIHsKLSAgICBpZiAoaW5kZXggPj0KLSAgICAgICAgICAgIChpbnQpKG1UZXh0SW5CYW5kVmVjdG9yLnNpemUoKSArIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLnNpemUoKSkpIHsKK3N0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c2VsZWN0VHJhY2tfbChpbnQzMl90IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IChpbnQpKG1UZXh0U291cmNlVmVjdG9yLnNpemUoKSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBzcDxUaW1lZFRleHRTb3VyY2U+IHNvdXJjZTsKLSAgICBpZiAoaW5kZXggPCBtVGV4dEluQmFuZFZlY3Rvci5zaXplKCkpIHsKLSAgICAgICAgc291cmNlID0gbVRleHRJbkJhbmRWZWN0b3IuaXRlbUF0KGluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzb3VyY2UgPSBtVGV4dE91dE9mQmFuZFZlY3Rvci5pdGVtQXQoaW5kZXggLSBtVGV4dEluQmFuZFZlY3Rvci5zaXplKCkpOwotICAgIH0KKyAgICBzb3VyY2UgPSBtVGV4dFNvdXJjZVZlY3Rvci5pdGVtQXQoaW5kZXgpOwogICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgbVN0YXRlID0gUEFVU0VEOworICAgIH0KKyAgICBtQ3VycmVudFRyYWNrSW5kZXggPSBpbmRleDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTczLDEzICs3NCwxMCBAQAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBMQVlJTkc6CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGNhc2UgUEFVU0VEOgotICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwpAQCAtODgsMTAgKzg2LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c3RvcCgpIHsKLSAgICByZXR1cm4gcGF1c2UoKTsKLX0KLQogLy8gVE9ETzogVGVzdCBpZiBwYXVzZSgpIHdvcmtzIHByb3Blcmx5LgogLy8gU2NlbmFyaW8gMTogc3RhcnQgLSBwYXVzZSAtIHJlc3VtZQogLy8gU2NlbmFyaW8gMjogc3RhcnQgLSBzZWVrCkBAIC0xMDEsOCArOTUsNiBAQAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBjYXNlIFBMQVlJTkc6CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTUsNDUgKzEwNywxNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgVGltZWRUZXh0RHJpdmVyOjpyZXN1bWUoKSB7Ci0gICAgcmV0dXJuIHN0YXJ0KCk7Ci19Ci0KLXN0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c2Vla1RvQXN5bmMoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyh0aW1lVXMpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVGltZWRUZXh0RHJpdmVyOjpzZXRUaW1lZFRleHRUcmFja0luZGV4KGludDMyX3QgaW5kZXgpIHsKLSAgICAvLyBUT0RPOiBUaGlzIGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIE1lZGlhUGxheWVyOjpkaXNhYmxlVGltZWRUZXh0KCkuCi0gICAgLy8gRmluZCBiZXR0ZXIgd2F5IGZvciByZWFkYWJpbGl0eS4KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KK3N0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c2VsZWN0VHJhY2soaW50MzJfdCBpbmRleCkgewogICAgIHN0YXR1c190IHJldCA9IE9LOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOgotICAgICAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBQQVVTRUQ6Ci0gICAgICAgICAgICByZXQgPSBzZXRUaW1lZFRleHRUcmFja0luZGV4X2woaW5kZXgpOworICAgICAgICAgICAgcmV0ID0gc2VsZWN0VHJhY2tfbChpbmRleCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBQTEFZSU5HOgogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgIHJldCA9IHNldFRpbWVkVGV4dFRyYWNrSW5kZXhfbChpbmRleCk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBFRDoKLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBTVE9QUEVEIGFuZCBQQVVTRUQgaXMgdGhpcwotICAgICAgICAgICAgLy8gcGFydC4gUmV2aXNlIHRoZSBmbG93IGZyb20gIk1lZGlhUGxheWVyOjplbmFibGVUaW1lZFRleHQoKSIgYW5kCi0gICAgICAgICAgICAvLyByZW1vdmUgb25lIG9mIHRoZSBzdGF0dXMsIFBBVVNFRCBhbmQgU1RPUFBFRCwgaWYgcG9zc2libGUuCi0gICAgICAgICAgICByZXQgPSBzZXRUaW1lZFRleHRUcmFja0luZGV4X2woaW5kZXgpOworICAgICAgICAgICAgcmV0ID0gc2VsZWN0VHJhY2tfbChpbmRleCk7CiAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNjUsNiArMTI5LDI0IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgVGltZWRUZXh0RHJpdmVyOjp1bnNlbGVjdFRyYWNrKGludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAobUN1cnJlbnRUcmFja0luZGV4ICE9IGluZGV4KSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gcGF1c2UoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVN0YXRlID0gVU5JTklUSUFMSVpFRDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6c2Vla1RvQXN5bmMoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyh0aW1lVXMpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgVGltZWRUZXh0RHJpdmVyOjphZGRJbkJhbmRUZXh0U291cmNlKAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIG1lZGlhU291cmNlKSB7CiAgICAgc3A8VGltZWRUZXh0U291cmNlPiBzb3VyY2UgPQpAQCAtMTczLDI1ICsxNTUsMTcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1UZXh0SW5CYW5kVmVjdG9yLmFkZChzb3VyY2UpOwotICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwotICAgIH0KKyAgICBtVGV4dFNvdXJjZVZlY3Rvci5hZGQoc291cmNlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFRpbWVkVGV4dERyaXZlcjo6YWRkT3V0T2ZCYW5kVGV4dFNvdXJjZSgKLSAgICAgICAgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqbWltZVR5cGUpIHsKICAgICAvLyBUT0RPOiBEZWZpbmUgIlRpbWVkVGV4dFNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpIgogICAgIC8vIGFuZCBtb3ZlIGJlbG93IGxpbmVzIHRoZXJlLi4/CiAKLSAgICAvLyBTdHJpbmcgdmFsdWVzIHdyaXR0ZW4gaW4gUGFyY2VsIGFyZSBVVEYtMTYgdmFsdWVzLgotICAgIGNvbnN0IFN0cmluZzE2IHVyaTE2ID0gcmVxdWVzdC5yZWFkU3RyaW5nMTYoKTsKLSAgICBTdHJpbmc4IHVyaSA9IFN0cmluZzgocmVxdWVzdC5yZWFkU3RyaW5nMTYoKSk7Ci0KLSAgICB1cmkudG9Mb3dlcigpOwogICAgIC8vIFRvIHN1cHBvcnQgbG9jYWwgc3VidGl0bGUgZmlsZSBvbmx5IGZvciBub3cKLSAgICBpZiAoc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmkuc3RyaW5nKCksIDcpKSB7CisgICAgaWYgKHN0cm5jYXNlY21wKCJmaWxlOi8vIiwgdXJpLCA3KSkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQpAQCAtMjAxLDcgKzE3NSw3IEBACiAgICAgfQogCiAgICAgc3A8VGltZWRUZXh0U291cmNlPiBzb3VyY2U7Ci0gICAgaWYgKHVyaS5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gU3RyaW5nOCgiLnNydCIpKSB7CisgICAgaWYgKHN0cmNhc2VjbXAobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQKSkgewogICAgICAgICBzb3VyY2UgPSBUaW1lZFRleHRTb3VyY2U6OkNyZWF0ZVRpbWVkVGV4dFNvdXJjZSgKICAgICAgICAgICAgICAgICBkYXRhU291cmNlLCBUaW1lZFRleHRTb3VyY2U6Ok9VVF9PRl9CQU5EX0ZJTEVfU1JUKTsKICAgICB9CkBAIC0yMTEsMTIgKzE4NSwzOCBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtVGV4dE91dE9mQmFuZFZlY3Rvci5hZGQoc291cmNlKTsKLSAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICB9CisgICAgbVRleHRTb3VyY2VWZWN0b3IuYWRkKHNvdXJjZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBUaW1lZFRleHREcml2ZXI6OmFkZE91dE9mQmFuZFRleHRTb3VyY2UoCisgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSB7CisgICAgLy8gTm90IHN1cHBvcnRlZCB5ZXQuIFRoaXMgcmVxdWlyZXMgRGF0YVNvdXJjZTo6c25pZmYgdG8gZGV0ZWN0IHZhcmlvdXMgdGV4dAorICAgIC8vIGZvcm1hdHMgc3VjaCBhcyBzcnQvc21pL3R0bWwuCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCit2b2lkIFRpbWVkVGV4dERyaXZlcjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBWZWN0b3I8c3A8VGltZWRUZXh0U291cmNlPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtVGV4dFNvdXJjZVZlY3Rvci5zaXplKCkpOworICAgIGZvciAoaXRlciA9IG1UZXh0U291cmNlVmVjdG9yLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IG1UZXh0U291cmNlVmVjdG9yLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSAoKml0ZXIpLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBmaWVsZHMuCisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMik7CisKKyAgICAgICAgICAgIC8vIHRyYWNrIHR5cGUuCisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpOworCisgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gInVuZCI7CisgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgJmxhbmcpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKaW5kZXggYmRhN2I0Ni4uODcxNzkxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKQEAgLTU2LDEwICs1Niw2IEBACiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKIH0KIAotdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnJlc3VtZSgpIHsKLSAgICBzdGFydCgpOwotfQotCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6c2Vla1RvQXN5bmMoaW50NjRfdCB0aW1lVXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHRpbWVVcyk7CkBAIC0xMDQsOSArMTAwLDkgQEAKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNwPFBhcmNlbEV2ZW50PiBwYXJjZWxFdmVudDsKICAgICAgICAgICAgICAgICBwYXJjZWxFdmVudCA9IHN0YXRpY19jYXN0PFBhcmNlbEV2ZW50Kj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhULCAmKHBhcmNlbEV2ZW50LT5wYXJjZWwpKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigmKHBhcmNlbEV2ZW50LT5wYXJjZWwpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCk7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRvUmVhZCgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTksMTQgKzExNSwxOCBAQAogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxUaW1lZFRleHRTb3VyY2UqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgICAgIFBhcmNlbCBwYXJjZWw7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZS0+ZXh0cmFjdEdsb2JhbERlc2NyaXB0aW9ucygmcGFyY2VsKSA9PSBPSyAmJgotICAgICAgICAgICAgICAgIHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsICZwYXJjZWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhUKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbCBwYXJjZWw7CisgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5leHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKCZwYXJjZWwpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigmcGFyY2VsKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTQxLDggKzE0MSwxMiBAQAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OmRvUmVhZChNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqIG9wdGlvbnMpIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CiAgICAgc3A8UGFyY2VsRXZlbnQ+IHBhcmNlbEV2ZW50ID0gbmV3IFBhcmNlbEV2ZW50KCk7Ci0gICAgbVNvdXJjZS0+cmVhZCgmdGltZVVzLCAmKHBhcmNlbEV2ZW50LT5wYXJjZWwpLCBvcHRpb25zKTsKLSAgICBwb3N0VGV4dEV2ZW50KHBhcmNlbEV2ZW50LCB0aW1lVXMpOworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJnRpbWVVcywgJihwYXJjZWxFdmVudC0+cGFyY2VsKSwgb3B0aW9ucyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBub3RpZnlFcnJvcihlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBvc3RUZXh0RXZlbnQocGFyY2VsRXZlbnQsIHRpbWVVcyk7CisgICAgfQogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6cG9zdFRleHRFdmVudChjb25zdCBzcDxQYXJjZWxFdmVudD4mIHBhcmNlbCwgaW50NjRfdCB0aW1lVXMpIHsKQEAgLTE1MSw3ICsxNTUsNyBAQAogICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXMsIGRlbGF5VXM7CiAgICAgICAgIGludDMyX3QgcG9zaXRpb25NcyA9IDA7CiAgICAgICAgIGxpc3RlbmVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnBvc2l0aW9uTXMpOwotICAgICAgICBwb3NpdGlvblVzID0gcG9zaXRpb25NcyAqIDEwMDA7CisgICAgICAgIHBvc2l0aW9uVXMgPSBwb3NpdGlvbk1zICogMTAwMGxsOwogCiAgICAgICAgIGlmICh0aW1lVXMgPD0gcG9zaXRpb25VcyArIGtBZGp1c3RtZW50UHJvY2Vzc2luZ1RpbWVVcykgewogICAgICAgICAgICAgZGVsYXlVcyA9IDA7CkBAIC0xNjcsMTMgKzE3MSwyMCBAQAogICAgIH0KIH0KIAotdm9pZCBUaW1lZFRleHRQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyKGludCBtc2csIGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7Cit2b2lkIFRpbWVkVGV4dFBsYXllcjo6bm90aWZ5RXJyb3IoaW50IGVycm9yKSB7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChNRURJQV9JTkZPLCBNRURJQV9JTkZPX1RJTUVEX1RFWFRfRVJST1IsIGVycm9yKTsKKyAgICB9Cit9CisKK3ZvaWQgVGltZWRUZXh0UGxheWVyOjpub3RpZnlMaXN0ZW5lcihjb25zdCBQYXJjZWwgKnBhcmNlbCkgewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChwYXJjZWwgIT0gTlVMTCAmJiAocGFyY2VsLT5kYXRhU2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnLCAwLCAwLCBwYXJjZWwpOworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChNRURJQV9USU1FRF9URVhULCAwLCAwLCBwYXJjZWwpOwogICAgICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0IHRvIGNsZWFyIHRoZSBzY3JlZW4KLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoTUVESUFfVElNRURfVEVYVCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgKaW5kZXggODM3YmVlYi4uYjg2OWYxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuaApAQCAtNDAsNyArNDAsNiBAQAogCiAgICAgdm9pZCBzdGFydCgpOwogICAgIHZvaWQgcGF1c2UoKTsKLSAgICB2b2lkIHJlc3VtZSgpOwogICAgIHZvaWQgc2Vla1RvQXN5bmMoaW50NjRfdCB0aW1lVXMpOwogICAgIHZvaWQgc2V0RGF0YVNvdXJjZShzcDxUaW1lZFRleHRTb3VyY2U+IHNvdXJjZSk7CiAKQEAgLTY4LDcgKzY3LDggQEAKICAgICB2b2lkIGRvUmVhZChNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqIG9wdGlvbnMgPSBOVUxMKTsKICAgICB2b2lkIG9uVGV4dEV2ZW50KCk7CiAgICAgdm9pZCBwb3N0VGV4dEV2ZW50KGNvbnN0IHNwPFBhcmNlbEV2ZW50PiYgcGFyY2VsID0gTlVMTCwgaW50NjRfdCB0aW1lVXMgPSAtMSk7Ci0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBjb25zdCBQYXJjZWwgKnBhcmNlbCA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yID0gMCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihjb25zdCBQYXJjZWwgKnBhcmNlbCA9IE5VTEwpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0UGxheWVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U1JUU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuY3BwCmluZGV4IDM3NTJkMzQuLmM0NGE5OWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuY3BwCkBAIC0yMSw4ICsyMSwxMCBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+ICAvLyBmb3IgTUVESUFfTUlNRVRZUEVfeHh4CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKICNpbmNsdWRlICJUaW1lZFRleHRTUlRTb3VyY2UuaCIKICNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCkBAIC0zMSw2ICszMyw3IEBACiAKIFRpbWVkVGV4dFNSVFNvdXJjZTo6VGltZWRUZXh0U1JUU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKQogICAgICAgICA6IG1Tb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCiAgICAgICAgICAgbUluZGV4KDApIHsKIH0KIApAQCAtNDIsMTAgKzQ1LDE0IEBACiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXNldCgpOwogICAgIH0KKyAgICAvLyBUT0RPOiBOZWVkIHRvIGRldGVjdCB0aGUgbGFuZ3VhZ2UsIGJlY2F1c2UgU1JUIGRvZXNuJ3QgZ2l2ZSBsYW5ndWFnZQorICAgIC8vIGluZm9ybWF0aW9uIGV4cGxpY2l0bHkuCisgICAgbU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCAiIik7CiAgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBUaW1lZFRleHRTUlRTb3VyY2U6OnJlc2V0KCkgeworICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKICAgICBtVGV4dFZlY3Rvci5jbGVhcigpOwogICAgIG1JbmRleCA9IDA7CiB9CkBAIC0yNzIsNCArMjc5LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NwPE1ldGFEYXRhPiBUaW1lZFRleHRTUlRTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbU1ldGFEYXRhOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oCmluZGV4IGFjYzAxZjkuLjYyNzEwYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U1JUU291cmNlLmgKQEAgLTM5LDEyICszOSwxNCBAQAogICAgICAgICAgICAgaW50NjRfdCAqdGltZVVzLAogICAgICAgICAgICAgUGFyY2VsICpwYXJjZWwsCiAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflRpbWVkVGV4dFNSVFNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhRGF0YTsKIAogICAgIHN0cnVjdCBUZXh0SW5mbyB7CiAgICAgICAgIGludDY0X3QgZW5kVGltZVVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmNwcAppbmRleCBmZmJlMWMzLi45NTNmN2I1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmNwcApAQCAtNTksNCArNTksOCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzcDxNZXRhRGF0YT4gVGltZWRUZXh0U291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmgKaW5kZXggMDZiYWU3MS4uOTM0OTM0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaApAQCAtMjUsNiArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBEYXRhU291cmNlOworY2xhc3MgTWV0YURhdGE7CiBjbGFzcyBQYXJjZWw7CiAKIGNsYXNzIFRpbWVkVGV4dFNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTQ4LDYgKzQ5LDcgQEAKICAgdmlydHVhbCBzdGF0dXNfdCBleHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKFBhcmNlbCAqcGFyY2VsKSB7CiAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgIH0KKyAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICBwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgflRpbWVkVGV4dFNvdXJjZSgpIHsgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKaW5kZXggMDU1OTgxMi4uNGU5YjRjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCkBAIC0xMSwxMiArMTEsMTIgQEAKIAlsaWJ1dGlscyBcCiAJbGliYmluZGVyCiAKLWJhc2UgOj0gJChMT0NBTF9QQVRIKS8uLi8uLgotCisjIEZJWE1FIFRoZSBkdXBsaWNhdGUgYXVkaW9mbGluZ2VyIGlzIHRlbXBvcmFyeQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChiYXNlKS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoYmFzZSkvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAotICAgICQoYmFzZSkvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAorICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UKIAogTE9DQUxfTU9EVUxFOj0gbWVkaWFzZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCAxNTIwYzAxLi42YjFhYmIxIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMTYsMTYgKzE2LDE4IEBACiAqLwogCiAjZGVmaW5lIExPR19UQUcgIm1lZGlhc2VydmVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPEF1ZGlvRmxpbmdlci5oPgotI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxBdWRpb1BvbGljeVNlcnZpY2UuaD4KKy8vIGZyb20gTE9DQUxfQ19JTkNMVURFUworI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rCmluZGV4IDAyNWExMzEuLjNlMDlhNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5tawpAQCAtNDAsOSArNDAsOSBAQAogICAgICQoVE9QKS9leHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMgXAogICAgICQoVE9QKS9leHRlcm5hbC9za2lhL2luY2x1ZGUvZWZmZWN0cyBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS8gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS8gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFIDo9IGpwZWdfYmVuY2gKIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggOTNkODY3NS4uMmFjZjU1NCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCkBAIC01Niw4ICs1Niw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJ1c2JfYWNjZXNzb3J5X3VyaV9wcm9tcHQiIG1zZ2lkPSI1MTM0NTA2MjE0MTM3MzMzNDMiPiJUaWRhayBhZGEgYXBsIHRlcnBhc2FuZyB5YW5nIGJla2VyamEgZGVuZ2FuIGFrc2Vzb3JpIFVTQiBpbmkuIFBlbGFqYXJpIGxlYmloIGxhbmp1dCB0ZW50YW5nIGFrc2Vzb3JpIGluaSBkaSA8eGxpZmY6ZyBpZD0iVVJMIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRpdGxlX3VzYl9hY2Nlc3NvcnkiIG1zZ2lkPSI0OTY2MjY1MjYzNDY1MTgxMzcyIj4iQWtzZXNvcmkgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFiZWxfdmlldyIgbXNnaWQ9IjYzMDQ1NjU1NTMyMTgxOTI5OTAiPiJMaWhhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c191c2VfZGV2aWNlIiBtc2dpZD0iMTQ1MDI4NzQzNzAxNzMxNTkwNiI+Ikd1bmFrYW4gc2VjYXJhIGJhd2FhbiB1bnR1ayBwZXJhbmdrYXQgVVNCIGluaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c191c2VfYWNjZXNzb3J5IiBtc2dpZD0iMTIxMDk1NDU3Njk3OTYyMTU5NiI+Ikd1bmFrYW4gc2VjYXJhIGJhd2FhbiB1bnR1ayBha3Nlc29yaSBVU0IgaW5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWx3YXlzX3VzZV9kZXZpY2UiIG1zZ2lkPSIxNDUwMjg3NDM3MDE3MzE1OTA2Ij4iR3VuYWthbiBzZWNhcmEgZGVmYXVsdCB1bnR1ayBwZXJhbmdrYXQgVVNCIGluaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c191c2VfYWNjZXNzb3J5IiBtc2dpZD0iMTIxMDk1NDU3Njk3OTYyMTU5NiI+Ikd1bmFrYW4gc2VjYXJhIGRlZmF1bHQgdW50dWsgYWtzZXNvcmkgVVNCIGluaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvbXBhdF9tb2RlX29uIiBtc2dpZD0iNjYyMzgzOTI0NDg0MDYzODIxMyI+IlBlcmJlc2FyIHV0ayBtZW5naXNpIGxheWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29tcGF0X21vZGVfb2ZmIiBtc2dpZD0iNDQzNDQ2NzU3MjQ2MTMyNzg5OCI+IlJlbnRhbmdrbiB1dGsgbW5naXNpIGxheWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29tcGF0X21vZGVfaGVscF9oZWFkZXIiIG1zZ2lkPSI3OTY5NDkzOTg5Mzk3NTI5OTEwIj4iUGVyYmVzYXIvcGVya2VjaWwgdW50dWsga29tcGF0aWJpbGl0YXMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQppbmRleCBlMGEwZDJkLi5hMWY3MzE2IDEwMDc1NQotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTE3LDggKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGw7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSVVpTW9kZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5hcHAuVWlNb2RlTWFuYWdlcjsKQEAgLTM4MzIsMTAgKzM4MzIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydEFjdGl2aXR5KG51bGwsIGRvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jay5yZXNvbHZlVHlwZUlmTmVlZGVkKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCBudWxsLCBudWxsLCAwLCB0cnVlIC8qIG9ubHlJZk5lZWRlZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRlYnVnICovLCBmYWxzZSAvKiBvcGVuZ2xUcmFjZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9GTEFHX09OTFlfSUZfTkVFREVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM4NDMsMTAgKzM4NDMsMTAgQEAKICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdHkobnVsbCwgbUhvbWVJbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ib21lSW50ZW50LnJlc29sdmVUeXBlSWZOZWVkZWQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCBudWxsLCBudWxsLCAwLCB0cnVlIC8qIG9ubHlJZk5lZWRlZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkZWJ1ZyAqLywgZmFsc2UgLyogb3BlbmdsVHJhY2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0ZMQUdfT05MWV9JRl9ORUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1JFVFVSTl9JTlRFTlRfVE9fQ0FMTEVSKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggODY2OTJlNy4uNTE2NDIxMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTEyLDggKzEyLDggQEAKICMgICBBdWRpb1Jlc2FtcGxlckN1YmljLmNwcC5hcm0KIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW91dGlscyBcCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGJmYTRhNDkuLmQ4M2QxOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0zNyw4ICszNywxMiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAKKyN1bmRlZiBBRERfQkFUVEVSWV9EQVRBCisKKyNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgpAQCAtNTcsOSArNjEsMTMgQEAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAotI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgorCiAvLyAjZGVmaW5lIERFQlVHX0NQVV9VU0FHRSAxMCAgLy8gbG9nIHN0YXRpc3RpY3MgZXZlcnkgbiB3YWxsIGNsb2NrIHNlY29uZHMKKyNpZmRlZiBERUJVR19DUFVfVVNBR0UKKyNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvY2NfaGVscGVyLmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaD4KQEAgLTEwNSw2ICsxMTMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAvLyBUbyBjb2xsZWN0IHRoZSBhbXBsaWZpZXIgdXNhZ2UKIHN0YXRpYyB2b2lkIGFkZEJhdHRlcnlEYXRhKHVpbnQzMl90IHBhcmFtcykgewogICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBJTWVkaWFEZWF0aE5vdGlmaWVyOjpnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKQEAgLTExNSw2ICsxMjQsNyBAQAogCiAgICAgc2VydmljZS0+YWRkQmF0dGVyeURhdGEocGFyYW1zKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGNvbnN0IGh3X21vZHVsZV90ICoqbW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqKmRldikKQEAgLTExODgsNiArMTE5OCwxMCBAQAogICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgfQogCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiaW8gaGFuZGxlOiAlZFxuIiwgbUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVElEOiAlZFxuIiwgZ2V0VGlkKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdGFuZGJ5OiAlZFxuIiwgbVN0YW5kYnkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTYW1wbGUgcmF0ZTogJWRcbiIsIG1TYW1wbGVSYXRlKTsKQEAgLTE5MzksMzAgKzE5NTMsODMgQEAKIAogY2xhc3MgQ3B1U3RhdHMgewogcHVibGljOgotICAgIHZvaWQgc2FtcGxlKCk7CisgICAgQ3B1U3RhdHMoKTsKKyAgICB2b2lkIHNhbXBsZShjb25zdCBTdHJpbmc4ICZ0aXRsZSk7CiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgotICAgIFRocmVhZENwdVVzYWdlIG1DcHU7CisgICAgVGhyZWFkQ3B1VXNhZ2UgbUNwdVVzYWdlOyAgICAgICAgICAgLy8gaW5zdGFudGFuZW91cyB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucworCisgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworCisgICAgaW50IG1DcHVOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkJ3MgY3VycmVudCBDUFUgbnVtYmVyCisgICAgaW50IG1DcHVrSHo7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbmN5IG9mIHRocmVhZCdzIGN1cnJlbnQgQ1BVIGluIGtIegogI2VuZGlmCiB9OwogCi12b2lkIENwdVN0YXRzOjpzYW1wbGUoKSB7CitDcHVTdGF0czo6Q3B1U3RhdHMoKQogI2lmZGVmIERFQlVHX0NQVV9VU0FHRQotICAgIGNvbnN0IENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MmIHN0YXRzID0gbUNwdS5zdGF0aXN0aWNzKCk7Ci0gICAgbUNwdS5zYW1wbGVBbmRFbmFibGUoKTsKLSAgICB1bnNpZ25lZCBuID0gc3RhdHMubigpOwotICAgIC8vIG1DcHUuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCisgICAgOiBtQ3B1TnVtKC0xKSwgbUNwdWtIeigtMSkKKyNlbmRpZgoreworfQorCit2b2lkIENwdVN0YXRzOjpzYW1wbGUoY29uc3QgU3RyaW5nOCAmdGl0bGUpIHsKKyNpZmRlZiBERUJVR19DUFVfVVNBR0UKKyAgICAvLyBnZXQgY3VycmVudCB0aHJlYWQncyBkZWx0YSBDUFUgdGltZSBpbiB3YWxsIGNsb2NrIG5zCisgICAgZG91YmxlIHdjTnM7CisgICAgYm9vbCB2YWxpZCA9IG1DcHVVc2FnZS5zYW1wbGVBbmRFbmFibGUod2NOcyk7CisKKyAgICAvLyByZWNvcmQgc2FtcGxlIGZvciB3YWxsIGNsb2NrIHN0YXRpc3RpY3MKKyAgICBpZiAodmFsaWQpIHsKKyAgICAgICAgbVdjU3RhdHMuc2FtcGxlKHdjTnMpOworICAgIH0KKworICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCisgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IENQVSBmcmVxdWVuY3kgaW4ga0h6CisgICAgaW50IGNwdWtIeiA9IG1DcHVVc2FnZS5nZXRDcHVrSHooY3B1TnVtKTsKKworICAgIC8vIGNoZWNrIGlmIGVpdGhlciBDUFUgbnVtYmVyIG9yIGZyZXF1ZW5jeSBjaGFuZ2VkCisgICAgaWYgKGNwdU51bSAhPSBtQ3B1TnVtIHx8IGNwdWtIeiAhPSBtQ3B1a0h6KSB7CisgICAgICAgIG1DcHVOdW0gPSBjcHVOdW07CisgICAgICAgIG1DcHVrSHogPSBjcHVrSHo7CisgICAgICAgIC8vIGlnbm9yZSBzYW1wbGUgZm9yIHB1cnBvc2VzIG9mIGN5Y2xlcworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgIH0KKworICAgIC8vIGlmIG5vIGNoYW5nZSBpbiBDUFUgbnVtYmVyIG9yIGZyZXF1ZW5jeSwgdGhlbiByZWNvcmQgc2FtcGxlIGZvciBjeWNsZSBzdGF0aXN0aWNzCisgICAgaWYgKHZhbGlkICYmIG1DcHVrSHogPiAwKSB7CisgICAgICAgIGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLnNhbXBsZShjeWNsZXMpOworICAgIH0KKworICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgLy8gbUNwdVVzYWdlLmVsYXBzZWQoKSBpcyBleHBlbnNpdmUsIHNvIGRvbid0IGNhbGwgaXQgZXZlcnkgbG9vcAogICAgIGlmICgobiAmIDEyNykgPT0gMSkgewotICAgICAgICBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHUuZWxhcHNlZCgpOworICAgICAgICBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgewogICAgICAgICAgICAgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKICAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7Ci0gICAgICAgICAgICBkb3VibGUgbWVhbiA9IHN0YXRzLm1lYW4oKTsKLSAgICAgICAgICAgIGRvdWJsZSBzdGRkZXYgPSBzdGF0cy5zdGRkZXYoKTsKLSAgICAgICAgICAgIGRvdWJsZSBtaW5pbXVtID0gc3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heGltdW0gPSBzdGF0cy5tYXhpbXVtKCk7Ci0gICAgICAgICAgICBtQ3B1LnJlc2V0U3RhdGlzdGljcygpOwotICAgICAgICAgICAgQUxPR0koIkNQVSB1c2FnZSBvdmVyIHBhc3QgJS4xZiBzZWNzICgldSBtaXhlciBsb29wcyBhdCAlLjFmIG1lYW4gbXMgcGVyIGxvb3ApOlxuICB1cyBwZXIgbWl4IGxvb3A6IG1lYW49JS4wZiBzdGRkZXY9JS4wZiBtaW49JS4wZiBtYXg9JS4wZlxuICAlJSBvZiB3YWxsOiBtZWFuPSUuMWYgc3RkZGV2PSUuMWYgbWluPSUuMWYgbWF4PSUuMWYiLAorICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKKyAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOworICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOworICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7CisgICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKKyAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOworICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOworICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKKyAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CisgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOworICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKKyAgICAgICAgICAgIEFMT0dEKCJDUFUgdXNhZ2UgZm9yICVzIG92ZXIgcGFzdCAlLjFmIHNlY3NcbiIKKyAgICAgICAgICAgICAgICAiICAoJXUgbWl4ZXIgbG9vcHMgYXQgJS4xZiBtZWFuIG1zIHBlciBsb29wKTpcbiIKKyAgICAgICAgICAgICAgICAiICB1cyBwZXIgbWl4IGxvb3A6IG1lYW49JS4wZiBzdGRkZXY9JS4wZiBtaW49JS4wZiBtYXg9JS4wZlxuIgorICAgICAgICAgICAgICAgICIgICUlIG9mIHdhbGw6IG1lYW49JS4xZiBzdGRkZXY9JS4xZiBtaW49JS4xZiBtYXg9JS4xZlxuIgorICAgICAgICAgICAgICAgICIgIE1IejogbWVhbj0lLjFmLCBzdGRkZXY9JS4xZiwgbWluPSUuMWYgbWF4PSUuMWYiLAorICAgICAgICAgICAgICAgICAgICB0aXRsZS5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCAqIC4wMDAwMDAwMDEsIG4sIHBlckxvb3AgKiAuMDAwMDAxLAogICAgICAgICAgICAgICAgICAgICBtZWFuICogLjAwMSwKICAgICAgICAgICAgICAgICAgICAgc3RkZGV2ICogLjAwMSwKQEAgLTE5NzEsNyArMjAzOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBtZWFuIC8gcGVyTG9vcDEwMCwKICAgICAgICAgICAgICAgICAgICAgc3RkZGV2IC8gcGVyTG9vcDEwMCwKICAgICAgICAgICAgICAgICAgICAgbWluaW11bSAvIHBlckxvb3AxMDAsCi0gICAgICAgICAgICAgICAgICAgIG1heGltdW0gLyBwZXJMb29wMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bSAvIHBlckxvb3AxMDAsCisgICAgICAgICAgICAgICAgICAgIG1lYW5DeWNsZXMgLyBwZXJMb29wMWssCisgICAgICAgICAgICAgICAgICAgIHN0ZGRldkN5Y2xlcyAvIHBlckxvb3AxaywKKyAgICAgICAgICAgICAgICAgICAgbWluQ3ljbGVzIC8gcGVyTG9vcDFrLAorICAgICAgICAgICAgICAgICAgICBtYXhDeWNsZXMgLyBwZXJMb29wMWspOworCiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYKQEAgLTIwMTcsMTYgKzIwODksMTQgQEAKICAgICBzbGVlcFRpbWVTaGlmdCA9IDA7CiB9CiAKLSAgICAvLyBNSVhFUgogICAgIENwdVN0YXRzIGNwdVN0YXRzOworICAgIGNvbnN0IFN0cmluZzggbXlOYW1lKFN0cmluZzg6OmZvcm1hdCgidGhyZWFkICVwIHR5cGUgJWQgVElEICVkIiwgdGhpcywgbVR5cGUsIGdldHRpZCgpKSk7CiAKICAgICBhY3F1aXJlV2FrZUxvY2soKTsKIAogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7Ci1pZiAobVR5cGUgPT0gTUlYRVIpIHsKLSAgICAgICAgY3B1U3RhdHMuc2FtcGxlKCk7Ci19CisgICAgICAgIGNwdVN0YXRzLnNhbXBsZShteU5hbWUpOwogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCkBAIC0yMDYzLDkgKzIxMzMsOSBAQAogCiAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZG8uLi4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRocmVhZCAlcCB0eXBlICVkIFRJRCAlZCBnb2luZyB0byBzbGVlcCIsIHRoaXMsIG1UeXBlLCBnZXR0aWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBnb2luZyB0byBzbGVlcCIsIG15TmFtZS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXQobUxvY2spOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVGhyZWFkICVwIHR5cGUgJWQgVElEICVkIHdha2luZyB1cCIsIHRoaXMsIG1UeXBlLCBnZXR0aWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyB3YWtpbmcgdXAiLCBteU5hbWUuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOwogCiAgICAgICAgICAgICAgICAgICAgIG1QcmV2TWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwpAQCAtMjYxMiw2ICsyNjgyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQogICAgICAgICAgICAgLy8gdGhlIGNoYW5nZQogICAgICAgICAgICAgaWYgKChpbnQpbURldmljZSAhPSB2YWx1ZSkgewpAQCAtMjYzMiw2ICsyNzAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisjZW5kaWYKIAogICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQogICAgICAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgpAQCAtMzQ1NCw4ICszNTI2LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOwogCisjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgICAgICAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQogICAgICAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0aHJlYWQtPmlkKCkpOwogICAgICAgICAgICAgfQpAQCAtMzU3MiwxMCArMzY0NiwxMiBAQAogICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRocmVhZC0+aWQoKSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAKKyNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0YXJ0KTsKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKQEAgLTM2MTAsOCArMzY4NiwxMCBAQAogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLCBtU3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLmxvY2soKTsKIAorI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCiAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzYzMCw4ICszNzA4LDEwIEBACiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLCBtU3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAKKyNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKICAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YQppbmRleCA2NTkzYTBmLi4wYjVlYWZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YQpAQCAtMjAwLDE3ICsyMDAsMTUgQEAKIAogICAgIC8qKgogICAgICAqIE1ha2UgY29tbWFuZCBmb3IgZGFlbW9uLCBlc2NhcGluZyBhcmd1bWVudHMgYXMgbmVlZGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmluYWwgY29tbWFuZC4KICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbWFrZUNvbW1hbmQoU3RyaW5nIGNtZCwgT2JqZWN0Li4uIGFyZ3MpCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VDb21tYW5kKFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgU3RyaW5nIGNtZCwgT2JqZWN0Li4uIGFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVE9ETzogZXZlbnR1YWxseSBlbmZvcmNlIHRoYXQgY21kIGRvZXNuJ3QgY29udGFpbiBhcmd1bWVudHMKICAgICAgICAgaWYgKGNtZC5pbmRleE9mKCdcMCcpID49IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuZXhwZWN0ZWQgY29tbWFuZDogIiArIGNtZCk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihjbWQpOworICAgICAgICBidWlsZGVyLmFwcGVuZChjbWQpOwogICAgICAgICBmb3IgKE9iamVjdCBhcmcgOiBhcmdzKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoYXJnKTsKICAgICAgICAgICAgIGlmIChhcmdTdHJpbmcuaW5kZXhPZignXDAnKSA+PSAwKSB7CkBAIC0yMjAsMzQgKzIxOCw2IEBACiAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwogICAgICAgICAgICAgYXBwZW5kRXNjYXBlZChidWlsZGVyLCBhcmdTdHJpbmcpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2VuZENvbW1hbmQoU3RyaW5nQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IHNlcXVlbmNlTnVtYmVyID0gbVNlcXVlbmNlTnVtYmVyLmluY3JlbWVudEFuZEdldCgpOwotCi0gICAgICAgIGJ1aWxkZXIuaW5zZXJ0KDAsIEludGVnZXIudG9TdHJpbmcoc2VxdWVuY2VOdW1iZXIpICsgIiAiKTsKLQotICAgICAgICBsb2coIlNORCAtPiB7IiArIGJ1aWxkZXIudG9TdHJpbmcoKSArICJ9Iik7Ci0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1wwJyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtRGFlbW9uTG9jaykgewotICAgICAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24oIm1pc3Npbmcgb3V0cHV0IHN0cmVhbSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLndyaXRlKGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbigicHJvYmxlbSBzZW5kaW5nIGNvbW1hbmQiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2VxdWVuY2VOdW1iZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMjUsMjUgKzI5NSw0NiBAQAogICAgIHB1YmxpYyBOYXRpdmVEYWVtb25FdmVudFtdIGV4ZWN1dGUoaW50IHRpbWVvdXQsIFN0cmluZyBjbWQsIE9iamVjdC4uLiBhcmdzKQogICAgICAgICAgICAgdGhyb3dzIE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxOYXRpdmVEYWVtb25FdmVudD4gZXZlbnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2VudENvbW1hbmQgPSBtYWtlQ29tbWFuZChjbWQsIGFyZ3MpOwotICAgICAgICBmaW5hbCBpbnQgY21kTnVtYmVyID0gc2VuZENvbW1hbmQoc2VudENvbW1hbmQpOworCisgICAgICAgIGZpbmFsIGludCBzZXF1ZW5jZU51bWJlciA9IG1TZXF1ZW5jZU51bWJlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBjbWRCdWlsZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcihJbnRlZ2VyLnRvU3RyaW5nKHNlcXVlbmNlTnVtYmVyKSkuYXBwZW5kKCcgJyk7CisKKyAgICAgICAgbWFrZUNvbW1hbmQoY21kQnVpbGRlciwgY21kLCBhcmdzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbG9nQ21kID0gY21kQnVpbGRlci50b1N0cmluZygpOyAvKiBpbmNsdWRlcyBjbWROdW0sIGNtZCwgYXJncyAqLworICAgICAgICBsb2coIlNORCAtPiB7IiArIGxvZ0NtZCArICJ9Iik7CisKKyAgICAgICAgY21kQnVpbGRlci5hcHBlbmQoJ1wwJyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZW50Q21kID0gY21kQnVpbGRlci50b1N0cmluZygpOyAvKiBsb2dDbWQgKyBcMCAqLworCisgICAgICAgIHN5bmNocm9uaXplZCAobURhZW1vbkxvY2spIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uKCJtaXNzaW5nIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShzZW50Q21kLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uKCJwcm9ibGVtIHNlbmRpbmcgY29tbWFuZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIE5hdGl2ZURhZW1vbkV2ZW50IGV2ZW50ID0gbnVsbDsKLSAgICAgICAgY21kID0gc2VudENvbW1hbmQudG9TdHJpbmcoKTsKICAgICAgICAgZG8gewotICAgICAgICAgICAgZXZlbnQgPSBtUmVzcG9uc2VRdWV1ZS5yZW1vdmUoY21kTnVtYmVyLCB0aW1lb3V0LCBjbWQpOworICAgICAgICAgICAgZXZlbnQgPSBtUmVzcG9uc2VRdWV1ZS5yZW1vdmUoc2VxdWVuY2VOdW1iZXIsIHRpbWVvdXQsIHNlbnRDbWQpOwogICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2dlKCJ0aW1lZC1vdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UgdG8gIiArIGNtZE51bWJlciArICIgIiArIGNtZCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkZhaWx1cmVFeGNlcHRpb24oY21kLCBldmVudCk7CisgICAgICAgICAgICAgICAgbG9nZSgidGltZWQtb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlIHRvICIgKyBsb2dDbWQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25GYWlsdXJlRXhjZXB0aW9uKGxvZ0NtZCwgZXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXZlbnRzLmFkZChldmVudCk7CiAgICAgICAgIH0gd2hpbGUgKGV2ZW50LmlzQ2xhc3NDb250aW51ZSgpKTsKIAogICAgICAgICBpZiAoZXZlbnQuaXNDbGFzc0NsaWVudEVycm9yKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Bcmd1bWVudEV4Y2VwdGlvbihjbWQsIGV2ZW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Bcmd1bWVudEV4Y2VwdGlvbihsb2dDbWQsIGV2ZW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXZlbnQuaXNDbGFzc1NlcnZlckVycm9yKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25GYWlsdXJlRXhjZXB0aW9uKGNtZCwgZXZlbnQpOworICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkZhaWx1cmVFeGNlcHRpb24obG9nQ21kLCBldmVudCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZXZlbnRzLnRvQXJyYXkobmV3IE5hdGl2ZURhZW1vbkV2ZW50W2V2ZW50cy5zaXplKCldKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA2MzQxOGRiLi41MmE0MTEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xODU4LDYgKzE4NTgsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbGlnaHRzICpiZWZvcmUqIHRha2luZyBjYXJlIG9mIHR1cm5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbiBvZmYsIHNvIHdlIGNhbiBpbml0aWF0ZSBhbnkgYW5pbWF0aW9ucyB0aGF0IGFyZSBkZXNpcmVkLgorICAgICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMaWdodHNMb2NrZWQobmV3U3RhdGUsIDApOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xODc2LDcgKzE4NzcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Qb3dlclN0YXRlICY9IH5TQ1JFRU5fT05fQklUOwotICAgICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JlZW5CcmlnaHRuZXNzQW5pbWF0b3IuaXNBbmltYXRpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc2NyZWVuT2ZmRmluaXNoZWRBbmltYXRpbmdMb2NrZWQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VpTW9kZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9VaU1vZGVNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGM1YzI5MDEuLjg0ZGFlYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VpTW9kZU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVWlNb2RlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTg5LDggKzE4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuc3RhcnRBY3Rpdml0eVdpdGhDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGhvbWVJbnRlbnQsIG51bGwsIG51bGwsIDAsIG51bGwsIG51bGwsIDAsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgaG9tZUludGVudCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ib2xkaW5nQ29uZmlndXJhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgZS5nZXRDYXVzZSgpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA5NGI5ZTkxLi42Zjg5ZjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yODYsOSArMjg2LDcgQEAKICAgICBzdGF0aWMgY2xhc3MgUGVuZGluZ0FjdGl2aXR5TGF1bmNoIHsKICAgICAgICAgQWN0aXZpdHlSZWNvcmQgcjsKICAgICAgICAgQWN0aXZpdHlSZWNvcmQgc291cmNlUmVjb3JkOwotICAgICAgICBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnM7Ci0gICAgICAgIGludCBncmFudGVkTW9kZTsKLSAgICAgICAgYm9vbGVhbiBvbmx5SWZOZWVkZWQ7CisgICAgICAgIGludCBzdGFydEZsYWdzOwogICAgIH0KICAgICAKICAgICBmaW5hbCBBcnJheUxpc3Q8UGVuZGluZ0FjdGl2aXR5TGF1bmNoPiBtUGVuZGluZ0FjdGl2aXR5TGF1bmNoZXMKQEAgLTIwOTUsOCArMjA5Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIGFJbmZvLmFwcGxpY2F0aW9uSW5mby51aWQpOwogICAgICAgICAgICAgaWYgKGFwcCA9PSBudWxsIHx8IGFwcC5pbnN0cnVtZW50YXRpb25DbGFzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKGludGVudC5nZXRGbGFncygpIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgIG1NYWluU3RhY2suc3RhcnRBY3Rpdml0eUxvY2tlZChudWxsLCBpbnRlbnQsIG51bGwsIG51bGwsIDAsIGFJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBtTWFpblN0YWNrLnN0YXJ0QWN0aXZpdHlMb2NrZWQobnVsbCwgaW50ZW50LCBudWxsLCBhSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIDAsIDAsIDAsIDAsIG51bGwsIGZhbHNlLCBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTUwLDggKzIxNDgsOCBAQAogICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSwgcmkuYWN0aXZpdHlJbmZvLm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgbU1haW5TdGFjay5zdGFydEFjdGl2aXR5TG9ja2VkKG51bGwsIGludGVudCwgbnVsbCwgbnVsbCwgMCwgcmkuYWN0aXZpdHlJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1NYWluU3RhY2suc3RhcnRBY3Rpdml0eUxvY2tlZChudWxsLCBpbnRlbnQsIG51bGwsIHJpLmFjdGl2aXR5SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCAwLCAwLCAwLCAwLCBudWxsLCBmYWxzZSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMjU3LDE4ICsyMjU1LDE1IEBACiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgIFBlbmRpbmdBY3Rpdml0eUxhdW5jaCBwYWwgPSBtUGVuZGluZ0FjdGl2aXR5TGF1bmNoZXMuZ2V0KGkpOwogICAgICAgICAgICAgbU1haW5TdGFjay5zdGFydEFjdGl2aXR5VW5jaGVja2VkTG9ja2VkKHBhbC5yLCBwYWwuc291cmNlUmVjb3JkLAotICAgICAgICAgICAgICAgICAgICBwYWwuZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBwYWwuZ3JhbnRlZE1vZGUsIHBhbC5vbmx5SWZOZWVkZWQsCi0gICAgICAgICAgICAgICAgICAgIGRvUmVzdW1lICYmIGkgPT0gKE4tMSkpOworICAgICAgICAgICAgICAgICAgICBwYWwuc3RhcnRGbGFncywgZG9SZXN1bWUgJiYgaSA9PSAoTi0xKSk7CiAgICAgICAgIH0KICAgICAgICAgbVBlbmRpbmdBY3Rpdml0eUxhdW5jaGVzLmNsZWFyKCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIGludCBzdGFydEFjdGl2aXR5KElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMsCi0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUsIElCaW5kZXIgcmVzdWx0VG8sCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGJvb2xlYW4gb25seUlmTmVlZGVkLCBib29sZWFuIGRlYnVnLAotICAgICAgICAgICAgYm9vbGVhbiBvcGVuZ2xUcmFjZSwgU3RyaW5nIHByb2ZpbGVGaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwcm9maWxlRmQsCi0gICAgICAgICAgICBib29sZWFuIGF1dG9TdG9wUHJvZmlsZXIpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIElCaW5kZXIgcmVzdWx0VG8sCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGludCBzdGFydEZsYWdzLAorICAgICAgICAgICAgU3RyaW5nIHByb2ZpbGVGaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwcm9maWxlRmQsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGVuZm9yY2VOb3RJc29sYXRlZENhbGxlcigic3RhcnRBY3Rpdml0eSIpOwogICAgICAgICBpbnQgdXNlcklkID0gMDsKICAgICAgICAgaWYgKGludGVudC5nZXRDYXRlZ29yaWVzKCkgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0Q2F0ZWdvcmllcygpLmNvbnRhaW5zKEludGVudC5DQVRFR09SWV9IT01FKSkgewpAQCAtMjI4NSw0MyArMjI4MCwzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtTWFpblN0YWNrLnN0YXJ0QWN0aXZpdHlNYXlXYWl0KGNhbGxlciwgLTEsIGludGVudCwgcmVzb2x2ZWRUeXBlLAotICAgICAgICAgICAgICAgIGdyYW50ZWRVcmlQZXJtaXNzaW9ucywgZ3JhbnRlZE1vZGUsIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBvbmx5SWZOZWVkZWQsCi0gICAgICAgICAgICAgICAgZGVidWcsIG9wZW5nbFRyYWNlLCBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLCBhdXRvU3RvcFByb2ZpbGVyLCBudWxsLCBudWxsLCB1c2VySWQpOworICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBzdGFydEZsYWdzLCBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG9wdGlvbnMsIHVzZXJJZCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFdhaXRSZXN1bHQgc3RhcnRBY3Rpdml0eUFuZFdhaXQoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIFVyaVtdIGdyYW50ZWRVcmlQZXJtaXNzaW9ucywKLSAgICAgICAgICAgIGludCBncmFudGVkTW9kZSwgSUJpbmRlciByZXN1bHRUbywKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgYm9vbGVhbiBvbmx5SWZOZWVkZWQsIGJvb2xlYW4gZGVidWcsCi0gICAgICAgICAgICBib29sZWFuIG9wZW5nbFRyYWNlLCBTdHJpbmcgcHJvZmlsZUZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlcikgeworICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgSUJpbmRlciByZXN1bHRUbywKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgaW50IHN0YXJ0RmxhZ3MsIFN0cmluZyBwcm9maWxlRmlsZSwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwgQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgZW5mb3JjZU5vdElzb2xhdGVkQ2FsbGVyKCJzdGFydEFjdGl2aXR5QW5kV2FpdCIpOwogICAgICAgICBXYWl0UmVzdWx0IHJlcyA9IG5ldyBXYWl0UmVzdWx0KCk7CiAgICAgICAgIGludCB1c2VySWQgPSBCaW5kZXIuZ2V0T3JpZ0NhbGxpbmdVc2VyKCk7CiAgICAgICAgIG1NYWluU3RhY2suc3RhcnRBY3Rpdml0eU1heVdhaXQoY2FsbGVyLCAtMSwgaW50ZW50LCByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBncmFudGVkTW9kZSwgcmVzdWx0VG8sIHJlc3VsdFdobywKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgb25seUlmTmVlZGVkLCBkZWJ1Zywgb3BlbmdsVHJhY2UsIHByb2ZpbGVGaWxlLCBwcm9maWxlRmQsIGF1dG9TdG9wUHJvZmlsZXIsCi0gICAgICAgICAgICAgICAgcmVzLCBudWxsLCB1c2VySWQpOworICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBzdGFydEZsYWdzLCBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLAorICAgICAgICAgICAgICAgIHJlcywgbnVsbCwgb3B0aW9ucywgdXNlcklkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgaW50IHN0YXJ0QWN0aXZpdHlXaXRoQ29uZmlnKElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMsCi0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUsIElCaW5kZXIgcmVzdWx0VG8sCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGJvb2xlYW4gb25seUlmTmVlZGVkLAotICAgICAgICAgICAgYm9vbGVhbiBkZWJ1ZywgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIElCaW5kZXIgcmVzdWx0VG8sCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsIGludCBzdGFydEZsYWdzLCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGVuZm9yY2VOb3RJc29sYXRlZENhbGxlcigic3RhcnRBY3Rpdml0eVdpdGhDb25maWciKTsKICAgICAgICAgaW50IHJldCA9IG1NYWluU3RhY2suc3RhcnRBY3Rpdml0eU1heVdhaXQoY2FsbGVyLCAtMSwgaW50ZW50LCByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBncmFudGVkTW9kZSwgcmVzdWx0VG8sIHJlc3VsdFdobywKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgb25seUlmTmVlZGVkLAotICAgICAgICAgICAgICAgIGRlYnVnLCBmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UsIG51bGwsIGNvbmZpZywgQmluZGVyLmdldE9yaWdDYWxsaW5nVXNlcigpKTsKKyAgICAgICAgICAgICAgICByZXN1bHRUbywgcmVzdWx0V2hvLCByZXF1ZXN0Q29kZSwgc3RhcnRGbGFncywKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBjb25maWcsIG9wdGlvbnMsIEJpbmRlci5nZXRPcmlnQ2FsbGluZ1VzZXIoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgcHVibGljIGludCBzdGFydEFjdGl2aXR5SW50ZW50U2VuZGVyKElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsCiAgICAgICAgICAgICBJbnRlbnRTZW5kZXIgaW50ZW50LCBJbnRlbnQgZmlsbEluSW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLAogICAgICAgICAgICAgSUJpbmRlciByZXN1bHRUbywgU3RyaW5nIHJlc3VsdFdobywgaW50IHJlcXVlc3RDb2RlLAotICAgICAgICAgICAgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGVuZm9yY2VOb3RJc29sYXRlZENhbGxlcigic3RhcnRBY3Rpdml0eUludGVudFNlbmRlciIpOwogICAgICAgICAvLyBSZWZ1c2UgcG9zc2libGUgbGVha2VkIGZpbGUgZGVzY3JpcHRvcnMKICAgICAgICAgaWYgKGZpbGxJbkludGVudCAhPSBudWxsICYmIGZpbGxJbkludGVudC5oYXNGaWxlRGVzY3JpcHRvcnMoKSkgewpAQCAtMjM0NCwxMyArMjMzNCwxMyBAQAogICAgICAgICAgICAgICAgIG1BcHBTd2l0Y2hlc0FsbG93ZWRUaW1lID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpbnQgcmV0ID0gcGlyLnNlbmRJbm5lcigwLCBmaWxsSW5JbnRlbnQsIHJlc29sdmVkVHlwZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCByZXN1bHRUbywgcmVzdWx0V2hvLCByZXF1ZXN0Q29kZSwgZmxhZ3NNYXNrLCBmbGFnc1ZhbHVlcyk7CisgICAgICAgIGludCByZXQgPSBwaXIuc2VuZElubmVyKDAsIGZpbGxJbkludGVudCwgcmVzb2x2ZWRUeXBlLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBvcHRpb25zKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gc3RhcnROZXh0TWF0Y2hpbmdBY3Rpdml0eShJQmluZGVyIGNhbGxpbmdBY3Rpdml0eSwKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIC8vIFJlZnVzZSBwb3NzaWJsZSBsZWFrZWQgZmlsZSBkZXNjcmlwdG9ycwogICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwgJiYgaW50ZW50Lmhhc0ZpbGVEZXNjcmlwdG9ycygpID09IHRydWUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGluIEludGVudCIpOwpAQCAtMjQzMCwxMyArMjQyMCwxMyBAQAogICAgICAgICAgICAgLy8gWFhYIHdlIGFyZSBub3QgZGVhbGluZyB3aXRoIHByb3BhZ2F0aW5nIGdyYW50ZWRVcmlQZXJtaXNzaW9ucy4uLgogICAgICAgICAgICAgLy8gdGhvc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCB0byB1c2VyIGNvZGUsIHNvIHRoZXJlIGlzIG5vIG5lZWQuCiAgICAgICAgICAgICBpbnQgcmVzID0gbU1haW5TdGFjay5zdGFydEFjdGl2aXR5TG9ja2VkKHIuYXBwLnRocmVhZCwgaW50ZW50LAotICAgICAgICAgICAgICAgICAgICByLnJlc29sdmVkVHlwZSwgbnVsbCwgMCwgYUluZm8sCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFRvICE9IG51bGwgPyByZXN1bHRUby5hcHBUb2tlbiA6IG51bGwsIHJlc3VsdFdobywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIC0xLCByLmxhdW5jaGVkRnJvbVVpZCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgci5yZXNvbHZlZFR5cGUsIGFJbmZvLCByZXN1bHRUbyAhPSBudWxsID8gcmVzdWx0VG8uYXBwVG9rZW4gOiBudWxsLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCAtMSwgci5sYXVuY2hlZEZyb21VaWQsIDAsCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIGZhbHNlLCBudWxsKTsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CiAKICAgICAgICAgICAgIHIuZmluaXNoaW5nID0gd2FzRmluaXNoaW5nOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBTVEFSVF9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAocmVzICE9IEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yNDQ1LDcgKzI0MzUsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIGludCBzdGFydEFjdGl2aXR5SW5QYWNrYWdlKGludCB1aWQsCiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLCBJQmluZGVyIHJlc3VsdFRvLAotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdFdobywgaW50IHJlcXVlc3RDb2RlLCBib29sZWFuIG9ubHlJZk5lZWRlZCkgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdFdobywgaW50IHJlcXVlc3RDb2RlLCBpbnQgc3RhcnRGbGFncywgQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgCiAgICAgICAgIC8vIFRoaXMgaXMgc28gc3VwZXIgbm90IHNhZmUsIHRoYXQgb25seSB0aGUgc3lzdGVtIChvciBva2F5IHJvb3QpCiAgICAgICAgIC8vIGNhbiBkbyBpdC4KQEAgLTI0NTcsMjEgKzI0NDcsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCByZXQgPSBtTWFpblN0YWNrLnN0YXJ0QWN0aXZpdHlNYXlXYWl0KG51bGwsIHVpZCwgaW50ZW50LCByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICAgICAgbnVsbCwgMCwgcmVzdWx0VG8sIHJlc3VsdFdobywgcmVxdWVzdENvZGUsIG9ubHlJZk5lZWRlZCwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlLCBudWxsLCBudWxsLCB1c2VySWQpOworICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBzdGFydEZsYWdzLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG9wdGlvbnMsIHVzZXJJZCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIGludCBzdGFydEFjdGl2aXRpZXMoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwKLSAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8pIHsKKyAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8sIEJ1bmRsZSBvcHRpb25zKSB7CiAgICAgICAgIGVuZm9yY2VOb3RJc29sYXRlZENhbGxlcigic3RhcnRBY3Rpdml0aWVzIik7CiAgICAgICAgIGludCByZXQgPSBtTWFpblN0YWNrLnN0YXJ0QWN0aXZpdGllcyhjYWxsZXIsIC0xLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCByZXN1bHRUbywKLSAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0T3JpZ0NhbGxpbmdVc2VyKCkpOworICAgICAgICAgICAgICAgIG9wdGlvbnMsIEJpbmRlci5nZXRPcmlnQ2FsbGluZ1VzZXIoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIGludCBzdGFydEFjdGl2aXRpZXNJblBhY2thZ2UoaW50IHVpZCwKLSAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8pIHsKKyAgICAgICAgICAgIEludGVudFtdIGludGVudHMsIFN0cmluZ1tdIHJlc29sdmVkVHlwZXMsIElCaW5kZXIgcmVzdWx0VG8sCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgewogCiAgICAgICAgIC8vIFRoaXMgaXMgc28gc3VwZXIgbm90IHNhZmUsIHRoYXQgb25seSB0aGUgc3lzdGVtIChvciBva2F5IHJvb3QpCiAgICAgICAgIC8vIGNhbiBkbyBpdC4KQEAgLTI0ODEsNyArMjQ3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICJzdGFydEFjdGl2aXR5SW5QYWNrYWdlIG9ubHkgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0iKTsKICAgICAgICAgfQogICAgICAgICBpbnQgcmV0ID0gbU1haW5TdGFjay5zdGFydEFjdGl2aXRpZXMobnVsbCwgdWlkLCBpbnRlbnRzLCByZXNvbHZlZFR5cGVzLCByZXN1bHRUbywKLSAgICAgICAgICAgICAgICBVc2VySWQuZ2V0VXNlcklkKHVpZCkpOworICAgICAgICAgICAgICAgIG9wdGlvbnMsIFVzZXJJZC5nZXRVc2VySWQodWlkKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC00MTkzLDcgKzQxODQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0ZpbGVEZXNjcmlwdG9ycygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWxlIGRlc2NyaXB0b3JzIHBhc3NlZCBpbiBJbnRlbnQiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBJTlRFTlRfU0VOREVSX0JST0FEQ0FTVCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9CUk9BRENBU1QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZW50LmdldEZsYWdzKCkmSW50ZW50LkZMQUdfUkVDRUlWRVJfQk9PVF9VUEdSQURFKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgdXNlIEZMQUdfUkVDRUlWRVJfQk9PVF9VUEdSQURFIGhlcmUiKTsKQEAgLTQyNDIsNyArNDIzMyw3IEBACiAgICAgICAgIGlmIChERUJVR19NVSkKICAgICAgICAgICAgIFNsb2cudihUQUdfTVUsICJnZXRJbnRlbnRTZW5kZXJMb2NrZWQoKTogdWlkPSIgKyBjYWxsaW5nVWlkKTsKICAgICAgICAgQWN0aXZpdHlSZWNvcmQgYWN0aXZpdHkgPSBudWxsOwotICAgICAgICBpZiAodHlwZSA9PSBJTlRFTlRfU0VOREVSX0FDVElWSVRZX1JFU1VMVCkgeworICAgICAgICBpZiAodHlwZSA9PSBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQpIHsKICAgICAgICAgICAgIGFjdGl2aXR5ID0gbU1haW5TdGFjay5pc0luU3RhY2tMb2NrZWQodG9rZW4pOwogICAgICAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTQyODksNyArNDI4MCw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmVjID0gbmV3IFBlbmRpbmdJbnRlbnRSZWNvcmQodGhpcywga2V5LCBjYWxsaW5nVWlkKTsKICAgICAgICAgbUludGVudFNlbmRlclJlY29yZHMucHV0KGtleSwgcmVjLnJlZik7Ci0gICAgICAgIGlmICh0eXBlID09IElOVEVOVF9TRU5ERVJfQUNUSVZJVFlfUkVTVUxUKSB7CisgICAgICAgIGlmICh0eXBlID09IEFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZX1JFU1VMVCkgewogICAgICAgICAgICAgaWYgKGFjdGl2aXR5LnBlbmRpbmdSZXN1bHRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhY3Rpdml0eS5wZW5kaW5nUmVzdWx0cwogICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFBlbmRpbmdJbnRlbnRSZWNvcmQ+PigpOwpAQCAtMTI0NTQsNyArMTI0NDUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlJlbW90ZSBleGNlcHRpb24iLCBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQlJPQURDQVNUX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5CUk9BRENBU1RfU1VDQ0VTUzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKQEAgLTEyNDcyLDcgKzEyNDYzLDcgQEAKICAgICAgICAgICAgIGlmIChyZXF1aXJlZFBlcm1pc3Npb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDYW4ndCBicm9hZGNhc3Qgc3RpY2t5IGludGVudCAiICsgaW50ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIGVuZm9yY2UgcGVybWlzc2lvbiAiICsgcmVxdWlyZWRQZXJtaXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQlJPQURDQVNUX1NUSUNLWV9DQU5UX0hBVkVfUEVSTUlTU0lPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyLkJST0FEQ0FTVF9TVElDS1lfQ0FOVF9IQVZFX1BFUk1JU1NJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaW50ZW50LmdldENvbXBvbmVudCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oCkBAIC0xMjY0Niw3ICsxMjYzNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gQlJPQURDQVNUX1NVQ0NFU1M7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuQlJPQURDQVNUX1NVQ0NFU1M7CiAgICAgfQogCiAgICAgZmluYWwgSW50ZW50IHZlcmlmeUJyb2FkY2FzdExvY2tlZChJbnRlbnQgaW50ZW50KSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKaW5kZXggNjRkNTJlZC4uZWRlYmJhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQpAQCAtMjUsMTUgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJldHJpZXZlcjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9DTEFTU19OT1RfRk9VTkQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIuU1RBUlRfREVMSVZFUkVEX1RPX1RPUDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9GT1JXQVJEX0FORF9SRVFVRVNUX0NPTkZMSUNUOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0lOVEVOVF9OT1RfUkVTT0xWRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVI7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9TV0lUQ0hFU19DQU5DRUxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlci5TVEFSVF9UQVNLX1RPX0ZST05UOwogaW1wb3J0IGFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYXBwLlJlc3VsdEluZm87CkBAIC0yMjcwLDE0ICsyMjYxLDEyIEBACiAgICAgfQogCiAgICAgZmluYWwgaW50IHN0YXJ0QWN0aXZpdHlMb2NrZWQoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsCi0gICAgICAgICAgICBVcmlbXSBncmFudGVkVXJpUGVybWlzc2lvbnMsCi0gICAgICAgICAgICBpbnQgZ3JhbnRlZE1vZGUsIEFjdGl2aXR5SW5mbyBhSW5mbywgSUJpbmRlciByZXN1bHRUbywKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIEFjdGl2aXR5SW5mbyBhSW5mbywgSUJpbmRlciByZXN1bHRUbywKICAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwKLSAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCwgYm9vbGVhbiBvbmx5SWZOZWVkZWQsCisgICAgICAgICAgICBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQsIGludCBzdGFydEZsYWdzLCBCdW5kbGUgb3B0aW9ucywKICAgICAgICAgICAgIGJvb2xlYW4gY29tcG9uZW50U3BlY2lmaWVkLCBBY3Rpdml0eVJlY29yZFtdIG91dEFjdGl2aXR5KSB7CiAKLSAgICAgICAgaW50IGVyciA9IFNUQVJUX1NVQ0NFU1M7CisgICAgICAgIGludCBlcnIgPSBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1VDQ0VTUzsKIAogICAgICAgICBQcm9jZXNzUmVjb3JkIGNhbGxlckFwcCA9IG51bGw7CiAgICAgICAgIGlmIChjYWxsZXIgIT0gbnVsbCkgewpAQCAtMjI4OSwxMSArMjI3OCwxMSBAQAogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmFibGUgdG8gZmluZCBhcHAgZm9yIGNhbGxlciAiICsgY2FsbGVyCiAgICAgICAgICAgICAgICAgICAgICAgKyAiIChwaWQ9IiArIGNhbGxpbmdQaWQgKyAiKSB3aGVuIHN0YXJ0aW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgZXJyID0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1BFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGVyciA9PSBTVEFSVF9TVUNDRVNTKSB7CisgICAgICAgIGlmIChlcnIgPT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1NVQ0NFU1MpIHsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTVEFSVCB7IiArIGludGVudC50b1Nob3J0U3RyaW5nKHRydWUsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgICAgICAgICAgICAgICArICJ9IGZyb20gcGlkICIgKyAoY2FsbGVyQXBwICE9IG51bGwgPyBjYWxsZXJBcHAucGlkIDogY2FsbGluZ1BpZCkpOwogICAgICAgICB9CkBAIC0yMzE5LDcgKzIzMDgsNyBAQAogICAgICAgICAgICAgLy8gVHJhbnNmZXIgdGhlIHJlc3VsdCB0YXJnZXQgZnJvbSB0aGUgc291cmNlIGFjdGl2aXR5IHRvIHRoZSBuZXcKICAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzdGFydGVkLCBpbmNsdWRpbmcgYW55IGZhaWx1cmVzLgogICAgICAgICAgICAgaWYgKHJlcXVlc3RDb2RlID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfRk9SV0FSRF9BTkRfUkVRVUVTVF9DT05GTElDVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0ZPUldBUkRfQU5EX1JFUVVFU1RfQ09ORkxJQ1Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHRSZWNvcmQgPSBzb3VyY2VSZWNvcmQucmVzdWx0VG87CiAgICAgICAgICAgICByZXN1bHRXaG8gPSBzb3VyY2VSZWNvcmQucmVzdWx0V2hvOwpAQCAtMjMzMSwxOSArMjMyMCwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGVyciA9PSBTVEFSVF9TVUNDRVNTICYmIGludGVudC5nZXRDb21wb25lbnQoKSA9PSBudWxsKSB7CisgICAgICAgIGlmIChlcnIgPT0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1NVQ0NFU1MgJiYgaW50ZW50LmdldENvbXBvbmVudCgpID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgYSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgdGhlIGdpdmVuIEludGVudC4KICAgICAgICAgICAgIC8vIFRoYXQncyB0aGUgZW5kIG9mIHRoYXQhCi0gICAgICAgICAgICBlcnIgPSBTVEFSVF9JTlRFTlRfTk9UX1JFU09MVkVEOworICAgICAgICAgICAgZXJyID0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0lOVEVOVF9OT1RfUkVTT0xWRUQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZXJyID09IFNUQVJUX1NVQ0NFU1MgJiYgYUluZm8gPT0gbnVsbCkgeworICAgICAgICBpZiAoZXJyID09IEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTICYmIGFJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIHNwZWNpZmljIGNsYXNzIHNwZWNpZmllZCBpbiB0aGUgSW50ZW50LgogICAgICAgICAgICAgLy8gQWxzbyB0aGUgZW5kIG9mIHRoZSBsaW5lLgotICAgICAgICAgICAgZXJyID0gU1RBUlRfQ0xBU1NfTk9UX0ZPVU5EOworICAgICAgICAgICAgZXJyID0gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0NMQVNTX05PVF9GT1VORDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlcnIgIT0gU1RBUlRfU1VDQ0VTUykgeworICAgICAgICBpZiAoZXJyICE9IEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTKSB7CiAgICAgICAgICAgICBpZiAocmVzdWx0UmVjb3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZW5kQWN0aXZpdHlSZXN1bHRMb2NrZWQoLTEsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlY29yZCwgcmVzdWx0V2hvLCByZXF1ZXN0Q29kZSwKQEAgLTI0MDAsNyArMjM4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHByZXRlbmQgdG8gdGhlIGNhbGxlciB0aGF0IGl0IHdhcyByZWFsbHkgc3RhcnRlZCwgYnV0CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgd2lsbCBqdXN0IGdldCBhIGNhbmNlbCByZXN1bHQuCiAgICAgICAgICAgICAgICAgICAgIG1EaXNtaXNzS2V5Z3VhcmRPbk5leHRBY3Rpdml0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQxOSwxMiArMjQwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBQZW5kaW5nQWN0aXZpdHlMYXVuY2ggcGFsID0gbmV3IFBlbmRpbmdBY3Rpdml0eUxhdW5jaCgpOwogICAgICAgICAgICAgICAgICAgICBwYWwuciA9IHI7CiAgICAgICAgICAgICAgICAgICAgIHBhbC5zb3VyY2VSZWNvcmQgPSBzb3VyY2VSZWNvcmQ7Ci0gICAgICAgICAgICAgICAgICAgIHBhbC5ncmFudGVkVXJpUGVybWlzc2lvbnMgPSBncmFudGVkVXJpUGVybWlzc2lvbnM7Ci0gICAgICAgICAgICAgICAgICAgIHBhbC5ncmFudGVkTW9kZSA9IGdyYW50ZWRNb2RlOwotICAgICAgICAgICAgICAgICAgICBwYWwub25seUlmTmVlZGVkID0gb25seUlmTmVlZGVkOworICAgICAgICAgICAgICAgICAgICBwYWwuc3RhcnRGbGFncyA9IHN0YXJ0RmxhZ3M7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1QZW5kaW5nQWN0aXZpdHlMYXVuY2hlcy5hZGQocGFsKTsKICAgICAgICAgICAgICAgICAgICAgbURpc21pc3NLZXlndWFyZE9uTmV4dEFjdGl2aXR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFSVF9TV0lUQ0hFU19DQU5DRUxFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TV0lUQ0hFU19DQU5DRUxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIApAQCAtMjQ0Myw3ICsyNDMwLDcgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgZXJyID0gc3RhcnRBY3Rpdml0eVVuY2hlY2tlZExvY2tlZChyLCBzb3VyY2VSZWNvcmQsCi0gICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zLCBncmFudGVkTW9kZSwgb25seUlmTmVlZGVkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydEZsYWdzLCB0cnVlKTsKICAgICAgICAgaWYgKG1EaXNtaXNzS2V5Z3VhcmRPbk5leHRBY3Rpdml0eSAmJiBtUGF1c2luZ0FjdGl2aXR5ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFNvbWVvbmUgYXNrZWQgdG8gaGF2ZSB0aGUga2V5Z3VhcmQgZGlzbWlzc2VkIG9uIHRoZSBuZXh0CiAgICAgICAgICAgICAvLyBhY3Rpdml0eSBzdGFydCwgYnV0IHdlIGFyZSBub3QgYWN0dWFsbHkgZG9pbmcgYW4gYWN0aXZpdHkKQEAgLTI0NjYsOCArMjQ1Myw3IEBACiAgICAgfQogCiAgICAgZmluYWwgaW50IHN0YXJ0QWN0aXZpdHlVbmNoZWNrZWRMb2NrZWQoQWN0aXZpdHlSZWNvcmQgciwKLSAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHNvdXJjZVJlY29yZCwgVXJpW10gZ3JhbnRlZFVyaVBlcm1pc3Npb25zLAotICAgICAgICAgICAgaW50IGdyYW50ZWRNb2RlLCBib29sZWFuIG9ubHlJZk5lZWRlZCwgYm9vbGVhbiBkb1Jlc3VtZSkgeworICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgc291cmNlUmVjb3JkLCBpbnQgc3RhcnRGbGFncywgYm9vbGVhbiBkb1Jlc3VtZSkgewogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gci5pbnRlbnQ7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gci5sYXVuY2hlZEZyb21VaWQ7CiAgICAgICAgIGZpbmFsIGludCB1c2VySWQgPSByLnVzZXJJZDsKQEAgLTI0OTQsMTQgKzI0ODAsMTQgQEAKICAgICAgICAgLy8gYmVpbmcgbGF1bmNoZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBtYWtpbmcgdGhlIGNhbGwuLi4gIG9yLCBhcwogICAgICAgICAvLyBhIHNwZWNpYWwgY2FzZSwgaWYgd2UgZG8gbm90IGtub3cgdGhlIGNhbGxlciB0aGVuIHdlIGNvdW50IHRoZQogICAgICAgICAvLyBjdXJyZW50IHRvcCBhY3Rpdml0eSBhcyB0aGUgY2FsbGVyLgotICAgICAgICBpZiAob25seUlmTmVlZGVkKSB7CisgICAgICAgIGlmICgoc3RhcnRGbGFncyZBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19PTkxZX0lGX05FRURFRCkgIT0gMCkgewogICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgY2hlY2tlZENhbGxlciA9IHNvdXJjZVJlY29yZDsKICAgICAgICAgICAgIGlmIChjaGVja2VkQ2FsbGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjaGVja2VkQ2FsbGVyID0gdG9wUnVubmluZ05vbkRlbGF5ZWRBY3Rpdml0eUxvY2tlZChub3RUb3ApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFjaGVja2VkQ2FsbGVyLnJlYWxBY3Rpdml0eS5lcXVhbHMoci5yZWFsQWN0aXZpdHkpKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2FsbGVyIGlzIG5vdCB0aGUgc2FtZSBhcyBsYXVuY2hlciwgc28gYWx3YXlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBvbmx5SWZOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGFydEZsYWdzICY9IH5BY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19PTkxZX0lGX05FRURFRDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNTg2LDcgKzI1NzIsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoKGxhdW5jaEZsYWdzJkludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrVG9wID0gcmVzZXRUYXNrSWZOZWVkZWRMb2NrZWQodGFza1RvcCwgcik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlJZk5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXJ0RmxhZ3MmQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0ZMQUdfT05MWV9JRl9ORUVERUQpICAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgbmV3IGFjdGl2aXR5LCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjbGllbnQgc2FpZCBub3QgdG8gZG8gYW55dGhpbmcgaWYgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGNhc2UsIHNvIHRoaXMgaXMgaXQhICBBbmQgZm9yIHBhcmFub2lhLCBtYWtlCkBAIC0yNTk0LDcgKzI1ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzdW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVG9wQWN0aXZpdHlMb2NrZWQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1JFVFVSTl9JTlRFTlRfVE9fQ0FMTEVSOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICgobGF1bmNoRmxhZ3MgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTS3xJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKSkKQEAgLTI2ODEsNyArMjY2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZXN1bWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUb3BBY3Rpdml0eUxvY2tlZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFSVF9UQVNLX1RPX0ZST05UOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9UQVNLX1RPX0ZST05UOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjcxMCwxNCArMjY5NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc3VtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUb3BBY3Rpdml0eUxvY2tlZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlJZk5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnRGbGFncyZBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19PTkxZX0lGX05FRURFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgbmV3IGFjdGl2aXR5LCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBzYWlkIG5vdCB0byBkbyBhbnl0aGluZyBpZiB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBjYXNlLCBzbyB0aGlzIGlzIGl0IQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUkVUVVJOX0lOVEVOVF9UT19DQUxMRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5kZWxpdmVyTmV3SW50ZW50TG9ja2VkKGNhbGxpbmdVaWQsIHIuaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfREVMSVZFUkVEX1RPX1RPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX0RFTElWRVJFRF9UT19UT1A7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNzI5LDcgKzI3MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgci5yZXN1bHRUbywgci5yZXN1bHRXaG8sIHIucmVxdWVzdENvZGUsCiAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5LlJFU1VMVF9DQU5DRUxFRCwgbnVsbCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU1RBUlRfQ0xBU1NfTk9UX0ZPVU5EOworICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9DTEFTU19OT1RfRk9VTkQ7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIG5ld1Rhc2sgPSBmYWxzZTsKQEAgLTI3NzAsNyArMjc1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc3VtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVG9wQWN0aXZpdHlMb2NrZWQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0RFTElWRVJFRF9UT19UT1A7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfREVMSVZFUkVEX1RPX1RPUDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhZGRpbmdUb1Rhc2sgJiYKICAgICAgICAgICAgICAgICAgICAgKGxhdW5jaEZsYWdzJkludGVudC5GTEFHX0FDVElWSVRZX1JFT1JERVJfVE9fRlJPTlQpICE9IDApIHsKQEAgLTI3ODUsNyArMjc3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc3VtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVG9wQWN0aXZpdHlMb2NrZWQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0RFTElWRVJFRF9UT19UT1A7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfREVMSVZFUkVEX1RPX1RPUDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBBbiBleGlzdGluZyBhY3Rpdml0eSBpcyBzdGFydGluZyB0aGlzIG5ldyBhY3Rpdml0eSwgc28gd2Ugd2FudApAQCAtMjgwOSwxMyArMjc5NSw2IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBuZXcgZ3Vlc3NlZCAiICsgci50YXNrKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChncmFudGVkVXJpUGVybWlzc2lvbnMgIT0gbnVsbCAmJiBjYWxsaW5nVWlkID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGdyYW50ZWRVcmlQZXJtaXNzaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCByLnBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZFVyaVBlcm1pc3Npb25zW2ldLCBncmFudGVkTW9kZSwgci5nZXRVcmlQZXJtaXNzaW9uc0xvY2tlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIG1TZXJ2aWNlLmdyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoY2FsbGluZ1VpZCwgci5wYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBpbnRlbnQsIHIuZ2V0VXJpUGVybWlzc2lvbnNMb2NrZWQoKSk7CiAKQEAgLTI4MjQsMTIgKzI4MDMsMTEgQEAKICAgICAgICAgfQogICAgICAgICBsb2dTdGFydEFjdGl2aXR5KEV2ZW50TG9nVGFncy5BTV9DUkVBVEVfQUNUSVZJVFksIHIsIHIudGFzayk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHlMb2NrZWQociwgbmV3VGFzaywgZG9SZXN1bWUsIGtlZXBDdXJUcmFuc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuIFNUQVJUX1NVQ0NFU1M7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1VDQ0VTUzsKICAgICB9CiAKLSAgICBBY3Rpdml0eUluZm8gcmVzb2x2ZUFjdGl2aXR5KEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIGJvb2xlYW4gZGVidWcsCi0gICAgICAgICAgICBib29sZWFuIG9wZW5nbFRyYWNlLCBTdHJpbmcgcHJvZmlsZUZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlcikgeworICAgIEFjdGl2aXR5SW5mbyByZXNvbHZlQWN0aXZpdHkoSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgaW50IHN0YXJ0RmxhZ3MsCisgICAgICAgICAgICAgU3RyaW5nIHByb2ZpbGVGaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwcm9maWxlRmQpIHsKICAgICAgICAgLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFyZ2V0IG9mIHRoZSBJbnRlbnQuCiAgICAgICAgIEFjdGl2aXR5SW5mbyBhSW5mbzsKICAgICAgICAgdHJ5IHsKQEAgLTI4NTIsMTMgKzI4MzAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgYUluZm8uYXBwbGljYXRpb25JbmZvLnBhY2thZ2VOYW1lLCBhSW5mby5uYW1lKSk7CiAKICAgICAgICAgICAgIC8vIERvbid0IGRlYnVnIHRoaW5ncyBpbiB0aGUgc3lzdGVtIHByb2Nlc3MKLSAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgaWYgKChzdGFydEZsYWdzJkFjdGl2aXR5TWFuYWdlci5TVEFSVF9GTEFHX0RFQlVHKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhSW5mby5wcm9jZXNzTmFtZS5lcXVhbHMoInN5c3RlbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldERlYnVnQXBwKGFJbmZvLnByb2Nlc3NOYW1lLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAob3BlbmdsVHJhY2UpIHsKKyAgICAgICAgICAgIGlmICgoc3RhcnRGbGFncyZBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19PUEVOR0xfVFJBQ0VTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhSW5mby5wcm9jZXNzTmFtZS5lcXVhbHMoInN5c3RlbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldE9wZW5HbFRyYWNlQXBwKGFJbmZvLmFwcGxpY2F0aW9uSW5mbywgYUluZm8ucHJvY2Vzc05hbWUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4NjcsNyArMjg0NSw4IEBACiAgICAgICAgICAgICBpZiAocHJvZmlsZUZpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmICghYUluZm8ucHJvY2Vzc05hbWUuZXF1YWxzKCJzeXN0ZW0iKSkgewogICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQcm9maWxlQXBwKGFJbmZvLmFwcGxpY2F0aW9uSW5mbywgYUluZm8ucHJvY2Vzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZpbGUsIHByb2ZpbGVGZCwgYXV0b1N0b3BQcm9maWxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZpbGUsIHByb2ZpbGVGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRGbGFncyZBY3Rpdml0eU1hbmFnZXIuU1RBUlRfRkxBR19BVVRPX1NUT1BfUFJPRklMRVIpICE9IDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjg3NSwxMiArMjg1NCwxMCBAQAogICAgIH0KIAogICAgIGZpbmFsIGludCBzdGFydEFjdGl2aXR5TWF5V2FpdChJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLCBpbnQgY2FsbGluZ1VpZCwKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQsIFN0cmluZyByZXNvbHZlZFR5cGUsIFVyaVtdIGdyYW50ZWRVcmlQZXJtaXNzaW9ucywKLSAgICAgICAgICAgIGludCBncmFudGVkTW9kZSwgSUJpbmRlciByZXN1bHRUbywKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgYm9vbGVhbiBvbmx5SWZOZWVkZWQsCi0gICAgICAgICAgICBib29sZWFuIGRlYnVnLCBib29sZWFuIG9wZW5nbFRyYWNlLCBTdHJpbmcgcHJvZmlsZUZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b1N0b3BQcm9maWxlciwKLSAgICAgICAgICAgIFdhaXRSZXN1bHQgb3V0UmVzdWx0LCBDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHVzZXJJZCkgeworICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwgSUJpbmRlciByZXN1bHRUbywKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRXaG8sIGludCByZXF1ZXN0Q29kZSwgaW50IHN0YXJ0RmxhZ3MsIFN0cmluZyBwcm9maWxlRmlsZSwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHByb2ZpbGVGZCwgV2FpdFJlc3VsdCBvdXRSZXN1bHQsIENvbmZpZ3VyYXRpb24gY29uZmlnLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMsIGludCB1c2VySWQpIHsKICAgICAgICAgLy8gUmVmdXNlIHBvc3NpYmxlIGxlYWtlZCBmaWxlIGRlc2NyaXB0b3JzCiAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuaGFzRmlsZURlc2NyaXB0b3JzKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGluIEludGVudCIpOwpAQCAtMjg5MSw4ICsyODY4LDggQEAKICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChpbnRlbnQpOwogCiAgICAgICAgIC8vIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldCBvZiB0aGUgSW50ZW50LgotICAgICAgICBBY3Rpdml0eUluZm8gYUluZm8gPSByZXNvbHZlQWN0aXZpdHkoaW50ZW50LCByZXNvbHZlZFR5cGUsIGRlYnVnLCBvcGVuZ2xUcmFjZSwKLSAgICAgICAgICAgICAgICBwcm9maWxlRmlsZSwgcHJvZmlsZUZkLCBhdXRvU3RvcFByb2ZpbGVyKTsKKyAgICAgICAgQWN0aXZpdHlJbmZvIGFJbmZvID0gcmVzb2x2ZUFjdGl2aXR5KGludGVudCwgcmVzb2x2ZWRUeXBlLCBzdGFydEZsYWdzLAorICAgICAgICAgICAgICAgIHByb2ZpbGVGaWxlLCBwcm9maWxlRmQpOwogICAgICAgICBhSW5mbyA9IG1TZXJ2aWNlLmdldEFjdGl2aXR5SW5mb0ZvclVzZXIoYUluZm8sIHVzZXJJZCk7CiAKICAgICAgICAgc3luY2hyb25pemVkIChtU2VydmljZSkgewpAQCAtMjkzMiwxMiArMjkwOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5hYmxlIHRvIGZpbmQgYXBwIGZvciBjYWxsZXIgIiArIGNhbGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKHBpZD0iICsgcmVhbENhbGxpbmdQaWQgKyAiKSB3aGVuIHN0YXJ0aW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZW50U2VuZGVyIHRhcmdldCA9IG1TZXJ2aWNlLmdldEludGVudFNlbmRlckxvY2tlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZLCAiYW5kcm9pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZLCAiYW5kcm9pZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxDYWxsaW5nVWlkLCBudWxsLCBudWxsLCAwLCBuZXcgSW50ZW50W10geyBpbnRlbnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgcmVzb2x2ZWRUeXBlIH0sIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBlbmRpbmdJbnRlbnQuRkxBR19PTkVfU0hPVCk7CkBAIC0yOTgzLDkgKzI5NjAsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpbnQgcmVzID0gc3RhcnRBY3Rpdml0eUxvY2tlZChjYWxsZXIsIGludGVudCwgcmVzb2x2ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICBncmFudGVkVXJpUGVybWlzc2lvbnMsIGdyYW50ZWRNb2RlLCBhSW5mbywKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG8sIHJlc3VsdFdobywgcmVxdWVzdENvZGUsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgICAgIG9ubHlJZk5lZWRlZCwgY29tcG9uZW50U3BlY2lmaWVkLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYUluZm8sIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgICAgICBzdGFydEZsYWdzLCBvcHRpb25zLCBjb21wb25lbnRTcGVjaWZpZWQsIG51bGwpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAobUNvbmZpZ1dpbGxDaGFuZ2UgJiYgbU1haW5TdGFjaykgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgYWxzbyB3YW50cyB0byBzd2l0Y2ggdG8gYSBuZXcgY29uZmlndXJhdGlvbiwKQEAgLTMwMDQsNyArMjk4MCw3IEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChvdXRSZXN1bHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG91dFJlc3VsdC5yZXN1bHQgPSByZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBJQWN0aXZpdHlNYW5hZ2VyLlNUQVJUX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nQWN0aXZpdHlMYXVuY2hlZC5hZGQob3V0UmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTMwMTIsNyArMjk4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFvdXRSZXN1bHQudGltZW91dCAmJiBvdXRSZXN1bHQud2hvID09IG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfVEFTS19UT19GUk9OVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IEFjdGl2aXR5TWFuYWdlci5TVEFSVF9UQVNLX1RPX0ZST05UKSB7CiAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHIgPSB0aGlzLnRvcFJ1bm5pbmdBY3Rpdml0eUxvY2tlZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIubm93VmlzaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0LnRpbWVvdXQgPSBmYWxzZTsKQEAgLTMwMzcsOCArMzAxMyw4IEBACiAgICAgfQogICAgIAogICAgIGZpbmFsIGludCBzdGFydEFjdGl2aXRpZXMoSUFwcGxpY2F0aW9uVGhyZWFkIGNhbGxlciwgaW50IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICBJbnRlbnRbXSBpbnRlbnRzLAotICAgICAgICAgICAgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcywgSUJpbmRlciByZXN1bHRUbywgaW50IHVzZXJJZCkgeworICAgICAgICAgICAgSW50ZW50W10gaW50ZW50cywgU3RyaW5nW10gcmVzb2x2ZWRUeXBlcywgSUJpbmRlciByZXN1bHRUbywKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zLCBpbnQgdXNlcklkKSB7CiAgICAgICAgIGlmIChpbnRlbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW50ZW50cyBpcyBudWxsIik7CiAgICAgICAgIH0KQEAgLTMwODEsOCArMzA1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoaW50ZW50KTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQgb2YgdGhlIEludGVudC4KLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvIGFJbmZvID0gcmVzb2x2ZUFjdGl2aXR5KGludGVudCwgcmVzb2x2ZWRUeXBlc1tpXSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvIGFJbmZvID0gcmVzb2x2ZUFjdGl2aXR5KGludGVudCwgcmVzb2x2ZWRUeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTmV3LCBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgYUluZm8gPSBtU2VydmljZS5nZXRBY3Rpdml0eUluZm9Gb3JVc2VyKGFJbmZvLCB1c2VySWQpOwogCkBAIC0zMDkzLDggKzMwNjksOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHN0YXJ0QWN0aXZpdHlMb2NrZWQoY2FsbGVyLCBpbnRlbnQsIHJlc29sdmVkVHlwZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgYUluZm8sIHJlc3VsdFRvLCBudWxsLCAtMSwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY29tcG9uZW50U3BlY2lmaWVkLCBvdXRBY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUluZm8sIHJlc3VsdFRvLCBudWxsLCAtMSwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBvcHRpb25zLCBjb21wb25lbnRTcGVjaWZpZWQsIG91dEFjdGl2aXR5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMxMDYsNyArMzA4Miw3IEBACiAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfU1VDQ0VTUzsKKyAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5TVEFSVF9TVUNDRVNTOwogICAgIH0KIAogICAgIHZvaWQgcmVwb3J0QWN0aXZpdHlMYXVuY2hlZExvY2tlZChib29sZWFuIHRpbWVvdXQsIEFjdGl2aXR5UmVjb3JkIHIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9QZW5kaW5nSW50ZW50UmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9QZW5kaW5nSW50ZW50UmVjb3JkLmphdmEKaW5kZXggMDA0Mzg3NC4uOTY3NjA4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUGVuZGluZ0ludGVudFJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1BlbmRpbmdJbnRlbnRSZWNvcmQuamF2YQpAQCAtMTYsMTIgKzE2LDEzIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRTZW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlcklkOwpAQCAtMTU4LDEzICsxNTksMTMgQEAKICAgICAgICAgCiAgICAgICAgIFN0cmluZyB0eXBlTmFtZSgpIHsKICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgSUFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX0FDVElWSVRZOgorICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQUNUSVZJVFk6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhcnRBY3Rpdml0eSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQlJPQURDQVNUOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJyb2FkY2FzdEludGVudCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBJQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfU0VSVklDRToKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX1NFUlZJQ0U6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhcnRTZXJ2aWNlIjsKLSAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQ6CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQ6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZpdHlSZXN1bHQiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodHlwZSk7CkBAIC0xODEsMTMgKzE4MiwxMyBAQAogICAgIHB1YmxpYyBpbnQgc2VuZChpbnQgY29kZSwgSW50ZW50IGludGVudCwgU3RyaW5nIHJlc29sdmVkVHlwZSwKICAgICAgICAgICAgIElJbnRlbnRSZWNlaXZlciBmaW5pc2hlZFJlY2VpdmVyLCBTdHJpbmcgcmVxdWlyZWRQZXJtaXNzaW9uKSB7CiAgICAgICAgIHJldHVybiBzZW5kSW5uZXIoY29kZSwgaW50ZW50LCByZXNvbHZlZFR5cGUsIGZpbmlzaGVkUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWRQZXJtaXNzaW9uLCBudWxsLCBudWxsLCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByZXF1aXJlZFBlcm1pc3Npb24sIG51bGwsIG51bGwsIDAsIDAsIDAsIG51bGwpOwogICAgIH0KICAgICAKICAgICBpbnQgc2VuZElubmVyKGludCBjb2RlLCBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcmVzb2x2ZWRUeXBlLAogICAgICAgICAgICAgSUludGVudFJlY2VpdmVyIGZpbmlzaGVkUmVjZWl2ZXIsIFN0cmluZyByZXF1aXJlZFBlcm1pc3Npb24sCiAgICAgICAgICAgICBJQmluZGVyIHJlc3VsdFRvLCBTdHJpbmcgcmVzdWx0V2hvLCBpbnQgcmVxdWVzdENvZGUsCi0gICAgICAgICAgICBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMpIHsKKyAgICAgICAgICAgIGludCBmbGFnc01hc2ssIGludCBmbGFnc1ZhbHVlcywgQnVuZGxlIG9wdGlvbnMpIHsKICAgICAgICAgc3luY2hyb25pemVkKG93bmVyKSB7CiAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkKSB7CiAgICAgICAgICAgICAgICAgc2VudCA9IHRydWU7CkBAIC0yMTMsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmRGaW5pc2ggPSBmaW5pc2hlZFJlY2VpdmVyICE9IG51bGw7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkudHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5hbGxJbnRlbnRzICE9IG51bGwgJiYga2V5LmFsbEludGVudHMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRbXSBhbGxJbnRlbnRzID0gbmV3IEludGVudFtrZXkuYWxsSW50ZW50cy5sZW5ndGhdOwpAQCAtMjI3LDIyICsyMjgsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsSW50ZW50c1thbGxJbnRlbnRzLmxlbmd0aC0xXSA9IGZpbmFsSW50ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxSZXNvbHZlZFR5cGVzW2FsbFJlc29sdmVkVHlwZXMubGVuZ3RoLTFdID0gcmVzb2x2ZWRUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lci5zdGFydEFjdGl2aXRpZXNJblBhY2thZ2UodWlkLCBhbGxJbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlc29sdmVkVHlwZXMsIHJlc3VsdFRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxSZXNvbHZlZFR5cGVzLCByZXN1bHRUbywgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIuc3RhcnRBY3Rpdml0eUluUGFja2FnZSh1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxJbnRlbnQsIHJlc29sdmVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUbywgcmVzdWx0V2hvLCByZXF1ZXN0Q29kZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRvLCByZXN1bHRXaG8sIHJlcXVlc3RDb2RlLCAwLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5UQUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNlbmQgc3RhcnRBY3Rpdml0eSBpbnRlbnQiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9BQ1RJVklUWV9SRVNVTFQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQUNUSVZJVFlfUkVTVUxUOgogICAgICAgICAgICAgICAgICAgICAgICAga2V5LmFjdGl2aXR5LnN0YWNrLnNlbmRBY3Rpdml0eVJlc3VsdExvY2tlZCgtMSwga2V5LmFjdGl2aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkud2hvLCBrZXkucmVxdWVzdENvZGUsIGNvZGUsIGZpbmFsSW50ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIElBY3Rpdml0eU1hbmFnZXIuSU5URU5UX1NFTkRFUl9CUk9BRENBU1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfQlJPQURDQVNUOgogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGNvbXBsZXRpb24gY2FsbGJhY2sgaGFzIGJlZW4gcmVxdWVzdGVkLCByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgYnJvYWRjYXN0IGJlIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5CkBAIC0yNTcsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2VuZCBzdGFydEFjdGl2aXR5IGludGVudCIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUFjdGl2aXR5TWFuYWdlci5JTlRFTlRfU0VOREVSX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLklOVEVOVF9TRU5ERVJfU0VSVklDRToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIuc3RhcnRTZXJ2aWNlSW5QYWNrYWdlKHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsSW50ZW50LCByZXNvbHZlZFR5cGUpOwpAQCAtMjgxLDcgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIElBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0FOQ0VMRUQ7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXIuU1RBUlRfQ0FOQ0VMRUQ7CiAgICAgfQogICAgIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BcHBXaW5kb3dUb2tlbi5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQXBwV2luZG93VG9rZW4uamF2YQppbmRleCBiODRmYmRiLi41Y2EwOWU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BcHBXaW5kb3dUb2tlbi5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FwcFdpbmRvd1Rva2VuLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW47CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJQb2xpY3k7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKIApAQCAtMzcsNyArMzgsNyBAQAogICogVmVyc2lvbiBvZiBXaW5kb3dUb2tlbiB0aGF0IGlzIHNwZWNpZmljYWxseSBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIChvcgogICogcmVhbGx5IGFjdGl2aXR5KSB0aGF0IGlzIGRpc3BsYXlpbmcgd2luZG93cy4KICAqLwotY2xhc3MgQXBwV2luZG93VG9rZW4gZXh0ZW5kcyBXaW5kb3dUb2tlbiBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXJTZXJ2aWNlLlN0ZXBBbmltYXRvciB7CitjbGFzcyBBcHBXaW5kb3dUb2tlbiBleHRlbmRzIFdpbmRvd1Rva2VuIHsKICAgICAvLyBOb24tbnVsbCBvbmx5IGZvciBhcHBsaWNhdGlvbiB0b2tlbnMuCiAgICAgZmluYWwgSUFwcGxpY2F0aW9uVG9rZW4gYXBwVG9rZW47CiAKQEAgLTE5NSw4ICsxOTYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3RlcEFuaW1hdGlvbihsb25nIGN1cnJlbnRUaW1lKSB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RlcEFuaW1hdGlvbihsb25nIGN1cnJlbnRUaW1lKSB7CiAgICAgICAgIGlmIChhbmltYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMTYsNyArMjE3LDcgQEAKICAgICB9CiAKICAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHdoaWxlIGluc2lkZSBhIHRyYW5zYWN0aW9uLgotICAgIGJvb2xlYW4gc3RhcnRBbmRGaW5pc2hBbmltYXRpb25Mb2NrZWQobG9uZyBjdXJyZW50VGltZSwgaW50IGR3LCBpbnQgZGgpIHsKKyAgICBib29sZWFuIHN0ZXBBbmltYXRpb25Mb2NrZWQobG9uZyBjdXJyZW50VGltZSwgaW50IGR3LCBpbnQgZGgpIHsKICAgICAgICAgaWYgKCFzZXJ2aWNlLm1EaXNwbGF5RnJvemVuICYmIHNlcnZpY2UubVBvbGljeS5pc1NjcmVlbk9uRnVsbHkoKSkgewogICAgICAgICAgICAgLy8gV2Ugd2lsbCBydW4gYW5pbWF0aW9ucyBhcyBsb25nIGFzIHRoZSBkaXNwbGF5IGlzbid0IGZyb3plbi4KIApAQCAtMjQwLDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUhCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBBbmltYXRpb24oY3VycmVudFRpbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGxheSBpcyBmcm96ZW4sIGFuZCB0aGVyZSBpcyBhIHBlbmRpbmcgYW5pbWF0aW9uLApAQCAtMjU1LDYgKzI1Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICBzZXJ2aWNlLm1QZW5kaW5nTGF5b3V0Q2hhbmdlcyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19BTklNOwogICAgICAgICBjbGVhckFuaW1hdGlvbigpOwogICAgICAgICBhbmltYXRpbmcgPSBmYWxzZTsKICAgICAgICAgaWYgKGFuaW1MYXllckFkanVzdG1lbnQgIT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2NyZWVuUm90YXRpb25BbmltYXRpb24uamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NjcmVlblJvdGF0aW9uQW5pbWF0aW9uLmphdmEKaW5kZXggN2I1YmYwOC4uNTgxODdiNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2NyZWVuUm90YXRpb25BbmltYXRpb24uamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwogCi1jbGFzcyBTY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbiBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXJTZXJ2aWNlLlN0ZXBBbmltYXRvciB7CitjbGFzcyBTY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2NyZWVuUm90YXRpb25BbmltYXRpb24iOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NUQVRFID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVFJBTlNGT1JNUyA9IGZhbHNlOwpAQCAtNTQwLDggKzU0MCw3IEBACiAgICAgICAgICAgICAgICAgfHwgbVJvdGF0ZUZyYW1lQW5pbWF0aW9uICE9IG51bGw7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3RlcEFuaW1hdGlvbihsb25nIG5vdykgeworICAgIHByaXZhdGUgYm9vbGVhbiBzdGVwQW5pbWF0aW9uKGxvbmcgbm93KSB7CiAKICAgICAgICAgaWYgKG1GaW5pc2hBbmltUmVhZHkgJiYgbUZpbmlzaEFuaW1TdGFydFRpbWUgPCAwKSB7CiAgICAgICAgICAgICBpZiAoREVCVUdfU1RBVEUpIFNsb2cudihUQUcsICJTdGVwOiBmaW5pc2ggYW5pbSBub3cgcmVhZHkiKTsKQEAgLTcyNSw3ICs3MjQsNyBAQAogICAgICAgICBzZXRTbmFwc2hvdFRyYW5zZm9ybShtU25hcHNob3RGaW5hbE1hdHJpeCwgbUV4aXRUcmFuc2Zvcm1hdGlvbi5nZXRBbHBoYSgpKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRBbmRGaW5pc2hBbmltYXRpb25Mb2NrZWQobG9uZyBub3cpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGVwQW5pbWF0aW9uTG9ja2VkKGxvbmcgbm93KSB7CiAgICAgICAgIGlmICghaXNBbmltYXRpbmcoKSkgewogICAgICAgICAgICAgaWYgKERFQlVHX1NUQVRFKSBTbG9nLnYoVEFHLCAiU3RlcDogbm8gYW5pbWF0aW9ucyBydW5uaW5nIik7CiAgICAgICAgICAgICBtRmluaXNoQW5pbVJlYWR5ID0gZmFsc2U7CkBAIC03NjMsOCArNzYyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BbmltUnVubmluZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIHJldHVybiBzdGVwQW5pbWF0aW9uKG5vdyk7CiAgICAgfQogCiAgICAgcHVibGljIFRyYW5zZm9ybWF0aW9uIGdldEVudGVyVHJhbnNmb3JtYXRpb24oKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAyMjk0OWYzLi40ZjU1MjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ2MSw2ICs0NjEsNyBAQAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElSb3RhdGlvbldhdGNoZXI+KCk7CiAgICAgaW50IG1EZWZlcnJlZFJvdGF0aW9uUGF1c2VDb3VudDsKIAorICAgIGludCBtUGVuZGluZ0xheW91dENoYW5nZXMgPSAwOwogICAgIGJvb2xlYW4gbUxheW91dE5lZWRlZCA9IHRydWU7CiAgICAgYm9vbGVhbiBtVHJhdmVyc2FsU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgYm9vbGVhbiBtRGlzcGxheUZyb3plbiA9IGZhbHNlOwpAQCAtNjE3LDE4ICs2MTgsNiBAQAogICAgIGZpbmFsIEFuaW1hdGlvblJ1bm5hYmxlIG1BbmltYXRpb25SdW5uYWJsZSA9IG5ldyBBbmltYXRpb25SdW5uYWJsZSgpOwogICAgIGJvb2xlYW4gbUFuaW1hdGlvblNjaGVkdWxlZDsKIAotICAgIGludGVyZmFjZSBTdGVwQW5pbWF0b3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29udGludWUgdGhlIHN0ZXBwaW5nIG9mIGFuIG9uZ29pbmcgYW5pbWF0aW9uLiBXaGVuIHRoZSBhbmltYXRpb24gY29tcGxldGVzIHRoaXMgbWV0aG9kCi0gICAgICAgICAqIG11c3QgZGlzYWJsZSB0aGUgYW5pbWF0aW9uIG9uIHRoZSBTdGVwQW5pbWF0b3IuIAotICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBVc2UgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIGdvaW5nIG9uLCBmYWxzZSBpZiB0aGUgYW5pbWF0aW9uIGhhcyBjb21wbGV0ZWQKLSAgICAgICAgICogICAgICBhbmQgc3RlcEFuaW1hdGlvbiBoYXMgY2xlYXJlZCB0aGUgYW5pbWF0aW9uIGxvY2FsbHkuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIHN0ZXBBbmltYXRpb24obG9uZyBjdXJyZW50VGltZSk7Ci0gICAgfQotICAgIGZpbmFsIEFycmF5TGlzdDxTdGVwQW5pbWF0b3I+IG1TdGVwQW5pbWF0b3JzID0gbmV3IEFycmF5TGlzdDxTdGVwQW5pbWF0b3I+KCk7Ci0gICAgCiAgICAgZmluYWwgY2xhc3MgRHJhZ0lucHV0RXZlbnRSZWNlaXZlciBleHRlbmRzIElucHV0RXZlbnRSZWNlaXZlciB7CiAgICAgICAgIHB1YmxpYyBEcmFnSW5wdXRFdmVudFJlY2VpdmVyKElucHV0Q2hhbm5lbCBpbnB1dENoYW5uZWwsIExvb3BlciBsb29wZXIpIHsKICAgICAgICAgICAgIHN1cGVyKGlucHV0Q2hhbm5lbCwgbG9vcGVyKTsKQEAgLTI5OTUsMTUgKzI5ODQsMjcgQEAKICAgICB9CiAKICAgICB2b2lkIGFwcGx5RW50ZXJBbmltYXRpb25Mb2NrZWQoV2luZG93U3RhdGUgd2luKSB7Ci0gICAgICAgIGludCB0cmFuc2l0ID0gV2luZG93TWFuYWdlclBvbGljeS5UUkFOU0lUX1NIT1c7CisgICAgICAgIGZpbmFsIGludCB0cmFuc2l0OwogICAgICAgICBpZiAod2luLm1FbnRlckFuaW1hdGlvblBlbmRpbmcpIHsKICAgICAgICAgICAgIHdpbi5tRW50ZXJBbmltYXRpb25QZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICAgICB0cmFuc2l0ID0gV2luZG93TWFuYWdlclBvbGljeS5UUkFOU0lUX0VOVEVSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNpdCA9IFdpbmRvd01hbmFnZXJQb2xpY3kuVFJBTlNJVF9TSE9XOwogICAgICAgICB9CiAKICAgICAgICAgYXBwbHlBbmltYXRpb25Mb2NrZWQod2luLCB0cmFuc2l0LCB0cnVlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDaG9vc2UgdGhlIGNvcnJlY3QgYW5pbWF0aW9uIGFuZCBzZXQgaXQgdG8gdGhlIHBhc3NlZCBXaW5kb3dTdGF0ZS4KKyAgICAgKiBAcGFyYW0gd2luIFRoZSB3aW5kb3cgdG8gYWRkIHRoZSBhbmltYXRpb24gdG8uCisgICAgICogQHBhcmFtIHRyYW5zaXQgSWYgV2luZG93TWFuYWdlclBvbGljeS5UUkFOU0lUX1BSRVZJRVdfRE9ORSBhbmQgdGhlIGFwcCB3aW5kb3cgaGFzIGJlZW4gZHJhd24KKyAgICAgKiAgICAgIHRoZW4gdGhlIGFuaW1hdGlvbiB3aWxsIGJlIGFwcF9zdGFydGluZ19leGl0LiBBbnkgb3RoZXIgdmFsdWUgbG9hZHMgdGhlIGFuaW1hdGlvbiBmcm9tCisgICAgICogICAgICB0aGUgc3dpdGNoIHN0YXRlbWVudCBiZWxvdy4KKyAgICAgKiBAcGFyYW0gaXNFbnRyYW5jZSBUaGUgYW5pbWF0aW9uIHR5cGUgdGhlIGxhc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQuIFVzZWQgdG8ga2VlcCBmcm9tCisgICAgICogICAgICBsb2FkaW5nIHRoZSBzYW1lIGFuaW1hdGlvbiB0d2ljZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gYW5pbWF0aW9uIGhhcyBiZWVuIGxvYWRlZC4KKyAgICAgKi8KICAgICBib29sZWFuIGFwcGx5QW5pbWF0aW9uTG9ja2VkKFdpbmRvd1N0YXRlIHdpbiwKICAgICAgICAgICAgIGludCB0cmFuc2l0LCBib29sZWFuIGlzRW50cmFuY2UpIHsKICAgICAgICAgaWYgKHdpbi5tTG9jYWxBbmltYXRpbmcgJiYgd2luLm1BbmltYXRpb25Jc0VudHJhbmNlID09IGlzRW50cmFuY2UpIHsKQEAgLTc2NDMsMjAgKzc2NDQsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGFuaW1hdGluZyBvYmplY3RzIHNhdmVkIGluIG1TdGVwQW5pbWF0b3JzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGVwQW5pbWF0aW9ucygpIHsKLSAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKGZpbmFsIFN0ZXBBbmltYXRvciBzdGVwQW5pbWF0b3IgOiBtU3RlcEFuaW1hdG9ycykgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3JlID0gc3RlcEFuaW1hdG9yLnN0ZXBBbmltYXRpb24oY3VycmVudFRpbWUpOwotICAgICAgICAgICAgaWYgKERFQlVHX0FOSU0pIHsKLSAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAic3RlcEFuaW1hdGlvbnM6ICIgKyBjdXJyZW50VGltZSArICI6IFN0ZXBwZWQgIiArIHN0ZXBBbmltYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgKyAobW9yZSA/ICIgbW9yZSIgOiAiIGRvbmUiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCiAgICAgICogRXh0cmFjdGVkIGZyb20ge0BsaW5rICNwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyfSB0byByZWR1Y2Ugc2l6ZSBvZiBtZXRob2QuCiAgICAgICogVXBkYXRlIGFuaW1hdGlvbnMgb2YgYWxsIGFwcGxpY2F0aW9ucywgaW5jbHVkaW5nIHRob3NlIGFzc29jaWF0ZWQgd2l0aCBleGl0aW5nL3JlbW92ZWQgYXBwcy4KICAgICAgKgpAQCAtNzY3MCwxNiArNzY1NywxNCBAQAogICAgICAgICBmaW5hbCBpbnQgTkFUID0gbUFwcFRva2Vucy5zaXplKCk7CiAgICAgICAgIGZvciAoaT0wOyBpPE5BVDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBBcHBXaW5kb3dUb2tlbiBhcHBUb2tlbiA9IG1BcHBUb2tlbnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFwcFRva2VuLnN0YXJ0QW5kRmluaXNoQW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lLCBpbm5lckR3LCBpbm5lckRoKSkgewotICAgICAgICAgICAgICAgIG1TdGVwQW5pbWF0b3JzLmFkZChhcHBUb2tlbik7CisgICAgICAgICAgICBpZiAoYXBwVG9rZW4uc3RlcEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSwgaW5uZXJEdywgaW5uZXJEaCkpIHsKICAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubUFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgaW50IE5FQVQgPSBtRXhpdGluZ0FwcFRva2Vucy5zaXplKCk7CiAgICAgICAgIGZvciAoaT0wOyBpPE5FQVQ7IGkrKykgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXBwVG9rZW4gPSBtRXhpdGluZ0FwcFRva2Vucy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYXBwVG9rZW4uc3RhcnRBbmRGaW5pc2hBbmltYXRpb25Mb2NrZWQoY3VycmVudFRpbWUsIGlubmVyRHcsIGlubmVyRGgpKSB7Ci0gICAgICAgICAgICAgICAgbVN0ZXBBbmltYXRvcnMuYWRkKGFwcFRva2VuKTsKKyAgICAgICAgICAgIGlmIChhcHBUb2tlbi5zdGVwQW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lLCBpbm5lckR3LCBpbm5lckRoKSkgewogICAgICAgICAgICAgICAgIG1Jbm5lckZpZWxkcy5tQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzY4NywxMCArNzY3Miw5IEBACiAgICAgICAgIGlmIChtU2NyZWVuUm90YXRpb25BbmltYXRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5pc0FuaW1hdGluZygpIHx8CiAgICAgICAgICAgICAgICAgICAgIG1TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5tRmluaXNoQW5pbVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5zdGFydEFuZEZpbmlzaEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNjcmVlblJvdGF0aW9uQW5pbWF0aW9uLnN0ZXBBbmltYXRpb25Mb2NrZWQoY3VycmVudFRpbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Jbm5lckZpZWxkcy5tVXBkYXRlUm90YXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU3RlcEFuaW1hdG9ycy5hZGQobVNjcmVlblJvdGF0aW9uQW5pbWF0aW9uKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubVVwZGF0ZVJvdGF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbVNjcmVlblJvdGF0aW9uQW5pbWF0aW9uLmtpbGwoKTsKQEAgLTc3MTEsOSArNzY5NSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlV2luZG93c0FuZFdhbGxwYXBlckxvY2tlZChmaW5hbCBsb25nIGN1cnJlbnRUaW1lLCBmaW5hbCBpbnQgZHcsIGZpbmFsIGludCBkaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbm5lckR3LCBmaW5hbCBpbnQgaW5uZXJEaCkgewotCi0gICAgICAgIG1Qb2xpY3kuYmVnaW5BbmltYXRpb25MdyhkdywgZGgpOwotCisgICAgICAgIGludCBjaGFuZ2VzID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IG1XaW5kb3dzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gbVdpbmRvd3MuZ2V0KGkpOwogCkBAIC03NzI3LDYgKzc3MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1dBTExQQVBFUikgU2xvZy52KFRBRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcnN0IGRyYXcgZG9uZSBpbiBwb3RlbnRpYWwgd2FsbHBhcGVyIHRhcmdldCAiICsgdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubVdhbGxwYXBlck1heUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IFdpbmRvd01hbmFnZXJQb2xpY3kuRklOSVNIX0xBWU9VVF9SRURPX1dBTExQQVBFUjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtNzc0OSwxMyArNzczMiw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNBbmltYXRpbmcgPSB3Lm1XYXNBbmltYXRpbmc7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3dBbmltYXRpbmcgPSB3LnN0YXJ0QW5kRmluaXNoQW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobm93QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGVwQW5pbWF0b3JzLmFkZCh3KTsKLSAgICAgICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vd0FuaW1hdGluZyA9IHcuc3RlcEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfV0FMTFBBUEVSKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudihUQUcsIHcgKyAiOiB3YXNBbmltYXRpbmc9IiArIHdhc0FuaW1hdGluZyArCkBAIC03ODA2LDYgKzc3ODMsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHdhc0FuaW1hdGluZyAmJiAhdy5tQW5pbWF0aW5nICYmIG1XYWxscGFwZXJUYXJnZXQgPT0gdykgewogICAgICAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubVdhbGxwYXBlck1heUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fV0FMTFBBUEVSOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChtUG9saWN5LmRvZXNGb3JjZUhpZGUodywgYXR0cnMpKSB7CkBAIC03ODE0LDYgKzc3OTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5pbWF0aW9uIHN0YXJ0ZWQgdGhhdCBjb3VsZCBpbXBhY3QgZm9yY2UgaGlkZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1XYWxscGFwZXJGb3JjZUhpZGluZ0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19XQUxMUEFQRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNNYXlDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcuaXNSZWFkeUZvckRpc3BsYXkoKSAmJiB3Lm1BbmltYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1Gb3JjZUhpZGluZyA9IHRydWU7CkBAIC03ODUyLDEwICs3ODMxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQgJiYgKGF0dHJzLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0FMTFBBUEVSKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubVdhbGxwYXBlck1heUNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IFdpbmRvd01hbmFnZXJQb2xpY3kuRklOSVNIX0xBWU9VVF9SRURPX1dBTExQQVBFUjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1Qb2xpY3kuYW5pbWF0aW5nV2luZG93THcodywgYXR0cnMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBBcHBXaW5kb3dUb2tlbiBhdG9rZW4gPSB3Lm1BcHBUb2tlbjsKQEAgLTc5MDAsMTAgKzc4NzgsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHcubVJlYWR5VG9TaG93KSB7CiAgICAgICAgICAgICAgICAgdy5wZXJmb3JtU2hvd0xvY2tlZCgpOworICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fQU5JTTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAvLyBlbmQgZm9yYWxsIHdpbmRvd3MKIAotICAgICAgICByZXR1cm4gbVBvbGljeS5maW5pc2hBbmltYXRpb25MdygpOworICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICB9CiAKICAgICAvKioKQEAgLTgzMjIsNiArODMwMSw3MiBAQAogICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmVzaXppbmdXaW5kb3dzKGZpbmFsIFdpbmRvd1N0YXRlIHcpIHsKKyAgICAgICAgaWYgKCF3Lm1BcHBGcmVlemluZyAmJiB3Lm1MYXlvdXRTZXEgPT0gbUxheW91dFNlcSkgeworICAgICAgICAgICAgdy5tQ29udGVudEluc2V0c0NoYW5nZWQgfD0KKyAgICAgICAgICAgICAgICAhdy5tTGFzdENvbnRlbnRJbnNldHMuZXF1YWxzKHcubUNvbnRlbnRJbnNldHMpOworICAgICAgICAgICAgdy5tVmlzaWJsZUluc2V0c0NoYW5nZWQgfD0KKyAgICAgICAgICAgICAgICAhdy5tTGFzdFZpc2libGVJbnNldHMuZXF1YWxzKHcubVZpc2libGVJbnNldHMpOworICAgICAgICAgICAgYm9vbGVhbiBjb25maWdDaGFuZ2VkID0KKyAgICAgICAgICAgICAgICB3Lm1Db25maWd1cmF0aW9uICE9IG1DdXJDb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgJiYgKHcubUNvbmZpZ3VyYXRpb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUN1ckNvbmZpZ3VyYXRpb24uZGlmZih3Lm1Db25maWd1cmF0aW9uKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OICYmIGNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiV2luICIgKyB3ICsgIiBjb25maWcgY2hhbmdlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ3VyQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBTbG9nLnYoVEFHLCAiUmVzaXppbmcgIiArIHcKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBjb25maWdDaGFuZ2VkPSIgKyBjb25maWdDaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICsgIiBsYXN0PSIgKyB3Lm1MYXN0RnJhbWUgKyAiIGZyYW1lPSIgKyB3Lm1GcmFtZSk7CisgICAgICAgICAgICB3Lm1MYXN0RnJhbWUuc2V0KHcubUZyYW1lKTsKKyAgICAgICAgICAgIGlmICh3Lm1Db250ZW50SW5zZXRzQ2hhbmdlZAorICAgICAgICAgICAgICAgICAgICB8fCB3Lm1WaXNpYmxlSW5zZXRzQ2hhbmdlZAorICAgICAgICAgICAgICAgICAgICB8fCB3Lm1TdXJmYWNlUmVzaXplZAorICAgICAgICAgICAgICAgICAgICB8fCBjb25maWdDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX1JFU0laRSB8fCBERUJVR19PUklFTlRBVElPTikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiUmVzaXplIHJlYXNvbnM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29udGVudEluc2V0c0NoYW5nZWQ9IiArIHcubUNvbnRlbnRJbnNldHNDaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZpc2libGVJbnNldHNDaGFuZ2VkPSIgKyB3Lm1WaXNpYmxlSW5zZXRzQ2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzdXJmYWNlUmVzaXplZD0iICsgdy5tU3VyZmFjZVJlc2l6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29uZmlnQ2hhbmdlZD0iICsgY29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdy5tTGFzdENvbnRlbnRJbnNldHMuc2V0KHcubUNvbnRlbnRJbnNldHMpOworICAgICAgICAgICAgICAgIHcubUxhc3RWaXNpYmxlSW5zZXRzLnNldCh3Lm1WaXNpYmxlSW5zZXRzKTsKKyAgICAgICAgICAgICAgICBtYWtlV2luZG93RnJlZXppbmdTY3JlZW5JZk5lZWRlZExvY2tlZCh3KTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb3JpZW50YXRpb24gaXMgY2hhbmdpbmcsIHRoZW4gd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIGhvbGQgb2ZmIG9uIHVuZnJlZXppbmcgdGhlIGRpc3BsYXkgdW50aWwgdGhpcworICAgICAgICAgICAgICAgIC8vIHdpbmRvdyBoYXMgYmVlbiByZWRyYXduOyB0byBkbyB0aGF0LCB3ZSBuZWVkCisgICAgICAgICAgICAgICAgLy8gdG8gZ28gdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIGluZm9ybWVkCisgICAgICAgICAgICAgICAgLy8gYnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gaXQgaGFzIGZpbmlzaGVkIGRyYXdpbmcuCisgICAgICAgICAgICAgICAgaWYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX09SSUVOVEFUSU9OKSBTbG9nLnYoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmllbnRhdGlvbiBzdGFydCB3YWl0aW5nIGZvciBkcmF3IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcgKyAiLCBzdXJmYWNlICIgKyB3Lm1TdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgdy5tRHJhd1BlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3Lm1Db21taXREcmF3UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3Lm1SZWFkeVRvU2hvdyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAody5tQXBwVG9rZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdy5tQXBwVG9rZW4uYWxsRHJhd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1SZXNpemluZ1dpbmRvd3MuY29udGFpbnModykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1JFU0laRSB8fCBERUJVR19PUklFTlRBVElPTikgU2xvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzaXppbmcgd2luZG93ICIgKyB3ICsgIiB0byAiICsgdy5tU3VyZmFjZVcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ4IiArIHcubVN1cmZhY2VIKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlc2l6aW5nV2luZG93cy5hZGQodyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh3Lm1PcmllbnRhdGlvbkNoYW5naW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKCF3Lm1EcmF3UGVuZGluZyAmJiAhdy5tQ29tbWl0RHJhd1BlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX09SSUVOVEFUSU9OKSBTbG9nLnYoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmllbnRhdGlvbiBub3Qgd2FpdGluZyBmb3IgZHJhdyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3ICsgIiwgc3VyZmFjZSAiICsgdy5tU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHcubU9yaWVudGF0aW9uQ2hhbmdpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBFeHRyYWN0ZWQgZnJvbSB7QGxpbmsgI3BlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXJ9IHRvIHJlZHVjZSBzaXplIG9mIG1ldGhvZC4KICAgICAgKgpAQCAtODQwNyw2OSArODQ1Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXcubUFwcEZyZWV6aW5nICYmIHcubUxheW91dFNlcSA9PSBtTGF5b3V0U2VxKSB7Ci0gICAgICAgICAgICB3Lm1Db250ZW50SW5zZXRzQ2hhbmdlZCB8PQotICAgICAgICAgICAgICAgICF3Lm1MYXN0Q29udGVudEluc2V0cy5lcXVhbHMody5tQ29udGVudEluc2V0cyk7Ci0gICAgICAgICAgICB3Lm1WaXNpYmxlSW5zZXRzQ2hhbmdlZCB8PQotICAgICAgICAgICAgICAgICF3Lm1MYXN0VmlzaWJsZUluc2V0cy5lcXVhbHMody5tVmlzaWJsZUluc2V0cyk7Ci0gICAgICAgICAgICBib29sZWFuIGNvbmZpZ0NoYW5nZWQgPQotICAgICAgICAgICAgICAgIHcubUNvbmZpZ3VyYXRpb24gIT0gbUN1ckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAmJiAody5tQ29uZmlndXJhdGlvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VyQ29uZmlndXJhdGlvbi5kaWZmKHcubUNvbmZpZ3VyYXRpb24pICE9IDApOwotICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJR1VSQVRJT04gJiYgY29uZmlnQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJXaW4gIiArIHcgKyAiIGNvbmZpZyBjaGFuZ2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1DdXJDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIFNsb2cudihUQUcsICJSZXNpemluZyAiICsgdwotICAgICAgICAgICAgICAgICAgICArICI6IGNvbmZpZ0NoYW5nZWQ9IiArIGNvbmZpZ0NoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGxhc3Q9IiArIHcubUxhc3RGcmFtZSArICIgZnJhbWU9IiArIHcubUZyYW1lKTsKLSAgICAgICAgICAgIHcubUxhc3RGcmFtZS5zZXQody5tRnJhbWUpOwotICAgICAgICAgICAgaWYgKHcubUNvbnRlbnRJbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgIHx8IHcubVZpc2libGVJbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgIHx8IHcubVN1cmZhY2VSZXNpemVkCi0gICAgICAgICAgICAgICAgICAgIHx8IGNvbmZpZ0NoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfUkVTSVpFIHx8IERFQlVHX09SSUVOVEFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJSZXNpemUgcmVhc29uczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb250ZW50SW5zZXRzQ2hhbmdlZD0iICsgdy5tQ29udGVudEluc2V0c0NoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmlzaWJsZUluc2V0c0NoYW5nZWQ9IiArIHcubVZpc2libGVJbnNldHNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHN1cmZhY2VSZXNpemVkPSIgKyB3Lm1TdXJmYWNlUmVzaXplZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb25maWdDaGFuZ2VkPSIgKyBjb25maWdDaGFuZ2VkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3Lm1MYXN0Q29udGVudEluc2V0cy5zZXQody5tQ29udGVudEluc2V0cyk7Ci0gICAgICAgICAgICAgICAgdy5tTGFzdFZpc2libGVJbnNldHMuc2V0KHcubVZpc2libGVJbnNldHMpOwotICAgICAgICAgICAgICAgIG1ha2VXaW5kb3dGcmVlemluZ1NjcmVlbklmTmVlZGVkTG9ja2VkKHcpOwotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvcmllbnRhdGlvbiBpcyBjaGFuZ2luZywgdGhlbiB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gaG9sZCBvZmYgb24gdW5mcmVlemluZyB0aGUgZGlzcGxheSB1bnRpbCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gd2luZG93IGhhcyBiZWVuIHJlZHJhd247IHRvIGRvIHRoYXQsIHdlIG5lZWQKLSAgICAgICAgICAgICAgICAvLyB0byBnbyB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgaW5mb3JtZWQKLSAgICAgICAgICAgICAgICAvLyBieSB0aGUgYXBwbGljYXRpb24gd2hlbiBpdCBoYXMgZmluaXNoZWQgZHJhd2luZy4KLSAgICAgICAgICAgICAgICBpZiAody5tT3JpZW50YXRpb25DaGFuZ2luZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yaWVudGF0aW9uIHN0YXJ0IHdhaXRpbmcgZm9yIGRyYXcgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdyArICIsIHN1cmZhY2UgIiArIHcubVN1cmZhY2UpOwotICAgICAgICAgICAgICAgICAgICB3Lm1EcmF3UGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHcubUNvbW1pdERyYXdQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHcubVJlYWR5VG9TaG93ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3Lm1BcHBUb2tlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3Lm1BcHBUb2tlbi5hbGxEcmF3biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbVJlc2l6aW5nV2luZG93cy5jb250YWlucyh3KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfUkVTSVpFIHx8IERFQlVHX09SSUVOVEFUSU9OKSBTbG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNpemluZyB3aW5kb3cgIiArIHcgKyAiIHRvICIgKyB3Lm1TdXJmYWNlVwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIngiICsgdy5tU3VyZmFjZUgpOwotICAgICAgICAgICAgICAgICAgICBtUmVzaXppbmdXaW5kb3dzLmFkZCh3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXcubURyYXdQZW5kaW5nICYmICF3Lm1Db21taXREcmF3UGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yaWVudGF0aW9uIG5vdCB3YWl0aW5nIGZvciBkcmF3IGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcgKyAiLCBzdXJmYWNlICIgKyB3Lm1TdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdy5tT3JpZW50YXRpb25DaGFuZ2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB1cGRhdGVSZXNpemluZ1dpbmRvd3Modyk7CiAKICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewpAQCAtODY3OCw2ICs4NjYxLDY3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIGZpbmFsIGludCBwZXJmb3JtQW5pbWF0aW9uc0xvY2tlZChsb25nIGN1cnJlbnRUaW1lLCBpbnQgZHcsIGludCBkaCwKKyAgICAgICAgICAgIGludCBpbm5lckR3LCBpbnQgaW5uZXJEaCkgeworICAgICAgICArK21UcmFuc2FjdGlvblNlcXVlbmNlOworCisgICAgICAgIGlmIChERUJVR19BUFBfVFJBTlNJVElPTlMpIFNsb2cudihUQUcsICIqKiogQU5JTSBTVEVQOiBzZXE9IgorICAgICAgICAgICAgICAgICsgbVRyYW5zYWN0aW9uU2VxdWVuY2UgKyAiIG1BbmltYXRpbmc9IgorICAgICAgICAgICAgICAgICsgbUlubmVyRmllbGRzLm1BbmltYXRpbmcpOworCisgICAgICAgIG1Jbm5lckZpZWxkcy5tVG9rZW5NYXlCZURyYXduID0gZmFsc2U7CisgICAgICAgIG1Jbm5lckZpZWxkcy5tV2FsbHBhcGVyTWF5Q2hhbmdlID0gZmFsc2U7CisgICAgICAgIG1Jbm5lckZpZWxkcy5tRm9yY2VIaWRpbmcgPSBmYWxzZTsKKyAgICAgICAgbUlubmVyRmllbGRzLm1EZXRhY2hlZFdhbGxwYXBlciA9IG51bGw7CisgICAgICAgIG1Jbm5lckZpZWxkcy5tV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZCA9IG51bGw7CisgICAgICAgIG1Jbm5lckZpZWxkcy5tV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZENvbG9yID0gMDsKKworICAgICAgICBpbnQgY2hhbmdlcyA9IHVwZGF0ZVdpbmRvd3NBbmRXYWxscGFwZXJMb2NrZWQoY3VycmVudFRpbWUsIGR3LCBkaCwgaW5uZXJEdywgaW5uZXJEaCk7CisKKyAgICAgICAgaWYgKG1Jbm5lckZpZWxkcy5tVG9rZW5NYXlCZURyYXduKSB7CisgICAgICAgICAgICBjaGFuZ2VzIHw9IHRlc3RUb2tlbk1heUJlRHJhd25Mb2NrZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSByZWFkeSB0byBwZXJmb3JtIGFuIGFwcCB0cmFuc2l0aW9uLCBjaGVjayB0aHJvdWdoCisgICAgICAgIC8vIGFsbCBvZiB0aGUgYXBwIHRva2VucyB0byBiZSBzaG93biBhbmQgc2VlIGlmIHRoZXkgYXJlIHJlYWR5CisgICAgICAgIC8vIHRvIGdvLgorICAgICAgICBpZiAobUFwcFRyYW5zaXRpb25SZWFkeSkgeworICAgICAgICAgICAgY2hhbmdlcyB8PSBoYW5kbGVBcHBUcmFuc2l0aW9uUmVhZHlMb2NrZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jbm5lckZpZWxkcy5tQWRqUmVzdWx0ID0gMDsKKworICAgICAgICBpZiAoIW1Jbm5lckZpZWxkcy5tQW5pbWF0aW5nICYmIG1BcHBUcmFuc2l0aW9uUnVubmluZykgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBmaW5pc2hlZCB0aGUgYW5pbWF0aW9uIG9mIGFuIGFwcCB0cmFuc2l0aW9uLiAgVG8gZG8KKyAgICAgICAgICAgIC8vIHRoaXMsIHdlIGhhdmUgZGVsYXllZCBhIGxvdCBvZiBvcGVyYXRpb25zIGxpa2Ugc2hvd2luZyBhbmQKKyAgICAgICAgICAgIC8vIGhpZGluZyBhcHBzLCBtb3ZpbmcgYXBwcyBpbiBaLW9yZGVyLCBldGMuICBUaGUgYXBwIHRva2VuIGxpc3QKKyAgICAgICAgICAgIC8vIHJlZmxlY3RzIHRoZSBjb3JyZWN0IFotb3JkZXIsIGJ1dCB0aGUgd2luZG93IGxpc3QgbWF5IG5vdworICAgICAgICAgICAgLy8gYmUgb3V0IG9mIHN5bmMgd2l0aCBpdC4gIFNvIGhlcmUgd2Ugd2lsbCBqdXN0IHJlYnVpbGQgdGhlCisgICAgICAgICAgICAvLyBlbnRpcmUgYXBwIHdpbmRvdyBsaXN0LiAgRnVuIQorICAgICAgICAgICAgY2hhbmdlcyB8PSBoYW5kbGVBbmltYXRpbmdTdG9wcGVkQW5kVHJhbnNpdGlvbkxvY2tlZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jbm5lckZpZWxkcy5tV2FsbHBhcGVyRm9yY2VIaWRpbmdDaGFuZ2VkICYmIGNoYW5nZXMgPT0gMCAmJiAhbUFwcFRyYW5zaXRpb25SZWFkeSkgeworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlcmUgd2FzIGEgd2luZG93IHdpdGggYSB3YWxscGFwZXIgdGhhdAorICAgICAgICAgICAgLy8gd2FzIGZvcmNlIGhpZGluZyBvdGhlciB3aW5kb3dzIGJlaGluZCBpdCwgYnV0IG5vdyBpdAorICAgICAgICAgICAgLy8gaXMgZ29pbmcgYXdheS4gIFRoaXMgbWF5IGJlIHNpbXBsZSAtLSBqdXN0IGFuaW1hdGUKKyAgICAgICAgICAgIC8vIGF3YXkgdGhlIHdhbGxwYXBlciBhbmQgaXRzIHdpbmRvdyAtLSBvciBpdCBtYXkgYmUKKyAgICAgICAgICAgIC8vIGhhcmQgLS0gdGhlIHdhbGxwYXBlciBub3cgbmVlZHMgdG8gYmUgc2hvd24gYmVoaW5kCisgICAgICAgICAgICAvLyBzb21ldGhpbmcgdGhhdCB3YXMgaGlkZGVuLgorICAgICAgICAgICAgY2hhbmdlcyB8PSBhbmltYXRlQXdheVdhbGxwYXBlckxvY2tlZCgpOworICAgICAgICB9CisKKyAgICAgICAgY2hhbmdlcyB8PSB0ZXN0V2FsbHBhcGVyQW5kQmFja2dyb3VuZExvY2tlZCgpOworCisgICAgICAgIGlmIChtTGF5b3V0TmVlZGVkKSB7CisgICAgICAgICAgICBjaGFuZ2VzIHw9IFBob25lV2luZG93TWFuYWdlci5GSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHX0FQUF9UUkFOU0lUSU9OUykgU2xvZy52KFRBRywgIioqKiBBTklNIFNURVA6IGNoYW5nZXM9MHgiCisgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoYW5nZXMpKTsKKyAgICAgICAgcmV0dXJuIGNoYW5nZXM7CisgICAgfQorCiAgICAgLy8gIlNvbWV0aGluZyBoYXMgY2hhbmdlZCEgIExldCdzIG1ha2UgaXQgY29ycmVjdCBub3cuIgogICAgIHByaXZhdGUgZmluYWwgdm9pZCBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyKAogICAgICAgICAgICAgYm9vbGVhbiByZWNvdmVyaW5nTWVtb3J5KSB7CkBAIC04NzQxLDcgKzg3ODUsNiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUlubmVyRmllbGRzLm1XYWxscGFwZXJGb3JjZUhpZGluZ0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGludCByZXBlYXRzID0gMDsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKICAgICAgICAgICAgIAogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHJlcGVhdHMrKzsKQEAgLTg3NTEsMjAgKzg3OTQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fV0FMTFBBUEVSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChtUGVuZGluZ0xheW91dENoYW5nZXMgJiBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19XQUxMUEFQRVIpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChhZGp1c3RXYWxscGFwZXJXaW5kb3dzTG9ja2VkKCkmQURKVVNUX1dBTExQQVBFUl9MQVlFUlNfQ0hBTkdFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduTGF5ZXJzTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTGF5b3V0TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19DT05GSUcpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1QZW5kaW5nTGF5b3V0Q2hhbmdlcyAmIFdpbmRvd01hbmFnZXJQb2xpY3kuRklOSVNIX0xBWU9VVF9SRURPX0NPTkZJRykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBTbG9nLnYoVEFHLCAiQ29tcHV0aW5nIG5ldyBjb25maWcgZnJvbSBsYXlvdXQiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2Vuc0xvY2tlZCh0cnVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUxheW91dE5lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSC5zZW5kRW1wdHlNZXNzYWdlKEguU0VORF9ORVdfQ09ORklHVVJBVElPTik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChtUGVuZGluZ0xheW91dENoYW5nZXMgJiBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbUxheW91dE5lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04Nzc1LDcxICs4ODE4LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJMYXlvdXQgcmVwZWF0IHNraXBwZWQgYWZ0ZXIgdG9vIG1hbnkgaXRlcmF0aW9ucyIpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICsrbVRyYW5zYWN0aW9uU2VxdWVuY2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfQVBQX1RSQU5TSVRJT05TKSBTbG9nLnYoVEFHLCAiKioqIEFOSU0gU1RFUDogc2VxPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRyYW5zYWN0aW9uU2VxdWVuY2UgKyAiIG1BbmltYXRpbmc9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5uZXJGaWVsZHMubUFuaW1hdGluZyk7Ci0KLSAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubVRva2VuTWF5QmVEcmF3biA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Jbm5lckZpZWxkcy5tV2FsbHBhcGVyTWF5Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1Gb3JjZUhpZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Jbm5lckZpZWxkcy5tRGV0YWNoZWRXYWxscGFwZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Jbm5lckZpZWxkcy5tV2luZG93QW5pbWF0aW9uQmFja2dyb3VuZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUlubmVyRmllbGRzLm1XaW5kb3dBbmltYXRpb25CYWNrZ3JvdW5kQ29sb3IgPSAwOwotCi0gICAgICAgICAgICAgICAgbVN0ZXBBbmltYXRvcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VzID0gdXBkYXRlV2luZG93c0FuZFdhbGxwYXBlckxvY2tlZChjdXJyZW50VGltZSwgZHcsIGRoLCBpbm5lckR3LCBpbm5lckRoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5uZXJGaWVsZHMubVRva2VuTWF5QmVEcmF3bikgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IHRlc3RUb2tlbk1heUJlRHJhd25Mb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAvLyBGSVJTVCBBTkQgT05FIEhBTEYgTE9PUDogTWFrZSBXaW5kb3dNYW5hZ2VyUG9saWN5IHRoaW5rCisgICAgICAgICAgICAgICAgLy8gaXQgaXMgYW5pbWF0aW5nLgorICAgICAgICAgICAgICAgIG1QZW5kaW5nTGF5b3V0Q2hhbmdlcyA9IDA7CisgICAgICAgICAgICAgICAgbVBvbGljeS5iZWdpbkFuaW1hdGlvbkx3KGR3LCBkaCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gbVdpbmRvd3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IG1XaW5kb3dzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHcubVN1cmZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeS5hbmltYXRpbmdXaW5kb3dMdyh3LCB3Lm1BdHRycyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgcmVhZHkgdG8gcGVyZm9ybSBhbiBhcHAgdHJhbnNpdGlvbiwgY2hlY2sgdGhyb3VnaAotICAgICAgICAgICAgICAgIC8vIGFsbCBvZiB0aGUgYXBwIHRva2VucyB0byBiZSBzaG93biBhbmQgc2VlIGlmIHRoZXkgYXJlIHJlYWR5Ci0gICAgICAgICAgICAgICAgLy8gdG8gZ28uCi0gICAgICAgICAgICAgICAgaWYgKG1BcHBUcmFuc2l0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBoYW5kbGVBcHBUcmFuc2l0aW9uUmVhZHlMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtSW5uZXJGaWVsZHMubUFkalJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1Jbm5lckZpZWxkcy5tQW5pbWF0aW5nICYmIG1BcHBUcmFuc2l0aW9uUnVubmluZykgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZpbmlzaGVkIHRoZSBhbmltYXRpb24gb2YgYW4gYXBwIHRyYW5zaXRpb24uICBUbyBkbwotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCB3ZSBoYXZlIGRlbGF5ZWQgYSBsb3Qgb2Ygb3BlcmF0aW9ucyBsaWtlIHNob3dpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIGhpZGluZyBhcHBzLCBtb3ZpbmcgYXBwcyBpbiBaLW9yZGVyLCBldGMuICBUaGUgYXBwIHRva2VuIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVmbGVjdHMgdGhlIGNvcnJlY3QgWi1vcmRlciwgYnV0IHRoZSB3aW5kb3cgbGlzdCBtYXkgbm93Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlIG91dCBvZiBzeW5jIHdpdGggaXQuICBTbyBoZXJlIHdlIHdpbGwganVzdCByZWJ1aWxkIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbnRpcmUgYXBwIHdpbmRvdyBsaXN0LiAgRnVuIQotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IGhhbmRsZUFuaW1hdGluZ1N0b3BwZWRBbmRUcmFuc2l0aW9uTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Jbm5lckZpZWxkcy5tV2FsbHBhcGVyRm9yY2VIaWRpbmdDaGFuZ2VkICYmIGNoYW5nZXMgPT0gMCAmJiAhbUFwcFRyYW5zaXRpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGVyZSB3YXMgYSB3aW5kb3cgd2l0aCBhIHdhbGxwYXBlciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdhcyBmb3JjZSBoaWRpbmcgb3RoZXIgd2luZG93cyBiZWhpbmQgaXQsIGJ1dCBub3cgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gaXMgZ29pbmcgYXdheS4gIFRoaXMgbWF5IGJlIHNpbXBsZSAtLSBqdXN0IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gYXdheSB0aGUgd2FsbHBhcGVyIGFuZCBpdHMgd2luZG93IC0tIG9yIGl0IG1heSBiZQotICAgICAgICAgICAgICAgICAgICAvLyBoYXJkIC0tIHRoZSB3YWxscGFwZXIgbm93IG5lZWRzIHRvIGJlIHNob3duIGJlaGluZAotICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgdGhhdCB3YXMgaGlkZGVuLgotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IGFuaW1hdGVBd2F5V2FsbHBhcGVyTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hhbmdlcyB8PSB0ZXN0V2FsbHBhcGVyQW5kQmFja2dyb3VuZExvY2tlZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1MYXlvdXROZWVkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBQaG9uZVdpbmRvd01hbmFnZXIuRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfQVBQX1RSQU5TSVRJT05TKSBTbG9nLnYoVEFHLCAiKioqIEFOSU0gU1RFUDogY2hhbmdlcz0weCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhjaGFuZ2VzKSk7Ci0gICAgICAgICAgICB9IHdoaWxlIChjaGFuZ2VzICE9IDApOworICAgICAgICAgICAgICAgIG1QZW5kaW5nTGF5b3V0Q2hhbmdlcyB8PSBtUG9saWN5LmZpbmlzaEFuaW1hdGlvbkx3KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IHdoaWxlIChtUGVuZGluZ0xheW91dENoYW5nZXMgIT0gMCk7CiAKICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbmltYXRpb25zIG9mIGFsbCBhcHBsaWNhdGlvbnMsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGV4aXRpbmcvcmVtb3ZlZCBhcHBzCiAKKyAgICAgICAgICAgIG1QZW5kaW5nTGF5b3V0Q2hhbmdlcyA9IHBlcmZvcm1BbmltYXRpb25zTG9ja2VkKGN1cnJlbnRUaW1lLCBkdywgZGgsCisgICAgICAgICAgICAgICAgICAgIGlubmVyRHcsIGlubmVyRGgpOwogICAgICAgICAgICAgdXBkYXRlV2luZG93c0FwcHNBbmRSb3RhdGlvbkFuaW1hdGlvbnNMb2NrZWQoY3VycmVudFRpbWUsIGlubmVyRHcsIGlubmVyRGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdGVwQW5pbWF0aW9ucygpOwogCiAgICAgICAgICAgICAvLyBUSElSRCBMT09QOiBVcGRhdGUgdGhlIHN1cmZhY2VzIG9mIGFsbCB3aW5kb3dzLgogCkBAIC05MDQ5LDYgKzkwNDcsMTMgQEAKICAgICAgICAgaWYgKHdhbGxwYXBlckRlc3Ryb3llZCkgewogICAgICAgICAgICAgbmVlZFJlbGF5b3V0ID0gYWRqdXN0V2FsbHBhcGVyV2luZG93c0xvY2tlZCgpICE9IDA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKChtUGVuZGluZ0xheW91dENoYW5nZXMgJiAoCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fV0FMTFBBUEVSIHwKKyAgICAgICAgICAgICAgICBBREpVU1RfV0FMTFBBUEVSX0xBWUVSU19DSEFOR0VEIHwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19DT05GSUcgfAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJQb2xpY3kuRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVCkpICE9IDApIHsKKyAgICAgICAgICAgIG5lZWRSZWxheW91dCA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgaWYgKG5lZWRSZWxheW91dCkgewogICAgICAgICAgICAgcmVxdWVzdFRyYXZlcnNhbExvY2tlZCgpOwogICAgICAgICB9IGVsc2UgaWYgKG1Jbm5lckZpZWxkcy5tQW5pbWF0aW5nKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YQppbmRleCBlMTFjODdhLi40ODc4OGU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlLmphdmEKQEAgLTU0LDggKzU0LDcgQEAKIC8qKgogICogQSB3aW5kb3cgaW4gdGhlIHdpbmRvdyBtYW5hZ2VyLgogICovCi1maW5hbCBjbGFzcyBXaW5kb3dTdGF0ZSBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXJQb2xpY3kuV2luZG93U3RhdGUsCi0gICAgICAgIFdpbmRvd01hbmFnZXJTZXJ2aWNlLlN0ZXBBbmltYXRvciB7CitmaW5hbCBjbGFzcyBXaW5kb3dTdGF0ZSBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXJQb2xpY3kuV2luZG93U3RhdGUgewogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1ZJU0lCSUxJVFkgPSBXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19WSVNJQklMSVRZOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfVFJBTlNBQ1RJT05TID0gV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlM7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19MSUdIVF9UUkFOU0FDVElPTlMgPSBXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX0xJR0hUX1RSQU5TQUNUSU9OUzsKQEAgLTk5NSw4ICs5OTQsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGVwQW5pbWF0aW9uKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RlcEFuaW1hdGlvbihsb25nIGN1cnJlbnRUaW1lKSB7CiAgICAgICAgIGlmICgobUFuaW1hdGlvbiA9PSBudWxsKSB8fCAhbUxvY2FsQW5pbWF0aW5nIHx8IChtQW5pbVN0YXRlICE9IEFOSU1fU1RBVEVfUlVOTklORykpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMTAxMyw3ICsxMDExLDcgQEAKIAogICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hpbGUgaW5zaWRlIGEgdHJhbnNhY3Rpb24uICBSZXR1cm5zIHRydWUgaWYKICAgICAvLyB0aGVyZSBpcyBtb3JlIGFuaW1hdGlvbiB0byBydW4uCi0gICAgYm9vbGVhbiBzdGFydEFuZEZpbmlzaEFuaW1hdGlvbkxvY2tlZChsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgYm9vbGVhbiBzdGVwQW5pbWF0aW9uTG9ja2VkKGxvbmcgY3VycmVudFRpbWUpIHsKICAgICAgICAgLy8gU2F2ZSB0aGUgYW5pbWF0aW9uIHN0YXRlIGFzIGl0IHdhcyBiZWZvcmUgdGhpcyBzdGVwIHNvIFdpbmRvd01hbmFnZXJTZXJ2aWNlIGNhbiB0ZWxsIGlmCiAgICAgICAgIC8vIHdlIGp1c3Qgc3RhcnRlZCBvciBqdXN0IHN0b3BwZWQgYW5pbWF0aW5nIGJ5IGNvbXBhcmluZyBtV2FzQW5pbWF0aW5nIHdpdGggaXNBbmltYXRpbmcoKS4KICAgICAgICAgbVdhc0FuaW1hdGluZyA9IG1BbmltYXRpbmc7CkBAIC0xMDM4LDcgKzEwMzYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKG1BbmltYXRpb24gIT0gbnVsbCkgJiYgbUxvY2FsQW5pbWF0aW5nICYmIAogICAgICAgICAgICAgICAgICAgICAgICAgKG1BbmltU3RhdGUgIT0gQU5JTV9TVEFURV9TVE9QUElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwQW5pbWF0aW9uKGN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX0FOSU0pIFNsb2cudigKICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiRmluaXNoZWQgYW5pbWF0aW9uIGluICIgKyB0aGlzICsKQEAgLTExMzMsNiArMTEzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBmaW5pc2hFeGl0KCk7CisgICAgICAgIG1TZXJ2aWNlLm1QZW5kaW5nTGF5b3V0Q2hhbmdlcyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZJTklTSF9MQVlPVVRfUkVET19BTklNOwogCiAgICAgICAgIGlmIChtQXBwVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgbUFwcFRva2VuLnVwZGF0ZVJlcG9ydGVkVmlzaWJpbGl0eUxvY2tlZCgpOwpAQCAtMTYwOCw2ICsxNjA3LDcgQEAKIAogICAgIGJvb2xlYW4gc2hvd0x3KGJvb2xlYW4gZG9BbmltYXRpb24sIGJvb2xlYW4gcmVxdWVzdEFuaW0pIHsKICAgICAgICAgaWYgKG1Qb2xpY3lWaXNpYmlsaXR5ICYmIG1Qb2xpY3lWaXNpYmlsaXR5QWZ0ZXJBbmltKSB7CisgICAgICAgICAgICAvLyBBbHJlYWR5IHNob3dpbmcuCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKERFQlVHX1ZJU0lCSUxJVFkpIFNsb2cudihXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJQb2xpY3kgdmlzaWJpbGl0eSB0cnVlOiAiICsgdGhpcyk7CkBAIC0xNjQ3LDYgKzE2NDcsNyBAQAogICAgICAgICBib29sZWFuIGN1cnJlbnQgPSBkb0FuaW1hdGlvbiA/IG1Qb2xpY3lWaXNpYmlsaXR5QWZ0ZXJBbmltCiAgICAgICAgICAgICAgICAgOiBtUG9saWN5VmlzaWJpbGl0eTsKICAgICAgICAgaWYgKCFjdXJyZW50KSB7CisgICAgICAgICAgICAvLyBBbHJlYWR5IGhpZGluZy4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZG9BbmltYXRpb24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiQ21hc0luZm8uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiQ21hc0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg5ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JDbWFzSW5mby5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworLyoqCisgKiBDb250YWlucyBDTUFTIHdhcm5pbmcgbm90aWZpY2F0aW9uIFR5cGUgMSBlbGVtZW50cyBmb3IgYSB7QGxpbmsgU21zQ2JNZXNzYWdlfS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggZWxlbWVudCBhcmUgZGVmaW5lZCBpbiBUSUEtMTE0OS0wLTEgKENNQVMgb3ZlciBDRE1BKSBhbmQKKyAqIDNHUFAgVFMgMjMuMDQxIChmb3IgR1NNL1VNVFMpLgorICoKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIFNtc0NiQ21hc0luZm8gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIC8vIENNQVMgbWVzc2FnZSBjbGFzcyAoaW4gR1NNL1VNVFMgbWVzc2FnZSBpZGVudGlmaWVyIG9yIENETUEgc2VydmljZSBjYXRlZ29yeSkuCisKKyAgICAvKiogUHJlc2lkZW50aWFsLWxldmVsIGFsZXJ0IChLb3JlYW4gUHVibGljIEFsZXJ0IFN5c3RlbSBDbGFzcyAwIG1lc3NhZ2UpLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0xBU1NfUFJFU0lERU5USUFMX0xFVkVMX0FMRVJUID0gMHgwMDsKKworICAgIC8qKiBFeHRyZW1lIHRocmVhdCB0byBsaWZlIGFuZCBwcm9wZXJ0eSAoS29yZWFuIFB1YmxpYyBBbGVydCBTeXN0ZW0gQ2xhc3MgMSBtZXNzYWdlKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NMQVNTX0VYVFJFTUVfVEhSRUFUID0gMHgwMTsKKworICAgIC8qKiBTZXZlcmUgdGhyZWF0IHRvIGxpZmUgYW5kIHByb3BlcnR5IChLb3JlYW4gUHVibGljIEFsZXJ0IFN5c3RlbSBDbGFzcyAxIG1lc3NhZ2UpLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0xBU1NfU0VWRVJFX1RIUkVBVCA9IDB4MDI7CisKKyAgICAvKiogQ2hpbGQgYWJkdWN0aW9uIGVtZXJnZW5jeSAoQU1CRVIgQWxlcnQpLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0xBU1NfQ0hJTERfQUJEVUNUSU9OX0VNRVJHRU5DWSA9IDB4MDM7CisKKyAgICAvKiogQ01BUyB0ZXN0IG1lc3NhZ2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DTEFTU19SRVFVSVJFRF9NT05USExZX1RFU1QgPSAweDA0OworCisgICAgLyoqIENNQVMgZXhlcmNpc2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DTEFTU19DTUFTX0VYRVJDSVNFID0gMHgwNTsKKworICAgIC8qKiBDTUFTIGNhdGVnb3J5IGZvciBvcGVyYXRvciBkZWZpbmVkIHVzZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NMQVNTX09QRVJBVE9SX0RFRklORURfVVNFID0gMHgwNjsKKworICAgIC8qKiBDTUFTIGNhdGVnb3J5IGZvciB3YXJuaW5nIHR5cGVzIHRoYXQgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0xBU1NfVU5LTk9XTiA9IC0xOworCisgICAgLy8gQ01BUyBhbGVydCBjYXRlZ29yeSAoaW4gQ0RNQSB0eXBlIDEgZWxlbWVudHMgcmVjb3JkKS4KKworICAgIC8qKiBDTUFTIGFsZXJ0IGNhdGVnb3J5OiBHZW9waHlzaWNhbCBpbmNsdWRpbmcgbGFuZHNsaWRlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfR0VPID0gMHgwMDsKKworICAgIC8qKiBDTUFTIGFsZXJ0IGNhdGVnb3J5OiBNZXRlb3JvbG9naWNhbCBpbmNsdWRpbmcgZmxvb2QuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DQVRFR09SWV9NRVQgPSAweDAxOworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IEdlbmVyYWwgZW1lcmdlbmN5IGFuZCBwdWJsaWMgc2FmZXR5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfU0FGRVRZID0gMHgwMjsKKworICAgIC8qKiBDTUFTIGFsZXJ0IGNhdGVnb3J5OiBMYXcgZW5mb3JjZW1lbnQsIG1pbGl0YXJ5LCBob21lbGFuZC9sb2NhbC9wcml2YXRlIHNlY3VyaXR5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfU0VDVVJJVFkgPSAweDAzOworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IFJlc2N1ZSBhbmQgcmVjb3ZlcnkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DQVRFR09SWV9SRVNDVUUgPSAweDA0OworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IEZpcmUgc3VwcHJlc3Npb24gYW5kIHJlc2N1ZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NBVEVHT1JZX0ZJUkUgPSAweDA1OworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IE1lZGljYWwgYW5kIHB1YmxpYyBoZWFsdGguICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DQVRFR09SWV9IRUFMVEggPSAweDA2OworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IFBvbGx1dGlvbiBhbmQgb3RoZXIgZW52aXJvbm1lbnRhbC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NBVEVHT1JZX0VOViA9IDB4MDc7CisKKyAgICAvKiogQ01BUyBhbGVydCBjYXRlZ29yeTogUHVibGljIGFuZCBwcml2YXRlIHRyYW5zcG9ydGF0aW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfVFJBTlNQT1JUID0gMHgwODsKKworICAgIC8qKiBDTUFTIGFsZXJ0IGNhdGVnb3J5OiBVdGlsaXR5LCB0ZWxlY29tLCBvdGhlciBub24tdHJhbnNwb3J0IGluZnJhc3RydWN0dXJlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfSU5GUkEgPSAweDA5OworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IENoZW0sIGJpbywgcmFkaW9sb2dpY2FsLCBudWNsZWFyLCBoaWdoIGV4cGxvc2l2ZSB0aHJlYXQgb3IgYXR0YWNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfQ0JSTkUgPSAweDBhOworCisgICAgLyoqIENNQVMgYWxlcnQgY2F0ZWdvcnk6IE90aGVyIGV2ZW50cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NBVEVHT1JZX09USEVSID0gMHgwYjsKKworICAgIC8qKgorICAgICAqIENNQVMgYWxlcnQgY2F0ZWdvcnkgaXMgdW5rbm93bi4gVGhlIGNhdGVnb3J5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBDRE1BIGJyb2FkY2FzdHMKKyAgICAgKiBjb250YWluaW5nIGEgdHlwZSAxIGVsZW1lbnRzIHJlY29yZCwgc28gR1NNIGFuZCBVTVRTIGJyb2FkY2FzdHMgYWx3YXlzIHJldHVybiB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfQ0FURUdPUllfVU5LTk9XTiA9IC0xOworCisgICAgLy8gQ01BUyByZXNwb25zZSB0eXBlIChpbiBDRE1BIHR5cGUgMSBlbGVtZW50cyByZWNvcmQpLgorCisgICAgLyoqIENNQVMgcmVzcG9uc2UgdHlwZTogVGFrZSBzaGVsdGVyIGluIHBsYWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfUkVTUE9OU0VfVFlQRV9TSEVMVEVSID0gMHgwMDsKKworICAgIC8qKiBDTUFTIHJlc3BvbnNlIHR5cGU6IEV2YWN1YXRlIChSZWxvY2F0ZSkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19SRVNQT05TRV9UWVBFX0VWQUNVQVRFID0gMHgwMTsKKworICAgIC8qKiBDTUFTIHJlc3BvbnNlIHR5cGU6IE1ha2UgcHJlcGFyYXRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfUkVTUE9OU0VfVFlQRV9QUkVQQVJFID0gMHgwMjsKKworICAgIC8qKiBDTUFTIHJlc3BvbnNlIHR5cGU6IEV4ZWN1dGUgYSBwcmUtcGxhbm5lZCBhY3Rpdml0eS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1JFU1BPTlNFX1RZUEVfRVhFQ1VURSA9IDB4MDM7CisKKyAgICAvKiogQ01BUyByZXNwb25zZSB0eXBlOiBBdHRlbmQgdG8gaW5mb3JtYXRpb24gc291cmNlcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1JFU1BPTlNFX1RZUEVfTU9OSVRPUiA9IDB4MDQ7CisKKyAgICAvKiogQ01BUyByZXNwb25zZSB0eXBlOiBBdm9pZCBoYXphcmQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19SRVNQT05TRV9UWVBFX0FWT0lEID0gMHgwNTsKKworICAgIC8qKiBDTUFTIHJlc3BvbnNlIHR5cGU6IEV2YWx1YXRlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIG1lc3NhZ2UgKG5vdCBmb3IgcHVibGljIHdhcm5pbmdzKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1JFU1BPTlNFX1RZUEVfQVNTRVNTID0gMHgwNjsKKworICAgIC8qKiBDTUFTIHJlc3BvbnNlIHR5cGU6IE5vIGFjdGlvbiByZWNvbW1lbmRlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1JFU1BPTlNFX1RZUEVfTk9ORSA9IDB4MDc7CisKKyAgICAvKioKKyAgICAgKiBDTUFTIHJlc3BvbnNlIHR5cGUgaXMgdW5rbm93bi4gVGhlIHJlc3BvbnNlIHR5cGUgaXMgb25seSBhdmFpbGFibGUgZm9yIENETUEgYnJvYWRjYXN0cworICAgICAqIGNvbnRhaW5pbmcgYSB0eXBlIDEgZWxlbWVudHMgcmVjb3JkLCBzbyBHU00gYW5kIFVNVFMgYnJvYWRjYXN0cyBhbHdheXMgcmV0dXJuIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19SRVNQT05TRV9UWVBFX1VOS05PV04gPSAtMTsKKworICAgIC8vIDQtYml0IENNQVMgc2V2ZXJpdHkgKGluIEdTTS9VTVRTIG1lc3NhZ2UgaWRlbnRpZmllciBvciBDRE1BIHR5cGUgMSBlbGVtZW50cyByZWNvcmQpLgorCisgICAgLyoqIENNQVMgc2V2ZXJpdHkgdHlwZTogRXh0cmFvcmRpbmFyeSB0aHJlYXQgdG8gbGlmZSBvciBwcm9wZXJ0eS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1NFVkVSSVRZX0VYVFJFTUUgPSAweDA7CisKKyAgICAvKiogQ01BUyBzZXZlcml0eSB0eXBlOiBTaWduaWZpY2FudCB0aHJlYXQgdG8gbGlmZSBvciBwcm9wZXJ0eS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1NFVkVSSVRZX1NFVkVSRSA9IDB4MTsKKworICAgIC8qKgorICAgICAqIENNQVMgYWxlcnQgc2V2ZXJpdHkgaXMgdW5rbm93bi4gVGhlIHNldmVyaXR5IGlzIGF2YWlsYWJsZSBmb3IgQ0RNQSB3YXJuaW5nIGFsZXJ0cworICAgICAqIGNvbnRhaW5pbmcgYSB0eXBlIDEgZWxlbWVudHMgcmVjb3JkIGFuZCBmb3IgYWxsIEdTTSBhbmQgVU1UUyBhbGVydHMgZXhjZXB0IGZvciB0aGUKKyAgICAgKiBQcmVzaWRlbnRpYWwtbGV2ZWwgYWxlcnQgY2xhc3MgKEtvcmVhbiBQdWJsaWMgQWxlcnQgU3lzdGVtIENsYXNzIDApLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfU0VWRVJJVFlfVU5LTk9XTiA9IC0xOworCisgICAgLy8gQ01BUyB1cmdlbmN5IChpbiBHU00vVU1UUyBtZXNzYWdlIGlkZW50aWZpZXIgb3IgQ0RNQSB0eXBlIDEgZWxlbWVudHMgcmVjb3JkKS4KKworICAgIC8qKiBDTUFTIHVyZ2VuY3kgdHlwZTogUmVzcG9uc2l2ZSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIGltbWVkaWF0ZWx5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNQVNfVVJHRU5DWV9JTU1FRElBVEUgPSAweDA7CisKKyAgICAvKiogQ01BUyB1cmdlbmN5IHR5cGU6IFJlc3BvbnNpdmUgYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aXRoaW4gdGhlIG5leHQgaG91ci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX1VSR0VOQ1lfRVhQRUNURUQgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiBDTUFTIGFsZXJ0IHVyZ2VuY3kgaXMgdW5rbm93bi4gVGhlIHVyZ2VuY3kgaXMgYXZhaWxhYmxlIGZvciBDRE1BIHdhcm5pbmcgYWxlcnRzCisgICAgICogY29udGFpbmluZyBhIHR5cGUgMSBlbGVtZW50cyByZWNvcmQgYW5kIGZvciBhbGwgR1NNIGFuZCBVTVRTIGFsZXJ0cyBleGNlcHQgZm9yIHRoZQorICAgICAqIFByZXNpZGVudGlhbC1sZXZlbCBhbGVydCBjbGFzcyAoS29yZWFuIFB1YmxpYyBBbGVydCBTeXN0ZW0gQ2xhc3MgMCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19VUkdFTkNZX1VOS05PV04gPSAtMTsKKworICAgIC8vIENNQVMgY2VydGFpbnR5IChpbiBHU00vVU1UUyBtZXNzYWdlIGlkZW50aWZpZXIgb3IgQ0RNQSB0eXBlIDEgZWxlbWVudHMgcmVjb3JkKS4KKworICAgIC8qKiBDTUFTIGNlcnRhaW50eSB0eXBlOiBEZXRlcm1pbmVkIHRvIGhhdmUgb2NjdXJyZWQgb3IgdG8gYmUgb25nb2luZy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NFUlRBSU5UWV9PQlNFUlZFRCA9IDB4MDsKKworICAgIC8qKiBDTUFTIGNlcnRhaW50eSB0eXBlOiBMaWtlbHkgKHByb2JhYmlsaXR5ID4gfjUwJSkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01BU19DRVJUQUlOVFlfTElLRUxZID0gMHgxOworCisgICAgLyoqCisgICAgICogQ01BUyBhbGVydCBjZXJ0YWludHkgaXMgdW5rbm93bi4gVGhlIGNlcnRhaW50eSBpcyBhdmFpbGFibGUgZm9yIENETUEgd2FybmluZyBhbGVydHMKKyAgICAgKiBjb250YWluaW5nIGEgdHlwZSAxIGVsZW1lbnRzIHJlY29yZCBhbmQgZm9yIGFsbCBHU00gYW5kIFVNVFMgYWxlcnRzIGV4Y2VwdCBmb3IgdGhlCisgICAgICogUHJlc2lkZW50aWFsLWxldmVsIGFsZXJ0IGNsYXNzIChLb3JlYW4gUHVibGljIEFsZXJ0IFN5c3RlbSBDbGFzcyAwKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTUFTX0NFUlRBSU5UWV9VTktOT1dOID0gLTE7CisKKyAgICAvKiogQ01BUyBtZXNzYWdlIGNsYXNzLiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1NZXNzYWdlQ2xhc3M7CisKKyAgICAvKiogQ01BUyBjYXRlZ29yeS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ2F0ZWdvcnk7CisKKyAgICAvKiogQ01BUyByZXNwb25zZSB0eXBlLiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNwb25zZVR5cGU7CisKKyAgICAvKiogQ01BUyBzZXZlcml0eS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtU2V2ZXJpdHk7CisKKyAgICAvKiogQ01BUyB1cmdlbmN5LiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1VcmdlbmN5OworCisgICAgLyoqIENNQVMgY2VydGFpbnR5LiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1DZXJ0YWludHk7CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IFNtc0NiQ21hc0luZm8gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuICovCisgICAgcHVibGljIFNtc0NiQ21hc0luZm8oaW50IG1lc3NhZ2VDbGFzcywgaW50IGNhdGVnb3J5LCBpbnQgcmVzcG9uc2VUeXBlLCBpbnQgc2V2ZXJpdHksCisgICAgICAgICAgICBpbnQgdXJnZW5jeSwgaW50IGNlcnRhaW50eSkgeworICAgICAgICBtTWVzc2FnZUNsYXNzID0gbWVzc2FnZUNsYXNzOworICAgICAgICBtQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKKyAgICAgICAgbVJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTsKKyAgICAgICAgbVNldmVyaXR5ID0gc2V2ZXJpdHk7CisgICAgICAgIG1VcmdlbmN5ID0gdXJnZW5jeTsKKyAgICAgICAgbUNlcnRhaW50eSA9IGNlcnRhaW50eTsKKyAgICB9CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IFNtc0NiQ21hc0luZm8gb2JqZWN0IGZyb20gYSBQYXJjZWwuICovCisgICAgU21zQ2JDbWFzSW5mbyhQYXJjZWwgaW4pIHsKKyAgICAgICAgbU1lc3NhZ2VDbGFzcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNhdGVnb3J5ID0gaW4ucmVhZEludCgpOworICAgICAgICBtUmVzcG9uc2VUeXBlID0gaW4ucmVhZEludCgpOworICAgICAgICBtU2V2ZXJpdHkgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1VcmdlbmN5ID0gaW4ucmVhZEludCgpOworICAgICAgICBtQ2VydGFpbnR5ID0gaW4ucmVhZEludCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW4gdGhpcyBvYmplY3QgaW50byBhIFBhcmNlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0ICBUaGUgUGFyY2VsIGluIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGZsYWdzIEFkZGl0aW9uYWwgZmxhZ3MgYWJvdXQgaG93IHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4gKGlnbm9yZWQpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1NZXNzYWdlQ2xhc3MpOworICAgICAgICBkZXN0LndyaXRlSW50KG1DYXRlZ29yeSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJlc3BvbnNlVHlwZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVNldmVyaXR5KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVXJnZW5jeSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNlcnRhaW50eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ01BUyBtZXNzYWdlIGNsYXNzLCBlLmcuIHtAbGluayAjQ01BU19DTEFTU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlR9LgorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSB7QGNvZGUgQ01BU19DTEFTU30gdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNZXNzYWdlQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBtTWVzc2FnZUNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIENNQVMgY2F0ZWdvcnksIGUuZy4ge0BsaW5rICNDTUFTX0NBVEVHT1JZX0dFT30uCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHtAY29kZSBDTUFTX0NBVEVHT1JZfSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhdGVnb3J5KCkgeworICAgICAgICByZXR1cm4gbUNhdGVnb3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIENNQVMgcmVzcG9uc2UgdHlwZSwgZS5nLiB7QGxpbmsgI0NNQVNfUkVTUE9OU0VfVFlQRV9TSEVMVEVSfS4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUge0Bjb2RlIENNQVNfUkVTUE9OU0VfVFlQRX0gdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNwb25zZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtUmVzcG9uc2VUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIENNQVMgc2V2ZXJpdHksIGUuZy4ge0BsaW5rICNDTUFTX1NFVkVSSVRZX0VYVFJFTUV9LgorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSB7QGNvZGUgQ01BU19TRVZFUklUWX0gdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXZlcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBDTUFTIHVyZ2VuY3ksIGUuZy4ge0BsaW5rICNDTUFTX1VSR0VOQ1lfSU1NRURJQVRFfS4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUge0Bjb2RlIENNQVNfVVJHRU5DWX0gdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRVcmdlbmN5KCkgeworICAgICAgICByZXR1cm4gbVVyZ2VuY3k7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ01BUyBjZXJ0YWludHksIGUuZy4ge0BsaW5rICNDTUFTX0NFUlRBSU5UWV9PQlNFUlZFRH0uCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHtAY29kZSBDTUFTX0NFUlRBSU5UWX0gdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDZXJ0YWludHkoKSB7CisgICAgICAgIHJldHVybiBtQ2VydGFpbnR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU21zQ2JDbWFzSW5mb3ttZXNzYWdlQ2xhc3M9IiArIG1NZXNzYWdlQ2xhc3MgKyAiLCBjYXRlZ29yeT0iICsgbUNhdGVnb3J5CisgICAgICAgICAgICAgICAgKyAiLCByZXNwb25zZVR5cGU9IiArIG1SZXNwb25zZVR5cGUgKyAiLCBzZXZlcml0eT0iICsgbVNldmVyaXR5CisgICAgICAgICAgICAgICAgKyAiLCB1cmdlbmN5PSIgKyBtVXJnZW5jeSArICIsIGNlcnRhaW50eT0iICsgbUNlcnRhaW50eSArICd9JzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZSB0aGUga2luZHMgb2Ygc3BlY2lhbCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgYml0bWFzayBpbmRpY2F0aW5nIHRoaXMgUGFyY2VsYWJsZSBjb250YWlucyBubyBzcGVjaWFsIG9iamVjdHMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKiBDcmVhdG9yIGZvciB1bnBhcmNlbGxpbmcgb2JqZWN0cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTbXNDYkNtYXNJbmZvPgorICAgICAgICAgICAgQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U21zQ2JDbWFzSW5mbz4oKSB7CisgICAgICAgIHB1YmxpYyBTbXNDYkNtYXNJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNtc0NiQ21hc0luZm8oaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNtc0NiQ21hc0luZm9bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYkNtYXNJbmZvW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiRXR3c0luZm8uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiRXR3c0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkwZDUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JFdHdzSW5mby5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGVsZW1lbnRzIGZvciBhIEdTTSBvciBVTVRTIEVUV1Mgd2FybmluZyBub3RpZmljYXRpb24uCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIGVsZW1lbnQgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDEuCisgKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgU21zQ2JFdHdzSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIGZvciBlYXJ0aHF1YWtlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX0VBUlRIUVVBS0UgPSAweDAwOworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIGZvciB0c3VuYW1pLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX1RTVU5BTUkgPSAweDAxOworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIGZvciBlYXJ0aHF1YWtlIGFuZCB0c3VuYW1pLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX0VBUlRIUVVBS0VfQU5EX1RTVU5BTUkgPSAweDAyOworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIGZvciB0ZXN0IG1lc3NhZ2VzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX1RFU1RfTUVTU0FHRSA9IDB4MDM7CisKKyAgICAvKiogRVRXUyB3YXJuaW5nIHR5cGUgZm9yIG90aGVyIGVtZXJnZW5jeSB0eXBlcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVFdTX1dBUk5JTkdfVFlQRV9PVEhFUl9FTUVSR0VOQ1kgPSAweDA0OworCisgICAgLyoqIFVua25vd24gRVRXUyB3YXJuaW5nIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVRXU19XQVJOSU5HX1RZUEVfVU5LTk9XTiA9IC0xOworCisgICAgLyoqIE9uZSBvZiB0aGUgRVRXUyB3YXJuaW5nIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtV2FybmluZ1R5cGU7CisKKyAgICAvKiogV2hldGhlciBvciBub3QgdG8gYWN0aXZhdGUgdGhlIGVtZXJnZW5jeSB1c2VyIGFsZXJ0IHRvbmUgYW5kIHZpYnJhdGlvbi4gKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUVtZXJnZW5jeVVzZXJBbGVydDsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB0byBhY3RpdmF0ZSBhIHBvcHVwIGFsZXJ0LiAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQWN0aXZhdGVQb3B1cDsKKworICAgIC8qKgorICAgICAqIDUwLWJ5dGUgc2VjdXJpdHkgaW5mb3JtYXRpb24gKEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb24gZm9yIEdTTSBvbmx5KS4gQXMgb2YgUmVsZWFzZSAxMCwKKyAgICAgKiAzR1BQIFRTIDIzLjA0MSBzdGF0ZXMgdGhhdCB0aGUgVUUgc2hhbGwgaWdub3JlIHRoZSBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAorICAgICAqIGFuZCBkaWdpdGFsIHNpZ25hdHVyZSBpZiByZWNlaXZlZC4gVGhlcmVmb3JlIGl0IGlzIHRyZWF0ZWQgYXMgYSByYXcgYnl0ZSBhcnJheSBhbmQKKyAgICAgKiBwYXJjZWxlZCB3aXRoIHRoZSBicm9hZGNhc3QgaW50ZW50IGlmIHByZXNlbnQsIGJ1dCB0aGUgdGltZXN0YW1wIGlzIG9ubHkgY29tcHV0ZWQgaWYgYW4KKyAgICAgKiBhcHBsaWNhdGlvbiBhc2tzIGZvciB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1XYXJuaW5nU2VjdXJpdHlJbmZvcm1hdGlvbjsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgU21zQ2JFdHdzSW5mbyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gKi8KKyAgICBwdWJsaWMgU21zQ2JFdHdzSW5mbyhpbnQgd2FybmluZ1R5cGUsIGJvb2xlYW4gZW1lcmdlbmN5VXNlckFsZXJ0LCBib29sZWFuIGFjdGl2YXRlUG9wdXAsCisgICAgICAgICAgICBieXRlW10gd2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb24pIHsKKyAgICAgICAgbVdhcm5pbmdUeXBlID0gd2FybmluZ1R5cGU7CisgICAgICAgIG1FbWVyZ2VuY3lVc2VyQWxlcnQgPSBlbWVyZ2VuY3lVc2VyQWxlcnQ7CisgICAgICAgIG1BY3RpdmF0ZVBvcHVwID0gYWN0aXZhdGVQb3B1cDsKKyAgICAgICAgbVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uID0gd2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb247CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhIG5ldyBTbXNDYkV0d3NJbmZvIG9iamVjdCBmcm9tIGEgUGFyY2VsLiAqLworICAgIFNtc0NiRXR3c0luZm8oUGFyY2VsIGluKSB7CisgICAgICAgIG1XYXJuaW5nVHlwZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUVtZXJnZW5jeVVzZXJBbGVydCA9IChpbi5yZWFkSW50KCkgIT0gMCk7CisgICAgICAgIG1BY3RpdmF0ZVBvcHVwID0gKGluLnJlYWRJbnQoKSAhPSAwKTsKKyAgICAgICAgbVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uID0gaW4uY3JlYXRlQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhdHRlbiB0aGlzIG9iamVjdCBpbnRvIGEgUGFyY2VsLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc3QgIFRoZSBQYXJjZWwgaW4gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgQWRkaXRpb25hbCBmbGFncyBhYm91dCBob3cgdGhlIG9iamVjdCBzaG91bGQgYmUgd3JpdHRlbiAoaWdub3JlZCkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVdhcm5pbmdUeXBlKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRW1lcmdlbmN5VXNlckFsZXJ0ID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlSW50KG1BY3RpdmF0ZVBvcHVwID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1XYXJuaW5nU2VjdXJpdHlJbmZvcm1hdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgRVRXUyB3YXJuaW5nIHR5cGUuCisgICAgICogQHJldHVybiBhIHdhcm5pbmcgdHlwZSBzdWNoIGFzIHtAbGluayAjRVRXU19XQVJOSU5HX1RZUEVfRUFSVEhRVUFLRX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdhcm5pbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gbVdhcm5pbmdUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEVUV1MgZW1lcmdlbmN5IHVzZXIgYWxlcnQgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRydWUgdG8gbm90aWZ5IHRlcm1pbmFsIHRvIGFjdGl2YXRlIGVtZXJnZW5jeSB1c2VyIGFsZXJ0OyBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtZXJnZW5jeVVzZXJBbGVydCgpIHsKKyAgICAgICAgcmV0dXJuIG1FbWVyZ2VuY3lVc2VyQWxlcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgRVRXUyBhY3RpdmF0ZSBwb3B1cCBmbGFnLgorICAgICAqIEByZXR1cm4gdHJ1ZSB0byBub3RpZnkgdGVybWluYWwgdG8gYWN0aXZhdGUgZGlzcGxheSBwb3B1cDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQb3B1cEFsZXJ0KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2YXRlUG9wdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgV2FybmluZy1TZWN1cml0eS1JbmZvcm1hdGlvbiB0aW1lc3RhbXAgKEdTTSBwcmltYXJ5IG5vdGlmaWNhdGlvbnMgb25seSkuCisgICAgICogQXMgb2YgUmVsZWFzZSAxMCwgM0dQUCBUUyAyMy4wNDEgc3RhdGVzIHRoYXQgdGhlIFVFIHNoYWxsIGlnbm9yZSB0aGlzIHZhbHVlIGlmIHJlY2VpdmVkLgorICAgICAqIEByZXR1cm4gYSBVVEMgdGltZXN0YW1wIGluIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIGZvcm1hdCwgb3IgMCBpZiBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFByaW1hcnlOb3RpZmljYXRpb25UaW1lc3RhbXAoKSB7CisgICAgICAgIGlmIChtV2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb24gPT0gbnVsbCB8fCBtV2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb24ubGVuZ3RoIDwgNykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgeWVhciA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChtV2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb25bMF0pOworICAgICAgICBpbnQgbW9udGggPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQobVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uWzFdKTsKKyAgICAgICAgaW50IGRheSA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChtV2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb25bMl0pOworICAgICAgICBpbnQgaG91ciA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChtV2FybmluZ1NlY3VyaXR5SW5mb3JtYXRpb25bM10pOworICAgICAgICBpbnQgbWludXRlID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KG1XYXJuaW5nU2VjdXJpdHlJbmZvcm1hdGlvbls0XSk7CisgICAgICAgIGludCBzZWNvbmQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQobVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uWzVdKTsKKworICAgICAgICAvLyBGb3IgdGhlIHRpbWV6b25lLCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCisgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCisgICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAorICAgICAgICAvLyB3aGljaCBpcyBtb3JlIHRoYW4gZW5vdWdoKQorCisgICAgICAgIGJ5dGUgdHpCeXRlID0gbVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uWzZdOworCisgICAgICAgIC8vIE1hc2sgb3V0IHNpZ24gYml0LgorICAgICAgICBpbnQgdGltZXpvbmVPZmZzZXQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQoKGJ5dGUpICh0ekJ5dGUgJiAofjB4MDgpKSk7CisKKyAgICAgICAgdGltZXpvbmVPZmZzZXQgPSAoKHR6Qnl0ZSAmIDB4MDgpID09IDApID8gdGltZXpvbmVPZmZzZXQgOiAtdGltZXpvbmVPZmZzZXQ7CisKKyAgICAgICAgVGltZSB0aW1lID0gbmV3IFRpbWUoVGltZS5USU1FWk9ORV9VVEMpOworCisgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IHllYXJzIGFib3ZlIDIwMDAuCisgICAgICAgIHRpbWUueWVhciA9IHllYXIgKyAyMDAwOworICAgICAgICB0aW1lLm1vbnRoID0gbW9udGggLSAxOworICAgICAgICB0aW1lLm1vbnRoRGF5ID0gZGF5OworICAgICAgICB0aW1lLmhvdXIgPSBob3VyOworICAgICAgICB0aW1lLm1pbnV0ZSA9IG1pbnV0ZTsKKyAgICAgICAgdGltZS5zZWNvbmQgPSBzZWNvbmQ7CisKKyAgICAgICAgLy8gVGltZXpvbmUgb2Zmc2V0IGlzIGluIHF1YXJ0ZXIgaG91cnMuCisgICAgICAgIHJldHVybiB0aW1lLnRvTWlsbGlzKHRydWUpIC0gKGxvbmcpICh0aW1lem9uZU9mZnNldCAqIDE1ICogNjAgKiAxMDAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkaWdpdGFsIHNpZ25hdHVyZSAoR1NNIHByaW1hcnkgbm90aWZpY2F0aW9ucyBvbmx5KS4gQXMgb2YgUmVsZWFzZSAxMCwKKyAgICAgKiAzR1BQIFRTIDIzLjA0MSBzdGF0ZXMgdGhhdCB0aGUgVUUgc2hhbGwgaWdub3JlIHRoaXMgdmFsdWUgaWYgcmVjZWl2ZWQuCisgICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIHByaW1hcnkgbm90aWZpY2F0aW9uIGRpZ2l0YWwgc2lnbmF0dXJlCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRQcmltYXJ5Tm90aWZpY2F0aW9uU2lnbmF0dXJlKCkgeworICAgICAgICBpZiAobVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uID09IG51bGwgfHwgbVdhcm5pbmdTZWN1cml0eUluZm9ybWF0aW9uLmxlbmd0aCA8IDUwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZlJhbmdlKG1XYXJuaW5nU2VjdXJpdHlJbmZvcm1hdGlvbiwgNywgNTApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU21zQ2JFdHdzSW5mb3t3YXJuaW5nVHlwZT0iICsgbVdhcm5pbmdUeXBlICsgIiwgZW1lcmdlbmN5VXNlckFsZXJ0PSIKKyAgICAgICAgICAgICAgICArIG1FbWVyZ2VuY3lVc2VyQWxlcnQgKyAiLCBhY3RpdmF0ZVBvcHVwPSIgKyBtQWN0aXZhdGVQb3B1cCArICd9JzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZSB0aGUga2luZHMgb2Ygc3BlY2lhbCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgYml0bWFzayBpbmRpY2F0aW5nIHRoaXMgUGFyY2VsYWJsZSBjb250YWlucyBubyBzcGVjaWFsIG9iamVjdHMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKiBDcmVhdG9yIGZvciB1bnBhcmNlbGxpbmcgb2JqZWN0cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8U21zQ2JFdHdzSW5mbz4gQ1JFQVRPUiA9IG5ldyBDcmVhdG9yPFNtc0NiRXR3c0luZm8+KCkgeworICAgICAgICBwdWJsaWMgU21zQ2JFdHdzSW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYkV0d3NJbmZvKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbXNDYkV0d3NJbmZvW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU21zQ2JFdHdzSW5mb1tzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYkxvY2F0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYkxvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1YmQwZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLkdzbUNlbGxMb2NhdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBhbmQgZ2VvZ3JhcGhpY2FsIHNjb3BlIG9mIGEgY2VsbCBicm9hZGNhc3QgbWVzc2FnZS4KKyAqIEZvciBHU00vVU1UUywgdGhlIExvY2F0aW9uIEFyZWEgYW5kIENlbGwgSUQgYXJlIHNldCB3aGVuIHRoZSBicm9hZGNhc3QKKyAqIGdlb2dyYXBoaWNhbCBzY29wZSBpcyBjZWxsIHdpZGUgb3IgTG9jYXRpb24gQXJlYSB3aWRlLiBGb3IgQ0RNQSwgdGhlCisgKiBicm9hZGNhc3QgZ2VvZ3JhcGhpY2FsIHNjb3BlIGlzIGFsd2F5cyBQTE1OIHdpZGUuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFNtc0NiTG9jYXRpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIC8qKiBUaGUgUExNTi4gTm90ZSB0aGF0IHRoaXMgZmllbGQgbWF5IGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IGlzbid0IGFsbG93ZWQgdG8gYmUgbnVsbC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGxtbjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1MYWM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNpZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSBsb2NhdGlvbiBvYmplY3QuIFRoaXMgaXMgdXNlZCBmb3Igc29tZSB0ZXN0IGNhc2VzLCBhbmQgZm9yCisgICAgICogY2VsbCBicm9hZGNhc3RzIHNhdmVkIGluIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkYXRhYmFzZSB3aXRob3V0IGxvY2F0aW9uIGluZm8uCisgICAgICovCisgICAgcHVibGljIFNtc0NiTG9jYXRpb24oKSB7CisgICAgICAgIG1QbG1uID0gIiI7CisgICAgICAgIG1MYWMgPSAtMTsKKyAgICAgICAgbUNpZCA9IC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIGxvY2F0aW9uIG9iamVjdCBmb3IgdGhlIFBMTU4uIFRoaXMgY2xhc3MgaXMgaW1tdXRhYmxlLCBzbworICAgICAqIHRoZSBzYW1lIG9iamVjdCBjYW4gYmUgcmV1c2VkIGZvciBtdWx0aXBsZSBicm9hZGNhc3RzLgorICAgICAqLworICAgIHB1YmxpYyBTbXNDYkxvY2F0aW9uKFN0cmluZyBwbG1uKSB7CisgICAgICAgIG1QbG1uID0gcGxtbjsKKyAgICAgICAgbUxhYyA9IC0xOworICAgICAgICBtQ2lkID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbG9jYXRpb24gb2JqZWN0IGZvciB0aGUgUExNTiwgTEFDLCBhbmQgQ2VsbCBJRC4gVGhpcyBjbGFzcyBpcyBpbW11dGFibGUsIHNvCisgICAgICogdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSByZXVzZWQgZm9yIG11bHRpcGxlIGJyb2FkY2FzdHMuCisgICAgICovCisgICAgcHVibGljIFNtc0NiTG9jYXRpb24oU3RyaW5nIHBsbW4sIGludCBsYWMsIGludCBjaWQpIHsKKyAgICAgICAgbVBsbW4gPSBwbG1uOworICAgICAgICBtTGFjID0gbGFjOworICAgICAgICBtQ2lkID0gY2lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIG9iamVjdCBmcm9tIGEgUGFyY2VsLgorICAgICAqLworICAgIHB1YmxpYyBTbXNDYkxvY2F0aW9uKFBhcmNlbCBpbikgeworICAgICAgICBtUGxtbiA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUxhYyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNpZCA9IGluLnJlYWRJbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBNQ0MvTU5DIG9mIHRoZSBuZXR3b3JrIGFzIGEgU3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIFBMTU4gaWRlbnRpZmllciAoTUNDK01OQykgYXMgYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBsbW4oKSB7CisgICAgICAgIHJldHVybiBtUGxtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBHU00gbG9jYXRpb24gYXJlYSBjb2RlLCBvciBVTVRTIHNlcnZpY2UgYXJlYSBjb2RlLgorICAgICAqIEByZXR1cm4gbG9jYXRpb24gYXJlYSBjb2RlLCAtMSBpZiB1bmtub3duLCAweGZmZmYgbWF4IGxlZ2FsIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMYWMoKSB7CisgICAgICAgIHJldHVybiBtTGFjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEdTTSBvciBVTVRTIGNlbGwgSUQuCisgICAgICogQHJldHVybiBnc20gY2VsbCBpZCwgLTEgaWYgdW5rbm93biwgMHhmZmZmIG1heCBsZWdhbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2lkKCkgeworICAgICAgICByZXR1cm4gbUNpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IG1QbG1uLmhhc2hDb2RlKCk7CisgICAgICAgIGhhc2ggPSBoYXNoICogMzEgKyBtTGFjOworICAgICAgICBoYXNoID0gaGFzaCAqIDMxICsgbUNpZDsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgU21zQ2JMb2NhdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTbXNDYkxvY2F0aW9uIG90aGVyID0gKFNtc0NiTG9jYXRpb24pIG87CisgICAgICAgIHJldHVybiBtUGxtbi5lcXVhbHMob3RoZXIubVBsbW4pICYmIG1MYWMgPT0gb3RoZXIubUxhYyAmJiBtQ2lkID09IG90aGVyLm1DaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICdbJyArIG1QbG1uICsgJywnICsgbUxhYyArICcsJyArIG1DaWQgKyAnXSc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIHRoaXMgbG9jYXRpb24gaXMgd2l0aGluIHRoZSBsb2NhdGlvbiBhcmVhIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZWEgdGhlIGxvY2F0aW9uIGFyZWEgdG8gY29tcGFyZSB3aXRoIHRoaXMgbG9jYXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBsb2NhdGlvbiBpcyBjb250YWluZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gYXJlYQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Mb2NhdGlvbkFyZWEoU21zQ2JMb2NhdGlvbiBhcmVhKSB7CisgICAgICAgIGlmIChtQ2lkICE9IC0xICYmIG1DaWQgIT0gYXJlYS5tQ2lkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MYWMgIT0gLTEgJiYgbUxhYyAhPSBhcmVhLm1MYWMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBsbW4uZXF1YWxzKGFyZWEubVBsbW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciB0aGlzIGxvY2F0aW9uIGlzIHdpdGhpbiB0aGUgbG9jYXRpb24gYXJlYSBvZiB0aGUgQ2VsbExvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBsbW4gdGhlIFBMTU4gdG8gdXNlIGZvciBjb21wYXJpc29uCisgICAgICogQHBhcmFtIGxhYyB0aGUgTG9jYXRpb24gQXJlYSAoR1NNKSBvciBTZXJ2aWNlIEFyZWEgKFVNVFMpIHRvIGNvbXBhcmUgd2l0aAorICAgICAqIEBwYXJhbSBjaWQgdGhlIENlbGwgSUQgdG8gY29tcGFyZSB3aXRoCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbG9jYXRpb24gaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIFBMTU4sIExBQywgYW5kIENlbGwgSUQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luTG9jYXRpb25BcmVhKFN0cmluZyBwbG1uLCBpbnQgbGFjLCBpbnQgY2lkKSB7CisgICAgICAgIGlmICghbVBsbW4uZXF1YWxzKHBsbW4pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUxhYyAhPSAtMSAmJiBtTGFjICE9IGxhYykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaWQgIT0gLTEgJiYgbUNpZCAhPSBjaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW4gdGhpcyBvYmplY3QgaW50byBhIFBhcmNlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0ICBUaGUgUGFyY2VsIGluIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGZsYWdzIEFkZGl0aW9uYWwgZmxhZ3MgYWJvdXQgaG93IHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4gKGlnbm9yZWQpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1QbG1uKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtTGFjKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtQ2lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTbXNDYkxvY2F0aW9uPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U21zQ2JMb2NhdGlvbj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU21zQ2JMb2NhdGlvbiBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYkxvY2F0aW9uKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU21zQ2JMb2NhdGlvbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNtc0NiTG9jYXRpb25bc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRGVzY3JpYmUgdGhlIGtpbmRzIG9mIHNwZWNpYWwgb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uCisgICAgICogQHJldHVybiBhIGJpdG1hc2sgaW5kaWNhdGluZyB0aGlzIFBhcmNlbGFibGUgY29udGFpbnMgbm8gc3BlY2lhbCBvYmplY3RzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYk1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhCmluZGV4IDM4M2UwZjkuLjA0NmJmOGMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhCkBAIC0xNiwxMTggKzE2LDI2MiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU21zQ2JIZWFkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiAvKioKLSAqIERlc2NyaWJlcyBhbiBTTVMtQ0IgbWVzc2FnZS4KKyAqIFBhcmNlbGFibGUgb2JqZWN0IGNvbnRhaW5pbmcgYSByZWNlaXZlZCBjZWxsIGJyb2FkY2FzdCBtZXNzYWdlLiBUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgdHlwZXMKKyAqIG9mIENlbGwgQnJvYWRjYXN0IG1lc3NhZ2VzOgogICoKLSAqIHtAaGlkZX0KKyAqIDx1bD4KKyAqIDxsaT5vcHQtaW4gaW5mb3JtYXRpb25hbCBicm9hZGNhc3RzLCBlLmcuIG5ld3MsIHdlYXRoZXIsIHN0b2NrIHF1b3Rlcywgc3BvcnRzIHNjb3JlczwvbGk+CisgKiA8bGk+Y2VsbCBpbmZvcm1hdGlvbiBtZXNzYWdlcywgYnJvYWRjYXN0IG9uIGNoYW5uZWwgNTAsIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgY2VsbCBuYW1lIGZvcgorICogIHJvYW1pbmcgcHVycG9zZXMgKHJlcXVpcmVkIHRvIGRpc3BsYXkgb24gdGhlIGlkbGUgc2NyZWVuIGluIEJyYXppbCk8L2xpPgorICogPGxpPmVtZXJnZW5jeSBicm9hZGNhc3RzIGZvciB0aGUgSmFwYW5lc2UgRWFydGhxdWFrZSBhbmQgVHN1bmFtaSBXYXJuaW5nIFN5c3RlbSAoRVRXUyk8L2xpPgorICogPGxpPmVtZXJnZW5jeSBicm9hZGNhc3RzIGZvciB0aGUgQW1lcmljYW4gQ29tbWVyY2lhbCBNb2JpbGUgQWxlcnQgU2VydmljZSAoQ01BUyk8L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5UaGVyZSBhcmUgYWxzbyBmb3VyIGRpZmZlcmVudCBDQiBtZXNzYWdlIGZvcm1hdHM6IEdTTSwgRVRXUyBQcmltYXJ5IE5vdGlmaWNhdGlvbiAoR1NNIG9ubHkpLAorICogVU1UUywgYW5kIENETUEuIFNvbWUgZmllbGRzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIHNvbWUgbWVzc2FnZSBmb3JtYXRzLiBPdGhlciBmaWVsZHMgd2VyZQorICogdW5pZmllZCB1bmRlciBhIGNvbW1vbiBuYW1lLCBhdm9pZGluZyBzb21lIG5hbWVzLCBzdWNoIGFzICJNZXNzYWdlIElkZW50aWZpZXIiLCB0aGF0IHJlZmVyIHRvCisgKiB0d28gY29tcGxldGVseSBkaWZmZXJlbnQgY29uY2VwdHMgaW4gM0dQUCBhbmQgQ0RNQS4KKyAqCisgKiA8cD5UaGUgR1NNL1VNVFMgTWVzc2FnZSBJZGVudGlmaWVyIGZpZWxkIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rICNnZXRTZXJ2aWNlQ2F0ZWdvcnl9LCB0aGUgbmFtZQorICogb2YgdGhlIGVxdWl2YWxlbnQgZmllbGQgaW4gQ0RNQS4gSW4gYm90aCBjYXNlcyB0aGUgc2VydmljZSBjYXRlZ29yeSBpcyBhIDE2LWJpdCB2YWx1ZSwgYnV0IDNHUFAKKyAqIGFuZCAzR1BQMiBoYXZlIGNvbXBsZXRlbHkgZGlmZmVyZW50IG1lYW5pbmdzIGZvciB0aGUgcmVzcGVjdGl2ZSB2YWx1ZXMuIEZvciBFVFdTIGFuZCBDTUFTLCB0aGUKKyAqIGFwcGxpY2F0aW9uIHNob3VsZAorICoKKyAqIDxwPlRoZSBDRE1BIE1lc3NhZ2UgSWRlbnRpZmllciBmaWVsZCBpcyBhdmFpbGFibGUgdmlhIHtAbGluayAjZ2V0U2VyaWFsTnVtYmVyfSwgd2hpY2ggaXMgdXNlZAorICogdG8gZGV0ZWN0IHRoZSByZWNlaXB0IG9mIGEgZHVwbGljYXRlIG1lc3NhZ2UgdG8gYmUgZGlzY2FyZGVkLiBJbiBDRE1BLCB0aGUgbWVzc2FnZSBJRCBpcworICogdW5pcXVlIHRvIHRoZSBjdXJyZW50IFBMTU4uIEluIEdTTS9VTVRTLCB0aGVyZSBpcyBhIDE2LWJpdCBzZXJpYWwgbnVtYmVyIGNvbnRhaW5pbmcgYSAyLWJpdAorICogR2VvZ3JhcGhpY2FsIFNjb3BlIGZpZWxkIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSAxMC1iaXQgbWVzc2FnZSBjb2RlIGFuZCA0LWJpdCB1cGRhdGUgbnVtYmVyCisgKiBhcmUgY29uc2lkZXJlZCB1bmlxdWUgdG8gdGhlIFBMTU4sIHRvIHRoZSBjdXJyZW50IGNlbGwsIG9yIHRvIHRoZSBjdXJyZW50IExvY2F0aW9uIEFyZWEgKG9yCisgKiBTZXJ2aWNlIEFyZWEgaW4gVU1UUykuIFRoZSByZWxldmFudCB2YWx1ZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIFN0cmluZyB3aGljaCB3aWxsIGJlCisgKiB1bmlxdWUgaWYgdGhlIG1lc3NhZ2VzIGFyZSBub3QgZHVwbGljYXRlcy4KKyAqCisgKiA8cD5UaGUgU01TIGRpc3BhdGNoZXIgZG9lcyBub3QgZGV0ZWN0IGR1cGxpY2F0ZSBtZXNzYWdlcy4gSG93ZXZlciwgaXQgZG9lcyBjb25jYXRlbmF0ZSB0aGUKKyAqIHBhZ2VzIG9mIGEgR1NNIG11bHRpLXBhZ2UgY2VsbCBicm9hZGNhc3QgaW50byBhIHNpbmdsZSBTbXNDYk1lc3NhZ2Ugb2JqZWN0LgorICoKKyAqIDxwPkludGVyZXN0ZWQgYXBwbGljYXRpb25zIHdpdGgge0Bjb2RlIFJFQ0VJVkVfU01TX1BFUk1JU1NJT059IGNhbiByZWdpc3RlciB0byByZWNlaXZlCisgKiB7QGNvZGUgU01TX0NCX1JFQ0VJVkVEX0FDVElPTn0gYnJvYWRjYXN0IGludGVudHMgZm9yIGluY29taW5nIG5vbi1lbWVyZ2VuY3kgYnJvYWRjYXN0cy4KKyAqIE9ubHkgc3lzdGVtIGFwcGxpY2F0aW9ucyBzdWNoIGFzIHRoZSBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIgbWF5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IKKyAqIGVtZXJnZW5jeSBicm9hZGNhc3RzIChFVFdTIGFuZCBDTUFTKS4gVGhpcyBpcyBpbnRlbmRlZCB0byBwcmV2ZW50IGFueSBwb3RlbnRpYWwgZm9yIGRlbGF5cyBvcgorICogaW50ZXJmZXJlbmNlIHdpdGggdGhlIGltbWVkaWF0ZSBkaXNwbGF5IG9mIHRoZSBhbGVydCBtZXNzYWdlIGFuZCBwbGF5aW5nIG9mIHRoZSBhbGVydCBzb3VuZCBhbmQKKyAqIHZpYnJhdGlvbiBwYXR0ZXJuLCB3aGljaCBjb3VsZCBiZSBjYXVzZWQgYnkgcG9vcmx5IHdyaXR0ZW4gb3IgbWFsaWNpb3VzIG5vbi1zeXN0ZW0gY29kZS4KKyAqCisgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgU21zQ2JNZXNzYWdlIHsKK3B1YmxpYyBjbGFzcyBTbXNDYk1lc3NhZ2UgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKIAotICAgIC8qKgotICAgICAqIENlbGwgd2lkZSBpbW1lZGlhdGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCi0gICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTTVNDQiI7CisKKyAgICAvKiogQ2VsbCB3aWRlIGdlb2dyYXBoaWNhbCBzY29wZSB3aXRoIGltbWVkaWF0ZSBkaXNwbGF5IChHU00vVU1UUyBvbmx5KS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURSA9IDA7CiAKLSAgICAvKioKLSAgICAgKiBQTE1OIHdpZGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCi0gICAgICovCisgICAgLyoqIFBMTU4gd2lkZSBnZW9ncmFwaGljYWwgc2NvcGUgKEdTTS9VTVRTIGFuZCBhbGwgQ0RNQSBicm9hZGNhc3RzKS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU9HUkFQSElDQUxfU0NPUEVfUExNTl9XSURFID0gMTsKIAotICAgIC8qKgotICAgICAqIExvY2F0aW9uIC8gc2VydmljZSBhcmVhIHdpZGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCi0gICAgICovCisgICAgLyoqIExvY2F0aW9uIC8gc2VydmljZSBhcmVhIHdpZGUgZ2VvZ3JhcGhpY2FsIHNjb3BlIChHU00vVU1UUyBvbmx5KS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU9HUkFQSElDQUxfU0NPUEVfTEFfV0lERSA9IDI7CiAKLSAgICAvKioKLSAgICAgKiBDZWxsIHdpZGUgZ2VvZ3JhcGhpY2FsIHNjb3BlCi0gICAgICovCisgICAgLyoqIENlbGwgd2lkZSBnZW9ncmFwaGljYWwgc2NvcGUgKEdTTS9VTVRTIG9ubHkpLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREUgPSAzOwogCisgICAgLyoqIEdTTSBvciBVTVRTIGZvcm1hdCBjZWxsIGJyb2FkY2FzdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0ZPUk1BVF8zR1BQID0gMTsKKworICAgIC8qKiBDRE1BIGZvcm1hdCBjZWxsIGJyb2FkY2FzdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0ZPUk1BVF8zR1BQMiA9IDI7CisKKyAgICAvKiogTm9ybWFsIG1lc3NhZ2UgcHJpb3JpdHkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9QUklPUklUWV9OT1JNQUwgPSAwOworCisgICAgLyoqIEludGVyYWN0aXZlIG1lc3NhZ2UgcHJpb3JpdHkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9QUklPUklUWV9JTlRFUkFDVElWRSA9IDE7CisKKyAgICAvKiogVXJnZW50IG1lc3NhZ2UgcHJpb3JpdHkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9QUklPUklUWV9VUkdFTlQgPSAyOworCisgICAgLyoqIEVtZXJnZW5jeSBtZXNzYWdlIHByaW9yaXR5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfUFJJT1JJVFlfRU1FUkdFTkNZID0gMzsKKworICAgIC8qKiBGb3JtYXQgb2YgdGhpcyBtZXNzYWdlIChmb3IgaW50ZXJwcmV0YXRpb24gb2Ygc2VydmljZSBjYXRlZ29yeSB2YWx1ZXMpLiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1NZXNzYWdlRm9ybWF0OworCisgICAgLyoqIEdlb2dyYXBoaWNhbCBzY29wZSBvZiBicm9hZGNhc3QuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdlb2dyYXBoaWNhbFNjb3BlOworCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSBhIHJlY2VpdmVkIFBEVQorICAgICAqIFNlcmlhbCBudW1iZXIgb2YgYnJvYWRjYXN0IChtZXNzYWdlIGlkZW50aWZpZXIgZm9yIENETUEsIGdlb2dyYXBoaWNhbCBzY29wZSArIG1lc3NhZ2UgY29kZSArCisgICAgICogdXBkYXRlIG51bWJlciBmb3IgR1NNL1VNVFMpLiBUaGUgc2VyaWFsIG51bWJlciBwbHVzIHRoZSBsb2NhdGlvbiBjb2RlIHVuaXF1ZWx5IGlkZW50aWZ5CisgICAgICogYSBjZWxsIGJyb2FkY2FzdCBmb3IgZHVwbGljYXRlIGRldGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtU2VyaWFsTnVtYmVyOworCisgICAgLyoqCisgICAgICogTG9jYXRpb24gaWRlbnRpZmllciBmb3IgdGhpcyBtZXNzYWdlLiBJdCBjb25zaXN0cyBvZiB0aGUgY3VycmVudCBvcGVyYXRvciBNQ0MvTU5DIGFzIGEKKyAgICAgKiA1IG9yIDYtZGlnaXQgZGVjaW1hbCBzdHJpbmcuIEluIGFkZGl0aW9uLCBmb3IgR1NNL1VNVFMsIGlmIHRoZSBHZW9ncmFwaGljYWwgU2NvcGUgb2YgdGhlCisgICAgICogbWVzc2FnZSBpcyBub3QgYmluYXJ5IDAxLCB0aGUgTG9jYXRpb24gQXJlYSBpcyBpbmNsdWRlZCBmb3IgY29tcGFyaXNvbi4gSWYgdGhlIEdTIGlzCisgICAgICogMDAgb3IgMTEsIHRoZSBDZWxsIElEIGlzIGFsc28gaW5jbHVkZWQuIExBQyBhbmQgQ2VsbCBJRCBhcmUgLTEgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNtc0NiTG9jYXRpb24gbUxvY2F0aW9uOworCisgICAgLyoqCisgICAgICogMTYtYml0IENETUEgc2VydmljZSBjYXRlZ29yeSBvciBHU00vVU1UUyBtZXNzYWdlIGlkZW50aWZpZXIuIEZvciBFVFdTIGFuZCBDTUFTIHdhcm5pbmdzLAorICAgICAqIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgY2F0ZWdvcnkgaXMgYWxzbyBhdmFpbGFibGUgdmlhIHtAbGluayAjZ2V0RXR3c1dhcm5pbmdJbmZvKCl9CisgICAgICogb3Ige0BsaW5rICNnZXRDbWFzV2FybmluZ0luZm8oKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNlcnZpY2VDYXRlZ29yeTsKKworICAgIC8qKiBNZXNzYWdlIGxhbmd1YWdlLCBhcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nLCBlLmcuICJlbiIuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxhbmd1YWdlOworCisgICAgLyoqIE1lc3NhZ2UgYm9keSwgYXMgYSBTdHJpbmcuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJvZHk7CisKKyAgICAvKiogTWVzc2FnZSBwcmlvcml0eSAoaW5jbHVkaW5nIGVtZXJnZW5jeSBwcmlvcml0eSkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVByaW9yaXR5OworCisgICAgLyoqIEVUV1Mgd2FybmluZyBub3RpZmljYXRpb24gaW5mb3JtYXRpb24gKEVUV1Mgd2FybmluZ3Mgb25seSkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTbXNDYkV0d3NJbmZvIG1FdHdzV2FybmluZ0luZm87CisKKyAgICAvKiogQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbiBpbmZvcm1hdGlvbiAoQ01BUyB3YXJuaW5ncyBvbmx5KS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFNtc0NiQ21hc0luZm8gbUNtYXNXYXJuaW5nSW5mbzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTbXNDYk1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIFNtc0NiTWVzc2FnZShpbnQgbWVzc2FnZUZvcm1hdCwgaW50IGdlb2dyYXBoaWNhbFNjb3BlLCBpbnQgc2VyaWFsTnVtYmVyLAorICAgICAgICAgICAgU21zQ2JMb2NhdGlvbiBsb2NhdGlvbiwgaW50IHNlcnZpY2VDYXRlZ29yeSwgU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgYm9keSwKKyAgICAgICAgICAgIGludCBwcmlvcml0eSwgU21zQ2JFdHdzSW5mbyBldHdzV2FybmluZ0luZm8sIFNtc0NiQ21hc0luZm8gY21hc1dhcm5pbmdJbmZvKSB7CisgICAgICAgIG1NZXNzYWdlRm9ybWF0ID0gbWVzc2FnZUZvcm1hdDsKKyAgICAgICAgbUdlb2dyYXBoaWNhbFNjb3BlID0gZ2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgICAgIG1TZXJpYWxOdW1iZXIgPSBzZXJpYWxOdW1iZXI7CisgICAgICAgIG1Mb2NhdGlvbiA9IGxvY2F0aW9uOworICAgICAgICBtU2VydmljZUNhdGVnb3J5ID0gc2VydmljZUNhdGVnb3J5OworICAgICAgICBtTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgbUJvZHkgPSBib2R5OworICAgICAgICBtUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgbUV0d3NXYXJuaW5nSW5mbyA9IGV0d3NXYXJuaW5nSW5mbzsKKyAgICAgICAgbUNtYXNXYXJuaW5nSW5mbyA9IGNtYXNXYXJuaW5nSW5mbzsKKyAgICB9CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IFNtc0NiTWVzc2FnZSBvYmplY3QgZnJvbSBhIFBhcmNlbC4gKi8KKyAgICBwdWJsaWMgU21zQ2JNZXNzYWdlKFBhcmNlbCBpbikgeworICAgICAgICBtTWVzc2FnZUZvcm1hdCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUdlb2dyYXBoaWNhbFNjb3BlID0gaW4ucmVhZEludCgpOworICAgICAgICBtU2VyaWFsTnVtYmVyID0gaW4ucmVhZEludCgpOworICAgICAgICBtTG9jYXRpb24gPSBuZXcgU21zQ2JMb2NhdGlvbihpbik7CisgICAgICAgIG1TZXJ2aWNlQ2F0ZWdvcnkgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1MYW5ndWFnZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUJvZHkgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1Qcmlvcml0eSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgaW50IHR5cGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICAgICAgLy8gdW5wYXJjZWwgRVRXUyB3YXJuaW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgbUV0d3NXYXJuaW5nSW5mbyA9IG5ldyBTbXNDYkV0d3NJbmZvKGluKTsKKyAgICAgICAgICAgICAgICBtQ21hc1dhcm5pbmdJbmZvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgLy8gdW5wYXJjZWwgQ01BUyB3YXJuaW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgbUV0d3NXYXJuaW5nSW5mbyA9IG51bGw7CisgICAgICAgICAgICAgICAgbUNtYXNXYXJuaW5nSW5mbyA9IG5ldyBTbXNDYkNtYXNJbmZvKGluKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtRXR3c1dhcm5pbmdJbmZvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtQ21hc1dhcm5pbmdJbmZvID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW4gdGhpcyBvYmplY3QgaW50byBhIFBhcmNlbC4KICAgICAgKgotICAgICAqIEBwYXJhbSBwZHUgUERVIGJ5dGVzCi0gICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBvciBudWxsIGlmIGludmFsaWQgcGR1CisgICAgICogQHBhcmFtIGRlc3QgIFRoZSBQYXJjZWwgaW4gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgQWRkaXRpb25hbCBmbGFncyBhYm91dCBob3cgdGhlIG9iamVjdCBzaG91bGQgYmUgd3JpdHRlbiAoaWdub3JlZCkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTbXNDYk1lc3NhZ2UgY3JlYXRlRnJvbVBkdShieXRlW10gcGR1KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNtc0NiTWVzc2FnZShwZHUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkZhaWxlZCBwYXJzaW5nIFNNUy1DQiBwZHUiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU01TQ0IiOwotCi0gICAgLyoqCi0gICAgICogTGFuZ3VhZ2VzIGluIHRoZSAwMDAweHh4eCBEQ1MgZ3JvdXAgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzOCwgc2VjdGlvbiA1LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdVQUdFX0NPREVTX0dST1VQXzAgPSB7Ci0gICAgICAgICAgICAiZGUiLCAiZW4iLCAiaXQiLCAiZnIiLCAiZXMiLCAibmwiLCAic3YiLCAiZGEiLCAicHQiLCAiZmkiLCAibm8iLCAiZWwiLCAidHIiLCAiaHUiLAotICAgICAgICAgICAgInBsIiwgbnVsbAotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBMYW5ndWFnZXMgaW4gdGhlIDAwMTB4eHh4IERDUyBncm91cCBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDM4LCBzZWN0aW9uIDUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFOR1VBR0VfQ09ERVNfR1JPVVBfMiA9IHsKLSAgICAgICAgICAgICJjcyIsICJoZSIsICJhciIsICJydSIsICJpcyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICBudWxsLCBudWxsCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0FSUklBR0VfUkVUVVJOID0gMHgwZDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfQk9EWV9QQUdFX0xFTkdUSCA9IDgyOwotCi0gICAgcHJpdmF0ZSBTbXNDYkhlYWRlciBtSGVhZGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhbmd1YWdlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJvZHk7Ci0KLSAgICAvKiogVGltZXN0YW1wIG9mIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb24gd2l0aCBzZWN1cml0eS4gKi8KLSAgICBwcml2YXRlIGxvbmcgbVByaW1hcnlOb3RpZmljYXRpb25UaW1lc3RhbXA7Ci0KLSAgICAvKiogNDMgYnl0ZSBkaWdpdGFsIHNpZ25hdHVyZSBvZiBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9uIHdpdGggc2VjdXJpdHkuICovCi0gICAgcHJpdmF0ZSBieXRlW10gbVByaW1hcnlOb3RpZmljYXRpb25EaWdpdGFsU2lnbmF0dXJlOwotCi0gICAgcHJpdmF0ZSBTbXNDYk1lc3NhZ2UoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1IZWFkZXIgPSBuZXcgU21zQ2JIZWFkZXIocGR1KTsKLSAgICAgICAgaWYgKG1IZWFkZXIuZm9ybWF0ID09IFNtc0NiSGVhZGVyLkZPUk1BVF9FVFdTX1BSSU1BUlkpIHsKLSAgICAgICAgICAgIG1Cb2R5ID0gIkVUV1MiOwotICAgICAgICAgICAgLy8gRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiB3aXRoIHNlY3VyaXR5IGlzIDU2IG9jdGV0cyBpbiBsZW5ndGgKLSAgICAgICAgICAgIGlmIChwZHUubGVuZ3RoID49IFNtc0NiSGVhZGVyLlBEVV9MRU5HVEhfRVRXUykgewotICAgICAgICAgICAgICAgIG1QcmltYXJ5Tm90aWZpY2F0aW9uVGltZXN0YW1wID0gZ2V0VGltZXN0YW1wTWlsbGlzKHBkdSk7Ci0gICAgICAgICAgICAgICAgbVByaW1hcnlOb3RpZmljYXRpb25EaWdpdGFsU2lnbmF0dXJlID0gbmV3IGJ5dGVbNDNdOwotICAgICAgICAgICAgICAgIC8vIGRpZ2l0YWwgc2lnbmF0dXJlIHN0YXJ0cyBhZnRlciA2IGJ5dGUgaGVhZGVyIGFuZCA3IGJ5dGUgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIDEzLCBtUHJpbWFyeU5vdGlmaWNhdGlvbkRpZ2l0YWxTaWduYXR1cmUsIDAsIDQzKTsKLSAgICAgICAgICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludChtTWVzc2FnZUZvcm1hdCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUdlb2dyYXBoaWNhbFNjb3BlKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtU2VyaWFsTnVtYmVyKTsKKyAgICAgICAgbUxvY2F0aW9uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlSW50KG1TZXJ2aWNlQ2F0ZWdvcnkpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1MYW5ndWFnZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUJvZHkpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Qcmlvcml0eSk7CisgICAgICAgIGlmIChtRXR3c1dhcm5pbmdJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBhcmNlbCBFVFdTIHdhcm5pbmcgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoJ0UnKTsKKyAgICAgICAgICAgIG1FdHdzV2FybmluZ0luZm8ud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIH0gZWxzZSBpZiAobUNtYXNXYXJuaW5nSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwYXJjZWwgQ01BUyB3YXJuaW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICBkZXN0LndyaXRlSW50KCdDJyk7CisgICAgICAgICAgICBtQ21hc1dhcm5pbmdJbmZvLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyc2VCb2R5KHBkdSk7CisgICAgICAgICAgICAvLyBubyBFVFdTIG9yIENNQVMgd2FybmluZyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgZGVzdC53cml0ZUludCgnMCcpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U21zQ2JNZXNzYWdlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U21zQ2JNZXNzYWdlPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTbXNDYk1lc3NhZ2UgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU21zQ2JNZXNzYWdlKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU21zQ2JNZXNzYWdlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU21zQ2JNZXNzYWdlW3NpemVdOworICAgICAgICB9CisgICAgfTsKKwogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZ2VvZ3JhcGhpY2FsIHNjb3BlIG9mIHRoaXMgbWVzc2FnZSwgb25lIG9mCi0gICAgICoge0BsaW5rICNHRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURX0sCi0gICAgICoge0BsaW5rICNHRU9HUkFQSElDQUxfU0NPUEVfUExNTl9XSURFfSwKLSAgICAgKiB7QGxpbmsgI0dFT0dSQVBISUNBTF9TQ09QRV9MQV9XSURFfSwKLSAgICAgKiB7QGxpbmsgI0dFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREV9CisgICAgICogUmV0dXJuIHRoZSBnZW9ncmFwaGljYWwgc2NvcGUgb2YgdGhpcyBtZXNzYWdlIChHU00vVU1UUyBvbmx5KS4KICAgICAgKgogICAgICAqIEByZXR1cm4gR2VvZ3JhcGhpY2FsIHNjb3BlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRHZW9ncmFwaGljYWxTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFkZXIuZ2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgICAgIHJldHVybiBtR2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBicm9hZGNhc3Qgc2VyaWFsIG51bWJlciBvZiBicm9hZGNhc3QgKG1lc3NhZ2UgaWRlbnRpZmllciBmb3IgQ0RNQSwgb3IKKyAgICAgKiBnZW9ncmFwaGljYWwgc2NvcGUgKyBtZXNzYWdlIGNvZGUgKyB1cGRhdGUgbnVtYmVyIGZvciBHU00vVU1UUykuIFRoZSBzZXJpYWwgbnVtYmVyIHBsdXMKKyAgICAgKiB0aGUgbG9jYXRpb24gY29kZSB1bmlxdWVseSBpZGVudGlmeSBhIGNlbGwgYnJvYWRjYXN0IGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgMTYtYml0IENETUEgbWVzc2FnZSBpZGVudGlmaWVyIG9yIEdTTS9VTVRTIHNlcmlhbCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXJpYWxOdW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhdGlvbiBpZGVudGlmaWVyIGZvciB0aGlzIG1lc3NhZ2UsIGNvbnNpc3Rpbmcgb2YgdGhlIE1DQy9NTkMgYXMgYQorICAgICAqIDUgb3IgNi1kaWdpdCBkZWNpbWFsIHN0cmluZy4gSW4gYWRkaXRpb24sIGZvciBHU00vVU1UUywgaWYgdGhlIEdlb2dyYXBoaWNhbCBTY29wZSBvZiB0aGUKKyAgICAgKiBtZXNzYWdlIGlzIG5vdCBiaW5hcnkgMDEsIHRoZSBMb2NhdGlvbiBBcmVhIGlzIGluY2x1ZGVkLiBJZiB0aGUgR1MgaXMgMDAgb3IgMTEsIHRoZQorICAgICAqIGNlbGwgSUQgaXMgYWxzbyBpbmNsdWRlZC4gVGhlIHtAbGluayBTbXNDYkxvY2F0aW9ufSBvYmplY3QgaW5jbHVkZXMgYSBtZXRob2QgdG8gdGVzdAorICAgICAqIGlmIHRoZSBsb2NhdGlvbiBpcyBpbmNsdWRlZCB3aXRoaW4gYW5vdGhlciBsb2NhdGlvbiBhcmVhIG9yIHdpdGhpbiBhIFBMTU4gYW5kIENlbGxMb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBjb2RlIGZvciBkdXBsaWNhdGUgbWVzc2FnZSBkZXRlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU21zQ2JMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDE2LWJpdCBDRE1BIHNlcnZpY2UgY2F0ZWdvcnkgb3IgR1NNL1VNVFMgbWVzc2FnZSBpZGVudGlmaWVyLiBUaGUgaW50ZXJwcmV0YXRpb24KKyAgICAgKiBvZiB0aGUgY2F0ZWdvcnkgaXMgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYy4gRm9yIEVUV1MgYW5kIENNQVMgd2FybmluZ3MsIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIHByb3ZpZGVkIGJ5IHRoZSBjYXRlZ29yeSBpcyBhdmFpbGFibGUgdmlhIHtAbGluayAjZ2V0RXR3c1dhcm5pbmdJbmZvKCl9IG9yCisgICAgICoge0BsaW5rICNnZXRDbWFzV2FybmluZ0luZm8oKX0gaW4gYSByYWRpbyB0ZWNobm9sb2d5IGluZGVwZW5kZW50IGZvcm1hdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgc2VydmljZSBjYXRlZ29yeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VydmljZUNhdGVnb3J5KCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2VDYXRlZ29yeTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OSwzMTEgKzI5Myw5MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVzc2FnZSBpZGVudGlmaWVyIG9mIHRoaXMgbWVzc2FnZSAoMC02NTUzNSkKLSAgICAgKgotICAgICAqIEByZXR1cm4gTWVzc2FnZSBpZGVudGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZXNzYWdlSWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXNzYWdlIGNvZGUgb2YgdGhpcyBtZXNzYWdlICgwLTEwMjMpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2UgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZUNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhZGVyLm1lc3NhZ2VDb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdXBkYXRlIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UgKDAtMTUpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFVwZGF0ZSBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFVwZGF0ZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFkZXIudXBkYXRlTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBTbXNDYkhlYWRlciNGT1JNQVRfR1NNfSwge0BsaW5rIFNtc0NiSGVhZGVyI0ZPUk1BVF9VTVRTfSwgb3IKLSAgICAgKiAgICAgICAgIHtAbGluayBTbXNDYkhlYWRlciNGT1JNQVRfRVRXU19QUklNQVJZfQorICAgICAqIEdldCB0aGUgbWVzc2FnZSBmb3JtYXQgKHtAbGluayAjTUVTU0FHRV9GT1JNQVRfM0dQUH0gb3Ige0BsaW5rICNNRVNTQUdFX0ZPUk1BVF8zR1BQMn0pLgorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgM0dQUCBvciAzR1BQMiBtZXNzYWdlIGZvcm1hdAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG1IZWFkZXIuZm9ybWF0OworICAgICAgICByZXR1cm4gbU1lc3NhZ2VGb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9yIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb25zLCByZXR1cm4gdGhlIGVtZXJnZW5jeSB1c2VyIGFsZXJ0IGZsYWcuCi0gICAgICogQHJldHVybiB0cnVlIHRvIG5vdGlmeSB0ZXJtaW5hbCB0byBhY3RpdmF0ZSBlbWVyZ2VuY3kgdXNlciBhbGVydDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogR2V0IHRoZSBtZXNzYWdlIHByaW9yaXR5LiBOb3JtYWwgYnJvYWRjYXN0cyByZXR1cm4ge0BsaW5rICNNRVNTQUdFX1BSSU9SSVRZX05PUk1BTH0KKyAgICAgKiBhbmQgZW1lcmdlbmN5IGJyb2FkY2FzdHMgcmV0dXJuIHtAbGluayAjTUVTU0FHRV9QUklPUklUWV9FTUVSR0VOQ1l9LiBDRE1BIGFsc28gbWF5IHJldHVybgorICAgICAqIHtAbGluayAjTUVTU0FHRV9QUklPUklUWV9JTlRFUkFDVElWRX0gb3Ige0BsaW5rICNNRVNTQUdFX1BSSU9SSVRZX1VSR0VOVH0uCisgICAgICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbWVzc2FnZSBwcmlvcml0eQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEV0d3NFbWVyZ2VuY3lVc2VyQWxlcnQoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhZGVyLmV0d3NFbWVyZ2VuY3lVc2VyQWxlcnQ7CisgICAgcHVibGljIGludCBnZXRNZXNzYWdlUHJpb3JpdHkoKSB7CisgICAgICAgIHJldHVybiBtUHJpb3JpdHk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9yIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb25zLCByZXR1cm4gdGhlIHBvcHVwIGZsYWcuCi0gICAgICogQHJldHVybiB0cnVlIHRvIG5vdGlmeSB0ZXJtaW5hbCB0byBhY3RpdmF0ZSBkaXNwbGF5IHBvcHVwOyBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRFdHdzUG9wdXAoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhZGVyLmV0d3NQb3B1cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbnMsIHJldHVybiB0aGUgd2FybmluZyB0eXBlLgotICAgICAqIEByZXR1cm4gYSB2YWx1ZSBzdWNoIGFzIHtAbGluayBTbXNDYkNvbnN0YW50cyNFVFdTX1dBUk5JTkdfVFlQRV9FQVJUSFFVQUtFfQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RXR3c1dhcm5pbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gbUhlYWRlci5ldHdzV2FybmluZ1R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb25zLCByZXR1cm4gdGhlIFdhcm5pbmctU2VjdXJpdHktSW5mb3JtYXRpb24gdGltZXN0YW1wLgotICAgICAqIEByZXR1cm4gYSB0aW1lc3RhbXAgaW4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldEV0d3NTZWN1cml0eVRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1QcmltYXJ5Tm90aWZpY2F0aW9uVGltZXN0YW1wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9ucywgcmV0dXJuIHRoZSA0MyBieXRlIGRpZ2l0YWwgc2lnbmF0dXJlLgotICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBkaWdpdGFsIHNpZ25hdHVyZQotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0RXR3c1NlY3VyaXR5U2lnbmF0dXJlKCkgewotICAgICAgICByZXR1cm4gbVByaW1hcnlOb3RpZmljYXRpb25EaWdpdGFsU2lnbmF0dXJlLmNsb25lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIHVucGFjayB0aGUgYm9keSB0ZXh0IGFjY29yZGluZyB0byB0aGUgZW5jb2RpbmcgaW4gdGhlIERDUy4KLSAgICAgKiBBZnRlciBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgYXNzaWduZWQgdGhlIGJvZHkKLSAgICAgKiB0ZXh0IGludG8gbUJvZHksIGFuZCBvcHRpb25hbGx5IHRoZSBsYW5ndWFnZSBjb2RlIGludG8gbUxhbmd1YWdlCisgICAgICogSWYgdGhpcyBpcyBhbiBFVFdTIHdhcm5pbmcgbm90aWZpY2F0aW9uIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgRVRXUyB3YXJuaW5nIHR5cGUsIHRoZSBlbWVyZ2VuY3kgdXNlciBhbGVydCBmbGFnLCBhbmQgdGhlIHBvcHVwIGZsYWcuIElmIHRoaXMgaXMgYW4KKyAgICAgKiBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9uIChHU00gb25seSksIHRoZXJlIHdpbGwgYWxzbyBiZSBhIDctYnl0ZSB0aW1lc3RhbXAgYW5kIDQzLWJ5dGUKKyAgICAgKiBkaWdpdGFsIHNpZ25hdHVyZS4gQXMgb2YgUmVsZWFzZSAxMCwgM0dQUCBUUyAyMy4wNDEgc3RhdGVzIHRoYXQgdGhlIFVFIHNoYWxsIGlnbm9yZSB0aGUKKyAgICAgKiBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9uIHRpbWVzdGFtcCBhbmQgZGlnaXRhbCBzaWduYXR1cmUgaWYgcmVjZWl2ZWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGR1IFRoZSBwZHUKKyAgICAgKiBAcmV0dXJuIGFuIFNtc0NiRXR3c0luZm8gb2JqZWN0LCBvciBudWxsIGlmIHRoaXMgaXMgbm90IGFuIEVUV1Mgd2FybmluZyBub3RpZmljYXRpb24KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VCb2R5KGJ5dGVbXSBwZHUpIHsKLSAgICAgICAgaW50IGVuY29kaW5nOwotICAgICAgICBib29sZWFuIGhhc0xhbmd1YWdlSW5kaWNhdG9yID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gRXh0cmFjdCBlbmNvZGluZyBhbmQgbGFuZ3VhZ2UgZnJvbSBEQ1MsIGFzIGRlZmluZWQgaW4gM2dwcCBUUyAyMy4wMzgsCi0gICAgICAgIC8vIHNlY3Rpb24gNS4KLSAgICAgICAgc3dpdGNoICgobUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lICYgMHhmMCkgPj4gNCkgewotICAgICAgICAgICAgY2FzZSAweDAwOgotICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR183QklUOwotICAgICAgICAgICAgICAgIG1MYW5ndWFnZSA9IExBTkdVQUdFX0NPREVTX0dST1VQXzBbbUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lICYgMHgwZl07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMHgwMToKLSAgICAgICAgICAgICAgICBoYXNMYW5ndWFnZUluZGljYXRvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKChtSGVhZGVyLmRhdGFDb2RpbmdTY2hlbWUgJiAweDBmKSA9PSAweDAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR18xNkJJVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMHgwMjoKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKLSAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBMQU5HVUFHRV9DT0RFU19HUk9VUF8yW21IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZSAmIDB4MGZdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDB4MDM6Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMHgwNDoKLSAgICAgICAgICAgIGNhc2UgMHgwNToKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKChtSGVhZGVyLmRhdGFDb2RpbmdTY2hlbWUgJiAweDBjKSA+PiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR184QklUOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzE2QklUOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAwOgotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMHgwNjoKLSAgICAgICAgICAgIGNhc2UgMHgwNzoKLSAgICAgICAgICAgICAgICAvLyBDb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkCi0gICAgICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgICAgICAgICAgLy8gVURIIHN0cnVjdHVyZSBub3Qgc3VwcG9ydGVkCi0gICAgICAgICAgICBjYXNlIDB4MGU6Ci0gICAgICAgICAgICAgICAgLy8gRGVmaW5lZCBieSB0aGUgV0FQIGZvcnVtIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFNtc01lc3NhZ2UuRU5DT0RJTkdfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAweDBmOgotICAgICAgICAgICAgICAgIGlmICgoKG1IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZSAmIDB4MDQpID4+IDIpID09IDB4MDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzhCSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkIHZhbHVlcyBhcmUgdG8gYmUgdHJlYXRlZCBhcyA3LWJpdAotICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU21zTWVzc2FnZS5FTkNPRElOR183QklUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1IZWFkZXIuZm9ybWF0ID09IFNtc0NiSGVhZGVyLkZPUk1BVF9VTVRTKSB7Ci0gICAgICAgICAgICAvLyBQYXlsb2FkIG1heSBjb250YWluIG11bHRpcGxlIHBhZ2VzCi0gICAgICAgICAgICBpbnQgbnJQYWdlcyA9IHBkdVtTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSF07Ci0KLSAgICAgICAgICAgIGlmIChwZHUubGVuZ3RoIDwgU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEggKyAxICsgKFBEVV9CT0RZX1BBR0VfTEVOR1RIICsgMSkKLSAgICAgICAgICAgICAgICAgICAgKiBuclBhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGR1IGxlbmd0aCAiICsgcGR1Lmxlbmd0aCArICIgZG9lcyBub3QgbWF0Y2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBuclBhZ2VzICsgIiBwYWdlcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuclBhZ2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBFYWNoIHBhZ2UgaXMgODIgYnl0ZXMgZm9sbG93ZWQgYnkgYSBsZW5ndGggb2N0ZXQgaW5kaWNhdGluZwotICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgdXNlZnVsIG9jdGV0cyB3aXRoaW4gdGhvc2UgODIKLSAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEggKyAxICsgKFBEVV9CT0RZX1BBR0VfTEVOR1RIICsgMSkgKiBpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBwZHVbb2Zmc2V0ICsgUERVX0JPRFlfUEFHRV9MRU5HVEhdOwotCi0gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IFBEVV9CT0RZX1BBR0VfTEVOR1RIKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhZ2UgbGVuZ3RoICIgKyBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXhjZWVkcyBtYXhpbXVtIHZhbHVlICIgKyBQRFVfQk9EWV9QQUdFX0xFTkdUSCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHVucGFja0JvZHkocGR1LCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgsIGhhc0xhbmd1YWdlSW5kaWNhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQm9keSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQYXlsb2FkIGlzIG9uZSBzaW5nbGUgcGFnZQotICAgICAgICAgICAgaW50IG9mZnNldCA9IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7Ci0KLSAgICAgICAgICAgIG1Cb2R5ID0gdW5wYWNrQm9keShwZHUsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCwgaGFzTGFuZ3VhZ2VJbmRpY2F0b3IpOwotICAgICAgICB9CisgICAgcHVibGljIFNtc0NiRXR3c0luZm8gZ2V0RXR3c1dhcm5pbmdJbmZvKCkgeworICAgICAgICByZXR1cm4gbUV0d3NXYXJuaW5nSW5mbzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVbnBhY2sgYm9keSB0ZXh0IGZyb20gdGhlIHBkdSB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcsIHBvc2l0aW9uIGFuZAotICAgICAqIGxlbmd0aCB3aXRoaW4gdGhlIHBkdQorICAgICAqIElmIHRoaXMgaXMgYSBDTUFTIHdhcm5pbmcgbm90aWZpY2F0aW9uIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgQ01BUyBtZXNzYWdlIGNsYXNzLCBjYXRlZ29yeSwgcmVzcG9uc2UgdHlwZSwgc2V2ZXJpdHksIHVyZ2VuY3kgYW5kIGNlcnRhaW50eS4KKyAgICAgKiBUaGUgbWVzc2FnZSBjbGFzcyBpcyBhbHdheXMgcHJlc2VudC4gU2V2ZXJpdHksIHVyZ2VuY3kgYW5kIGNlcnRhaW50eSBhcmUgcHJlc2VudCBmb3IgQ0RNQQorICAgICAqIHdhcm5pbmcgbm90aWZpY2F0aW9ucyBjb250YWluaW5nIGEgdHlwZSAxIGVsZW1lbnRzIHJlY29yZCBhbmQgZm9yIEdTTSBhbmQgVU1UUyB3YXJuaW5ncworICAgICAqIGV4Y2VwdCBmb3IgdGhlIFByZXNpZGVudGlhbC1sZXZlbCBhbGVydCBjYXRlZ29yeS4gQ2F0ZWdvcnkgYW5kIHJlc3BvbnNlIHR5cGUgYXJlIG9ubHkKKyAgICAgKiBhdmFpbGFibGUgZm9yIENETUEgbm90aWZpY2F0aW9ucyBjb250YWluaW5nIGEgdHlwZSAxIGVsZW1lbnRzIHJlY29yZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBwZHUgVGhlIHBkdQotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcsIGFzIGRlcml2ZWQgZnJvbSB0aGUgRENTCi0gICAgICogQHBhcmFtIG9mZnNldCBQb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSB0byB1bnBhY2sKLSAgICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBieXRlcyB0byB1bnBhY2sKLSAgICAgKiBAcGFyYW0gaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgdHJ1ZSBpZiB0aGUgYm9keSB0ZXh0IGlzIHByZWNlZGVkIGJ5IGEKLSAgICAgKiAgICAgICAgICAgIGxhbmd1YWdlIGluZGljYXRvci4gSWYgc28sIHRoaXMgbWV0aG9kIHdpbGwgYXMgYSBzaWRlLWVmZmVjdAotICAgICAqICAgICAgICAgICAgYXNzaWduIHRoZSBleHRyYWN0ZWQgbGFuZ3VhZ2UgY29kZSBpbnRvIG1MYW5ndWFnZQotICAgICAqIEByZXR1cm4gQm9keSB0ZXh0CisgICAgICogQHJldHVybiBhbiBTbXNDYkNtYXNJbmZvIG9iamVjdCwgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIENNQVMgd2FybmluZyBub3RpZmljYXRpb24KICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB1bnBhY2tCb2R5KGJ5dGVbXSBwZHUsIGludCBlbmNvZGluZywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzTGFuZ3VhZ2VJbmRpY2F0b3IpIHsKLSAgICAgICAgU3RyaW5nIGJvZHkgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIGNhc2UgU21zTWVzc2FnZS5FTkNPRElOR183QklUOgotICAgICAgICAgICAgICAgIGJvZHkgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LCBvZmZzZXQsIGxlbmd0aCAqIDggLyA3KTsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBib2R5ICE9IG51bGwgJiYgYm9keS5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTGFuZ3VhZ2UgaXMgdHdvIEdTTSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IGEgQ1IuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYm9keSB0ZXh0IGlzIG9mZnNldCBieSAzIGNoYXJhY3RlcnMuCi0gICAgICAgICAgICAgICAgICAgIG1MYW5ndWFnZSA9IGJvZHkuc3Vic3RyaW5nKDAsIDIpOwotICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5zdWJzdHJpbmcoMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ6Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0xhbmd1YWdlSW5kaWNhdG9yICYmIHBkdS5sZW5ndGggPj0gb2Zmc2V0ICsgMikgewotICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSBpcyB0d28gR1NNIGNoYXJhY3RlcnMuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYm9keSB0ZXh0IGlzIG9mZnNldCBieSAyIGJ5dGVzLgotICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LCBvZmZzZXQsIDIpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC09IDI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYm9keSA9IG5ldyBTdHJpbmcocGR1LCBvZmZzZXQsIChsZW5ndGggJiAweGZmZmUpLCAidXRmLTE2Iik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVlZWVrCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGJvZHkubGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGlmIChib2R5LmNoYXJBdChpKSAhPSBDQVJSSUFHRV9SRVRVUk4pIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keSA9IGJvZHkuc3Vic3RyaW5nKDAsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9keSA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgcHVibGljIFNtc0NiQ21hc0luZm8gZ2V0Q21hc1dhcm5pbmdJbmZvKCkgeworICAgICAgICByZXR1cm4gbUNtYXNXYXJuaW5nSW5mbzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAgYW5kIHJldHVybnMgYSBjdXJyZW50VGltZU1pbGxpcygpLXN0eWxlCi0gICAgICogdGltZXN0YW1wLiBDb3BpZWQgZnJvbSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuCi0gICAgICogQHBhcmFtIHBkdSB0aGUgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiBQRFUgdG8gZGVjb2RlCi0gICAgICogQHJldHVybiB0aGUgVVRDIHRpbWVzdGFtcCBmcm9tIHRoZSBXYXJuaW5nLVNlY3VyaXR5LUluZm9ybWF0aW9uIHBhcmFtZXRlcgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpcyBhbiBlbWVyZ2VuY3kgKFBXUykgbWVzc2FnZSB0eXBlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBhIHB1YmxpYyB3YXJuaW5nIG5vdGlmaWNhdGlvbjsgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGdldFRpbWVzdGFtcE1pbGxpcyhieXRlW10gcGR1KSB7Ci0gICAgICAgIC8vIFRpbWVzdGFtcCBzdGFydHMgYWZ0ZXIgQ0IgaGVhZGVyLCBpbiBwZHVbNl0KLSAgICAgICAgaW50IHllYXIgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1WzZdKTsKLSAgICAgICAgaW50IG1vbnRoID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVs3XSk7Ci0gICAgICAgIGludCBkYXkgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1WzhdKTsKLSAgICAgICAgaW50IGhvdXIgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1WzldKTsKLSAgICAgICAgaW50IG1pbnV0ZSA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbMTBdKTsKLSAgICAgICAgaW50IHNlY29uZCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbMTFdKTsKLQotICAgICAgICAvLyBGb3IgdGhlIHRpbWV6b25lLCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCi0gICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCi0gICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAotICAgICAgICAvLyB3aGljaCBpcyBtb3JlIHRoYW4gZW5vdWdoKQotCi0gICAgICAgIGJ5dGUgdHpCeXRlID0gcGR1WzEyXTsKLQotICAgICAgICAvLyBNYXNrIG91dCBzaWduIGJpdC4KLSAgICAgICAgaW50IHRpbWV6b25lT2Zmc2V0ID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KChieXRlKSAodHpCeXRlICYgKH4weDA4KSkpOwotCi0gICAgICAgIHRpbWV6b25lT2Zmc2V0ID0gKCh0ekJ5dGUgJiAweDA4KSA9PSAwKSA/IHRpbWV6b25lT2Zmc2V0IDogLXRpbWV6b25lT2Zmc2V0OwotCi0gICAgICAgIFRpbWUgdGltZSA9IG5ldyBUaW1lKFRpbWUuVElNRVpPTkVfVVRDKTsKLQotICAgICAgICAvLyBJdCdzIDIwMDYuICBTaG91bGQgSSByZWFsbHkgc3VwcG9ydCB5ZWFycyA8IDIwMDA/Ci0gICAgICAgIHRpbWUueWVhciA9IHllYXIgPj0gOTAgPyB5ZWFyICsgMTkwMCA6IHllYXIgKyAyMDAwOwotICAgICAgICB0aW1lLm1vbnRoID0gbW9udGggLSAxOwotICAgICAgICB0aW1lLm1vbnRoRGF5ID0gZGF5OwotICAgICAgICB0aW1lLmhvdXIgPSBob3VyOwotICAgICAgICB0aW1lLm1pbnV0ZSA9IG1pbnV0ZTsKLSAgICAgICAgdGltZS5zZWNvbmQgPSBzZWNvbmQ7Ci0KLSAgICAgICAgLy8gVGltZXpvbmUgb2Zmc2V0IGlzIGluIHF1YXJ0ZXIgaG91cnMuCi0gICAgICAgIHJldHVybiB0aW1lLnRvTWlsbGlzKHRydWUpIC0gKHRpbWV6b25lT2Zmc2V0ICogMTUgKiA2MCAqIDEwMDApOworICAgIHB1YmxpYyBib29sZWFuIGlzRW1lcmdlbmN5TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcmlvcml0eSA9PSBNRVNTQUdFX1BSSU9SSVRZX0VNRVJHRU5DWTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmQgdGV4dCB0byB0aGUgbWVzc2FnZSBib2R5LiBUaGlzIGlzIHVzZWQgdG8gY29uY2F0ZW5hdGUgbXVsdGktcGFnZSBHU00gYnJvYWRjYXN0cy4KLSAgICAgKiBAcGFyYW0gYm9keSB0aGUgdGV4dCB0byBhcHBlbmQgdG8gdGhpcyBtZXNzYWdlCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGlzIGFuIEVUV1Mgd2FybmluZyBhbGVydC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gRVRXUyB3YXJuaW5nIG5vdGlmaWNhdGlvbjsgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG9Cb2R5KFN0cmluZyBib2R5KSB7Ci0gICAgICAgIG1Cb2R5ID0gbUJvZHkgKyBib2R5OworICAgIHB1YmxpYyBib29sZWFuIGlzRXR3c01lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtRXR3c1dhcm5pbmdJbmZvICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGlzIGEgQ01BUyB3YXJuaW5nIGFsZXJ0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBhIENNQVMgd2FybmluZyBub3RpZmljYXRpb247IGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ21hc01lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtQ21hc1dhcm5pbmdJbmZvICE9IG51bGw7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTbXNDYk1lc3NhZ2V7IiArIG1IZWFkZXIudG9TdHJpbmcoKSArICIsIGxhbmd1YWdlPSIgKyBtTGFuZ3VhZ2UgKwotICAgICAgICAgICAgICAgICIsIGJvZHk9XCIiICsgbUJvZHkgKyAiXCJ9IjsKKyAgICAgICAgcmV0dXJuICJTbXNDYk1lc3NhZ2V7Z2VvZ3JhcGhpY2FsU2NvcGU9IiArIG1HZW9ncmFwaGljYWxTY29wZSArICIsIHNlcmlhbE51bWJlcj0iCisgICAgICAgICAgICAgICAgKyBtU2VyaWFsTnVtYmVyICsgIiwgbG9jYXRpb249IiArIG1Mb2NhdGlvbiArICIsIHNlcnZpY2VDYXRlZ29yeT0iCisgICAgICAgICAgICAgICAgKyBtU2VydmljZUNhdGVnb3J5ICsgIiwgbGFuZ3VhZ2U9IiArIG1MYW5ndWFnZSArICIsIGJvZHk9IiArIG1Cb2R5CisgICAgICAgICAgICAgICAgKyAiLCBwcmlvcml0eT0iICsgbVByaW9yaXR5CisgICAgICAgICAgICAgICAgKyAobUV0d3NXYXJuaW5nSW5mbyAhPSBudWxsID8gKCIsICIgKyBtRXR3c1dhcm5pbmdJbmZvLnRvU3RyaW5nKCkpIDogIiIpCisgICAgICAgICAgICAgICAgKyAobUNtYXNXYXJuaW5nSW5mbyAhPSBudWxsID8gKCIsICIgKyBtQ21hc1dhcm5pbmdJbmZvLnRvU3RyaW5nKCkpIDogIiIpICsgJ30nOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIHRoZSBraW5kcyBvZiBzcGVjaWFsIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLgorICAgICAqIEByZXR1cm4gYSBiaXRtYXNrIGluZGljYXRpbmcgdGhpcyBQYXJjZWxhYmxlIGNvbnRhaW5zIG5vIHNwZWNpYWwgb2JqZWN0cworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvY2RtYS9DZG1hU21zQ2JQcm9ncmFtRGF0YS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvY2RtYS9DZG1hU21zQ2JQcm9ncmFtRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NGVmZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9jZG1hL0NkbWFTbXNDYlByb2dyYW1EYXRhLmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LmNkbWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogQ0RNQSBTZXJ2aWNlIENhdGVnb3J5IFByb2dyYW0gRGF0YSBmcm9tIFNDUFQgdGVsZXNlcnZpY2UgU01TLgorICogVGhlIENlbGxCcm9hZGNhc3RSZWNlaXZlciBhcHAgcmVjZWl2ZXMgYW4gSW50ZW50IHdpdGggYWN0aW9uCisgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHMjU01TX1NFUlZJQ0VfQ0FURUdPUllfUFJPR1JBTV9EQVRBX1JFQ0VJVkVEX0FDVElPTn0KKyAqIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlc2Ugb2JqZWN0cyB0byB1cGRhdGUgaXRzIGxpc3Qgb2YgY2VsbCBicm9hZGNhc3Qgc2VydmljZSBjYXRlZ29yaWVzCisgKiB0byBkaXNwbGF5LgorICoKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIENkbWFTbXNDYlByb2dyYW1EYXRhIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICAvKiogRGVsZXRlIHRoZSBzcGVjaWZpZWQgc2VydmljZSBjYXRlZ29yeSBmcm9tIHRoZSBsaXN0IG9mIGVuYWJsZWQgY2F0ZWdvcmllcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT05fREVMRVRFX0NBVEVHT1JZICAgPSAwOworCisgICAgLyoqIEFkZCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgY2F0ZWdvcnkgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBjYXRlZ29yaWVzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9BRERfQ0FURUdPUlkgICAgICA9IDE7CisKKyAgICAvKiogQ2xlYXIgYWxsIHNlcnZpY2UgY2F0ZWdvcmllcyBmcm9tIHRoZSBsaXN0IG9mIGVuYWJsZWQgY2F0ZWdvcmllcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT05fQ0xFQVJfQ0FURUdPUklFUyAgPSAyOworCisgICAgLyoqIEFsZXJ0IG9wdGlvbjogbm8gYWxlcnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX05PX0FMRVJUICAgICAgICAgICAgICAgPSAwOworCisgICAgLyoqIEFsZXJ0IG9wdGlvbjogZGVmYXVsdCBhbGVydC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEVSVF9PUFRJT05fREVGQVVMVF9BTEVSVCAgICAgICAgICA9IDE7CisKKyAgICAvKiogQWxlcnQgb3B0aW9uOiB2aWJyYXRlIGFsZXJ0IG9uY2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX1ZJQlJBVEVfT05DRSAgICAgICAgICAgPSAyOworCisgICAgLyoqIEFsZXJ0IG9wdGlvbjogdmlicmF0ZSBhbGVydCAtIHJlcGVhdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEVSVF9PUFRJT05fVklCUkFURV9SRVBFQVQgICAgICAgICA9IDM7CisKKyAgICAvKiogQWxlcnQgb3B0aW9uOiB2aXN1YWwgYWxlcnQgb25jZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEVSVF9PUFRJT05fVklTVUFMX09OQ0UgICAgICAgICAgICA9IDQ7CisKKyAgICAvKiogQWxlcnQgb3B0aW9uOiB2aXN1YWwgYWxlcnQgLSByZXBlYXQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX1ZJU1VBTF9SRVBFQVQgICAgICAgICAgPSA1OworCisgICAgLyoqIEFsZXJ0IG9wdGlvbjogbG93LXByaW9yaXR5IGFsZXJ0IG9uY2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX0xPV19QUklPUklUWV9PTkNFICAgICAgPSA2OworCisgICAgLyoqIEFsZXJ0IG9wdGlvbjogbG93LXByaW9yaXR5IGFsZXJ0IC0gcmVwZWF0LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMRVJUX09QVElPTl9MT1dfUFJJT1JJVFlfUkVQRUFUICAgID0gNzsKKworICAgIC8qKiBBbGVydCBvcHRpb246IG1lZGl1bS1wcmlvcml0eSBhbGVydCBvbmNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMRVJUX09QVElPTl9NRURfUFJJT1JJVFlfT05DRSAgICAgID0gODsKKworICAgIC8qKiBBbGVydCBvcHRpb246IG1lZGl1bS1wcmlvcml0eSBhbGVydCAtIHJlcGVhdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEVSVF9PUFRJT05fTUVEX1BSSU9SSVRZX1JFUEVBVCAgICA9IDk7CisKKyAgICAvKiogQWxlcnQgb3B0aW9uOiBoaWdoLXByaW9yaXR5IGFsZXJ0IG9uY2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX0hJR0hfUFJJT1JJVFlfT05DRSAgICAgPSAxMDsKKworICAgIC8qKiBBbGVydCBvcHRpb246IGhpZ2gtcHJpb3JpdHkgYWxlcnQgLSByZXBlYXQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxFUlRfT1BUSU9OX0hJR0hfUFJJT1JJVFlfUkVQRUFUICAgPSAxMTsKKworICAgIC8qKiBTZXJ2aWNlIGNhdGVnb3J5IG9wZXJhdGlvbiAoYWRkL2RlbGV0ZS9jbGVhcikuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9wZXJhdGlvbjsKKworICAgIC8qKiBTZXJ2aWNlIGNhdGVnb3J5IHRvIG1vZGlmeS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ2F0ZWdvcnk7CisKKyAgICAvKiogTGFuZ3VhZ2UgdXNlZCBmb3Igc2VydmljZSBjYXRlZ29yeSBuYW1lIChJU08gNjM5IHR3byBjaGFyYWN0ZXIgY29kZSkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxhbmd1YWdlOworCisgICAgLyoqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIHN0b3JlIGZvciB0aGlzIHNlcnZpY2UgY2F0ZWdvcnkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heE1lc3NhZ2VzOworCisgICAgLyoqIFNlcnZpY2UgY2F0ZWdvcnkgYWxlcnQgb3B0aW9uLiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1BbGVydE9wdGlvbjsKKworICAgIC8qKiBOYW1lIG9mIHNlcnZpY2UgY2F0ZWdvcnkuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNhdGVnb3J5TmFtZTsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgQ2RtYVNtc0NiUHJvZ3JhbURhdGEgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuICovCisgICAgcHVibGljIENkbWFTbXNDYlByb2dyYW1EYXRhKGludCBvcGVyYXRpb24sIGludCBjYXRlZ29yeSwgU3RyaW5nIGxhbmd1YWdlLCBpbnQgbWF4TWVzc2FnZXMsCisgICAgICAgICAgICBpbnQgYWxlcnRPcHRpb24sIFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKKyAgICAgICAgbU9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgICAgICAgbUNhdGVnb3J5ID0gY2F0ZWdvcnk7CisgICAgICAgIG1MYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICBtTWF4TWVzc2FnZXMgPSBtYXhNZXNzYWdlczsKKyAgICAgICAgbUFsZXJ0T3B0aW9uID0gYWxlcnRPcHRpb247CisgICAgICAgIG1DYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhIG5ldyBDZG1hU21zQ2JQcm9ncmFtRGF0YSBvYmplY3QgZnJvbSBhIFBhcmNlbC4gKi8KKyAgICBDZG1hU21zQ2JQcm9ncmFtRGF0YShQYXJjZWwgaW4pIHsKKyAgICAgICAgbU9wZXJhdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNhdGVnb3J5ID0gaW4ucmVhZEludCgpOworICAgICAgICBtTGFuZ3VhZ2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1NYXhNZXNzYWdlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUFsZXJ0T3B0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICBtQ2F0ZWdvcnlOYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW4gdGhpcyBvYmplY3QgaW50byBhIFBhcmNlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0ICBUaGUgUGFyY2VsIGluIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGZsYWdzIEFkZGl0aW9uYWwgZmxhZ3MgYWJvdXQgaG93IHRoZSBvYmplY3Qgc2hvdWxkIGJlIHdyaXR0ZW4gKGlnbm9yZWQpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1PcGVyYXRpb24pOworICAgICAgICBkZXN0LndyaXRlSW50KG1DYXRlZ29yeSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUxhbmd1YWdlKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtTWF4TWVzc2FnZXMpOworICAgICAgICBkZXN0LndyaXRlSW50KG1BbGVydE9wdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUNhdGVnb3J5TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VydmljZSBjYXRlZ29yeSBvcGVyYXRpb24sIGUuZy4ge0BsaW5rICNPUEVSQVRJT05fQUREX0NBVEVHT1JZfS4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUge0Bjb2RlIE9QRVJBVElPTl8qfSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1PcGVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ0RNQSBzZXJ2aWNlIGNhdGVnb3J5IHRvIG1vZGlmeS4KKyAgICAgKiBAcmV0dXJuIGEgMTYtYml0IENETUEgc2VydmljZSBjYXRlZ29yeSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnkoKSB7CisgICAgICAgIHJldHVybiBtQ2F0ZWdvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSVNPLTYzOS0xIGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBzZXJ2aWNlIGNhdGVnb3J5IG5hbWUsIG9yIG51bGwgaWYgbm90IHByZXNlbnQuCisgICAgICogQHJldHVybiBhIHR3by1kaWdpdCBJU08tNjM5LTEgbGFuZ3VhZ2UgY29kZSwgZS5nLiAiZW4iIGZvciBFbmdsaXNoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZUNvZGUoKSB7CisgICAgICAgIHJldHVybiBtTGFuZ3VhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8gc3RvcmUgZm9yIHRoaXMgc2VydmljZSBjYXRlZ29yeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0byBzdG9yZSBmb3IgdGhpcyBzZXJ2aWNlIGNhdGVnb3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhNZXNzYWdlcygpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhNZXNzYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIGNhdGVnb3J5IGFsZXJ0IG9wdGlvbiwgZS5nLiB7QGxpbmsgI0FMRVJUX09QVElPTl9ERUZBVUxUX0FMRVJUfS4KKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUge0Bjb2RlIEFMRVJUX09QVElPTl8qfSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFsZXJ0T3B0aW9uKCkgeworICAgICAgICByZXR1cm4gbUFsZXJ0T3B0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZpY2UgY2F0ZWdvcnkgbmFtZSwgaW4gdGhlIGxhbmd1YWdlIHNwZWNpZmllZCBieSB7QGxpbmsgI2dldExhbmd1YWdlQ29kZSgpfS4KKyAgICAgKiBAcmV0dXJuIGFuIG9wdGlvbmFsIHNlcnZpY2UgY2F0ZWdvcnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCkgeworICAgICAgICByZXR1cm4gbUNhdGVnb3J5TmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkNkbWFTbXNDYlByb2dyYW1EYXRhe29wZXJhdGlvbj0iICsgbU9wZXJhdGlvbiArICIsIGNhdGVnb3J5PSIgKyBtQ2F0ZWdvcnkKKyAgICAgICAgICAgICAgICArICIsIGxhbmd1YWdlPSIgKyBtTGFuZ3VhZ2UgKyAiLCBtYXggbWVzc2FnZXM9IiArIG1NYXhNZXNzYWdlcworICAgICAgICAgICAgICAgICsgIiwgYWxlcnQgb3B0aW9uPSIgKyBtQWxlcnRPcHRpb24gKyAiLCBjYXRlZ29yeSBuYW1lPSIgKyBtQ2F0ZWdvcnlOYW1lICsgJ30nOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIHRoZSBraW5kcyBvZiBzcGVjaWFsIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLgorICAgICAqIEByZXR1cm4gYSBiaXRtYXNrIGluZGljYXRpbmcgdGhpcyBQYXJjZWxhYmxlIGNvbnRhaW5zIG5vIHNwZWNpYWwgb2JqZWN0cworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqIENyZWF0b3IgZm9yIHVucGFyY2VsbGluZyBvYmplY3RzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENkbWFTbXNDYlByb2dyYW1EYXRhPgorICAgICAgICAgICAgQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q2RtYVNtc0NiUHJvZ3JhbURhdGE+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENkbWFTbXNDYlByb2dyYW1EYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENkbWFTbXNDYlByb2dyYW1EYXRhKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2RtYVNtc0NiUHJvZ3JhbURhdGFbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDZG1hU21zQ2JQcm9ncmFtRGF0YVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQppbmRleCBmZTgwZmRmLi45NjViYWZhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKQEAgLTE4NiwxMCArMTg2LDEyIEBACiAgICAgICAgIGlmIChwaG9uZS5tQ00uZ2V0THRlT25DZG1hTW9kZSgpID09IFBob25lLkxURV9PTl9DRE1BX1RSVUUKICAgICAgICAgICAgICAgICAmJiBwaG9uZSBpbnN0YW5jZW9mIENETUFMVEVQaG9uZSkgewogICAgICAgICAgICAgbUljY1JlY29yZHMgPSBuZXcgQ2RtYUx0ZVVpY2NSZWNvcmRzKHBob25lKTsKLSAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IG5ldyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyKChDRE1BTFRFUGhvbmUpcGhvbmUpOworICAgICAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gbmV3IENkbWFMdGVVaWNjRmlsZUhhbmRsZXIodGhpcywgIiIsIG1QaG9uZS5tQ00pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUljY1JlY29yZHMgPSBpczNncHAgPyBuZXcgU0lNUmVjb3JkcyhwaG9uZSkgOiBuZXcgUnVpbVJlY29yZHMocGhvbmUpOwotICAgICAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gaXMzZ3BwID8gbmV3IFNJTUZpbGVIYW5kbGVyKHBob25lKSA6IG5ldyBSdWltRmlsZUhhbmRsZXIocGhvbmUpOworICAgICAgICAgICAgLy8gQ29ycmVjdCBhaWQgd2lsbCBiZSBzZXQgbGF0ZXIgKHdoZW4gR0VUX1NJTV9TVEFUVVMgcmV0dXJucykKKyAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IGlzM2dwcCA/IG5ldyBTSU1GaWxlSGFuZGxlcih0aGlzLCAiIiwgbVBob25lLm1DTSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1aW1GaWxlSGFuZGxlcih0aGlzLCAiIiwgbVBob25lLm1DTSk7CiAgICAgICAgIH0KICAgICAgICAgbVBob25lLm1DTS5yZWdpc3RlckZvck9mZk9yTm90QXZhaWxhYmxlKG1IYW5kbGVyLCBFVkVOVF9SQURJT19PRkZfT1JfTk9UX0FWQUlMQUJMRSwgbnVsbCk7CiAgICAgICAgIG1QaG9uZS5tQ00ucmVnaXN0ZXJGb3JPbihtSGFuZGxlciwgRVZFTlRfUkFESU9fT04sIG51bGwpOwpAQCAtNTcyLDYgKzU3NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAob2xkU3RhdGUgIT0gU3RhdGUuUkVBRFkgJiYgbmV3U3RhdGUgPT0gU3RhdGUuUkVBRFkpIHsKKyAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlci5zZXRBaWQoZ2V0QWlkKCkpOwogICAgICAgICAgICAgbUljY1JlY29yZHMub25SZWFkeSgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQppbmRleCAzODBiZmQxLi43MGQ4ZjdhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQpAQCAtOTAsNyArOTAsOSBAQAogICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IEVWRU5UX1JFQURfSUNPTl9ET05FID0gMTA7CiAKICAgICAgLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIHByb3RlY3RlZCBQaG9uZUJhc2UgcGhvbmU7CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbW1hbmRzSW50ZXJmYWNlIG1DaTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSWNjQ2FyZCBtUGFyZW50Q2FyZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1BaWQ7CiAKICAgICBzdGF0aWMgY2xhc3MgTG9hZExpbmVhckZpeGVkQ29udGV4dCB7CiAKQEAgLTEyMCw5ICsxMjIsMTAgQEAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEljY0ZpbGVIYW5kbGVyKFBob25lQmFzZSBwaG9uZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CisgICAgcHJvdGVjdGVkIEljY0ZpbGVIYW5kbGVyKEljY0NhcmQgY2FyZCwgU3RyaW5nIGFpZCwgQ29tbWFuZHNJbnRlcmZhY2UgY2kpIHsKKyAgICAgICAgbVBhcmVudENhcmQgPSBjYXJkOworICAgICAgICBtQWlkID0gYWlkOworICAgICAgICBtQ2kgPSBjaTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewpAQCAtMTQ1LDkgKzE0OCw4IEBACiAgICAgICAgICAgICA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX1JFQ09SRF9TSVpFX0RPTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9hZExpbmVhckZpeGVkQ29udGV4dChmaWxlaWQsIHJlY29yZE51bSwgb25Mb2FkZWQpKTsKIAotICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1LDEwICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgb25Mb2FkZWQpKTsKIAogICAgICAgICAvLyBUT0RPKCk6IFZlcmlmeSB3aGVuIHBhdGggY2hhbmdlcyBhcmUgZG9uZS4KLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBJY2NDb25zdGFudHMuRUZfSU1HLCAiaW1nIiwKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBJY2NDb25zdGFudHMuRUZfSU1HLCAiaW1nIiwKICAgICAgICAgICAgICAgICByZWNvcmROdW0sIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgR0VUX1JFU1BPTlNFX0VGX0lNR19TSVpFX0JZVEVTLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIEdFVF9SRVNQT05TRV9FRl9JTUdfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg0LDkgKzE4NSw4IEBACiAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UKICAgICAgICAgICAgICAgICA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0VGX0xJTkVBUl9SRUNPUkRfU0laRV9ET05FLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvYWRMaW5lYXJGaXhlZENvbnRleHQoZmlsZWlkLCBvbkxvYWRlZCkpOwotICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCi0gICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLCBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjAyLDkgKzIwMiw4IEBACiAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9SRUNPUkRfU0laRV9ET05FLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvYWRMaW5lYXJGaXhlZENvbnRleHQoZmlsZWlkLG9uTG9hZGVkKSk7CiAKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgR0VUX1JFU1BPTlNFX0VGX1NJWkVfQllURVMsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksIHJlc3BvbnNlKTsKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgR0VUX1JFU1BPTlNFX0VGX1NJWkVfQllURVMsIG51bGwsIG51bGwsIG1BaWQsIHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMSw5ICsyMjAsOCBAQAogICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQklOQVJZX1NJWkVfRE9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpZCwgMCwgb25Mb2FkZWQpOwogCi0gICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX0dFVF9SRVNQT05TRSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLCByZXNwb25zZSk7CisgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX0dFVF9SRVNQT05TRSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLCBtQWlkLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsOCArMjM5LDggQEAKICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVBRF9JQ09OX0RPTkUsIGZpbGVpZCwgMCwKICAgICAgICAgICAgICAgICBvbkxvYWRlZCk7CiAKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfUkVBRF9CSU5BUlksIGZpbGVpZCwgImltZyIsIGhpZ2hPZmZzZXQsIGxvd09mZnNldCwKLSAgICAgICAgICAgICAgICBsZW5ndGgsIG51bGwsIG51bGwsIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCAiaW1nIiwgaGlnaE9mZnNldCwgbG93T2Zmc2V0LAorICAgICAgICAgICAgICAgIGxlbmd0aCwgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU2LDEwICsyNTQsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVGTGluZWFyRml4ZWQoaW50IGZpbGVpZCwgaW50IHJlY29yZE51bSwgYnl0ZVtdIGRhdGEsCiAgICAgICAgICAgICBTdHJpbmcgcGluMiwgTWVzc2FnZSBvbkNvbXBsZXRlKSB7Ci0gICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1VQREFURV9SRUNPUkQsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCisgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1VQREFURV9SRUNPUkQsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmROdW0sIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsIGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSwgcGluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgb25Db21wbGV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKGRhdGEpLCBwaW4yLCBtQWlkLCBvbkNvbXBsZXRlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2OCwxMCArMjY1LDkgQEAKICAgICAgKiBAcGFyYW0gZGF0YSBtdXN0IGJlIGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgRUYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFRlRyYW5zcGFyZW50KGludCBmaWxlaWQsIGJ5dGVbXSBkYXRhLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfVVBEQVRFX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfVVBEQVRFX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgb25Db21wbGV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKGRhdGEpLCBudWxsLCBtQWlkLCBvbkNvbXBsZXRlKTsKICAgICB9CiAKIApAQCAtNDAyLDExICszOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIGxjLnJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4obGMuY291bnRSZWNvcmRzKTsKICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCisgICAgICAgICAgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkU2l6ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkU2l6ZSwgbnVsbCwgbnVsbCwgbUFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX1JFQURfUkVDT1JEX0RPTkUsIGxjKSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfQklOQVJZX1NJWkVfRE9ORToKQEAgLTQ0MSw5ICs0MzYsOCBAQAogICAgICAgICAgICAgICAgIHNpemUgPSAoKGRhdGFbUkVTUE9OU0VfREFUQV9GSUxFX1NJWkVfMV0gJiAweGZmKSA8PCA4KQogICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhW1JFU1BPTlNFX0RBVEFfRklMRV9TSVpFXzJdICYgMHhmZik7CiAKLSAgICAgICAgICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgc2l6ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLAorICAgICAgICAgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfQklOQVJZLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBzaXplLCBudWxsLCBudWxsLCBtQWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX1JFQURfQklOQVJZX0RPTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWlkLCAwLCByZXNwb25zZSkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NzcsMTEgKzQ3MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobGMucmVjb3JkTnVtID4gbGMuY291bnRSZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVzdWx0KHJlc3BvbnNlLCBsYy5yZXN1bHRzLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX1JFQ09SRCwgbGMuZWZpZCwgZ2V0RUZQYXRoKGxjLmVmaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9SRUNPUkRfTU9ERV9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLnJlY29yZFNpemUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYy5yZWNvcmRTaXplLCBudWxsLCBudWxsLCBtQWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShFVkVOVF9SRUFEX1JFQ09SRF9ET05FLCBsYykpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTUxLDUgKzU0NCw4IEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9nZChTdHJpbmcgcyk7CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2dlKFN0cmluZyBzKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBaWQoU3RyaW5nIGFpZCkgeworICAgICAgICBtQWlkID0gYWlkOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggYTQyYTI2Ny4uZDZmOTZmZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnk7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTMzOSw3ICszNDAsNyBAQAogICAgICAqIEBwYXJhbSBpbnRlbnQgaW50ZW50IHRvIGJyb2FkY2FzdAogICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uIFJlY2VpdmVycyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSB0aGlzIHBlcm1pc3Npb24KICAgICAgKi8KLSAgICB2b2lkIGRpc3BhdGNoKEludGVudCBpbnRlbnQsIFN0cmluZyBwZXJtaXNzaW9uKSB7CisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goSW50ZW50IGludGVudCwgU3RyaW5nIHBlcm1pc3Npb24pIHsKICAgICAgICAgLy8gSG9sZCBhIHdha2UgbG9jayBmb3IgV0FLRV9MT0NLX1RJTUVPVVQgc2Vjb25kcywgZW5vdWdoIHRvIGdpdmUgYW55CiAgICAgICAgIC8vIHJlY2VpdmVycyB0aW1lIHRvIHRha2UgdGhlaXIgb3duIHdha2UgbG9ja3MuCiAgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKFdBS0VfTE9DS19USU1FT1VUKTsKQEAgLTEwNzgsMTYgKzEwNzksMTYgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaEJyb2FkY2FzdFBkdXMoYnl0ZVtdW10gcGR1cywgYm9vbGVhbiBpc0VtZXJnZW5jeU1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKGlzRW1lcmdlbmN5TWVzc2FnZSkgeworICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoQnJvYWRjYXN0TWVzc2FnZShTbXNDYk1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBpZiAobWVzc2FnZS5pc0VtZXJnZW5jeU1lc3NhZ2UoKSkgewogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5TTVNfRU1FUkdFTkNZX0NCX1JFQ0VJVkVEX0FDVElPTik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdXMiLCBwZHVzKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkRpc3BhdGNoaW5nICIgKyBwZHVzLmxlbmd0aCArICIgZW1lcmdlbmN5IFNNUyBDQiBwZHVzIik7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRpc3BhdGNoaW5nIGVtZXJnZW5jeSBTTVMgQ0IiKTsKICAgICAgICAgICAgIGRpc3BhdGNoKGludGVudCwgUkVDRUlWRV9FTUVSR0VOQ1lfQlJPQURDQVNUX1BFUk1JU1NJT04pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5TTVNfQ0JfUkVDRUlWRURfQUNUSU9OKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1cyIsIHBkdXMpOwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGlzcGF0Y2hpbmcgIiArIHBkdXMubGVuZ3RoICsgIiBTTVMgQ0IgcGR1cyIpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJtZXNzYWdlIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJEaXNwYXRjaGluZyBTTVMgQ0IiKTsKICAgICAgICAgICAgIGRpc3BhdGNoKGludGVudCwgUkVDRUlWRV9TTVNfUEVSTUlTU0lPTik7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlVWljY0ZpbGVIYW5kbGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlVWljY0ZpbGVIYW5kbGVyLmphdmEKaW5kZXggZTE5NWZmMi4uOTNhNjI5MCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YQpAQCAtMTcsNiArMTcsOSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRmlsZUhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtMjcsOCArMzAsOCBAQAogcHVibGljIGZpbmFsIGNsYXNzIENkbWFMdGVVaWNjRmlsZUhhbmRsZXIgZXh0ZW5kcyBJY2NGaWxlSGFuZGxlciB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNETUEiOwogCi0gICAgcHVibGljIENkbWFMdGVVaWNjRmlsZUhhbmRsZXIoQ0RNQUxURVBob25lIHBob25lKSB7Ci0gICAgICAgIHN1cGVyKHBob25lKTsKKyAgICBwdWJsaWMgQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlcihJY2NDYXJkIGNhcmQsIFN0cmluZyBhaWQsIENvbW1hbmRzSW50ZXJmYWNlIGNpKSB7CisgICAgICAgIHN1cGVyKGNhcmQsIGFpZCwgY2kpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RUZQYXRoKGludCBlZmlkKSB7CkBAIC01NSw4ICs1OCw4IEBACiAgICAgICAgIGlmIChmaWxlaWQgPT0gRUZfQ1NJTV9FUFJMKSB7CiAgICAgICAgICAgICAvLyBFbnRpcmUgUFJMIGNvdWxkIGJlIGh1Z2UuIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4KICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSByZWNvcmQuCi0gICAgICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCA0LCBudWxsLCBudWxsLCBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCisgICAgICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCA0LCBudWxsLCBudWxsLCBtQWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVBRF9CSU5BUllfRE9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpZCwgMCwgb25Mb2FkZWQpKTsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGNhOGQ5YWUuLmJmYTIzZTcgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMzAsOCArMzAsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnk7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU21zLkludGVudHM7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3M7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY2RtYS5DZG1hU21zQ2JQcm9ncmFtRGF0YTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwpAQCAtNTAsNiArNTIsNyBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIApAQCAtOTcsNiArMTAwLDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaCBzZXJ2aWNlIGNhdGVnb3J5IHByb2dyYW0gZGF0YSB0byB0aGUgQ2VsbEJyb2FkY2FzdFJlY2VpdmVyIGFwcCwgd2hpY2ggZmlsdGVycworICAgICAqIHRoZSBicm9hZGNhc3QgYWxlcnRzIHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIHNtcyB0aGUgU01TIG1lc3NhZ2UgY29udGFpbmluZyBvbmUgb3IgbW9yZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5jZG1hLkNkbWFTbXNDYlByb2dyYW1EYXRhfSBvYmplY3RzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXJ2aWNlQ2F0ZWdvcnlQcm9ncmFtRGF0YShTbXNNZXNzYWdlIHNtcykgeworICAgICAgICBMaXN0PENkbWFTbXNDYlByb2dyYW1EYXRhPiBwcm9ncmFtRGF0YUxpc3QgPSBzbXMuZ2V0U21zQ2JQcm9ncmFtRGF0YSgpOworICAgICAgICBpZiAocHJvZ3JhbURhdGFMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImhhbmRsZVNlcnZpY2VDYXRlZ29yeVByb2dyYW1EYXRhOiBwcm9ncmFtIGRhdGEgbGlzdCBpcyBudWxsISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5TTVNfU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEFfUkVDRUlWRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwcm9ncmFtX2RhdGFfbGlzdCIsIChDZG1hU21zQ2JQcm9ncmFtRGF0YVtdKSBwcm9ncmFtRGF0YUxpc3QudG9BcnJheSgpKTsKKyAgICAgICAgZGlzcGF0Y2goaW50ZW50LCBSRUNFSVZFX1NNU19QRVJNSVNTSU9OKTsKKyAgICB9CisKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKQEAgLTExOSw4ICsxNDAsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgbmV0d29yayBkdXBsaWNhdGUgU01TLgogICAgICAgICBTbXNNZXNzYWdlIHNtcyA9IChTbXNNZXNzYWdlKSBzbXNiOworCisgICAgICAgIC8vIEhhbmRsZSBDTUFTIGVtZXJnZW5jeSBicm9hZGNhc3QgbWVzc2FnZXMuCisgICAgICAgIGlmIChTbXNFbnZlbG9wZS5NRVNTQUdFX1RZUEVfQlJPQURDQVNUID09IHNtcy5nZXRNZXNzYWdlVHlwZSgpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJCcm9hZGNhc3QgdHlwZSBtZXNzYWdlIik7CisgICAgICAgICAgICBTbXNDYk1lc3NhZ2UgbWVzc2FnZSA9IHNtcy5wYXJzZUJyb2FkY2FzdFNtcygpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRpc3BhdGNoQnJvYWRjYXN0TWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBJbnRlbnRzLlJFU1VMVF9TTVNfSEFORExFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgbmV0d29yayBkdXBsaWNhdGUgU01TLgogICAgICAgICBtTGFzdERpc3BhdGNoZWRTbXNGaW5nZXJwcmludCA9IHNtcy5nZXRJbmNvbWluZ1Ntc0ZpbmdlcnByaW50KCk7CiAgICAgICAgIGlmIChtTGFzdEFja25vd2xlZGdlZFNtc0ZpbmdlcnByaW50ICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKG1MYXN0RGlzcGF0Y2hlZFNtc0ZpbmdlcnByaW50LCBtTGFzdEFja25vd2xlZGdlZFNtc0ZpbmdlcnByaW50KSkgewpAQCAtMTQ5LDYgKzE4MSw5IEBACiAgICAgICAgICAgICAgICAgc21zLmlzU3RhdHVzUmVwb3J0TWVzc2FnZSgpKSB7CiAgICAgICAgICAgICBoYW5kbGVDZG1hU3RhdHVzUmVwb3J0KHNtcyk7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChTbXNFbnZlbG9wZS5URUxFU0VSVklDRV9TQ1BUID09IHRlbGVTZXJ2aWNlKSB7CisgICAgICAgICAgICBoYW5kbGVTZXJ2aWNlQ2F0ZWdvcnlQcm9ncmFtRGF0YShzbXMpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoKHNtcy5nZXRVc2VyRGF0YSgpID09IG51bGwpKSB7CiAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBTTVMgd2l0aG91dCB1c2VyIGRhdGEiKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1GaWxlSGFuZGxlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbUZpbGVIYW5kbGVyLmphdmEKaW5kZXggZTg1NGQ3Zi4uOWYzMGQzNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbUZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbUZpbGVIYW5kbGVyLmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLio7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0ZpbGVIYW5kbGVyOwpAQCAtMzksOCArNDEsOCBAQAogICAgIC8vKioqKiogSW5zdGFuY2UgVmFyaWFibGVzCiAKICAgICAvLyoqKioqIENvbnN0cnVjdG9yCi0gICAgcHVibGljIFJ1aW1GaWxlSGFuZGxlcihQaG9uZUJhc2UgcGhvbmUpIHsKLSAgICAgICAgc3VwZXIocGhvbmUpOworICAgIHB1YmxpYyBSdWltRmlsZUhhbmRsZXIoSWNjQ2FyZCBjYXJkLCBTdHJpbmcgYWlkLCBDb21tYW5kc0ludGVyZmFjZSBjaSkgeworICAgICAgICBzdXBlcihjYXJkLCBhaWQsIGNpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewpAQCAtNTgsOSArNjAsOSBAQAogICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gb2J0YWluTWVzc2FnZShFVkVOVF9SRUFEX0lDT05fRE9ORSwgZmlsZWlkLCAwLAogICAgICAgICAgICAgICAgIG9uTG9hZGVkKTsKIAotICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgImltZyIsIDAsIDAsCisgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX0dFVF9SRVNQT05TRSwgZmlsZWlkLCAiaW1nIiwgMCwgMCwKICAgICAgICAgICAgICAgICBHRVRfUkVTUE9OU0VfRUZfSU1HX1NJWkVfQllURVMsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IDE0MDljYWIuLmE3MjNkZTMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE5LDcgKzE5LDExIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JMb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY2RtYS5DZG1hU21zQ2JQcm9ncmFtRGF0YTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwpAQCAtMzgsNiArNDIsOSBAQAogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzOwogCiAvKioKICAqIFRPRE8oY2xlYW51cCk6IHRoZXNlIGNvbnN0YW50cyBhcmUgZGlzdHVyYmluZy4uLiBhcmUgdGhleSBub3QganVzdApAQCAtNDcsMTIgKzU0LDYgQEAKICAqIG5hbWVkIENkbWFTbXNNZXNzYWdlLCBjb3VsZCBpdCBub3Q/CiAgKi8KIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX1NFUFRFVFM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9TRVBURVRTX1dJVEhfSEVBREVSOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzczsKLQogLyoqCiAgKiBUT0RPKGNsZWFudXApOiBpbnRlcm5hbGx5IHJldHVybmluZyBudWxsIGluIG1hbnkgcGxhY2VzIG1ha2VzCiAgKiBkZWJ1Z2dpbmcgdmVyeSBoYXJkIChhbW9uZyBtYW55IG90aGVyIHJlYXNvbnMpIGFuZCBzaG91bGQgYmUgbWFkZQpAQCAtMTkyLDE2ICsxOTMsMTcgQEAKIAogICAgICAgICAvLyBiZWFyZXIgZGF0YQogICAgICAgICBjb3VudEludCA9IHAucmVhZEludCgpOyAvL3BfY3VyLT51QmVhcmVyRGF0YUxlbgotICAgICAgICBpZiAoY291bnRJbnQgPjApIHsKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtjb3VudEludF07Ci0gICAgICAgICAgICAgLy9wX2N1ci0+YUJlYXJlckRhdGFbZGlnaXRDb3VudF0gOgotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXggPCBjb3VudEludDsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gcC5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW52LmJlYXJlckRhdGEgPSBkYXRhOwotICAgICAgICAgICAgLy8gQkQgZ2V0cyBmdXJ0aGVyIGRlY29kZWQgd2hlbiBhY2Nlc3NlZCBpbiBTTVNEaXNwYXRjaGVyCisgICAgICAgIGlmIChjb3VudEludCA8IDApIHsKKyAgICAgICAgICAgIGNvdW50SW50ID0gMDsKICAgICAgICAgfQogCisgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtjb3VudEludF07CisgICAgICAgIGZvciAoaW50IGluZGV4PTA7IGluZGV4IDwgY291bnRJbnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gcC5yZWFkQnl0ZSgpOworICAgICAgICB9CisgICAgICAgIC8vIEJEIGdldHMgZnVydGhlciBkZWNvZGVkIHdoZW4gYWNjZXNzZWQgaW4gU01TRGlzcGF0Y2hlcgorICAgICAgICBlbnYuYmVhcmVyRGF0YSA9IGRhdGE7CisKICAgICAgICAgLy8gbGluayB0aGUgdGhlIGZpbGxlZCBvYmplY3RzIHRvIHRoZSBTTVMKICAgICAgICAgZW52Lm9yaWdBZGRyZXNzID0gYWRkcjsKICAgICAgICAgZW52Lm9yaWdTdWJhZGRyZXNzID0gc3ViYWRkcjsKQEAgLTczMiw2ICs3MzQsMjkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBicm9hZGNhc3QgU01TLCBwb3NzaWJseSBjb250YWluaW5nIGEgQ01BUyBhbGVydC4KKyAgICAgKi8KKyAgICBTbXNDYk1lc3NhZ2UgcGFyc2VCcm9hZGNhc3RTbXMoKSB7CisgICAgICAgIEJlYXJlckRhdGEgYkRhdGEgPSBCZWFyZXJEYXRhLmRlY29kZShtRW52ZWxvcGUuYmVhcmVyRGF0YSwgbUVudmVsb3BlLnNlcnZpY2VDYXRlZ29yeSk7CisgICAgICAgIGlmIChiRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQmVhcmVyRGF0YS5kZWNvZGUoKSByZXR1cm5lZCBudWxsIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShMT0dHQUJMRV9UQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIk1UIHJhdyBCZWFyZXJEYXRhID0gIiArIEhleER1bXAudG9IZXhTdHJpbmcobUVudmVsb3BlLmJlYXJlckRhdGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwbG1uID0gU3lzdGVtUHJvcGVydGllcy5nZXQoVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9PUEVSQVRPUl9OVU1FUklDKTsKKyAgICAgICAgU21zQ2JMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBTbXNDYkxvY2F0aW9uKHBsbW4pOworCisgICAgICAgIHJldHVybiBuZXcgU21zQ2JNZXNzYWdlKFNtc0NiTWVzc2FnZS5NRVNTQUdFX0ZPUk1BVF8zR1BQMiwKKyAgICAgICAgICAgICAgICBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERSwgYkRhdGEubWVzc2FnZUlkLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBtRW52ZWxvcGUuc2VydmljZUNhdGVnb3J5LCBiRGF0YS5nZXRMYW5ndWFnZSgpLCBiRGF0YS51c2VyRGF0YS5wYXlsb2FkU3RyLAorICAgICAgICAgICAgICAgIGJEYXRhLnByaW9yaXR5LCBudWxsLCBiRGF0YS5jbWFzV2FybmluZ0luZm8pOworICAgIH0KKworICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZUNsYXNzIGdldE1lc3NhZ2VDbGFzcygpIHsKQEAgLTk2MSw0ICs5ODYsMTIgQEAKIAogICAgICAgICByZXR1cm4gb3V0cHV0LnRvQnl0ZUFycmF5KCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBzZXJ2aWNlIGNhdGVnb3J5IHByb2dyYW0gZGF0YSwgaWYgcHJlc2VudC4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBDZG1hU21zQ2JQcm9ncmFtRGF0YSBvYmplY3RzLCBvciBudWxsIGlmIG5vdCBwcmVzZW50CisgICAgICovCisgICAgTGlzdDxDZG1hU21zQ2JQcm9ncmFtRGF0YT4gZ2V0U21zQ2JQcm9ncmFtRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1CZWFyZXJEYXRhLnNlcnZpY2VDYXRlZ29yeVByb2dyYW1EYXRhOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCmluZGV4IDY3NDNkYTAuLmU3MGZmMTggMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQpAQCAtMTYsMjggKzE2LDI5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFUzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwotCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JDbWFzSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5jZG1hLkNkbWFTbXNDYlByb2dyYW1EYXRhOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VJbnB1dFN0cmVhbTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VPdXRwdXRTdHJlYW07CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR18xNkJJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVNfV0lUSF9IRUFERVI7CiAKIC8qKgogICogQW4gb2JqZWN0IHRvIGVuY29kZSBhbmQgZGVjb2RlIENETUEgU01TIGJlYXJlciBkYXRhLgpAQCAtNjgsOCArNjksOCBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9ESVNQTEFZX01PREUgICAgICAgICAgICAgPSAweDBGOwogICAgIC8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NVUxUSVBMRV9FTkNPRElOR19VU0VSX0RBVEEgICAgICA9IDB4MTA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0RFUE9TSVRfSU5ERVggICAgICAgICAgICA9IDB4MTE7Ci0gICAgLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX1NFUlZJQ0VfQ0FURUdPUllfUFJPR1JBTV9EQVRBICAgID0gMHgxMjsKLSAgICAvL3ByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX1JFU1VMVFMgPSAweDEzOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEEgICAgPSAweDEyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX1JFU1VMVFMgPSAweDEzOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgPSAweDE0OwogICAgIC8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9UUF9GQUlMVVJFX0NBVVNFICAgICAgICAgICAgICAgICA9IDB4MTU7CiAgICAgLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFNVQlBBUkFNX0VOSEFOQ0VEX1ZNTiAgICAgICAgICAgICAgICAgICAgID0gMHgxNjsKQEAgLTMzOSwxMiArMzQwLDY4IEBACiAgICAgICovCiAgICAgcHVibGljIENkbWFTbXNBZGRyZXNzIGNhbGxiYWNrTnVtYmVyOwogCisgICAgLyoqCisgICAgICogQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKiBAc2VlICNkZWNvZGVDbWFzVXNlckRhdGEoQmVhcmVyRGF0YSwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBTbXNDYkNtYXNJbmZvIGNtYXNXYXJuaW5nSW5mbzsKKworICAgIC8qKgorICAgICAqIFRoZSBTZXJ2aWNlIENhdGVnb3J5IFByb2dyYW0gRGF0YSBzdWJwYXJhbWV0ZXIgaXMgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUKKyAgICAgKiBTTVMgYnJvYWRjYXN0IHNlcnZpY2UgY2F0ZWdvcmllcyB0byBkaXNwbGF5LiBJZiB0aGlzIHN1YnBhcmFtZXRlciBpcyBwcmVzZW50LAorICAgICAqIHRoaXMgZmllbGQgd2lsbCBjb250YWluIGEgbGlzdCBvZiBvbmUgb3IgbW9yZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5jZG1hLkNkbWFTbXNDYlByb2dyYW1EYXRhfSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlCisgICAgICogb3BlcmF0aW9uKHMpIHRvIHBlcmZvcm0uCisgICAgICovCisgICAgcHVibGljIExpc3Q8Q2RtYVNtc0NiUHJvZ3JhbURhdGE+IHNlcnZpY2VDYXRlZ29yeVByb2dyYW1EYXRhOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKICAgICAgICAgcHVibGljIENvZGluZ0V4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICAgICAgc3VwZXIocyk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3IgYXMgYSB0d28tY2hhcmFjdGVyIElTTyA2Mzkgc3RyaW5nLgorICAgICAqIEByZXR1cm4gYSB0d28gY2hhcmFjdGVyIElTTyA2MzkgbGFuZ3VhZ2UgY29kZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgICAgIHJldHVybiBnZXRMYW5ndWFnZUNvZGVGb3JWYWx1ZShsYW5ndWFnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBDRE1BIGxhbmd1YWdlIGluZGljYXRvciB2YWx1ZSB0byBhbiBJU08gNjM5IHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4KKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VWYWx1ZSB0aGUgQ0RNQSBsYW5ndWFnZSB2YWx1ZSB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgdHdvIGNoYXJhY3RlciBJU08gNjM5IGxhbmd1YWdlIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUsIG9yIG51bGwgaWYgdW5rbm93bgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYW5ndWFnZUNvZGVGb3JWYWx1ZShpbnQgbGFuZ3VhZ2VWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKGxhbmd1YWdlVmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgTEFOR1VBR0VfRU5HTElTSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuIjsKKworICAgICAgICAgICAgY2FzZSBMQU5HVUFHRV9GUkVOQ0g6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmciI7CisKKyAgICAgICAgICAgIGNhc2UgTEFOR1VBR0VfU1BBTklTSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVzIjsKKworICAgICAgICAgICAgY2FzZSBMQU5HVUFHRV9KQVBBTkVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gImphIjsKKworICAgICAgICAgICAgY2FzZSBMQU5HVUFHRV9LT1JFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuICJrbyI7CisKKyAgICAgICAgICAgIGNhc2UgTEFOR1VBR0VfQ0hJTkVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInpoIjsKKworICAgICAgICAgICAgY2FzZSBMQU5HVUFHRV9IRUJSRVc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJoZSI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtOTE2LDYgKzk3Myw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjgoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7CisgICAgICAgIGlmIChudW1GaWVsZHMgPCAwIHx8IChudW1GaWVsZHMgKyBvZmZzZXQpID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIlVURi04IGRlY29kZSBmYWlsZWQ6IG9mZnNldCBvciBsZW5ndGggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRhdGEsIG9mZnNldCwgbnVtRmllbGRzLCAiVVRGLTgiKTsKICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CkBAIC05MjYsMTEgKzk4NiwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGVVdGYxNihieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KLSAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwotICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKKyAgICAgICAgaW50IGJ5dGVDb3VudCA9IG51bUZpZWxkcyAqIDI7CisgICAgICAgIGlmIChieXRlQ291bnQgPCAwIHx8IChieXRlQ291bnQgKyBvZmZzZXQpID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIlVURi0xNiBkZWNvZGUgZmFpbGVkOiBvZmZzZXQgb3IgbGVuZ3RoIG91dCBvZiByYW5nZSIpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBvZmZzZXQsIG51bUZpZWxkcyAqIDIsICJ1dGYtMTZiZSIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0LCBieXRlQ291bnQsICJ1dGYtMTZiZSIpOwogICAgICAgICB9IGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIlVURi0xNiBkZWNvZGUgZmFpbGVkOiAiICsgZXgpOwogICAgICAgICB9CkBAIC05ODgsOCArMTA0OSwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGVMYXRpbihieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgaWYgKG51bUZpZWxkcyA8IDAgfHwgKG51bUZpZWxkcyArIG9mZnNldCkgPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvZGluZ0V4Y2VwdGlvbigiSVNPLTg4NTktMSBkZWNvZGUgZmFpbGVkOiBvZmZzZXQgb3IgbGVuZ3RoIG91dCBvZiByYW5nZSIpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBvZmZzZXQsIG51bUZpZWxkcyAtIG9mZnNldCwgIklTTy04ODU5LTEiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRhdGEsIG9mZnNldCwgbnVtRmllbGRzLCAiSVNPLTg4NTktMSIpOwogICAgICAgICB9IGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIklTTy04ODU5LTEgZGVjb2RlIGZhaWxlZDogIiArIGV4KTsKICAgICAgICAgfQpAQCAtMTAzMiw2ICsxMDk2LDcgQEAKICAgICAgICAgICAgICAgICB1c2VyRGF0YS5wYXlsb2FkU3RyID0gZGVjb2RlVXRmOCh1c2VyRGF0YS5wYXlsb2FkLCBvZmZzZXQsIHVzZXJEYXRhLm51bUZpZWxkcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX0lBNToKICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR183QklUX0FTQ0lJOgogICAgICAgICAgICAgdXNlckRhdGEucGF5bG9hZFN0ciA9IGRlY29kZTdiaXRBc2NpaSh1c2VyRGF0YS5wYXlsb2FkLCBvZmZzZXQsIHVzZXJEYXRhLm51bUZpZWxkcyk7CkBAIC0xMTE0LDggKzExNzksOSBAQAogICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQml0d2lzZUlucHV0U3RyZWFtKGJEYXRhLnVzZXJEYXRhLnBheWxvYWQpOwogICAgICAgICBpbnQgZGF0YUxlbiA9IGluU3RyZWFtLmF2YWlsYWJsZSgpIC8gNjsgIC8vIDYtYml0IHBhY2tlZCBjaGFyYWN0ZXIgZW5jb2RpbmcuCiAgICAgICAgIGludCBudW1GaWVsZHMgPSBiRGF0YS51c2VyRGF0YS5udW1GaWVsZHM7Ci0gICAgICAgIGlmICgoZGF0YUxlbiA+IDE0KSB8fCAoZGF0YUxlbiA8IG51bUZpZWxkcykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIklTLTkxIHZvaWNlbWFpbCBzdGF0dXMgZGVjb2RpbmcgZmFpbGVkIik7CisgICAgICAgIC8vIGRhdGFMZW4gbWF5IGJlID4gMTQgY2hhcmFjdGVycyBkdWUgdG8gb2N0ZXQgcGFkZGluZworICAgICAgICBpZiAoKG51bUZpZWxkcyA+IDE0KSB8fCAoZGF0YUxlbiA8IG51bUZpZWxkcykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oIklTLTkxIHNob3J0IG1lc3NhZ2UgZGVjb2RpbmcgZmFpbGVkIik7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZGF0YUxlbik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmllbGRzOyBpKyspIHsKQEAgLTE1MzksNyArMTYwNSw3IEBACiAgICAgICAgICAgICBiRGF0YS51c2VyUmVzcG9uc2VDb2RlID0gaW5TdHJlYW0ucmVhZCg4KTsKICAgICAgICAgfQogICAgICAgICBpZiAoKCEgZGVjb2RlU3VjY2VzcykgfHwgKHBhcmFtQml0cyA+IDApKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiVVNFUl9SRVBPTlNFX0NPREUgZGVjb2RlICIgKworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVTRVJfUkVTUE9OU0VfQ09ERSBkZWNvZGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgKGRlY29kZVN1Y2Nlc3MgPyAic3VjY2VlZGVkIiA6ICJmYWlsZWQiKSArCiAgICAgICAgICAgICAgICAgICAgICAgIiAoZXh0cmEgYml0cyA9ICIgKyBwYXJhbUJpdHMgKyAiKSIpOwogICAgICAgICB9CkBAIC0xNTQ4LDI3ICsxNjE0LDI0MCBAQAogICAgICAgICByZXR1cm4gZGVjb2RlU3VjY2VzczsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlY29kZVNlcnZpY2VDYXRlZ29yeVByb2dyYW1EYXRhKEJlYXJlckRhdGEgYkRhdGEsCisgICAgICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBCaXR3aXNlSW5wdXRTdHJlYW0uQWNjZXNzRXhjZXB0aW9uLCBDb2RpbmdFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChpblN0cmVhbS5hdmFpbGFibGUoKSA8IDEzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJTRVJWSUNFX0NBVEVHT1JZX1BST0dSQU1fREFUQSBkZWNvZGUgZmFpbGVkOiBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBpblN0cmVhbS5hdmFpbGFibGUoKSArICIgYml0cyBhdmFpbGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwYXJhbUJpdHMgPSBpblN0cmVhbS5yZWFkKDgpICogODsKKyAgICAgICAgaW50IG1zZ0VuY29kaW5nID0gaW5TdHJlYW0ucmVhZCg1KTsKKyAgICAgICAgcGFyYW1CaXRzIC09IDU7CisKKyAgICAgICAgaWYgKGluU3RyZWFtLmF2YWlsYWJsZSgpIDwgcGFyYW1CaXRzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJTRVJWSUNFX0NBVEVHT1JZX1BST0dSQU1fREFUQSBkZWNvZGUgZmFpbGVkOiBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBpblN0cmVhbS5hdmFpbGFibGUoKSArICIgYml0cyBhdmFpbGFibGUgKCIgKyBwYXJhbUJpdHMgKyAiIGJpdHMgZXhwZWN0ZWQpIik7CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8Q2RtYVNtc0NiUHJvZ3JhbURhdGE+IHByb2dyYW1EYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2RtYVNtc0NiUHJvZ3JhbURhdGE+KCk7CisKKyAgICAgICAgZmluYWwgaW50IENBVEVHT1JZX0ZJRUxEX01JTl9TSVpFID0gNiAqIDg7CisgICAgICAgIGJvb2xlYW4gZGVjb2RlU3VjY2VzcyA9IGZhbHNlOworICAgICAgICB3aGlsZSAocGFyYW1CaXRzID49IENBVEVHT1JZX0ZJRUxEX01JTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgb3BlcmF0aW9uID0gaW5TdHJlYW0ucmVhZCg0KTsKKyAgICAgICAgICAgIGludCBjYXRlZ29yeSA9IChpblN0cmVhbS5yZWFkKDgpIDw8IDgpIHwgaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlQ29kZUZvclZhbHVlKGluU3RyZWFtLnJlYWQoOCkpOworICAgICAgICAgICAgaW50IG1heE1lc3NhZ2VzID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgIGludCBhbGVydE9wdGlvbiA9IGluU3RyZWFtLnJlYWQoNCk7CisgICAgICAgICAgICBpbnQgbnVtRmllbGRzID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgIHBhcmFtQml0cyAtPSBDQVRFR09SWV9GSUVMRF9NSU5fU0laRTsKKworICAgICAgICAgICAgaW50IHRleHRCaXRzID0gZ2V0Qml0c0Zvck51bUZpZWxkcyhtc2dFbmNvZGluZywgbnVtRmllbGRzKTsKKyAgICAgICAgICAgIGlmIChwYXJhbUJpdHMgPCB0ZXh0Qml0cykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb2RpbmdFeGNlcHRpb24oImNhdGVnb3J5IG5hbWUgaXMgIiArIHRleHRCaXRzICsgIiBiaXRzIGluIGxlbmd0aCwiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IHRoZXJlIGFyZSBvbmx5ICIgKyBwYXJhbUJpdHMgKyAiIGJpdHMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisgICAgICAgICAgICB1c2VyRGF0YS5tc2dFbmNvZGluZyA9IG1zZ0VuY29kaW5nOworICAgICAgICAgICAgdXNlckRhdGEubXNnRW5jb2RpbmdTZXQgPSB0cnVlOworICAgICAgICAgICAgdXNlckRhdGEubnVtRmllbGRzID0gbnVtRmllbGRzOworICAgICAgICAgICAgdXNlckRhdGEucGF5bG9hZCA9IGluU3RyZWFtLnJlYWRCeXRlQXJyYXkodGV4dEJpdHMpOworICAgICAgICAgICAgcGFyYW1CaXRzIC09IHRleHRCaXRzOworCisgICAgICAgICAgICBkZWNvZGVVc2VyRGF0YVBheWxvYWQodXNlckRhdGEsIGZhbHNlKTsKKyAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeU5hbWUgPSB1c2VyRGF0YS5wYXlsb2FkU3RyOworICAgICAgICAgICAgQ2RtYVNtc0NiUHJvZ3JhbURhdGEgcHJvZ3JhbURhdGEgPSBuZXcgQ2RtYVNtc0NiUHJvZ3JhbURhdGEob3BlcmF0aW9uLCBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsIG1heE1lc3NhZ2VzLCBhbGVydE9wdGlvbiwgY2F0ZWdvcnlOYW1lKTsKKyAgICAgICAgICAgIHByb2dyYW1EYXRhTGlzdC5hZGQocHJvZ3JhbURhdGEpOworCisgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoISBkZWNvZGVTdWNjZXNzKSB8fCAocGFyYW1CaXRzID4gMCkpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJTRVJWSUNFX0NBVEVHT1JZX1BST0dSQU1fREFUQSBkZWNvZGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgKGRlY29kZVN1Y2Nlc3MgPyAic3VjY2VlZGVkIiA6ICJmYWlsZWQiKSArCisgICAgICAgICAgICAgICAgICAgICAgIiAoZXh0cmEgYml0cyA9ICIgKyBwYXJhbUJpdHMgKyAnKScpOworICAgICAgICB9CisKKyAgICAgICAgaW5TdHJlYW0uc2tpcChwYXJhbUJpdHMpOworICAgICAgICBiRGF0YS5zZXJ2aWNlQ2F0ZWdvcnlQcm9ncmFtRGF0YSA9IHByb2dyYW1EYXRhTGlzdDsKKyAgICAgICAgcmV0dXJuIGRlY29kZVN1Y2Nlc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlcnZpY2VDYXRlZ29yeVRvQ21hc01lc3NhZ2VDbGFzcyhpbnQgc2VydmljZUNhdGVnb3J5KSB7CisgICAgICAgIHN3aXRjaCAoc2VydmljZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBjYXNlIFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQ7CisKKyAgICAgICAgICAgIGNhc2UgU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFUOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfRVhUUkVNRV9USFJFQVQ7CisKKyAgICAgICAgICAgIGNhc2UgU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX1NFVkVSRV9USFJFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19TRVZFUkVfVEhSRUFUOworCisgICAgICAgICAgICBjYXNlIFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19DSElMRF9BQkRVQ1RJT05fRU1FUkdFTkNZOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfQ0hJTERfQUJEVUNUSU9OX0VNRVJHRU5DWTsKKworICAgICAgICAgICAgY2FzZSBTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfVEVTVF9NRVNTQUdFOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfUkVRVUlSRURfTU9OVEhMWV9URVNUOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gbXNnRW5jb2RpbmcgdGhlIG1lc3NhZ2UgZW5jb2RpbmcgdG8gdXNlCisgICAgICogQHBhcmFtIG51bUZpZWxkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZC4gRm9yIFNoaWZ0LUpJUyBhbmQgS29yZWFuIGVuY29kaW5ncywKKyAgICAgKiAgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIENvZGluZ0V4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Qml0c0Zvck51bUZpZWxkcyhpbnQgbXNnRW5jb2RpbmcsIGludCBudW1GaWVsZHMpCisgICAgICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChtc2dFbmNvZGluZykgeworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19PQ1RFVDoKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfU0hJRlRfSklTOgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19LT1JFQU46CisgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX0xBVElOOgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19MQVRJTl9IRUJSRVc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bUZpZWxkcyAqIDg7CisKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfSUE1OgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR183QklUX0FTQ0lJOgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtRmllbGRzICogNzsKKworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19VTklDT0RFXzE2OgorICAgICAgICAgICAgICAgIHJldHVybiBudW1GaWVsZHMgKiAxNjsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBtZXNzYWdlIGVuY29kaW5nICgiICsgbXNnRW5jb2RpbmcgKyAnKScpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ01BUyBtZXNzYWdlIGRlY29kaW5nLgorICAgICAqIChTZWUgVElBLTExNDktMC0xLCBDTUFTIG92ZXIgQ0RNQSkKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2F0ZWdvcnkgaXMgdGhlIHNlcnZpY2UgY2F0ZWdvcnkgZnJvbSB0aGUgU01TIGVudmVsb3BlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWNvZGVDbWFzVXNlckRhdGEoQmVhcmVyRGF0YSBiRGF0YSwgaW50IHNlcnZpY2VDYXRlZ29yeSkKKyAgICAgICAgICAgIHRocm93cyBCaXR3aXNlSW5wdXRTdHJlYW0uQWNjZXNzRXhjZXB0aW9uLCBDb2RpbmdFeGNlcHRpb24geworICAgICAgICBCaXR3aXNlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQml0d2lzZUlucHV0U3RyZWFtKGJEYXRhLnVzZXJEYXRhLnBheWxvYWQpOworICAgICAgICBpZiAoaW5TdHJlYW0uYXZhaWxhYmxlKCkgPCA4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJlbWVyZ2VuY3kgQ0Igd2l0aCBubyBDTUFFX3Byb3RvY29sX3ZlcnNpb24iKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBDTUFFX3Byb3RvY29sX3ZlcnNpb24gIiArIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWVzc2FnZUNsYXNzID0gc2VydmljZUNhdGVnb3J5VG9DbWFzTWVzc2FnZUNsYXNzKHNlcnZpY2VDYXRlZ29yeSk7CisgICAgICAgIGludCBjYXRlZ29yeSA9IFNtc0NiQ21hc0luZm8uQ01BU19DQVRFR09SWV9VTktOT1dOOworICAgICAgICBpbnQgcmVzcG9uc2VUeXBlID0gU21zQ2JDbWFzSW5mby5DTUFTX1JFU1BPTlNFX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgaW50IHNldmVyaXR5ID0gU21zQ2JDbWFzSW5mby5DTUFTX1NFVkVSSVRZX1VOS05PV047CisgICAgICAgIGludCB1cmdlbmN5ID0gU21zQ2JDbWFzSW5mby5DTUFTX1VSR0VOQ1lfVU5LTk9XTjsKKyAgICAgICAgaW50IGNlcnRhaW50eSA9IFNtc0NiQ21hc0luZm8uQ01BU19DRVJUQUlOVFlfVU5LTk9XTjsKKworICAgICAgICB3aGlsZSAoaW5TdHJlYW0uYXZhaWxhYmxlKCkgPj0gMTYpIHsKKyAgICAgICAgICAgIGludCByZWNvcmRUeXBlID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgIGludCByZWNvcmRMZW4gPSBpblN0cmVhbS5yZWFkKDgpOworICAgICAgICAgICAgc3dpdGNoIChyZWNvcmRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAgICAgLy8gVHlwZSAwIGVsZW1lbnRzIChBbGVydCB0ZXh0KQorICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YSBhbGVydFVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGFsZXJ0VXNlckRhdGEubXNnRW5jb2RpbmcgPSBpblN0cmVhbS5yZWFkKDUpOworICAgICAgICAgICAgICAgICAgICBhbGVydFVzZXJEYXRhLm1zZ0VuY29kaW5nU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYWxlcnRVc2VyRGF0YS5tc2dUeXBlID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRmllbGRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYXJzIHRvIGRlY29kZQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsZXJ0VXNlckRhdGEubXNnRW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfT0NURVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX0xBVElOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZpZWxkcyA9IHJlY29yZExlbiAtIDE7ICAgICAgLy8gc3VidHJhY3QgMSBieXRlIGZvciBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX0lBNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfR1NNXzdCSVRfQUxQSEFCRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmllbGRzID0gKChyZWNvcmRMZW4gKiA4KSAtIDUpIC8gNzsgIC8vIHN1YnRyYWN0IDUgYml0cyBmb3IgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19VTklDT0RFXzE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZpZWxkcyA9IChyZWNvcmRMZW4gLSAxKSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmllbGRzID0gMDsgICAgICAvLyB1bnN1cHBvcnRlZCBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYWxlcnRVc2VyRGF0YS5udW1GaWVsZHMgPSBudW1GaWVsZHM7CisgICAgICAgICAgICAgICAgICAgIGFsZXJ0VXNlckRhdGEucGF5bG9hZCA9IGluU3RyZWFtLnJlYWRCeXRlQXJyYXkocmVjb3JkTGVuICogOCAtIDUpOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVVc2VyRGF0YVBheWxvYWQoYWxlcnRVc2VyRGF0YSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBiRGF0YS51c2VyRGF0YSA9IGFsZXJ0VXNlckRhdGE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgLy8gVHlwZSAxIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlID0gaW5TdHJlYW0ucmVhZCg4KTsKKyAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHkgPSBpblN0cmVhbS5yZWFkKDQpOworICAgICAgICAgICAgICAgICAgICB1cmdlbmN5ID0gaW5TdHJlYW0ucmVhZCg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2VydGFpbnR5ID0gaW5TdHJlYW0ucmVhZCg0KTsKKyAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uc2tpcChyZWNvcmRMZW4gKiA4IC0gMjgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJza2lwcGluZyB1bnN1cHBvcnRlZCBDTUFTIHJlY29yZCB0eXBlICIgKyByZWNvcmRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uc2tpcChyZWNvcmRMZW4gKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiRGF0YS5jbWFzV2FybmluZ0luZm8gPSBuZXcgU21zQ2JDbWFzSW5mbyhtZXNzYWdlQ2xhc3MsIGNhdGVnb3J5LCByZXNwb25zZVR5cGUsIHNldmVyaXR5LAorICAgICAgICAgICAgICAgIHVyZ2VuY3ksIGNlcnRhaW50eSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIEJlYXJlckRhdGEgb2JqZWN0IGZyb20gc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi4KICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCiAgICAgICogQHBhcmFtIHNtc0RhdGEgYnl0ZSBhcnJheSBvZiByYXcgZW5jb2RlZCBTTVMgYmVhcmVyIGRhdGEuCi0gICAgICoKICAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCZWFyZXJEYXRhIGRlY29kZShieXRlW10gc21zRGF0YSkgeworICAgICAgICByZXR1cm4gZGVjb2RlKHNtc0RhdGEsIDApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbWFzQWxlcnRDYXRlZ29yeShpbnQgY2F0ZWdvcnkpIHsKKyAgICAgICAgcmV0dXJuIGNhdGVnb3J5ID49IFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQKKyAgICAgICAgICAgICAgICAmJiBjYXRlZ29yeSA8PSBTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfTEFTVF9SRVNFUlZFRF9WQUxVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgQmVhcmVyRGF0YSBvYmplY3QgZnJvbSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLgorICAgICAqIChTZWUgM0dQUDIgQy5SMTAwMS1GLCB2MS4wLCBzZWN0aW9uIDQuNSBmb3IgbGF5b3V0IGRldGFpbHMpCisgICAgICoKKyAgICAgKiBAcGFyYW0gc21zRGF0YSBieXRlIGFycmF5IG9mIHJhdyBlbmNvZGVkIFNNUyBiZWFyZXIgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2VydmljZUNhdGVnb3J5IHRoZSBlbnZlbG9wZSBzZXJ2aWNlIGNhdGVnb3J5IChmb3IgQ01BUyBhbGVydCBoYW5kbGluZykKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCZWFyZXJEYXRhIGRlY29kZShieXRlW10gc21zRGF0YSwgaW50IHNlcnZpY2VDYXRlZ29yeSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQml0d2lzZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJpdHdpc2VJbnB1dFN0cmVhbShzbXNEYXRhKTsKICAgICAgICAgICAgIEJlYXJlckRhdGEgYkRhdGEgPSBuZXcgQmVhcmVyRGF0YSgpOwogICAgICAgICAgICAgaW50IGZvdW5kU3VicGFyYW1NYXNrID0gMDsKICAgICAgICAgICAgIHdoaWxlIChpblN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRlY29kZVN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpbnQgc3VicGFyYW1JZCA9IGluU3RyZWFtLnJlYWQoOCk7CiAgICAgICAgICAgICAgICAgaW50IHN1YnBhcmFtSWRCaXQgPSAxIDw8IHN1YnBhcmFtSWQ7CiAgICAgICAgICAgICAgICAgaWYgKChmb3VuZFN1YnBhcmFtTWFzayAmIHN1YnBhcmFtSWRCaXQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGluZ0V4Y2VwdGlvbigiaWxsZWdhbCBkdXBsaWNhdGUgc3VicGFyYW1ldGVyICgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXJhbUlkICsgIikiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWNvZGVTdWNjZXNzOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VicGFyYW1JZCkgewogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlTWVzc2FnZUlkKGJEYXRhLCBpblN0cmVhbSk7CkBAIC0xNjI0LDYgKzE5MDMsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fTUVTU0FHRV9ERVBPU0lUX0lOREVYOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlRGVwb3NpdEluZGV4KGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEE6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVTZXJ2aWNlQ2F0ZWdvcnlQcm9ncmFtRGF0YShiRGF0YSwgaW5TdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kaW5nRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBiZWFyZXIgZGF0YSBzdWJwYXJhbWV0ZXIgKCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1YnBhcmFtSWQgKyAiKSIpOwpAQCAtMTYzNCw3ICsxOTE2LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGluZ0V4Y2VwdGlvbigibWlzc2luZyBNRVNTQUdFX0lERU5USUZJRVIgc3VicGFyYW0iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChiRGF0YS51c2VyRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJEYXRhLnVzZXJEYXRhLm1zZ0VuY29kaW5nID09IFVzZXJEYXRhLkVOQ09ESU5HX0lTOTFfRVhURU5ERURfUFJPVE9DT0wpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDbWFzQWxlcnRDYXRlZ29yeShzZXJ2aWNlQ2F0ZWdvcnkpICYmIGJEYXRhLnByaW9yaXR5SW5kaWNhdG9yU2V0CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiRGF0YS5wcmlvcml0eSA9PSBTbXNDYk1lc3NhZ2UuTUVTU0FHRV9QUklPUklUWV9FTUVSR0VOQ1kpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlQ21hc1VzZXJEYXRhKGJEYXRhLCBzZXJ2aWNlQ2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYkRhdGEudXNlckRhdGEubXNnRW5jb2RpbmcgPT0gVXNlckRhdGEuRU5DT0RJTkdfSVM5MV9FWFRFTkRFRF9QUk9UT0NPTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoKGZvdW5kU3VicGFyYW1NYXNrIF4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSKSBeCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFNVQlBBUkFNX1VTRVJfREFUQSkpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCmluZGV4IDRhNjAyMzEuLmY3M2RmNTYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgVEVMRVNFUlZJQ0VfVk1OICAgICAgICAgICAgICAgPSAweDEwMDM7CiAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgVEVMRVNFUlZJQ0VfV0FQICAgICAgICAgICAgICAgPSAweDEwMDQ7CiAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgVEVMRVNFUlZJQ0VfV0VNVCAgICAgICAgICAgICAgPSAweDEwMDU7CisgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgVEVMRVNFUlZJQ0VfU0NQVCAgICAgICAgICAgICAgPSAweDEwMDY7CiAKICAgICAvKioKICAgICAgKiBUaGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkIGFzIGV4dGVuc2lvbnMgdG8gdGhlIHN0YW5kYXJkIHRlbGVzZXJ2aWNlcwpAQCAtNDYsMTQgKzQ3LDE3IEBACiAgICAgLy8gbnVtYmVyIG9mIG1lc3NhZ2VzIHdhaXRpbmcsIGl0J3MgdXNlZCBieSBzb21lIENETUEgY2FycmllcnMgZm9yIGEgdm9pY2UgbWFpbCBjb3VudC4KICAgICBzdGF0aWMgcHVibGljIGZpbmFsIGludCBURUxFU0VSVklDRV9NV0kgICAgICAgICAgICAgICA9IDB4NDAwMDA7CiAKLSAgICAvLyBTZXJ2aWNlQ2F0ZWdvcmllcyBmb3IgQ2VsbCBCcm9hZGNhc3QsIHNlZSAzR1BQMiBDLlIxMDAxIHRhYmxlIDkuMy4xLTEKLSAgICAvL3N0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNFUlZJQ0VDQVRFR09SWV9FTUVSR0VOQ1kgICAgICA9IDB4MDAxMDsKKyAgICAvLyBTZXJ2aWNlIENhdGVnb3JpZXMgZm9yIENlbGwgQnJvYWRjYXN0LCBzZWUgM0dQUDIgQy5SMTAwMSB0YWJsZSA5LjMuMS0xCisgICAgLy8gc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NBVEVHT1JZX0VNRVJHRU5DWSAgICAgID0gMHgwMDAxOwogICAgIC8vLi4uCiAKLSAgICAvKioKLSAgICAgKiAgbWF4aW11bSBsZW5ndGhzIGZvciBmaWVsZHMgYXMgZGVmaW5lZCBpbiByaWxfY2RtYV9zbXMuaAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNNU19CRUFSRVJfREFUQV9NQVggPSAyNTU7CisgICAgLy8gQ01BUyBhbGVydCBzZXJ2aWNlIGNhdGVnb3J5IGFzc2lnbm1lbnRzLCBzZWUgM0dQUDIgQy5SMTAwMSB0YWJsZSA5LjMuMy0xCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX1BSRVNJREVOVElBTF9MRVZFTF9BTEVSVCAgPSAweDEwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFUICAgICAgICAgICAgPSAweDEwMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX1NFVkVSRV9USFJFQVQgICAgICAgICAgICAgPSAweDEwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX0NISUxEX0FCRFVDVElPTl9FTUVSR0VOQ1kgPSAweDEwMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX1RFU1RfTUVTU0FHRSAgICAgICAgICAgICAgPSAweDEwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DQVRFR09SWV9DTUFTX0xBU1RfUkVTRVJWRURfVkFMVUUgICAgICAgPSAweDEwZmY7CiAKICAgICAvKioKICAgICAgKiBQcm92aWRlcyB0aGUgdHlwZSBvZiBhIFNNUyBtZXNzYWdlIGxpa2UgcG9pbnQgdG8gcG9pbnQsIGJyb2FkY2FzdCBvciBhY2tub3dsZWRnZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1VzZXJEYXRhLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvVXNlckRhdGEuamF2YQppbmRleCAxODlkOTdkLi41OTljMmIzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvVXNlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvVXNlckRhdGEuamF2YQpAQCAtMzIsOSArMzIsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HXzdCSVRfQVNDSUkgICAgICAgICAgICAgICAgID0gMHgwMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19JQTUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDM7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfVU5JQ09ERV8xNiAgICAgICAgICAgICAgICAgPSAweDA0OwotICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfU0hJRlRfSklTICAgICAgICAgICAgICAgICAgPSAweDA1OwotICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfS09SRUFOICAgICAgICAgICAgICAgICAgICAgPSAweDA2OwotICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfTEFUSU5fSEVCUkVXICAgICAgICAgICAgICAgPSAweDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX1NISUZUX0pJUyAgICAgICAgICAgICAgICAgID0gMHgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19LT1JFQU4gICAgICAgICAgICAgICAgICAgICA9IDB4MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfTEFUSU5fSEVCUkVXICAgICAgICAgICAgICAgPSAweDA3OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0xBVElOICAgICAgICAgICAgICAgICAgICAgID0gMHgwODsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVCAgICAgICAgICA9IDB4MDk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfR1NNX0RDUyAgICAgICAgICAgICAgICAgICAgPSAweDBBOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCA4YTc1ZjUxLi45MzFjNjYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNtczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXMuSW50ZW50czsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc0NiTG9jYXRpb247CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLkdzbUNlbGxMb2NhdGlvbjsKQEAgLTMxOCwyNCArMzE5LDE4IEBACiAgICAgICogY29uY2F0ZW5hdGVkIG1lc3NhZ2UKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTbXNDYkNvbmNhdEluZm8geworCiAgICAgICAgIHByaXZhdGUgZmluYWwgU21zQ2JIZWFkZXIgbUhlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTbXNDYkxvY2F0aW9uIG1Mb2NhdGlvbjsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGxtbjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTGFjOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DaWQ7Ci0KLSAgICAgICAgcHVibGljIFNtc0NiQ29uY2F0SW5mbyhTbXNDYkhlYWRlciBoZWFkZXIsIFN0cmluZyBwbG1uLCBpbnQgbGFjLCBpbnQgY2lkKSB7CisgICAgICAgIHB1YmxpYyBTbXNDYkNvbmNhdEluZm8oU21zQ2JIZWFkZXIgaGVhZGVyLCBTbXNDYkxvY2F0aW9uIGxvY2F0aW9uKSB7CiAgICAgICAgICAgICBtSGVhZGVyID0gaGVhZGVyOwotICAgICAgICAgICAgbVBsbW4gPSBwbG1uOwotICAgICAgICAgICAgbUxhYyA9IGxhYzsKLSAgICAgICAgICAgIG1DaWQgPSBjaWQ7CisgICAgICAgICAgICBtTG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXIgKiAzMSArIG1IZWFkZXIudXBkYXRlTnVtYmVyOworICAgICAgICAgICAgcmV0dXJuIChtSGVhZGVyLmdldFNlcmlhbE51bWJlcigpICogMzEpICsgbUxvY2F0aW9uLmhhc2hDb2RlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTM0Myw0OSArMzM4LDI4IEBACiAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU21zQ2JDb25jYXRJbmZvKSB7CiAgICAgICAgICAgICAgICAgU21zQ2JDb25jYXRJbmZvIG90aGVyID0gKFNtc0NiQ29uY2F0SW5mbylvYmo7CiAKLSAgICAgICAgICAgICAgICAvLyBUd28gcGFnZXMgbWF0Y2ggaWYgYWxsIGhlYWRlciBhdHRyaWJ1dGVzIChleGNlcHQgdGhlIHBhZ2UKLSAgICAgICAgICAgICAgICAvLyBpbmRleCkgYXJlIGlkZW50aWNhbCwgYW5kIGJvdGggcGFnZXMgYmVsb25nIHRvIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gKHdoaWNoIGlzIGFsc28gZGV0ZXJtaW5lZCBieSB0aGUgc2NvcGUgcGFyYW1ldGVyKQotICAgICAgICAgICAgICAgIGlmIChtSGVhZGVyLmdlb2dyYXBoaWNhbFNjb3BlID09IG90aGVyLm1IZWFkZXIuZ2VvZ3JhcGhpY2FsU2NvcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIubWVzc2FnZUNvZGUgPT0gb3RoZXIubUhlYWRlci5tZXNzYWdlQ29kZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci51cGRhdGVOdW1iZXIgPT0gb3RoZXIubUhlYWRlci51cGRhdGVOdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1IZWFkZXIubWVzc2FnZUlkZW50aWZpZXIgPT0gb3RoZXIubUhlYWRlci5tZXNzYWdlSWRlbnRpZmllcgotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci5kYXRhQ29kaW5nU2NoZW1lID09IG90aGVyLm1IZWFkZXIuZGF0YUNvZGluZ1NjaGVtZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUhlYWRlci5uck9mUGFnZXMgPT0gb3RoZXIubUhlYWRlci5uck9mUGFnZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNMb2NhdGlvbihvdGhlci5tUGxtbiwgb3RoZXIubUxhYywgb3RoZXIubUNpZCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFR3byBwYWdlcyBtYXRjaCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgc2VyaWFsIG51bWJlciAod2hpY2ggaW5jbHVkZXMgdGhlCisgICAgICAgICAgICAgICAgLy8gZ2VvZ3JhcGhpY2FsIHNjb3BlIGFuZCB1cGRhdGUgbnVtYmVyKSwgYW5kIGJvdGggcGFnZXMgYmVsb25nIHRvIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gKFBMTU4sIHBsdXMgTEFDIGFuZCBDSUQgaWYgdGhlc2UgYXJlIHBhcnQgb2YgdGhlIGdlb2dyYXBoaWNhbCBzY29wZSkuCisgICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkZXIuZ2V0U2VyaWFsTnVtYmVyKCkgPT0gb3RoZXIubUhlYWRlci5nZXRTZXJpYWxOdW1iZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUxvY2F0aW9uLmVxdWFscyhvdGhlci5tTG9jYXRpb24pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgY29uY2F0ZW5hdGlvbiBpbmZvIG1hdGNoZXMgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGUKLSAgICAgICAgICogZ3JhbnVsYXJpdHkgb2YgdGhlIG1hdGNoIGRlcGVuZHMgb24gdGhlIGdlb2dyYXBoaWNhbCBzY29wZS4KKyAgICAgICAgICogQ29tcGFyZSB0aGUgbG9jYXRpb24gY29kZSBmb3IgdGhpcyBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvZGUuIFRoZSBtYXRjaCBpcworICAgICAgICAgKiByZWxhdGl2ZSB0byB0aGUgZ2VvZ3JhcGhpY2FsIHNjb3BlIG9mIHRoZSBtZXNzYWdlLCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIExBQworICAgICAgICAgKiBhbmQgQ2VsbCBJRCBhcmUgc2F2ZWQgaW4gbUxvY2F0aW9uIG9yIHNldCB0byAtMSB0byBtYXRjaCBhbGwgdmFsdWVzLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGxtbiBQTE1OCi0gICAgICAgICAqIEBwYXJhbSBsYWMgTG9jYXRpb24gYXJlYSBjb2RlCi0gICAgICAgICAqIEBwYXJhbSBjaWQgQ2VsbCBJRAotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hpbmcsIGZhbHNlIG90aGVyd2lzZQorICAgICAgICAgKiBAcGFyYW0gcGxtbiB0aGUgY3VycmVudCBQTE1OCisgICAgICAgICAqIEBwYXJhbSBsYWMgdGhlIGN1cnJlbnQgTG9jYXRpb24gQXJlYSAoR1NNKSBvciBTZXJ2aWNlIEFyZWEgKFVNVFMpCisgICAgICAgICAqIEBwYXJhbSBjaWQgdGhlIGN1cnJlbnQgQ2VsbCBJRAorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXNzYWdlIGlzIHZhbGlkIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbjsgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzTG9jYXRpb24oU3RyaW5nIHBsbW4sIGludCBsYWMsIGludCBjaWQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobUhlYWRlci5nZW9ncmFwaGljYWxTY29wZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERV9JTU1FRElBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2lkICE9IGNpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgZmFsbC10aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFjICE9IGxhYykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlbGliZXJhdGUgZmFsbC10aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1QbG1uICE9IG51bGwgJiYgbVBsbW4uZXF1YWxzKHBsbW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uLmlzSW5Mb2NhdGlvbkFyZWEocGxtbiwgbGFjLCBjaWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MjEsMjQgKzM5NSw0MiBAQAogICAgICAgICAgICAgaW50IGxhYyA9IGNlbGxMb2NhdGlvbi5nZXRMYWMoKTsKICAgICAgICAgICAgIGludCBjaWQgPSBjZWxsTG9jYXRpb24uZ2V0Q2lkKCk7CiAKKyAgICAgICAgICAgIFNtc0NiTG9jYXRpb24gbG9jYXRpb247CisgICAgICAgICAgICBzd2l0Y2ggKGhlYWRlci5nZXRHZW9ncmFwaGljYWxTY29wZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0xBX1dJREU6CisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFNtc0NiTG9jYXRpb24ocGxtbiwgbGFjLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX0NFTExfV0lERToKKyAgICAgICAgICAgICAgICBjYXNlIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFX0lNTUVESUFURToKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgU21zQ2JMb2NhdGlvbihwbG1uLCBsYWMsIGNpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTbXNDYk1lc3NhZ2UuR0VPR1JBUEhJQ0FMX1NDT1BFX1BMTU5fV0lERToKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBTbXNDYkxvY2F0aW9uKHBsbW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYnl0ZVtdW10gcGR1czsKLSAgICAgICAgICAgIGlmIChoZWFkZXIubnJPZlBhZ2VzID4gMSkgeworICAgICAgICAgICAgaW50IHBhZ2VDb3VudCA9IGhlYWRlci5nZXROdW1iZXJPZlBhZ2VzKCk7CisgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMSkgewogICAgICAgICAgICAgICAgIC8vIE11bHRpLXBhZ2UgbWVzc2FnZQotICAgICAgICAgICAgICAgIFNtc0NiQ29uY2F0SW5mbyBjb25jYXRJbmZvID0gbmV3IFNtc0NiQ29uY2F0SW5mbyhoZWFkZXIsIHBsbW4sIGxhYywgY2lkKTsKKyAgICAgICAgICAgICAgICBTbXNDYkNvbmNhdEluZm8gY29uY2F0SW5mbyA9IG5ldyBTbXNDYkNvbmNhdEluZm8oaGVhZGVyLCBsb2NhdGlvbik7CiAKICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBvdGhlciBwYWdlcyBvZiB0aGUgc2FtZSBtZXNzYWdlCiAgICAgICAgICAgICAgICAgcGR1cyA9IG1TbXNDYlBhZ2VNYXAuZ2V0KGNvbmNhdEluZm8pOwogCiAgICAgICAgICAgICAgICAgaWYgKHBkdXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGl0IHRoZSBmaXJzdCBwYWdlIG9mIHRoaXMgbWVzc2FnZSwgbWFrZSByb29tIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFnZSBvZiB0aGlzIG1lc3NhZ2UsIG1ha2Ugcm9vbSBmb3IgYWxsCiAgICAgICAgICAgICAgICAgICAgIC8vIHBhZ2VzIGFuZCBrZWVwIHVudGlsIGNvbXBsZXRlCi0gICAgICAgICAgICAgICAgICAgIHBkdXMgPSBuZXcgYnl0ZVtoZWFkZXIubnJPZlBhZ2VzXVtdOworICAgICAgICAgICAgICAgICAgICBwZHVzID0gbmV3IGJ5dGVbcGFnZUNvdW50XVtdOwogCiAgICAgICAgICAgICAgICAgICAgIG1TbXNDYlBhZ2VNYXAucHV0KGNvbmNhdEluZm8sIHBkdXMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFBhZ2UgcGFyYW1ldGVyIGlzIG9uZS1iYXNlZAotICAgICAgICAgICAgICAgIHBkdXNbaGVhZGVyLnBhZ2VJbmRleCAtIDFdID0gcmVjZWl2ZWRQZHU7CisgICAgICAgICAgICAgICAgcGR1c1toZWFkZXIuZ2V0UGFnZUluZGV4KCkgLSAxXSA9IHJlY2VpdmVkUGR1OwogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwZHVzW2ldID09IG51bGwpIHsKQEAgLTQ1NSw4ICs0NDcsOCBAQAogICAgICAgICAgICAgICAgIHBkdXNbMF0gPSByZWNlaXZlZFBkdTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbGVhbiBpc0VtZXJnZW5jeU1lc3NhZ2UgPSBTbXNDYkhlYWRlci5pc0VtZXJnZW5jeU1lc3NhZ2UoaGVhZGVyLm1lc3NhZ2VJZGVudGlmaWVyKTsKLSAgICAgICAgICAgIGRpc3BhdGNoQnJvYWRjYXN0UGR1cyhwZHVzLCBpc0VtZXJnZW5jeU1lc3NhZ2UpOworICAgICAgICAgICAgU21zQ2JNZXNzYWdlIG1lc3NhZ2UgPSBHc21TbXNDYk1lc3NhZ2UuY3JlYXRlU21zQ2JNZXNzYWdlKGhlYWRlciwgbG9jYXRpb24sIHBkdXMpOworICAgICAgICAgICAgZGlzcGF0Y2hCcm9hZGNhc3RNZXNzYWdlKG1lc3NhZ2UpOwogCiAgICAgICAgICAgICAvLyBSZW1vdmUgbWVzc2FnZXMgdGhhdCBhcmUgb3V0IG9mIHNjb3BlIHRvIHByZXZlbnQgdGhlIG1hcCBmcm9tCiAgICAgICAgICAgICAvLyBncm93aW5nIGluZGVmaW5pdGVseSwgY29udGFpbmluZyBpbmNvbXBsZXRlIG1lc3NhZ2VzIHRoYXQgd2VyZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TbXNDYk1lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU21zQ2JNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5NTU0YQotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU21zQ2JNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYkxvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc0NiTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBQYXJzZXMgYSBHU00gb3IgVU1UUyBmb3JtYXQgU01TLUNCIG1lc3NhZ2UgaW50byBhbiB7QGxpbmsgU21zQ2JNZXNzYWdlfSBvYmplY3QuIFRoZSBjbGFzcyBpcworICogcHVibGljIGJlY2F1c2Uge0BsaW5rICNjcmVhdGVTbXNDYk1lc3NhZ2UoU21zQ2JMb2NhdGlvbiwgYnl0ZVtdW10pfSBpcyB1c2VkIGJ5IHNvbWUgdGVzdCBjYXNlcy4KKyAqLworcHVibGljIGNsYXNzIEdzbVNtc0NiTWVzc2FnZSB7CisKKyAgICAvKioKKyAgICAgKiBMYW5ndWFnZXMgaW4gdGhlIDAwMDB4eHh4IERDUyBncm91cCBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDM4LCBzZWN0aW9uIDUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFOR1VBR0VfQ09ERVNfR1JPVVBfMCA9IHsKKyAgICAgICAgICAgICJkZSIsICJlbiIsICJpdCIsICJmciIsICJlcyIsICJubCIsICJzdiIsICJkYSIsICJwdCIsICJmaSIsICJubyIsICJlbCIsICJ0ciIsICJodSIsCisgICAgICAgICAgICAicGwiLCBudWxsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIExhbmd1YWdlcyBpbiB0aGUgMDAxMHh4eHggRENTIGdyb3VwIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzgsIHNlY3Rpb24gNS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQU5HVUFHRV9DT0RFU19HUk9VUF8yID0geworICAgICAgICAgICAgImNzIiwgImhlIiwgImFyIiwgInJ1IiwgImlzIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgIG51bGwsIG51bGwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDQVJSSUFHRV9SRVRVUk4gPSAweDBkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9CT0RZX1BBR0VfTEVOR1RIID0gODI7CisKKyAgICAvKiogVXRpbGl0eSBjbGFzcyB3aXRoIG9ubHkgc3RhdGljIG1ldGhvZHMuICovCisgICAgcHJpdmF0ZSBHc21TbXNDYk1lc3NhZ2UoKSB7IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTbXNDYk1lc3NhZ2Ugb2JqZWN0IGZyb20gYSBoZWFkZXIgb2JqZWN0IHBsdXMgb25lIG9yIG1vcmUgcmVjZWl2ZWQgUERVcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwZHVzIFBEVSBieXRlcworICAgICAqLworICAgIHN0YXRpYyBTbXNDYk1lc3NhZ2UgY3JlYXRlU21zQ2JNZXNzYWdlKFNtc0NiSGVhZGVyIGhlYWRlciwgU21zQ2JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgIGJ5dGVbXVtdIHBkdXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoaGVhZGVyLmlzRXR3c1ByaW1hcnlOb3RpZmljYXRpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYk1lc3NhZ2UoU21zQ2JNZXNzYWdlLk1FU1NBR0VfRk9STUFUXzNHUFAsCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5nZXRHZW9ncmFwaGljYWxTY29wZSgpLCBoZWFkZXIuZ2V0U2VyaWFsTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBoZWFkZXIuZ2V0U2VydmljZUNhdGVnb3J5KCksCisgICAgICAgICAgICAgICAgICAgIG51bGwsICJFVFdTIiwgU21zQ2JNZXNzYWdlLk1FU1NBR0VfUFJJT1JJVFlfRU1FUkdFTkNZLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZ2V0RXR3c0luZm8oKSwgaGVhZGVyLmdldENtYXNJbmZvKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChieXRlW10gcGR1IDogcGR1cykgeworICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBwYXJzZUJvZHkoaGVhZGVyLCBwZHUpOworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocC5zZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHByaW9yaXR5ID0gaGVhZGVyLmlzRW1lcmdlbmN5TWVzc2FnZSgpID8gU21zQ2JNZXNzYWdlLk1FU1NBR0VfUFJJT1JJVFlfRU1FUkdFTkNZCisgICAgICAgICAgICAgICAgICAgIDogU21zQ2JNZXNzYWdlLk1FU1NBR0VfUFJJT1JJVFlfTk9STUFMOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFNtc0NiTWVzc2FnZShTbXNDYk1lc3NhZ2UuTUVTU0FHRV9GT1JNQVRfM0dQUCwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmdldEdlb2dyYXBoaWNhbFNjb3BlKCksIGhlYWRlci5nZXRTZXJpYWxOdW1iZXIoKSwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5nZXRTZXJ2aWNlQ2F0ZWdvcnkoKSwgbGFuZ3VhZ2UsIHNiLnRvU3RyaW5nKCksIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZ2V0RXR3c0luZm8oKSwgaGVhZGVyLmdldENtYXNJbmZvKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFNtc0NiTWVzc2FnZSBvYmplY3QgZnJvbSBvbmUgb3IgbW9yZSByZWNlaXZlZCBQRFVzLiBUaGlzIGlzIHVzZWQgYnkgc29tZQorICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciB0ZXN0IGNhc2VzLCBiZWNhdXNlIFNtc0NiSGVhZGVyIGlzIG5vdyBwYWNrYWdlIGxvY2FsLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiAoZ2VvZ3JhcGhpY2FsIHNjb3BlKSBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gcGR1cyBQRFUgYnl0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNtc0NiTWVzc2FnZSBjcmVhdGVTbXNDYk1lc3NhZ2UoU21zQ2JMb2NhdGlvbiBsb2NhdGlvbiwgYnl0ZVtdW10gcGR1cykKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBTbXNDYkhlYWRlciBoZWFkZXIgPSBuZXcgU21zQ2JIZWFkZXIocGR1c1swXSk7CisgICAgICAgIHJldHVybiBjcmVhdGVTbXNDYk1lc3NhZ2UoaGVhZGVyLCBsb2NhdGlvbiwgcGR1cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIHVucGFjayB0aGUgYm9keSB0ZXh0IGFjY29yZGluZyB0byB0aGUgZW5jb2RpbmcgaW4gdGhlIERDUy4KKyAgICAgKiBBZnRlciBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgYXNzaWduZWQgdGhlIGJvZHkKKyAgICAgKiB0ZXh0IGludG8gbUJvZHksIGFuZCBvcHRpb25hbGx5IHRoZSBsYW5ndWFnZSBjb2RlIGludG8gbUxhbmd1YWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyIHRoZSBtZXNzYWdlIGhlYWRlciB0byB1c2UKKyAgICAgKiBAcGFyYW0gcGR1IHRoZSBQRFUgdG8gZGVjb2RlCisgICAgICogQHJldHVybiBhIFBhaXIgb2YgU3RyaW5ncyBjb250YWluaW5nIHRoZSBsYW5ndWFnZSBhbmQgYm9keSBvZiB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHBhcnNlQm9keShTbXNDYkhlYWRlciBoZWFkZXIsIGJ5dGVbXSBwZHUpIHsKKyAgICAgICAgaW50IGVuY29kaW5nOworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOworICAgICAgICBib29sZWFuIGhhc0xhbmd1YWdlSW5kaWNhdG9yID0gZmFsc2U7CisgICAgICAgIGludCBkYXRhQ29kaW5nU2NoZW1lID0gaGVhZGVyLmdldERhdGFDb2RpbmdTY2hlbWUoKTsKKworICAgICAgICAvLyBFeHRyYWN0IGVuY29kaW5nIGFuZCBsYW5ndWFnZSBmcm9tIERDUywgYXMgZGVmaW5lZCBpbiAzZ3BwIFRTIDIzLjAzOCwKKyAgICAgICAgLy8gc2VjdGlvbiA1LgorICAgICAgICBzd2l0Y2ggKChkYXRhQ29kaW5nU2NoZW1lICYgMHhmMCkgPj4gNCkgeworICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR183QklUOworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gTEFOR1VBR0VfQ09ERVNfR1JPVVBfMFtkYXRhQ29kaW5nU2NoZW1lICYgMHgwZl07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgICAgICBoYXNMYW5ndWFnZUluZGljYXRvciA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKChkYXRhQ29kaW5nU2NoZW1lICYgMHgwZikgPT0gMHgwMSkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBMQU5HVUFHRV9DT0RFU19HUk9VUF8yW2RhdGFDb2RpbmdTY2hlbWUgJiAweDBmXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR183QklUOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICAgICAgc3dpdGNoICgoZGF0YUNvZGluZ1NjaGVtZSAmIDB4MGMpID4+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzhCSVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgY2FzZSAweDA3OgorICAgICAgICAgICAgICAgIC8vIENvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGNhc2UgMHgwOToKKyAgICAgICAgICAgICAgICAvLyBVREggc3RydWN0dXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGNhc2UgMHgwZToKKyAgICAgICAgICAgICAgICAvLyBEZWZpbmVkIGJ5IHRoZSBXQVAgZm9ydW0gbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIEdTTSBkYXRhQ29kaW5nU2NoZW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YUNvZGluZ1NjaGVtZSk7CisKKyAgICAgICAgICAgIGNhc2UgMHgwZjoKKyAgICAgICAgICAgICAgICBpZiAoKChkYXRhQ29kaW5nU2NoZW1lICYgMHgwNCkgPj4gMikgPT0gMHgwMSkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfOEJJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQgdmFsdWVzIGFyZSB0byBiZSB0cmVhdGVkIGFzIDctYml0CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVhZGVyLmlzVW10c0Zvcm1hdCgpKSB7CisgICAgICAgICAgICAvLyBQYXlsb2FkIG1heSBjb250YWluIG11bHRpcGxlIHBhZ2VzCisgICAgICAgICAgICBpbnQgbnJQYWdlcyA9IHBkdVtTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSF07CisKKyAgICAgICAgICAgIGlmIChwZHUubGVuZ3RoIDwgU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEggKyAxICsgKFBEVV9CT0RZX1BBR0VfTEVOR1RIICsgMSkKKyAgICAgICAgICAgICAgICAgICAgKiBuclBhZ2VzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGR1IGxlbmd0aCAiICsgcGR1Lmxlbmd0aCArICIgZG9lcyBub3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuclBhZ2VzICsgIiBwYWdlcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuclBhZ2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBFYWNoIHBhZ2UgaXMgODIgYnl0ZXMgZm9sbG93ZWQgYnkgYSBsZW5ndGggb2N0ZXQgaW5kaWNhdGluZworICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgdXNlZnVsIG9jdGV0cyB3aXRoaW4gdGhvc2UgODIKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEggKyAxICsgKFBEVV9CT0RZX1BBR0VfTEVOR1RIICsgMSkgKiBpOworICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBwZHVbb2Zmc2V0ICsgUERVX0JPRFlfUEFHRV9MRU5HVEhdOworCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IFBEVV9CT0RZX1BBR0VfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhZ2UgbGVuZ3RoICIgKyBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXhjZWVkcyBtYXhpbXVtIHZhbHVlICIgKyBQRFVfQk9EWV9QQUdFX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IHVucGFja0JvZHkocGR1LCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNMYW5ndWFnZUluZGljYXRvciwgbGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocC5zZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihsYW5ndWFnZSwgc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXlsb2FkIGlzIG9uZSBzaW5nbGUgcGFnZQorICAgICAgICAgICAgaW50IG9mZnNldCA9IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7CisKKyAgICAgICAgICAgIHJldHVybiB1bnBhY2tCb2R5KHBkdSwgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoLCBoYXNMYW5ndWFnZUluZGljYXRvciwgbGFuZ3VhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5wYWNrIGJvZHkgdGV4dCBmcm9tIHRoZSBwZHUgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLCBwb3NpdGlvbiBhbmQKKyAgICAgKiBsZW5ndGggd2l0aGluIHRoZSBwZHUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwZHUgVGhlIHBkdQorICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcsIGFzIGRlcml2ZWQgZnJvbSB0aGUgRENTCisgICAgICogQHBhcmFtIG9mZnNldCBQb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSB0byB1bnBhY2sKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBieXRlcyB0byB1bnBhY2sKKyAgICAgKiBAcGFyYW0gaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgdHJ1ZSBpZiB0aGUgYm9keSB0ZXh0IGlzIHByZWNlZGVkIGJ5IGEKKyAgICAgKiAgICAgICAgICAgIGxhbmd1YWdlIGluZGljYXRvci4gSWYgc28sIHRoaXMgbWV0aG9kIHdpbGwgYXMgYSBzaWRlLWVmZmVjdAorICAgICAqICAgICAgICAgICAgYXNzaWduIHRoZSBleHRyYWN0ZWQgbGFuZ3VhZ2UgY29kZSBpbnRvIG1MYW5ndWFnZQorICAgICAqIEBwYXJhbSBsYW5ndWFnZSB0aGUgbGFuZ3VhZ2UgdG8gcmV0dXJuIGlmIGhhc0xhbmd1YWdlSW5kaWNhdG9yIGlzIGZhbHNlCisgICAgICogQHJldHVybiBhIFBhaXIgb2YgU3RyaW5ncyBjb250YWluaW5nIHRoZSBsYW5ndWFnZSBhbmQgYm9keSBvZiB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHVucGFja0JvZHkoYnl0ZVtdIHBkdSwgaW50IGVuY29kaW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgYm9vbGVhbiBoYXNMYW5ndWFnZUluZGljYXRvciwgU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgIFN0cmluZyBib2R5ID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7CisgICAgICAgICAgICBjYXNlIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfN0JJVDoKKyAgICAgICAgICAgICAgICBib2R5ID0gR3NtQWxwaGFiZXQuZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKHBkdSwgb2Zmc2V0LCBsZW5ndGggKiA4IC8gNyk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzTGFuZ3VhZ2VJbmRpY2F0b3IgJiYgYm9keSAhPSBudWxsICYmIGJvZHkubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIGlzIHR3byBHU00gY2hhcmFjdGVycyBmb2xsb3dlZCBieSBhIENSLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGJvZHkgdGV4dCBpcyBvZmZzZXQgYnkgMyBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IGJvZHkuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5zdWJzdHJpbmcoMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ6CisgICAgICAgICAgICAgICAgaWYgKGhhc0xhbmd1YWdlSW5kaWNhdG9yICYmIHBkdS5sZW5ndGggPj0gb2Zmc2V0ICsgMikgeworICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSBpcyB0d28gR1NNIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYm9keSB0ZXh0IGlzIG9mZnNldCBieSAyIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IEdzbUFscGhhYmV0LmdzbTdCaXRQYWNrZWRUb1N0cmluZyhwZHUsIG9mZnNldCwgMik7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib2R5ID0gbmV3IFN0cmluZyhwZHUsIG9mZnNldCwgKGxlbmd0aCAmIDB4ZmZmZSksICJ1dGYtMTYiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXBwYXJlbnRseSBpdCB3YXNuJ3QgdmFsaWQgVVRGLTE2LgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFcnJvciBkZWNvZGluZyBVVEYtMTYgbWVzc2FnZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBib2R5Lmxlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYm9keS5jaGFyQXQoaSkgIT0gQ0FSUklBR0VfUkVUVVJOKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvZHkgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4obGFuZ3VhZ2UsIGJvZHkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YQppbmRleCA4YzNiYzBlLi40NTVlZTc0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTUZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmRBcHBsaWNhdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwpAQCAtMzUsOCArMzYsOCBAQAogCiAgICAgLy8qKioqKiBDb25zdHJ1Y3RvcgogCi0gICAgcHVibGljIFNJTUZpbGVIYW5kbGVyKFBob25lQmFzZSBwaG9uZSkgewotICAgICAgICBzdXBlcihwaG9uZSk7CisgICAgcHVibGljIFNJTUZpbGVIYW5kbGVyKEljY0NhcmQgY2FyZCwgU3RyaW5nIGFpZCwgQ29tbWFuZHNJbnRlcmZhY2UgY2kpIHsKKyAgICAgICAgc3VwZXIoY2FyZCwgYWlkLCBjaSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKQEAgLTkxLDggKzkyLDggQEAKICAgICAgICAgICAgIC8vIFRoZSBFRmlkcyBpbiBVU0lNIHBob25lIGJvb2sgZW50cmllcyBhcmUgZGVjaWRlZCBieSB0aGUgY2FyZCBtYW51ZmFjdHVyZXIuCiAgICAgICAgICAgICAvLyBTbyBpZiB3ZSBkb24ndCBtYXRjaCBhbnkgb2YgdGhlIGNhc2VzIGFib3ZlIGFuZCBpZiBpdHMgYSBVU0lNIHJldHVybgogICAgICAgICAgICAgLy8gdGhlIHBob25lIGJvb2sgcGF0aC4KLSAgICAgICAgICAgIEljY0NhcmQgY2FyZCA9IHBob25lLmdldEljY0NhcmQoKTsKLSAgICAgICAgICAgIGlmIChjYXJkICE9IG51bGwgJiYgY2FyZC5pc0FwcGxpY2F0aW9uT25JY2MoSWNjQ2FyZEFwcGxpY2F0aW9uLkFwcFR5cGUuQVBQVFlQRV9VU0lNKSkgeworICAgICAgICAgICAgaWYgKG1QYXJlbnRDYXJkICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhcmVudENhcmQuaXNBcHBsaWNhdGlvbk9uSWNjKEljY0NhcmRBcHBsaWNhdGlvbi5BcHBUeXBlLkFQUFRZUEVfVVNJTSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTUZfU0lNICsgREZfVEVMRUNPTSArIERGX1BIT05FQk9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvcjogRUYgUGF0aCBiZWluZyByZXR1cm5lZCBpbiBudWxsIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYkNvbnN0YW50cy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkNvbnN0YW50cy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiQ29uc3RhbnRzLmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JDb25zdGFudHMuamF2YQppbmRleCBhMWI0YWRmLi5lYmI0NjY2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNDYkNvbnN0YW50cy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE0ICsxNCwyMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbTsKIAogLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBTTVMgQ2VsbCBCcm9hZGNhc3QgbWVzc2FnZXMuCisgKiBDb25zdGFudHMgdXNlZCBpbiBTTVMgQ2VsbCBCcm9hZGNhc3QgbWVzc2FnZXMgKHNlZSAzR1BQIFRTIDIzLjA0MSkuIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUKKyAqIGJvb3QtdGltZSBicm9hZGNhc3QgY2hhbm5lbCBlbmFibGUgYW5kIGRhdGFiYXNlIHVwZ3JhZGUgY29kZSBpbiBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIsIHNvIGl0CisgKiBpcyBwdWJsaWMsIGJ1dCBzaG91bGQgYmUgYXZvaWRlZCBpbiBmYXZvciBvZiB0aGUgcmFkaW8gdGVjaG5vbG9neSBpbmRlcGVuZGVudCBjb25zdGFudHMgaW4KKyAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYk1lc3NhZ2V9LCB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JFdHdzSW5mb30sIGFuZAorICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlNtc0NiQ21hc0luZm99IGNsYXNzZXMuCiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNtc0NiQ29uc3RhbnRzIHsKK3B1YmxpYyBjbGFzcyBTbXNDYkNvbnN0YW50cyB7CisKKyAgICAvKiogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgdXRpbGl0eSBjbGFzcy4gKi8KKyAgICBwcml2YXRlIFNtc0NiQ29uc3RhbnRzKCkgeyB9CisKICAgICAvKiogU3RhcnQgb2YgUFdTIE1lc3NhZ2UgSWRlbnRpZmllciByYW5nZSAoaW5jbHVkZXMgRVRXUyBhbmQgQ01BUykuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9QV1NfRklSU1RfSURFTlRJRklFUiA9IDB4MTEwMDsKIApAQCAtOTQsMTEgKzEwMiwxMSBAQAogICAgIC8qKiBFbmQgb2YgUFdTIE1lc3NhZ2UgSWRlbnRpZmllciByYW5nZSAoaW5jbHVkZXMgRVRXUywgQ01BUywgYW5kIGZ1dHVyZSBleHRlbnNpb25zKS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX1BXU19MQVNUX0lERU5USUZJRVIgICAgICAgICAgICAgICAgICA9IDB4MThGRjsKIAotICAgIC8qKiBFVFdTIG1lc3NhZ2UgY29kZSBmbGFnIHRvIGFjdGl2YXRlIHRoZSBwb3B1cCBkaXNwbGF5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQ09ERV9FVFdTX0FDVElWQVRFX1BPUFVQICAgICAgICAgICAgICAgID0gMHgxMDA7CisgICAgLyoqIEVUV1Mgc2VyaWFsIG51bWJlciBmbGFnIHRvIGFjdGl2YXRlIHRoZSBwb3B1cCBkaXNwbGF5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUklBTF9OVU1CRVJfRVRXU19BQ1RJVkFURV9QT1BVUCAgICAgICAgICAgICAgICA9IDB4MTAwMDsKIAotICAgIC8qKiBFVFdTIG1lc3NhZ2UgY29kZSBmbGFnIHRvIGFjdGl2YXRlIHRoZSBlbWVyZ2VuY3kgdXNlciBhbGVydC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NPREVfRVRXU19FTUVSR0VOQ1lfVVNFUl9BTEVSVCAgICAgICAgICA9IDB4MjAwOworICAgIC8qKiBFVFdTIHNlcmlhbCBudW1iZXIgZmxhZyB0byBhY3RpdmF0ZSB0aGUgZW1lcmdlbmN5IHVzZXIgYWxlcnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSSUFMX05VTUJFUl9FVFdTX0VNRVJHRU5DWV9VU0VSX0FMRVJUICAgICAgICAgID0gMHgyMDAwOwogCiAgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIHZhbHVlIGZvciBlYXJ0aHF1YWtlLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX0VBUlRIUVVBS0UgICAgICAgICAgICAgICAgICAgID0gMHgwMDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YQppbmRleCA4ZTZiNzliLi41NjkyMDQ0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhCkBAIC0xNiwyOCArMTYsNDIgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtOwogCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JDbWFzSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYkV0d3NJbmZvOwogCi1wdWJsaWMgY2xhc3MgU21zQ2JIZWFkZXIgaW1wbGVtZW50cyBTbXNDYkNvbnN0YW50cyB7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBQYXJzZXMgYSAzR1BQIFRTIDIzLjA0MSBjZWxsIGJyb2FkY2FzdCBtZXNzYWdlIGhlYWRlci4gVGhpcyBjbGFzcyBpcyBwdWJsaWMgZm9yIHVzZSBieQorICogQ2VsbEJyb2FkY2FzdFJlY2VpdmVyIHRlc3QgY2FzZXMsIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLgorICoKKyAqIEFsbCByZWxldmFudCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgbm93IHNlbnQgYXMgYSBQYXJjZWxhYmxlCisgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlfSBvYmplY3QgaW4gdGhlICJtZXNzYWdlIiBleHRyYSBvZiB0aGUKKyAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXMuSW50ZW50cyNTTVNfQ0JfUkVDRUlWRURfQUNUSU9OfSBvcgorICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNtcy5JbnRlbnRzI1NNU19FTUVSR0VOQ1lfQ0JfUkVDRUlWRURfQUNUSU9OfSBpbnRlbnQuCisgKiBUaGUgcmF3IFBEVSBpcyBubyBsb25nZXIgc2VudCB0byBTTVMgQ0IgYXBwbGljYXRpb25zLgorICovCitjbGFzcyBTbXNDYkhlYWRlciB7CisKICAgICAvKioKICAgICAgKiBMZW5ndGggb2YgU01TLUNCIGhlYWRlcgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBEVV9IRUFERVJfTEVOR1RIID0gNjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBEVV9IRUFERVJfTEVOR1RIID0gNjsKIAogICAgIC8qKgogICAgICAqIEdTTSBwZHUgZm9ybWF0LCBhcyBkZWZpbmVkIGluIDNncHAgVFMgMjMuMDQxLCBzZWN0aW9uIDkuNC4xCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0dTTSA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR1NNID0gMTsKIAogICAgIC8qKgogICAgICAqIFVNVFMgcGR1IGZvcm1hdCwgYXMgZGVmaW5lZCBpbiAzZ3BwIFRTIDIzLjA0MSwgc2VjdGlvbiA5LjQuMgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTVRTID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTVRTID0gMjsKIAogICAgIC8qKgogICAgICAqIEdTTSBwZHUgZm9ybWF0LCBhcyBkZWZpbmVkIGluIDNncHAgVFMgMjMuMDQxLCBzZWN0aW9uIDkuNC4xLjMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRVRXU19QUklNQVJZID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FVFdTX1BSSU1BUlkgPSAzOwogCiAgICAgLyoqCiAgICAgICogTWVzc2FnZSB0eXBlIHZhbHVlIGFzIGRlZmluZWQgaW4gM2dwcCBUUyAyNS4zMjQsIHNlY3Rpb24gMTEuMS4KQEAgLTQ3LDM0ICs2MSwzNCBAQAogICAgIC8qKgogICAgICAqIExlbmd0aCBvZiBHU00gcGR1cwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBEVV9MRU5HVEhfR1NNID0gODg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9MRU5HVEhfR1NNID0gODg7CiAKICAgICAvKioKICAgICAgKiBNYXhpbXVtIGxlbmd0aCBvZiBFVFdTIHByaW1hcnkgbWVzc2FnZSBHU00gcGR1cwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBEVV9MRU5HVEhfRVRXUyA9IDU2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRFVfTEVOR1RIX0VUV1MgPSA1NjsKIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZ2VvZ3JhcGhpY2FsU2NvcGU7CiAKLSAgICBwdWJsaWMgZmluYWwgaW50IG1lc3NhZ2VDb2RlOworICAgIC8qKiBUaGUgc2VyaWFsIG51bWJlciBjb21iaW5lcyBnZW9ncmFwaGljYWwgc2NvcGUsIG1lc3NhZ2UgY29kZSwgYW5kIHVwZGF0ZSBudW1iZXIuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2VyaWFsTnVtYmVyOwogCi0gICAgcHVibGljIGZpbmFsIGludCB1cGRhdGVOdW1iZXI7CisgICAgLyoqIFRoZSBNZXNzYWdlIElkZW50aWZpZXIgaW4gM0dQUCBpcyB0aGUgc2FtZSBhcyB0aGUgU2VydmljZSBDYXRlZ29yeSBpbiBDRE1BLiAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1lc3NhZ2VJZGVudGlmaWVyOwogCi0gICAgcHVibGljIGZpbmFsIGludCBtZXNzYWdlSWRlbnRpZmllcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBkYXRhQ29kaW5nU2NoZW1lOwogCi0gICAgcHVibGljIGZpbmFsIGludCBkYXRhQ29kaW5nU2NoZW1lOworICAgIHByaXZhdGUgZmluYWwgaW50IHBhZ2VJbmRleDsKIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgcGFnZUluZGV4OworICAgIHByaXZhdGUgZmluYWwgaW50IG5yT2ZQYWdlczsKIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgbnJPZlBhZ2VzOworICAgIHByaXZhdGUgZmluYWwgaW50IGZvcm1hdDsKIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZm9ybWF0OworICAgIC8qKiBFVFdTIHdhcm5pbmcgbm90aWZpY2F0aW9uIGluZm8uICovCisgICAgcHJpdmF0ZSBmaW5hbCBTbXNDYkV0d3NJbmZvIG1FdHdzSW5mbzsKIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV0d3NFbWVyZ2VuY3lVc2VyQWxlcnQ7Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBldHdzUG9wdXA7Ci0KLSAgICBwdWJsaWMgZmluYWwgaW50IGV0d3NXYXJuaW5nVHlwZTsKKyAgICAvKiogQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbiBpbmZvLiAqLworICAgIHByaXZhdGUgZmluYWwgU21zQ2JDbWFzSW5mbyBtQ21hc0luZm87CiAKICAgICBwdWJsaWMgU21zQ2JIZWFkZXIoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwZHUgPT0gbnVsbCB8fCBwZHUubGVuZ3RoIDwgUERVX0hFQURFUl9MRU5HVEgpIHsKQEAgLTgzLDIyICs5NywzMSBAQAogCiAgICAgICAgIGlmIChwZHUubGVuZ3RoIDw9IFBEVV9MRU5HVEhfRVRXUykgewogICAgICAgICAgICAgZm9ybWF0ID0gRk9STUFUX0VUV1NfUFJJTUFSWTsKLSAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gLTE7IC8vbm90IGFwcGxpY2FibGUKLSAgICAgICAgICAgIG1lc3NhZ2VDb2RlID0gLTE7Ci0gICAgICAgICAgICB1cGRhdGVOdW1iZXIgPSAtMTsKKyAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gKHBkdVswXSAmIDB4YzApID4+IDY7CisgICAgICAgICAgICBzZXJpYWxOdW1iZXIgPSAoKHBkdVswXSAmIDB4ZmYpIDw8IDgpIHwgKHBkdVsxXSAmIDB4ZmYpOwogICAgICAgICAgICAgbWVzc2FnZUlkZW50aWZpZXIgPSAoKHBkdVsyXSAmIDB4ZmYpIDw8IDgpIHwgKHBkdVszXSAmIDB4ZmYpOwogICAgICAgICAgICAgZGF0YUNvZGluZ1NjaGVtZSA9IC0xOwogICAgICAgICAgICAgcGFnZUluZGV4ID0gLTE7CiAgICAgICAgICAgICBuck9mUGFnZXMgPSAtMTsKLSAgICAgICAgICAgIGV0d3NFbWVyZ2VuY3lVc2VyQWxlcnQgPSAocGR1WzRdICYgMHgxKSAhPSAwOwotICAgICAgICAgICAgZXR3c1BvcHVwID0gKHBkdVs1XSAmIDB4ODApICE9IDA7Ci0gICAgICAgICAgICBldHdzV2FybmluZ1R5cGUgPSAocGR1WzRdICYgMHhmZSkgPj4gMTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW1lcmdlbmN5VXNlckFsZXJ0ID0gKHBkdVs0XSAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZhdGVQb3B1cCA9IChwZHVbNV0gJiAweDgwKSAhPSAwOworICAgICAgICAgICAgaW50IHdhcm5pbmdUeXBlID0gKHBkdVs0XSAmIDB4ZmUpID4+IDE7CisgICAgICAgICAgICBieXRlW10gd2FybmluZ1NlY3VyaXR5SW5mbzsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIFdhcm5pbmctU2VjdXJpdHktSW5mb3JtYXRpb24sIGlmIHByZXNlbnQKKyAgICAgICAgICAgIGlmIChwZHUubGVuZ3RoID4gUERVX0hFQURFUl9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5nU2VjdXJpdHlJbmZvID0gQXJyYXlzLmNvcHlPZlJhbmdlKHBkdSwgNiwgcGR1Lmxlbmd0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdTZWN1cml0eUluZm8gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV0d3NJbmZvID0gbmV3IFNtc0NiRXR3c0luZm8od2FybmluZ1R5cGUsIGVtZXJnZW5jeVVzZXJBbGVydCwgYWN0aXZhdGVQb3B1cCwKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ1NlY3VyaXR5SW5mbyk7CisgICAgICAgICAgICBtQ21hc0luZm8gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOyAgICAgLy8gc2tpcCB0aGUgRVRXUy9DTUFTIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHJlZ3VsYXIgbm90aWZpY2F0aW9ucwogICAgICAgICB9IGVsc2UgaWYgKHBkdS5sZW5ndGggPD0gUERVX0xFTkdUSF9HU00pIHsKICAgICAgICAgICAgIC8vIEdTTSBwZHVzIGFyZSBubyBtb3JlIHRoYW4gODggYnl0ZXMKICAgICAgICAgICAgIGZvcm1hdCA9IEZPUk1BVF9HU007CiAgICAgICAgICAgICBnZW9ncmFwaGljYWxTY29wZSA9IChwZHVbMF0gJiAweGMwKSA+PiA2OwotICAgICAgICAgICAgbWVzc2FnZUNvZGUgPSAoKHBkdVswXSAmIDB4M2YpIDw8IDQpIHwgKChwZHVbMV0gJiAweGYwKSA+PiA0KTsKLSAgICAgICAgICAgIHVwZGF0ZU51bWJlciA9IHBkdVsxXSAmIDB4MGY7CisgICAgICAgICAgICBzZXJpYWxOdW1iZXIgPSAoKHBkdVswXSAmIDB4ZmYpIDw8IDgpIHwgKHBkdVsxXSAmIDB4ZmYpOwogICAgICAgICAgICAgbWVzc2FnZUlkZW50aWZpZXIgPSAoKHBkdVsyXSAmIDB4ZmYpIDw8IDgpIHwgKHBkdVszXSAmIDB4ZmYpOwogICAgICAgICAgICAgZGF0YUNvZGluZ1NjaGVtZSA9IHBkdVs0XSAmIDB4ZmY7CiAKQEAgLTExMyw5ICsxMzYsNiBAQAogCiAgICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKICAgICAgICAgICAgIHRoaXMubnJPZlBhZ2VzID0gbnJPZlBhZ2VzOwotICAgICAgICAgICAgZXR3c0VtZXJnZW5jeVVzZXJBbGVydCA9IGZhbHNlOwotICAgICAgICAgICAgZXR3c1BvcHVwID0gZmFsc2U7Ci0gICAgICAgICAgICBldHdzV2FybmluZ1R5cGUgPSAtMTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFVNVFMgcGR1cyBhcmUgYWx3YXlzIGF0IGxlYXN0IDkwIGJ5dGVzIHNpbmNlIHRoZSBwYXlsb2FkIGluY2x1ZGVzCiAgICAgICAgICAgICAvLyBhIG51bWJlci1vZi1wYWdlcyBvY3RldCBhbmQgYWxzbyBvbmUgbGVuZ3RoIG9jdGV0IHBlciBwYWdlCkBAIC0xMjksOCArMTQ5LDcgQEAKIAogICAgICAgICAgICAgbWVzc2FnZUlkZW50aWZpZXIgPSAoKHBkdVsxXSAmIDB4ZmYpIDw8IDgpIHwgcGR1WzJdICYgMHhmZjsKICAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gKHBkdVszXSAmIDB4YzApID4+IDY7Ci0gICAgICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzNdICYgMHgzZikgPDwgNCkgfCAoKHBkdVs0XSAmIDB4ZjApID4+IDQpOwotICAgICAgICAgICAgdXBkYXRlTnVtYmVyID0gcGR1WzRdICYgMHgwZjsKKyAgICAgICAgICAgIHNlcmlhbE51bWJlciA9ICgocGR1WzNdICYgMHhmZikgPDwgOCkgfCAocGR1WzRdICYgMHhmZik7CiAgICAgICAgICAgICBkYXRhQ29kaW5nU2NoZW1lID0gcGR1WzVdICYgMHhmZjsKIAogICAgICAgICAgICAgLy8gV2Ugd2lsbCBhbHdheXMgY29uc2lkZXIgYSBVTVRTIG1lc3NhZ2UgYXMgaGF2aW5nIG9uZSBzaW5nbGUgcGFnZQpAQCAtMTM4LDc1ICsxNTcsMjUxIEBACiAgICAgICAgICAgICAvLyBhY3R1YWwgcGF5bG9hZCBtYXkgY29udGFpbiBzZXZlcmFsIHBhZ2VzLgogICAgICAgICAgICAgcGFnZUluZGV4ID0gMTsKICAgICAgICAgICAgIG5yT2ZQYWdlcyA9IDE7Ci0gICAgICAgICAgICBldHdzRW1lcmdlbmN5VXNlckFsZXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICBldHdzUG9wdXAgPSBmYWxzZTsKLSAgICAgICAgICAgIGV0d3NXYXJuaW5nVHlwZSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRXR3c01lc3NhZ2UoKSkgeworICAgICAgICAgICAgYm9vbGVhbiBlbWVyZ2VuY3lVc2VyQWxlcnQgPSBpc0V0d3NFbWVyZ2VuY3lVc2VyQWxlcnQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZhdGVQb3B1cCA9IGlzRXR3c1BvcHVwQWxlcnQoKTsKKyAgICAgICAgICAgIGludCB3YXJuaW5nVHlwZSA9IGdldEV0d3NXYXJuaW5nVHlwZSgpOworICAgICAgICAgICAgbUV0d3NJbmZvID0gbmV3IFNtc0NiRXR3c0luZm8od2FybmluZ1R5cGUsIGVtZXJnZW5jeVVzZXJBbGVydCwgYWN0aXZhdGVQb3B1cCwgbnVsbCk7CisgICAgICAgICAgICBtQ21hc0luZm8gPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKGlzQ21hc01lc3NhZ2UoKSkgeworICAgICAgICAgICAgaW50IG1lc3NhZ2VDbGFzcyA9IGdldENtYXNNZXNzYWdlQ2xhc3MoKTsKKyAgICAgICAgICAgIGludCBzZXZlcml0eSA9IGdldENtYXNTZXZlcml0eSgpOworICAgICAgICAgICAgaW50IHVyZ2VuY3kgPSBnZXRDbWFzVXJnZW5jeSgpOworICAgICAgICAgICAgaW50IGNlcnRhaW50eSA9IGdldENtYXNDZXJ0YWludHkoKTsKKyAgICAgICAgICAgIG1FdHdzSW5mbyA9IG51bGw7CisgICAgICAgICAgICBtQ21hc0luZm8gPSBuZXcgU21zQ2JDbWFzSW5mbyhtZXNzYWdlQ2xhc3MsIFNtc0NiQ21hc0luZm8uQ01BU19DQVRFR09SWV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICBTbXNDYkNtYXNJbmZvLkNNQVNfUkVTUE9OU0VfVFlQRV9VTktOT1dOLCBzZXZlcml0eSwgdXJnZW5jeSwgY2VydGFpbnR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1FdHdzSW5mbyA9IG51bGw7CisgICAgICAgICAgICBtQ21hc0luZm8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldEdlb2dyYXBoaWNhbFNjb3BlKCkgeworICAgICAgICByZXR1cm4gZ2VvZ3JhcGhpY2FsU2NvcGU7CisgICAgfQorCisgICAgaW50IGdldFNlcmlhbE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlcmlhbE51bWJlcjsKKyAgICB9CisKKyAgICBpbnQgZ2V0U2VydmljZUNhdGVnb3J5KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUlkZW50aWZpZXI7CisgICAgfQorCisgICAgaW50IGdldERhdGFDb2RpbmdTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBkYXRhQ29kaW5nU2NoZW1lOworICAgIH0KKworICAgIGludCBnZXRQYWdlSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBwYWdlSW5kZXg7CisgICAgfQorCisgICAgaW50IGdldE51bWJlck9mUGFnZXMoKSB7CisgICAgICAgIHJldHVybiBuck9mUGFnZXM7CisgICAgfQorCisgICAgU21zQ2JFdHdzSW5mbyBnZXRFdHdzSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1FdHdzSW5mbzsKKyAgICB9CisKKyAgICBTbXNDYkNtYXNJbmZvIGdldENtYXNJbmZvKCkgeworICAgICAgICByZXR1cm4gbUNtYXNJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgYnJvYWRjYXN0IGlzIGFuIGVtZXJnZW5jeSAoUFdTKSBtZXNzYWdlIHR5cGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWVzc2FnZSBpcyBlbWVyZ2VuY3kgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBpc0VtZXJnZW5jeU1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlSWRlbnRpZmllciA+PSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX1BXU19GSVJTVF9JREVOVElGSUVSCisgICAgICAgICAgICAgICAgJiYgbWVzc2FnZUlkZW50aWZpZXIgPD0gU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9QV1NfTEFTVF9JREVOVElGSUVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgYnJvYWRjYXN0IGlzIGFuIEVUV1MgZW1lcmdlbmN5IG1lc3NhZ2UgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXNzYWdlIGlzIEVUV1MgZW1lcmdlbmN5IHR5cGU7IGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V0d3NNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gKG1lc3NhZ2VJZGVudGlmaWVyICYgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9FVFdTX1RZUEVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0VUV1NfVFlQRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGJyb2FkY2FzdCBpcyBhbiBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgaXMgYW4gRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbjsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBpc0V0d3NQcmltYXJ5Tm90aWZpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gZm9ybWF0ID09IEZPUk1BVF9FVFdTX1BSSU1BUlk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBicm9hZGNhc3QgaXMgaW4gVU1UUyBmb3JtYXQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWVzc2FnZSBpcyBpbiBVTVRTIGZvcm1hdDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBpc1VtdHNGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBmb3JtYXQgPT0gRk9STUFUX1VNVFM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGlzIGEgQ01BUyBlbWVyZ2VuY3kgbWVzc2FnZSB0eXBlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1lc3NhZ2UgaXMgQ01BUyBlbWVyZ2VuY3kgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ21hc01lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlSWRlbnRpZmllciA+PSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfRklSU1RfSURFTlRJRklFUgorICAgICAgICAgICAgICAgICYmIG1lc3NhZ2VJZGVudGlmaWVyIDw9IFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19MQVNUX0lERU5USUZJRVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHBvcHVwIGFsZXJ0IGZsYWcgaXMgc2V0IGZvciBhbiBFVFdTIHdhcm5pbmcgbm90aWZpY2F0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWVzc2FnZSBJRCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yIEVUV1MgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhIHBvcHVwIGFsZXJ0IHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFdHdzUG9wdXBBbGVydCgpIHsKKyAgICAgICAgcmV0dXJuIChzZXJpYWxOdW1iZXIgJiBTbXNDYkNvbnN0YW50cy5TRVJJQUxfTlVNQkVSX0VUV1NfQUNUSVZBVEVfUE9QVVApICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGVtZXJnZW5jeSB1c2VyIGFsZXJ0IGZsYWcgaXMgc2V0IGZvciBhbiBFVFdTIHdhcm5pbmcgbm90aWZpY2F0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWVzc2FnZSBJRCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yIEVUV1MgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhbiBlbWVyZ2VuY3kgdXNlciBhbGVydAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V0d3NFbWVyZ2VuY3lVc2VyQWxlcnQoKSB7CisgICAgICAgIHJldHVybiAoc2VyaWFsTnVtYmVyICYgU21zQ2JDb25zdGFudHMuU0VSSUFMX05VTUJFUl9FVFdTX0VNRVJHRU5DWV9VU0VSX0FMRVJUKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHdhcm5pbmcgdHlwZSBmb3IgYW4gRVRXUyB3YXJuaW5nIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBFVFdTIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBFVFdTIHdhcm5pbmcgdHlwZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQxIHNlY3Rpb24gOS4zLjI0CisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXR3c1dhcm5pbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUlkZW50aWZpZXIgLSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0VUV1NfRUFSVEhRVUFLRV9XQVJOSU5HOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgY2xhc3MgZm9yIGEgQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBDTUFTIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgQ01BUyBtZXNzYWdlIGNsYXNzIGFzIGRlZmluZWQgaW4ge0BsaW5rIFNtc0NiQ21hc0luZm99CisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q21hc01lc3NhZ2VDbGFzcygpIHsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfUFJFU0lERU5USUFMX0xFVkVMOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfUFJFU0lERU5USUFMX0xFVkVMX0FMRVJUOworCisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0lNTUVESUFURV9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX0xJS0VMWToKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfRVhQRUNURURfT0JTRVJWRUQ6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0VYUEVDVEVEX0xJS0VMWToKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX0VYVFJFTUVfVEhSRUFUOworCisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfSU1NRURJQVRFX09CU0VSVkVEOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0lNTUVESUFURV9MSUtFTFk6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfRVhQRUNURURfT0JTRVJWRUQ6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfRVhQRUNURURfTElLRUxZOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfU0VWRVJFX1RIUkVBVDsKKworICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfQ0hJTERfQUJEVUNUSU9OX0VNRVJHRU5DWToKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX0NISUxEX0FCRFVDVElPTl9FTUVSR0VOQ1k7CisKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1JFUVVJUkVEX01PTlRITFlfVEVTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX1JFUVVJUkVEX01PTlRITFlfVEVTVDsKKworICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfRVhFUkNJU0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19DTUFTX0VYRVJDSVNFOworCisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9PUEVSQVRPUl9ERUZJTkVEX1VTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX09QRVJBVE9SX0RFRklORURfVVNFOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0xBU1NfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBJRCBpcyBhbiBlbWVyZ2VuY3kgKFBXUykgbWVzc2FnZSB0eXBlLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgdGFrZXMgYW4gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQotICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciwgd2hpY2ggc3RvcmVzIG1lc3NhZ2UgSUQncyBpbiBTUUxpdGUgcmF0aGVyIHRoYW4gUERVLgotICAgICAqIEBwYXJhbSBpZCB0aGUgbWVzc2FnZSBpZGVudGlmaWVyIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIGVtZXJnZW5jeSB0eXBlOyBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eSBmb3IgYSBDTUFTIHdhcm5pbmcgbm90aWZpY2F0aW9uLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBleHRyZW1lCisgICAgICogYW5kIHNldmVyZSBhbGVydHMsIG5vdCBmb3Igb3RoZXIgdHlwZXMgc3VjaCBhcyBQcmVzaWRlbnRpYWwgTGV2ZWwgYW5kIEFNQkVSIGFsZXJ0cy4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBDTUFTIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgQ01BUyBzZXZlcml0eSBhcyBkZWZpbmVkIGluIHtAbGluayBTbXNDYkNtYXNJbmZvfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtZXJnZW5jeU1lc3NhZ2UoaW50IGlkKSB7Ci0gICAgICAgIHJldHVybiBpZCA+PSBNRVNTQUdFX0lEX1BXU19GSVJTVF9JREVOVElGSUVSICYmIGlkIDw9IE1FU1NBR0VfSURfUFdTX0xBU1RfSURFTlRJRklFUjsKKyAgICBwcml2YXRlIGludCBnZXRDbWFzU2V2ZXJpdHkoKSB7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZUlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX09CU0VSVkVEOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfRVhUUkVNRV9JTU1FRElBVEVfTElLRUxZOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfRVhUUkVNRV9FWFBFQ1RFRF9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfRVhQRUNURURfTElLRUxZOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfU0VWRVJJVFlfRVhUUkVNRTsKKworICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0lNTUVESUFURV9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9JTU1FRElBVEVfTElLRUxZOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0VYUEVDVEVEX09CU0VSVkVEOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0VYUEVDVEVEX0xJS0VMWToKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX1NFVkVSSVRZX1NFVkVSRTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX1NFVkVSSVRZX1VOS05PV047CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgSUQgaXMgYW4gRVRXUyBlbWVyZ2VuY3kgbWVzc2FnZSB0eXBlLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgdGFrZXMgYW4gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQotICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciwgd2hpY2ggc3RvcmVzIG1lc3NhZ2UgSUQncyBpbiBTUUxpdGUgcmF0aGVyIHRoYW4gUERVLgotICAgICAqIEBwYXJhbSBpZCB0aGUgbWVzc2FnZSBpZGVudGlmaWVyIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIEVUV1MgZW1lcmdlbmN5IHR5cGU7IGZhbHNlIG90aGVyd2lzZQorICAgICAqIFJldHVybnMgdGhlIHVyZ2VuY3kgZm9yIGEgQ01BUyB3YXJuaW5nIG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZXh0cmVtZQorICAgICAqIGFuZCBzZXZlcmUgYWxlcnRzLCBub3QgZm9yIG90aGVyIHR5cGVzIHN1Y2ggYXMgUHJlc2lkZW50aWFsIExldmVsIGFuZCBBTUJFUiBhbGVydHMuCisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXNzYWdlIElEIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgQ01BUyB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIENNQVMgdXJnZW5jeSBhcyBkZWZpbmVkIGluIHtAbGluayBTbXNDYkNtYXNJbmZvfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V0d3NNZXNzYWdlKGludCBpZCkgewotICAgICAgICByZXR1cm4gKGlkICYgTUVTU0FHRV9JRF9FVFdTX1RZUEVfTUFTSykgPT0gTUVTU0FHRV9JRF9FVFdTX1RZUEU7CisgICAgcHJpdmF0ZSBpbnQgZ2V0Q21hc1VyZ2VuY3koKSB7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZUlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX09CU0VSVkVEOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfRVhUUkVNRV9JTU1FRElBVEVfTElLRUxZOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0lNTUVESUFURV9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9JTU1FRElBVEVfTElLRUxZOgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfVVJHRU5DWV9JTU1FRElBVEU7CisKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfRVhQRUNURURfT0JTRVJWRUQ6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0VYUEVDVEVEX0xJS0VMWToKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9FWFBFQ1RFRF9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9FWFBFQ1RFRF9MSUtFTFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNtc0NiQ21hc0luZm8uQ01BU19VUkdFTkNZX0VYUEVDVEVEOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfVVJHRU5DWV9VTktOT1dOOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXNzYWdlIElEIGlzIGEgQ01BUyBlbWVyZ2VuY3kgbWVzc2FnZSB0eXBlLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgdGFrZXMgYW4gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQotICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciwgd2hpY2ggc3RvcmVzIG1lc3NhZ2UgSUQncyBpbiBTUUxpdGUgcmF0aGVyIHRoYW4gUERVLgotICAgICAqIEBwYXJhbSBpZCB0aGUgbWVzc2FnZSBpZGVudGlmaWVyIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIENNQVMgZW1lcmdlbmN5IHR5cGU7IGZhbHNlIG90aGVyd2lzZQorICAgICAqIFJldHVybnMgdGhlIGNlcnRhaW50eSBmb3IgYSBDTUFTIHdhcm5pbmcgbm90aWZpY2F0aW9uLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBleHRyZW1lCisgICAgICogYW5kIHNldmVyZSBhbGVydHMsIG5vdCBmb3Igb3RoZXIgdHlwZXMgc3VjaCBhcyBQcmVzaWRlbnRpYWwgTGV2ZWwgYW5kIEFNQkVSIGFsZXJ0cy4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBDTUFTIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgQ01BUyBjZXJ0YWludHkgYXMgZGVmaW5lZCBpbiB7QGxpbmsgU21zQ2JDbWFzSW5mb30KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbWFzTWVzc2FnZShpbnQgaWQpIHsKLSAgICAgICAgcmV0dXJuIGlkID49IE1FU1NBR0VfSURfQ01BU19GSVJTVF9JREVOVElGSUVSICYmIGlkIDw9IE1FU1NBR0VfSURfQ01BU19MQVNUX0lERU5USUZJRVI7Ci0gICAgfQorICAgIHByaXZhdGUgaW50IGdldENtYXNDZXJ0YWludHkoKSB7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZUlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX09CU0VSVkVEOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfRVhUUkVNRV9FWFBFQ1RFRF9PQlNFUlZFRDoKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9JTU1FRElBVEVfT0JTRVJWRUQ6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfRVhQRUNURURfT0JTRVJWRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNtc0NiQ21hc0luZm8uQ01BU19DRVJUQUlOVFlfT0JTRVJWRUQ7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgY29kZSBpbmRpY2F0ZXMgYW4gRVRXUyBwb3B1cCBhbGVydC4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBzdGF0aWMgYW5kIHRha2VzIGFuIGFyZ3VtZW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkKLSAgICAgKiBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIsIHdoaWNoIHN0b3JlcyBtZXNzYWdlIGNvZGVzIGluIFNRTGl0ZSByYXRoZXIgdGhhbiBQRFUuCi0gICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXNzYWdlIElEIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgRVRXUyB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb2RlIHRoZSBtZXNzYWdlIGNvZGUgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgY29kZSBpbmRpY2F0ZXMgYSBwb3B1cCBhbGVydCBzaG91bGQgYmUgZGlzcGxheWVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXR3c1BvcHVwQWxlcnQoaW50IG1lc3NhZ2VDb2RlKSB7Ci0gICAgICAgIHJldHVybiAobWVzc2FnZUNvZGUgJiBNRVNTQUdFX0NPREVfRVRXU19BQ1RJVkFURV9QT1BVUCkgIT0gMDsKLSAgICB9CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0lNTUVESUFURV9MSUtFTFk6CisgICAgICAgICAgICBjYXNlIFNtc0NiQ29uc3RhbnRzLk1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0VYUEVDVEVEX0xJS0VMWToKKyAgICAgICAgICAgIGNhc2UgU21zQ2JDb25zdGFudHMuTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1NFVkVSRV9JTU1FRElBVEVfTElLRUxZOgorICAgICAgICAgICAgY2FzZSBTbXNDYkNvbnN0YW50cy5NRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0VYUEVDVEVEX0xJS0VMWToKKyAgICAgICAgICAgICAgICByZXR1cm4gU21zQ2JDbWFzSW5mby5DTUFTX0NFUlRBSU5UWV9MSUtFTFk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgY29kZSBpbmRpY2F0ZXMgYW4gRVRXUyBlbWVyZ2VuY3kgdXNlciBhbGVydC4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBzdGF0aWMgYW5kIHRha2VzIGFuIGFyZ3VtZW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkKLSAgICAgKiBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIsIHdoaWNoIHN0b3JlcyBtZXNzYWdlIGNvZGVzIGluIFNRTGl0ZSByYXRoZXIgdGhhbiBQRFUuCi0gICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXNzYWdlIElEIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgRVRXUyB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb2RlIHRoZSBtZXNzYWdlIGNvZGUgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgY29kZSBpbmRpY2F0ZXMgYW4gZW1lcmdlbmN5IHVzZXIgYWxlcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFdHdzRW1lcmdlbmN5VXNlckFsZXJ0KGludCBtZXNzYWdlQ29kZSkgewotICAgICAgICByZXR1cm4gKG1lc3NhZ2VDb2RlICYgTUVTU0FHRV9DT0RFX0VUV1NfRU1FUkdFTkNZX1VTRVJfQUxFUlQpICE9IDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBTbXNDYkNtYXNJbmZvLkNNQVNfQ0VSVEFJTlRZX1VOS05PV047CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNtc0NiSGVhZGVye0dTPSIgKyBnZW9ncmFwaGljYWxTY29wZSArICIsIG1lc3NhZ2VDb2RlPTB4IiArCi0gICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtZXNzYWdlQ29kZSkgKyAiLCB1cGRhdGVOdW1iZXI9IiArIHVwZGF0ZU51bWJlciArCisgICAgICAgIHJldHVybiAiU21zQ2JIZWFkZXJ7R1M9IiArIGdlb2dyYXBoaWNhbFNjb3BlICsgIiwgc2VyaWFsTnVtYmVyPTB4IiArCisgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhzZXJpYWxOdW1iZXIpICsKICAgICAgICAgICAgICAgICAiLCBtZXNzYWdlSWRlbnRpZmllcj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1lc3NhZ2VJZGVudGlmaWVyKSArCiAgICAgICAgICAgICAgICAgIiwgRENTPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoZGF0YUNvZGluZ1NjaGVtZSkgKwogICAgICAgICAgICAgICAgICIsIHBhZ2UgIiArIHBhZ2VJbmRleCArICIgb2YgIiArIG5yT2ZQYWdlcyArICd9JzsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNtc0NiVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU21zQ2JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YzBiMgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNtc0NiVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc0NiQ21hc0luZm87CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LmNkbWEuQ2RtYVNtc0NiUHJvZ3JhbURhdGE7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuQmVhcmVyRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuQ2RtYVNtc0FkZHJlc3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlNtc0VudmVsb3BlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkJpdHdpc2VPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogVGVzdCBjYXNlcyBmb3IgYmFzaWMgU21zQ2JNZXNzYWdlIG9wZXJhdGlvbiBmb3IgQ0RNQS4KKyAqLworcHVibGljIGNsYXNzIENkbWFTbXNDYlRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyogQ29weSBvZiBwcml2YXRlIHN1YnBhcmFtZXRlciBpZGVudGlmaWVyIGNvbnN0YW50cyBmcm9tIEJlYXJlckRhdGEgY2xhc3MuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0lERU5USUZJRVIgICA9IChieXRlKSAweDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1VCUEFSQU1fVVNFUl9EQVRBICAgICAgICAgICAgPSAoYnl0ZSkgMHgwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNVQlBBUkFNX1BSSU9SSVRZX0lORElDQVRPUiAgID0gKGJ5dGUpIDB4MDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVUJQQVJBTV9MQU5HVUFHRV9JTkRJQ0FUT1IgICA9IChieXRlKSAweDBEOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEEgICAgPSAweDEyOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhIFBhcmNlbCBmb3IgYW4gaW5jb21pbmcgQ0RNQSBjZWxsIGJyb2FkY2FzdC4gVGhlIGNhbGxlciB3aWxsIHdyaXRlIHRoZQorICAgICAqIGJlYXJlciBkYXRhIGFuZCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gU21zTWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZUNhdGVnb3J5IHRoZSBDRE1BIHNlcnZpY2UgY2F0ZWdvcnkKKyAgICAgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplZCBQYXJjZWwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBQYXJjZWwgY3JlYXRlQnJvYWRjYXN0UGFyY2VsKGludCBzZXJ2aWNlQ2F0ZWdvcnkpIHsKKyAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgcC53cml0ZUludChTbXNFbnZlbG9wZS5URUxFU0VSVklDRV9OT1RfU0VUKTsKKyAgICAgICAgcC53cml0ZUJ5dGUoKGJ5dGUpIDEpOyAgLy8gbm9uLXplcm8gZm9yIE1FU1NBR0VfVFlQRV9CUk9BRENBU1QKKyAgICAgICAgcC53cml0ZUludChzZXJ2aWNlQ2F0ZWdvcnkpOworCisgICAgICAgIC8vIGR1bW15IGFkZHJlc3MgKFJJTCBtYXkgZ2VuZXJhdGUgYSBkaWZmZXJlbnQgZHVtbXkgYWRkcmVzcyBmb3IgYnJvYWRjYXN0cykKKyAgICAgICAgcC53cml0ZUludChDZG1hU21zQWRkcmVzcy5ESUdJVF9NT0RFXzRCSVRfRFRNRik7ICAgICAgICAgICAgLy8gc0FkZHJlc3MuZGlnaXRfbW9kZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLk5VTUJFUl9NT0RFX05PVF9EQVRBX05FVFdPUkspOyAgICAvLyBzQWRkcmVzcy5udW1iZXJfbW9kZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLlRPTl9VTktOT1dOKTsgICAgICAgICAgICAgICAgICAgICAvLyBzQWRkcmVzcy5udW1iZXJfdHlwZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLk5VTUJFUklOR19QTEFOX0lTRE5fVEVMRVBIT05ZKTsgICAvLyBzQWRkcmVzcy5udW1iZXJfcGxhbgorICAgICAgICBwLndyaXRlQnl0ZSgoYnl0ZSkgMCk7ICAgICAgLy8gc0FkZHJlc3MubnVtYmVyX29mX2RpZ2l0cworICAgICAgICBwLndyaXRlSW50KChieXRlKSAwKTsgICAgICAgLy8gc1N1YkFkZHJlc3Muc3ViYWRkcmVzc1R5cGUKKyAgICAgICAgcC53cml0ZUJ5dGUoKGJ5dGUpIDApOyAgICAgIC8vIHNTdWJBZGRyZXNzLm9kZAorICAgICAgICBwLndyaXRlQnl0ZSgoYnl0ZSkgMCk7ICAgICAgLy8gc1N1YkFkZHJlc3MubnVtYmVyX29mX2RpZ2l0cworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGEgQml0d2lzZU91dHB1dFN0cmVhbSB3aXRoIHRoZSBDRE1BIGJlYXJlciBkYXRhIHN1YnBhcmFtZXRlcnMgZXhjZXB0IGZvcgorICAgICAqIHVzZXIgZGF0YS4gVGhlIGNhbGxlciB3aWxsIGFwcGVuZCB0aGUgdXNlciBkYXRhIGFuZCBhZGQgaXQgdG8gdGhlIHBhcmNlbC4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIHRoZSAxNi1iaXQgbWVzc2FnZSBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHByaW9yaXR5IG1lc3NhZ2UgcHJpb3JpdHkKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbWVzc2FnZSBsYW5ndWFnZSBjb2RlCisgICAgICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZWQgQml0d2lzZU91dHB1dFN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJpdHdpc2VPdXRwdXRTdHJlYW0gY3JlYXRlQmVhcmVyRGF0YVN0cmVhbShpbnQgbWVzc2FnZUlkLCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICBpbnQgbGFuZ3VhZ2UpIHRocm93cyBCaXR3aXNlT3V0cHV0U3RyZWFtLkFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEJpdHdpc2VPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJpdHdpc2VPdXRwdXRTdHJlYW0oMTApOworICAgICAgICBib3Mud3JpdGUoOCwgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIDMpOyAgICAvLyBsZW5ndGg6IDMgYnl0ZXMKKyAgICAgICAgYm9zLndyaXRlKDQsIEJlYXJlckRhdGEuTUVTU0FHRV9UWVBFX0RFTElWRVIpOworICAgICAgICBib3Mud3JpdGUoOCwgKChtZXNzYWdlSWQgPj4+IDgpICYgMHhmZikpOworICAgICAgICBib3Mud3JpdGUoOCwgKG1lc3NhZ2VJZCAmIDB4ZmYpKTsKKyAgICAgICAgYm9zLndyaXRlKDEsIDApOyAgICAvLyBubyBVc2VyIERhdGEgSGVhZGVyCisgICAgICAgIGJvcy53cml0ZSgzLCAwKTsgICAgLy8gcmVzZXJ2ZWQKKworICAgICAgICBpZiAocHJpb3JpdHkgIT0gLTEpIHsKKyAgICAgICAgICAgIGJvcy53cml0ZSg4LCBTVUJQQVJBTV9QUklPUklUWV9JTkRJQ0FUT1IpOworICAgICAgICAgICAgYm9zLndyaXRlKDgsIDEpOyAgICAvLyBsZW5ndGg6IDEgYnl0ZQorICAgICAgICAgICAgYm9zLndyaXRlKDIsIChwcmlvcml0eSAmIDB4MDMpKTsKKyAgICAgICAgICAgIGJvcy53cml0ZSg2LCAwKTsgICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYW5ndWFnZSAhPSAtMSkgeworICAgICAgICAgICAgYm9zLndyaXRlKDgsIFNVQlBBUkFNX0xBTkdVQUdFX0lORElDQVRPUik7CisgICAgICAgICAgICBib3Mud3JpdGUoOCwgMSk7ICAgIC8vIGxlbmd0aDogMSBieXRlCisgICAgICAgICAgICBib3Mud3JpdGUoOCwgKGxhbmd1YWdlICYgMHhmZikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgYmVhcmVyIGRhdGEgYXJyYXkgdG8gdGhlIHBhcmNlbCwgdGhlbiByZXR1cm4gYSBuZXcgU21zTWVzc2FnZSBmcm9tIHRoZSBwYXJjZWwuCisgICAgICogQHBhcmFtIHAgdGhlIHBhcmNlbCBjb250YWluaW5nIHRoZSBDRE1BIFNNUyBoZWFkZXJzCisgICAgICogQHBhcmFtIGJlYXJlckRhdGEgdGhlIGJlYXJlciBkYXRhIGJ5dGUgYXJyYXkgdG8gYXBwZW5kIHRvIHRoZSBwYXJjZWwKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgU21zTWVzc2FnZSBjcmVhdGVkIGZyb20gdGhlIHBhcmNlbAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNtc01lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21QYXJjZWwoUGFyY2VsIHAsIGJ5dGVbXSBiZWFyZXJEYXRhKSB7CisgICAgICAgIHAud3JpdGVJbnQoYmVhcmVyRGF0YS5sZW5ndGgpOworICAgICAgICBmb3IgKGJ5dGUgYiA6IGJlYXJlckRhdGEpIHsKKyAgICAgICAgICAgIHAud3JpdGVCeXRlKGIpOworICAgICAgICB9CisgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOyAgIC8vIHJlc2V0IHBvc2l0aW9uIGZvciByZWFkaW5nCisgICAgICAgIFNtc01lc3NhZ2UgbWVzc2FnZSA9IFNtc01lc3NhZ2UubmV3RnJvbVBhcmNlbChwKTsKKyAgICAgICAgcC5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHBhcmNlbCBmb3IgYW4gaW5jb21pbmcgQ01BUyBicm9hZGNhc3QsIHRoZW4gcmV0dXJuIGEgbmV3IFNtc01lc3NhZ2UgY3JlYXRlZAorICAgICAqIGZyb20gdGhlIHBhcmNlbC4KKyAgICAgKiBAcGFyYW0gc2VydmljZUNhdGVnb3J5IHRoZSBDRE1BIHNlcnZpY2UgY2F0ZWdvcnkKKyAgICAgKiBAcGFyYW0gbWVzc2FnZUlkIHRoZSAxNi1iaXQgbWVzc2FnZSBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHByaW9yaXR5IG1lc3NhZ2UgcHJpb3JpdHkKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbWVzc2FnZSBsYW5ndWFnZSBjb2RlCisgICAgICogQHBhcmFtIGJvZHkgbWVzc2FnZSBib2R5CisgICAgICogQHBhcmFtIGNtYXNDYXRlZ29yeSBDTUFTIGNhdGVnb3J5IChvciAtMSB0byBza2lwIGFkZGluZyBDTUFTIHR5cGUgMSBlbGVtZW50cyByZWNvcmQpCisgICAgICogQHBhcmFtIHJlc3BvbnNlVHlwZSBDTUFTIHJlc3BvbnNlIHR5cGUKKyAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgQ01BUyBzZXZlcml0eQorICAgICAqIEBwYXJhbSB1cmdlbmN5IENNQVMgdXJnZW5jeQorICAgICAqIEBwYXJhbSBjZXJ0YWludHkgQ01BUyBjZXJ0YWludHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIFNtc01lc3NhZ2Ugb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU21zTWVzc2FnZSBjcmVhdGVDbWFzU21zTWVzc2FnZShpbnQgc2VydmljZUNhdGVnb3J5LCBpbnQgbWVzc2FnZUlkLCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICBpbnQgbGFuZ3VhZ2UsIGludCBlbmNvZGluZywgU3RyaW5nIGJvZHksIGludCBjbWFzQ2F0ZWdvcnksIGludCByZXNwb25zZVR5cGUsCisgICAgICAgICAgICBpbnQgc2V2ZXJpdHksIGludCB1cmdlbmN5LCBpbnQgY2VydGFpbnR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQml0d2lzZU91dHB1dFN0cmVhbSBjbWFzQm9zID0gbmV3IEJpdHdpc2VPdXRwdXRTdHJlYW0oMTApOworICAgICAgICBjbWFzQm9zLndyaXRlKDgsIDApOyAgICAvLyBDTUFFIHByb3RvY29sIHZlcnNpb24gMAorCisgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtYXNCb3Mud3JpdGUoOCwgMCk7ICAgICAgICAvLyBUeXBlIDAgZWxlbWVudHMgKGFsZXJ0IHRleHQpCisgICAgICAgICAgICBlbmNvZGVCb2R5KGVuY29kaW5nLCBib2R5LCB0cnVlLCBjbWFzQm9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbWFzQ2F0ZWdvcnkgIT0gU21zQ2JDbWFzSW5mby5DTUFTX0NBVEVHT1JZX1VOS05PV04pIHsKKyAgICAgICAgICAgIGNtYXNCb3Mud3JpdGUoOCwgMSk7ICAgIC8vIFR5cGUgMSBlbGVtZW50cworICAgICAgICAgICAgY21hc0Jvcy53cml0ZSg4LCA0KTsgICAgLy8gbGVuZ3RoOiA0IGJ5dGVzCisgICAgICAgICAgICBjbWFzQm9zLndyaXRlKDgsIChjbWFzQ2F0ZWdvcnkgJiAweGZmKSk7CisgICAgICAgICAgICBjbWFzQm9zLndyaXRlKDgsIChyZXNwb25zZVR5cGUgJiAweGZmKSk7CisgICAgICAgICAgICBjbWFzQm9zLndyaXRlKDQsIChzZXZlcml0eSAmIDB4MGYpKTsKKyAgICAgICAgICAgIGNtYXNCb3Mud3JpdGUoNCwgKHVyZ2VuY3kgJiAweDBmKSk7CisgICAgICAgICAgICBjbWFzQm9zLndyaXRlKDQsIChjZXJ0YWludHkgJiAweDBmKSk7CisgICAgICAgICAgICBjbWFzQm9zLndyaXRlKDQsIDApOyAgICAvLyBwYWQgdG8gb2N0ZXQgYm91bmRhcnkKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBjbWFzVXNlckRhdGEgPSBjbWFzQm9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgUGFyY2VsIHAgPSBjcmVhdGVCcm9hZGNhc3RQYXJjZWwoc2VydmljZUNhdGVnb3J5KTsKKyAgICAgICAgQml0d2lzZU91dHB1dFN0cmVhbSBib3MgPSBjcmVhdGVCZWFyZXJEYXRhU3RyZWFtKG1lc3NhZ2VJZCwgcHJpb3JpdHksIGxhbmd1YWdlKTsKKworICAgICAgICBib3Mud3JpdGUoOCwgU1VCUEFSQU1fVVNFUl9EQVRBKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIGNtYXNVc2VyRGF0YS5sZW5ndGggKyAyKTsgIC8vIGFkZCAyIGJ5dGVzIGZvciBtc2dfZW5jb2RpbmcgYW5kIG51bV9maWVsZHMKKyAgICAgICAgYm9zLndyaXRlKDUsIFVzZXJEYXRhLkVOQ09ESU5HX09DVEVUKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIGNtYXNVc2VyRGF0YS5sZW5ndGgpOworICAgICAgICBib3Mud3JpdGVCeXRlQXJyYXkoY21hc1VzZXJEYXRhLmxlbmd0aCAqIDgsIGNtYXNVc2VyRGF0YSk7CisgICAgICAgIGJvcy53cml0ZSgzLCAwKTsgICAgLy8gcGFkIHRvIGJ5dGUgYm91bmRhcnkKKworICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QYXJjZWwocCwgYm9zLnRvQnl0ZUFycmF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHBhcmNlbCBmb3IgYW4gaW5jb21pbmcgQ0RNQSBjZWxsIGJyb2FkY2FzdCwgdGhlbiByZXR1cm4gYSBuZXcgU21zTWVzc2FnZSBjcmVhdGVkCisgICAgICogZnJvbSB0aGUgcGFyY2VsLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2F0ZWdvcnkgdGhlIENETUEgc2VydmljZSBjYXRlZ29yeQorICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgdGhlIDE2LWJpdCBtZXNzYWdlIGlkZW50aWZpZXIKKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgbWVzc2FnZSBwcmlvcml0eQorICAgICAqIEBwYXJhbSBsYW5ndWFnZSBtZXNzYWdlIGxhbmd1YWdlIGNvZGUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdXNlciBkYXRhIGVuY29kaW5nIG1ldGhvZAorICAgICAqIEBwYXJhbSBib2R5IHRoZSBtZXNzYWdlIGJvZHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIFNtc01lc3NhZ2Ugb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU21zTWVzc2FnZSBjcmVhdGVCcm9hZGNhc3RTbXNNZXNzYWdlKGludCBzZXJ2aWNlQ2F0ZWdvcnksIGludCBtZXNzYWdlSWQsCisgICAgICAgICAgICBpbnQgcHJpb3JpdHksIGludCBsYW5ndWFnZSwgaW50IGVuY29kaW5nLCBTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBwID0gY3JlYXRlQnJvYWRjYXN0UGFyY2VsKHNlcnZpY2VDYXRlZ29yeSk7CisgICAgICAgIEJpdHdpc2VPdXRwdXRTdHJlYW0gYm9zID0gY3JlYXRlQmVhcmVyRGF0YVN0cmVhbShtZXNzYWdlSWQsIHByaW9yaXR5LCBsYW5ndWFnZSk7CisKKyAgICAgICAgYm9zLndyaXRlKDgsIFNVQlBBUkFNX1VTRVJfREFUQSk7CisgICAgICAgIGVuY29kZUJvZHkoZW5jb2RpbmcsIGJvZHksIGZhbHNlLCBib3MpOworCisgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlRnJvbVBhcmNlbChwLCBib3MudG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBtZXNzYWdlIGxlbmd0aCwgZW5jb2RpbmcsIGFuZCBib2R5IHRvIHRoZSBCZWFyZXJEYXRhIG91dHB1dCBzdHJlYW0uCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB3cml0aW5nIHRoZSBVc2VyIERhdGEgc3VicGFyYW1ldGVyIGZvciBub24tQ01BUyBicm9hZGNhc3RzIGFuZCBmb3IKKyAgICAgKiB3cml0aW5nIHRoZSBhbGVydCB0ZXh0IGZvciBDTUFTIGJyb2FkY2FzdHMuCisgICAgICogQHBhcmFtIGVuY29kaW5nIG9uZSBvZiB0aGUgQ0RNQSBVc2VyRGF0YSBlbmNvZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgbWVzc2FnZSBib2R5CisgICAgICogQHBhcmFtIGlzQ21hc1JlY29yZCB0cnVlIGlmIHRoaXMgaXMgYSBDTUFTIHR5cGUgMCBlbGVtZW50cyByZWNvcmQ7IGZhbHNlIGZvciB1c2VyIGRhdGEKKyAgICAgKiBAcGFyYW0gYm9zIHRoZSBCaXR3aXNlT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHRocm93cyBFeGNlcHRpb24gb24gYW55IGVuY29kaW5nIGVycm9yCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGVCb2R5KGludCBlbmNvZGluZywgU3RyaW5nIGJvZHksIGJvb2xlYW4gaXNDbWFzUmVjb3JkLAorICAgICAgICAgICAgQml0d2lzZU91dHB1dFN0cmVhbSBib3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSSB8fCBlbmNvZGluZyA9PSBVc2VyRGF0YS5FTkNPRElOR19JQTUpIHsKKyAgICAgICAgICAgIGludCBjaGFyQ291bnQgPSBib2R5Lmxlbmd0aCgpOworICAgICAgICAgICAgaW50IHJlY29yZEJpdHMgPSAoY2hhckNvdW50ICogNykgKyA1OyAgICAgICAvLyBhZGQgNSBiaXRzIGZvciBjaGFyIHNldCBmaWVsZAorICAgICAgICAgICAgaW50IHJlY29yZE9jdGV0cyA9IChyZWNvcmRCaXRzICsgNykgLyA4OyAgICAvLyByb3VuZCB1cCB0byBvY3RldCBib3VuZGFyeQorICAgICAgICAgICAgaW50IHBhZEJpdHMgPSAocmVjb3JkT2N0ZXRzICogOCkgLSByZWNvcmRCaXRzOworCisgICAgICAgICAgICBpZiAoIWlzQ21hc1JlY29yZCkgeworICAgICAgICAgICAgICAgIHJlY29yZE9jdGV0cysrOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgOCBiaXRzIGZvciBudW1fZmllbGRzCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvcy53cml0ZSg4LCByZWNvcmRPY3RldHMpOworICAgICAgICAgICAgYm9zLndyaXRlKDUsIChlbmNvZGluZyAmIDB4MWYpKTsKKworICAgICAgICAgICAgaWYgKCFpc0NtYXNSZWNvcmQpIHsKKyAgICAgICAgICAgICAgICBib3Mud3JpdGUoOCwgY2hhckNvdW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGJvcy53cml0ZSg3LCBib2R5LmNoYXJBdChpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvcy53cml0ZShwYWRCaXRzLCAwKTsgICAgICAvLyBwYWQgdG8gb2N0ZXQgYm91bmRhcnkKKyAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSBVc2VyRGF0YS5FTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVAorICAgICAgICAgICAgICAgIHx8IGVuY29kaW5nID09IFVzZXJEYXRhLkVOQ09ESU5HX0dTTV9EQ1MpIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gNy1iaXQgcGFja2VkIGVuY29kaW5nIHdpdGggc2VwdGV0IGNvdW50IGluIGluZGV4IDAgb2YgYnl0ZSBhcnJheQorICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWRCb2R5ID0gR3NtQWxwaGFiZXQuc3RyaW5nVG9Hc203Qml0UGFja2VkKGJvZHkpOworCisgICAgICAgICAgICBpbnQgY2hhckNvdW50ID0gZW5jb2RlZEJvZHlbMF07ICAgICAgICAgICAgIC8vIHNlcHRldCBjb3VudAorICAgICAgICAgICAgaW50IHJlY29yZEJpdHMgPSAoY2hhckNvdW50ICogNykgKyA1OyAgICAgICAvLyBhZGQgNSBiaXRzIGZvciBjaGFyIHNldCBmaWVsZAorICAgICAgICAgICAgaW50IHJlY29yZE9jdGV0cyA9IChyZWNvcmRCaXRzICsgNykgLyA4OyAgICAvLyByb3VuZCB1cCB0byBvY3RldCBib3VuZGFyeQorICAgICAgICAgICAgaW50IHBhZEJpdHMgPSAocmVjb3JkT2N0ZXRzICogOCkgLSByZWNvcmRCaXRzOworCisgICAgICAgICAgICBpZiAoIWlzQ21hc1JlY29yZCkgeworICAgICAgICAgICAgICAgIHJlY29yZE9jdGV0cysrOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgOCBiaXRzIGZvciBudW1fZmllbGRzCisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IFVzZXJEYXRhLkVOQ09ESU5HX0dTTV9EQ1MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkT2N0ZXRzKys7ICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIDggYml0cyBmb3IgRENTIChtZXNzYWdlIHR5cGUpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib3Mud3JpdGUoOCwgcmVjb3JkT2N0ZXRzKTsKKyAgICAgICAgICAgIGJvcy53cml0ZSg1LCAoZW5jb2RpbmcgJiAweDFmKSk7CisKKyAgICAgICAgICAgIGlmICghaXNDbWFzUmVjb3JkICYmIGVuY29kaW5nID09IFVzZXJEYXRhLkVOQ09ESU5HX0dTTV9EQ1MpIHsKKyAgICAgICAgICAgICAgICBib3Mud3JpdGUoOCwgMCk7ICAgICAgICAvLyBHU00gRENTOiA3IGJpdCBkZWZhdWx0IGFscGhhYmV0LCBubyBtc2cgY2xhc3MKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc0NtYXNSZWNvcmQpIHsKKyAgICAgICAgICAgICAgICBib3Mud3JpdGUoOCwgY2hhckNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVbXSBib2R5U2VwdGV0cyA9IEFycmF5cy5jb3B5T2ZSYW5nZShlbmNvZGVkQm9keSwgMSwgZW5jb2RlZEJvZHkubGVuZ3RoKTsKKyAgICAgICAgICAgIGJvcy53cml0ZUJ5dGVBcnJheShjaGFyQ291bnQgKiA3LCBib2R5U2VwdGV0cyk7CisgICAgICAgICAgICBib3Mud3JpdGUocGFkQml0cywgMCk7ICAgICAgLy8gcGFkIHRvIG9jdGV0IGJvdW5kYXJ5CisgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gVXNlckRhdGEuRU5DT0RJTkdfSVM5MV9FWFRFTkRFRF9QUk9UT0NPTCkgeworICAgICAgICAgICAgLy8gNiBiaXQgcGFja2VkIGVuY29kaW5nIHdpdGggMHgyMCBvZmZzZXQgKEFTQ0lJIDB4MjAgLSAweDYwKQorICAgICAgICAgICAgaW50IGNoYXJDb3VudCA9IGJvZHkubGVuZ3RoKCk7CisgICAgICAgICAgICBpbnQgcmVjb3JkQml0cyA9IChjaGFyQ291bnQgKiA2KSArIDIxOyAgICAgIC8vIGFkZCAyMSBiaXRzIGZvciBoZWFkZXIgZmllbGRzCisgICAgICAgICAgICBpbnQgcmVjb3JkT2N0ZXRzID0gKHJlY29yZEJpdHMgKyA3KSAvIDg7ICAgIC8vIHJvdW5kIHVwIHRvIG9jdGV0IGJvdW5kYXJ5CisgICAgICAgICAgICBpbnQgcGFkQml0cyA9IChyZWNvcmRPY3RldHMgKiA4KSAtIHJlY29yZEJpdHM7CisKKyAgICAgICAgICAgIGJvcy53cml0ZSg4LCByZWNvcmRPY3RldHMpOworCisgICAgICAgICAgICBib3Mud3JpdGUoNSwgKGVuY29kaW5nICYgMHgxZikpOworICAgICAgICAgICAgYm9zLndyaXRlKDgsIFVzZXJEYXRhLklTOTFfTVNHX1RZUEVfU0hPUlRfTUVTU0FHRSk7CisgICAgICAgICAgICBib3Mud3JpdGUoOCwgY2hhckNvdW50KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGJvcy53cml0ZSg2LCAoKGludCkgYm9keS5jaGFyQXQoaSkgLSAweDIwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvcy53cml0ZShwYWRCaXRzLCAwKTsgICAgICAvLyBwYWQgdG8gb2N0ZXQgYm91bmRhcnkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkQm9keTsKKyAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX1VOSUNPREVfMTY6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRCb2R5ID0gYm9keS5nZXRCeXRlcygiVVRGLTE2QkUiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX1NISUZUX0pJUzoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEJvZHkgPSBib2R5LmdldEJ5dGVzKCJTaGlmdF9KSVMiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVzZXJEYXRhLkVOQ09ESU5HX0tPUkVBTjoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEJvZHkgPSBib2R5LmdldEJ5dGVzKCJLU0M1NjAxIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19MQVRJTl9IRUJSRVc6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRCb2R5ID0gYm9keS5nZXRCeXRlcygiSVNPLTg4NTktOCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfTEFUSU46CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEJvZHkgPSBib2R5LmdldEJ5dGVzKCJJU08tODg1OS0xIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNoYXJDb3VudCA9IGJvZHkubGVuZ3RoKCk7ICAgICAgICAgICAgICAvLyB1c2UgYWN0dWFsIGNoYXIgY291bnQgZm9yIG51bSBmaWVsZHMKKyAgICAgICAgICAgIGludCByZWNvcmRPY3RldHMgPSBlbmNvZGVkQm9keS5sZW5ndGggKyAxOyAgLy8gYWRkIDEgYnl0ZSBmb3IgZW5jb2RpbmcgYW5kIHBhZCBiaXRzCisgICAgICAgICAgICBpZiAoIWlzQ21hc1JlY29yZCkgeworICAgICAgICAgICAgICAgIHJlY29yZE9jdGV0cysrOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgOCBiaXRzIGZvciBudW1fZmllbGRzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBib3Mud3JpdGUoOCwgcmVjb3JkT2N0ZXRzKTsKKyAgICAgICAgICAgIGJvcy53cml0ZSg1LCAoZW5jb2RpbmcgJiAweDFmKSk7CisgICAgICAgICAgICBpZiAoIWlzQ21hc1JlY29yZCkgeworICAgICAgICAgICAgICAgIGJvcy53cml0ZSg4LCBjaGFyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9zLndyaXRlQnl0ZUFycmF5KGVuY29kZWRCb2R5Lmxlbmd0aCAqIDgsIGVuY29kZWRCb2R5KTsKKyAgICAgICAgICAgIGJvcy53cml0ZSgzLCAwKTsgICAgICAgICAgICAvLyBwYWQgdG8gb2N0ZXQgYm91bmRhcnkKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RFWFQgPSAiVGhpcyBpcyBhIHRlc3QgQ0RNQSBjZWxsIGJyb2FkY2FzdCBtZXNzYWdlLi4uIgorICAgICAgICAgICAgKyAiNjc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTX0FMRVJUID0KKyAgICAgICAgICAgICJUSEUgUFJFU0lERU5UIEhBUyBJU1NVRUQgQU4gRU1FUkdFTkNZIEFMRVJULiBDSEVDSyBMT0NBTCBNRURJQSBGT1IgTU9SRSBERVRBSUxTIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSRU1FX0FMRVJUID0gIkZMQVNIIEZMT09EIFdBUk5JTkcgRk9SIFNPVVRIIENPQ09OSU5PIENPVU5UWSIKKyAgICAgICAgICAgICsgIiAtIE5PUlRIIENFTlRSQUwgQVJJWk9OQSBVTlRJTCA0MTUgUE0gTVNUIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVZFUkVfQUxFUlQgPSAiU0VWRVJFIFdFQVRIRVIgV0FSTklORyBGT1IgU09NRVJTRVQgQ09VTlRZIgorICAgICAgICAgICAgKyAiIC0gTkVXIEpFUlNFWSBVTlRJTCA0MTUgUE0gTVNUIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTUJFUl9BTEVSVCA9CisgICAgICAgICAgICAiQU1CRVIgQUxFUlQ6TW91bnRhaW4gVmlldyxDQSBWRUgnMDcgQmx1ZSBIb25kYSBDaXZpYyBDQSBMSUMgNUFCQzEyMyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEhMWV9URVNUX0FMRVJUID0gIlRoaXMgaXMgYSB0ZXN0IG9mIHRoZSBlbWVyZ2VuY3kgYWxlcnQgc3lzdGVtLiIKKyAgICAgICAgICAgICsgIiBUaGlzIGlzIG9ubHkgYSB0ZXN0LiA4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM5MV9URVhUID0gIklTOTEgU0hPUlQgTVNHIjsgICAvLyBtYXggbGVuZ3RoIDE0IGNoYXJzCisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgU21zQ2JNZXNzYWdlIGhhcyB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yIENETUEuCisgICAgICogQHBhcmFtIGNiTWVzc2FnZSB0aGUgbWVzc2FnZSB0byB0ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlDYlZhbHVlcyhTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYk1lc3NhZ2UuTUVTU0FHRV9GT1JNQVRfM0dQUDIsIGNiTWVzc2FnZS5nZXRNZXNzYWdlRm9ybWF0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9QTE1OX1dJREUsIGNiTWVzc2FnZS5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYk1lc3NhZ2UuaXNFdHdzTWVzc2FnZSgpKTsgLy8gRVRXUyBvbiBDRE1BIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1Rlc3ROb25FbWVyZ2VuY3lCcm9hZGNhc3QoaW50IGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVCcm9hZGNhc3RTbXNNZXNzYWdlKDEyMywgNDU2LCBCZWFyZXJEYXRhLlBSSU9SSVRZX05PUk1BTCwKKyAgICAgICAgICAgICAgICBCZWFyZXJEYXRhLkxBTkdVQUdFX0VOR0xJU0gsIGVuY29kaW5nLCBURVNUX1RFWFQpOworCisgICAgICAgIFNtc0NiTWVzc2FnZSBjYk1lc3NhZ2UgPSBtc2cucGFyc2VCcm9hZGNhc3RTbXMoKTsKKyAgICAgICAgdmVyaWZ5Q2JWYWx1ZXMoY2JNZXNzYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgY2JNZXNzYWdlLmdldFNlcnZpY2VDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQ1NiwgY2JNZXNzYWdlLmdldFNlcmlhbE51bWJlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0NiTWVzc2FnZS5NRVNTQUdFX1BSSU9SSVRZX05PUk1BTCwgY2JNZXNzYWdlLmdldE1lc3NhZ2VQcmlvcml0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIGNiTWVzc2FnZS5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1RFWFQsIGNiTWVzc2FnZS5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYk1lc3NhZ2UuaXNFbWVyZ2VuY3lNZXNzYWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNiTWVzc2FnZS5pc0NtYXNNZXNzYWdlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FbWVyZ2VuY3lCcm9hZGNhc3Q3Yml0QXNjaWkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Tm9uRW1lcmdlbmN5QnJvYWRjYXN0KFVzZXJEYXRhLkVOQ09ESU5HXzdCSVRfQVNDSUkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FbWVyZ2VuY3lCcm9hZGNhc3Q3Yml0R3NtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdE5vbkVtZXJnZW5jeUJyb2FkY2FzdChVc2VyRGF0YS5FTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVtZXJnZW5jeUJyb2FkY2FzdDE2Yml0VW5pY29kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3ROb25FbWVyZ2VuY3lCcm9hZGNhc3QoVXNlckRhdGEuRU5DT0RJTkdfVU5JQ09ERV8xNik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVtZXJnZW5jeUJyb2FkY2FzdElzOTFFeHRlbmRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBJUy05MSBkb2Vzbid0IHN1cHBvcnQgbGFuZ3VhZ2Ugb3IgcHJpb3JpdHkgc3VicGFyYW1ldGVycywgbWF4IDE0IGNoYXJzIHRleHQKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVCcm9hZGNhc3RTbXNNZXNzYWdlKDk4NywgNjU0LCAtMSwgLTEsCisgICAgICAgICAgICAgICAgVXNlckRhdGEuRU5DT0RJTkdfSVM5MV9FWFRFTkRFRF9QUk9UT0NPTCwgSVM5MV9URVhUKTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlID0gbXNnLnBhcnNlQnJvYWRjYXN0U21zKCk7CisgICAgICAgIHZlcmlmeUNiVmFsdWVzKGNiTWVzc2FnZSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5ODcsIGNiTWVzc2FnZS5nZXRTZXJ2aWNlQ2F0ZWdvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2NTQsIGNiTWVzc2FnZS5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYk1lc3NhZ2UuTUVTU0FHRV9QUklPUklUWV9OT1JNQUwsIGNiTWVzc2FnZS5nZXRNZXNzYWdlUHJpb3JpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjYk1lc3NhZ2UuZ2V0TGFuZ3VhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSVM5MV9URVhULCBjYk1lc3NhZ2UuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY2JNZXNzYWdlLmlzRW1lcmdlbmN5TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYk1lc3NhZ2UuaXNDbWFzTWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvVGVzdENtYXNCcm9hZGNhc3QoaW50IHNlcnZpY2VDYXRlZ29yeSwgaW50IG1lc3NhZ2VDbGFzcywgU3RyaW5nIGJvZHkpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVDbWFzU21zTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBzZXJ2aWNlQ2F0ZWdvcnksIDEyMzQsIEJlYXJlckRhdGEuUFJJT1JJVFlfRU1FUkdFTkNZLCBCZWFyZXJEYXRhLkxBTkdVQUdFX0VOR0xJU0gsCisgICAgICAgICAgICAgICAgVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSSwgYm9keSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlID0gbXNnLnBhcnNlQnJvYWRjYXN0U21zKCk7CisgICAgICAgIHZlcmlmeUNiVmFsdWVzKGNiTWVzc2FnZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlQ2F0ZWdvcnksIGNiTWVzc2FnZS5nZXRTZXJ2aWNlQ2F0ZWdvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMjM0LCBjYk1lc3NhZ2UuZ2V0U2VyaWFsTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JNZXNzYWdlLk1FU1NBR0VfUFJJT1JJVFlfRU1FUkdFTkNZLCBjYk1lc3NhZ2UuZ2V0TWVzc2FnZVByaW9yaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgY2JNZXNzYWdlLmdldExhbmd1YWdlQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJvZHksIGNiTWVzc2FnZS5nZXRNZXNzYWdlQm9keSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNiTWVzc2FnZS5pc0VtZXJnZW5jeU1lc3NhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjYk1lc3NhZ2UuaXNDbWFzTWVzc2FnZSgpKTsKKyAgICAgICAgU21zQ2JDbWFzSW5mbyBjbWFzSW5mbyA9IGNiTWVzc2FnZS5nZXRDbWFzV2FybmluZ0luZm8oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VDbGFzcywgY21hc0luZm8uZ2V0TWVzc2FnZUNsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX0NBVEVHT1JZX1VOS05PV04sIGNtYXNJbmZvLmdldENhdGVnb3J5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1JFU1BPTlNFX1RZUEVfVU5LTk9XTiwgY21hc0luZm8uZ2V0UmVzcG9uc2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1NFVkVSSVRZX1VOS05PV04sIGNtYXNJbmZvLmdldFNldmVyaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1VSR0VOQ1lfVU5LTk9XTiwgY21hc0luZm8uZ2V0VXJnZW5jeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0NiQ21hc0luZm8uQ01BU19DRVJUQUlOVFlfVU5LTk9XTiwgY21hc0luZm8uZ2V0Q2VydGFpbnR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbWFzUHJlc2lkZW50aWFsQWxlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0Q21hc0Jyb2FkY2FzdChTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfUFJFU0lERU5USUFMX0xFVkVMX0FMRVJULAorICAgICAgICAgICAgICAgIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQsIFBSRVNfQUxFUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbWFzRXh0cmVtZUFsZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdENtYXNCcm9hZGNhc3QoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFULAorICAgICAgICAgICAgICAgIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19FWFRSRU1FX1RIUkVBVCwgRVhUUkVNRV9BTEVSVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENtYXNTZXZlcmVBbGVydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDbWFzQnJvYWRjYXN0KFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19TRVZFUkVfVEhSRUFULAorICAgICAgICAgICAgICAgIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19TRVZFUkVfVEhSRUFULCBTRVZFUkVfQUxFUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbWFzQW1iZXJBbGVydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDbWFzQnJvYWRjYXN0KFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19DSElMRF9BQkRVQ1RJT05fRU1FUkdFTkNZLAorICAgICAgICAgICAgICAgIFNtc0NiQ21hc0luZm8uQ01BU19DTEFTU19DSElMRF9BQkRVQ1RJT05fRU1FUkdFTkNZLCBBTUJFUl9BTEVSVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENtYXNUZXN0TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDbWFzQnJvYWRjYXN0KFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19URVNUX01FU1NBR0UsCisgICAgICAgICAgICAgICAgU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX1JFUVVJUkVEX01PTlRITFlfVEVTVCwgTU9OVEhMWV9URVNUX0FMRVJUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q21hc0V4dHJlbWVBbGVydFR5cGUxRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVDbWFzU21zTWVzc2FnZShTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfRVhUUkVNRV9USFJFQVQsCisgICAgICAgICAgICAgICAgNTY3OCwgQmVhcmVyRGF0YS5QUklPUklUWV9FTUVSR0VOQ1ksIEJlYXJlckRhdGEuTEFOR1VBR0VfRU5HTElTSCwKKyAgICAgICAgICAgICAgICBVc2VyRGF0YS5FTkNPRElOR183QklUX0FTQ0lJLCBFWFRSRU1FX0FMRVJULCBTbXNDYkNtYXNJbmZvLkNNQVNfQ0FURUdPUllfRU5WLAorICAgICAgICAgICAgICAgIFNtc0NiQ21hc0luZm8uQ01BU19SRVNQT05TRV9UWVBFX01PTklUT1IsIFNtc0NiQ21hc0luZm8uQ01BU19TRVZFUklUWV9TRVZFUkUsCisgICAgICAgICAgICAgICAgU21zQ2JDbWFzSW5mby5DTUFTX1VSR0VOQ1lfRVhQRUNURUQsIFNtc0NiQ21hc0luZm8uQ01BU19DRVJUQUlOVFlfTElLRUxZKTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlID0gbXNnLnBhcnNlQnJvYWRjYXN0U21zKCk7CisgICAgICAgIHZlcmlmeUNiVmFsdWVzKGNiTWVzc2FnZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfRVhUUkVNRV9USFJFQVQsCisgICAgICAgICAgICAgICAgY2JNZXNzYWdlLmdldFNlcnZpY2VDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDU2NzgsIGNiTWVzc2FnZS5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYk1lc3NhZ2UuTUVTU0FHRV9QUklPUklUWV9FTUVSR0VOQ1ksIGNiTWVzc2FnZS5nZXRNZXNzYWdlUHJpb3JpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBjYk1lc3NhZ2UuZ2V0TGFuZ3VhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRVhUUkVNRV9BTEVSVCwgY2JNZXNzYWdlLmdldE1lc3NhZ2VCb2R5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY2JNZXNzYWdlLmlzRW1lcmdlbmN5TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNiTWVzc2FnZS5pc0NtYXNNZXNzYWdlKCkpOworICAgICAgICBTbXNDYkNtYXNJbmZvIGNtYXNJbmZvID0gY2JNZXNzYWdlLmdldENtYXNXYXJuaW5nSW5mbygpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX0VYVFJFTUVfVEhSRUFULCBjbWFzSW5mby5nZXRNZXNzYWdlQ2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYkNtYXNJbmZvLkNNQVNfQ0FURUdPUllfRU5WLCBjbWFzSW5mby5nZXRDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0NiQ21hc0luZm8uQ01BU19SRVNQT05TRV9UWVBFX01PTklUT1IsIGNtYXNJbmZvLmdldFJlc3BvbnNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0NiQ21hc0luZm8uQ01BU19TRVZFUklUWV9TRVZFUkUsIGNtYXNJbmZvLmdldFNldmVyaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1VSR0VOQ1lfRVhQRUNURUQsIGNtYXNJbmZvLmdldFVyZ2VuY3koKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYkNtYXNJbmZvLkNNQVNfQ0VSVEFJTlRZX0xJS0VMWSwgY21hc0luZm8uZ2V0Q2VydGFpbnR5KCkpOworICAgIH0KKworICAgIC8vIFZaVyByZXF1aXJlbWVudCBpcyB0byBkaXNjYXJkIG1lc3NhZ2Ugd2l0aCB1bnN1cHBvcnRlZCBjaGFyc2V0LiBWZXJpZnkgdGhhdCB3ZSByZXR1cm4gbnVsbAorICAgIC8vIGZvciB0aGlzIHVuc3VwcG9ydGVkIGNoYXJhY3RlciBzZXQuCisgICAgcHVibGljIHZvaWQgdGVzdENtYXNVbnN1cHBvcnRlZENoYXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVDbWFzU21zTWVzc2FnZShTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfRVhUUkVNRV9USFJFQVQsCisgICAgICAgICAgICAgICAgMTIzNDUsIEJlYXJlckRhdGEuUFJJT1JJVFlfRU1FUkdFTkNZLCBCZWFyZXJEYXRhLkxBTkdVQUdFX0VOR0xJU0gsCisgICAgICAgICAgICAgICAgVXNlckRhdGEuRU5DT0RJTkdfR1NNX0RDUywgRVhUUkVNRV9BTEVSVCwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlID0gbXNnLnBhcnNlQnJvYWRjYXN0U21zKCk7CisgICAgICAgIGFzc2VydE51bGwoImV4cGVjdGVkIG51bGwgZm9yIHVuc3VwcG9ydGVkIGNoYXJzZXQiLCBjYk1lc3NhZ2UpOworICAgIH0KKworICAgIC8vIFZaVyByZXF1aXJlbWVudCBpcyB0byBkaXNjYXJkIG1lc3NhZ2Ugd2l0aCB1bnN1cHBvcnRlZCBjaGFyc2V0LiBWZXJpZnkgdGhhdCB3ZSByZXR1cm4gbnVsbAorICAgIC8vIGZvciB0aGlzIHVuc3VwcG9ydGVkIGNoYXJhY3RlciBzZXQuCisgICAgcHVibGljIHZvaWQgdGVzdENtYXNVbnN1cHBvcnRlZENoYXJTZXQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNtc01lc3NhZ2UgbXNnID0gY3JlYXRlQ21hc1Ntc01lc3NhZ2UoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFULAorICAgICAgICAgICAgICAgIDY3ODkwLCBCZWFyZXJEYXRhLlBSSU9SSVRZX0VNRVJHRU5DWSwgQmVhcmVyRGF0YS5MQU5HVUFHRV9FTkdMSVNILAorICAgICAgICAgICAgICAgIFVzZXJEYXRhLkVOQ09ESU5HX0tPUkVBTiwgRVhUUkVNRV9BTEVSVCwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKworICAgICAgICBTbXNDYk1lc3NhZ2UgY2JNZXNzYWdlID0gbXNnLnBhcnNlQnJvYWRjYXN0U21zKCk7CisgICAgICAgIGFzc2VydE51bGwoImV4cGVjdGVkIG51bGwgZm9yIHVuc3VwcG9ydGVkIGNoYXJzZXQiLCBjYk1lc3NhZ2UpOworICAgIH0KKworICAgIC8vIFZaVyByZXF1aXJlbWVudCBpcyB0byBkaXNjYXJkIG1lc3NhZ2Ugd2l0aG91dCByZWNvcmQgdHlwZSAwLiBUaGUgZnJhbWV3b3JrIHdpbGwgZGVjb2RlIGl0CisgICAgLy8gYW5kIHRoZSBhcHAgd2lsbCBkaXNjYXJkIGl0LgorICAgIHB1YmxpYyB2b2lkIHRlc3RDbWFzTm9SZWNvcmRUeXBlMCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTbXNNZXNzYWdlIG1zZyA9IGNyZWF0ZUNtYXNTbXNNZXNzYWdlKAorICAgICAgICAgICAgICAgIFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQsIDEyMzQsCisgICAgICAgICAgICAgICAgQmVhcmVyRGF0YS5QUklPUklUWV9FTUVSR0VOQ1ksIEJlYXJlckRhdGEuTEFOR1VBR0VfRU5HTElTSCwKKyAgICAgICAgICAgICAgICBVc2VyRGF0YS5FTkNPRElOR183QklUX0FTQ0lJLCBudWxsLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworCisgICAgICAgIFNtc0NiTWVzc2FnZSBjYk1lc3NhZ2UgPSBtc2cucGFyc2VCcm9hZGNhc3RTbXMoKTsKKyAgICAgICAgdmVyaWZ5Q2JWYWx1ZXMoY2JNZXNzYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19QUkVTSURFTlRJQUxfTEVWRUxfQUxFUlQsCisgICAgICAgICAgICAgICAgY2JNZXNzYWdlLmdldFNlcnZpY2VDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMzQsIGNiTWVzc2FnZS5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbXNDYk1lc3NhZ2UuTUVTU0FHRV9QUklPUklUWV9FTUVSR0VOQ1ksIGNiTWVzc2FnZS5nZXRNZXNzYWdlUHJpb3JpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBjYk1lc3NhZ2UuZ2V0TGFuZ3VhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgY2JNZXNzYWdlLmdldE1lc3NhZ2VCb2R5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY2JNZXNzYWdlLmlzRW1lcmdlbmN5TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNiTWVzc2FnZS5pc0NtYXNNZXNzYWdlKCkpOworICAgICAgICBTbXNDYkNtYXNJbmZvIGNtYXNJbmZvID0gY2JNZXNzYWdlLmdldENtYXNXYXJuaW5nSW5mbygpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX0NMQVNTX1BSRVNJREVOVElBTF9MRVZFTF9BTEVSVCwgY21hc0luZm8uZ2V0TWVzc2FnZUNsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX0NBVEVHT1JZX1VOS05PV04sIGNtYXNJbmZvLmdldENhdGVnb3J5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1JFU1BPTlNFX1RZUEVfVU5LTk9XTiwgY21hc0luZm8uZ2V0UmVzcG9uc2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1NFVkVSSVRZX1VOS05PV04sIGNtYXNJbmZvLmdldFNldmVyaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zQ2JDbWFzSW5mby5DTUFTX1VSR0VOQ1lfVU5LTk9XTiwgY21hc0luZm8uZ2V0VXJnZW5jeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0NiQ21hc0luZm8uQ01BU19DRVJUQUlOVFlfVU5LTk9XTiwgY21hc0luZm8uZ2V0Q2VydGFpbnR5KCkpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgd2UgZmVlZCBjb21wbGV0ZWx5IHJhbmRvbSBkYXRhIHRvIEJlYXJlclN0cmVhbS4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tQmVhcmVyU3RyZWFtRGF0YSgpIHsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKDU0MzIxKTsKKyAgICAgICAgZm9yIChpbnQgcnVuID0gMDsgcnVuIDwgMTAwMDsgcnVuKyspIHsKKyAgICAgICAgICAgIGludCBsZW4gPSByLm5leHRJbnQoMTQwKTsKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gKGJ5dGUpIHIubmV4dEludCgyNTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTG9nLmQoIkNkbWFTbXNDYlRlc3QiLCAidHJ5aW5nIHJhbmRvbSBiZWFyZXIgZGF0YSBydW4gIiArIHJ1biArICIgbGVuZ3RoICIgKyBsZW4pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgY2F0ZWdvcnkgPSAweDBmZjAgKyByLm5leHRJbnQoMzIpOyAgLy8gaGFsZiBDTUFTLCBoYWxmIG5vbi1DTUFTCisgICAgICAgICAgICAgICAgUGFyY2VsIHAgPSBjcmVhdGVCcm9hZGNhc3RQYXJjZWwoY2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIFNtc01lc3NhZ2UgbXNnID0gY3JlYXRlTWVzc2FnZUZyb21QYXJjZWwocCwgZGF0YSk7CisgICAgICAgICAgICAgICAgU21zQ2JNZXNzYWdlIGNiTWVzc2FnZSA9IG1zZy5wYXJzZUJyb2FkY2FzdFNtcygpOworICAgICAgICAgICAgICAgIC8vIHdpdGggcmFuZG9tIGlucHV0LCBjYk1lc3NhZ2Ugd2lsbCBhbG1vc3QgYWx3YXlzIGJlIG51bGwgKGxvZyB3aGVuIGl0IGlzbid0KQorICAgICAgICAgICAgICAgIGlmIChjYk1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQ2RtYVNtc0NiVGVzdCIsICJzdWNjZXNzOiAiICsgY2JNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKCJDZG1hU21zQ2JUZXN0IiwgImV4Y2VwdGlvbiB0aHJvd24iLCBlKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gZGVjb2RlciBhdCBydW4gIiArIHJ1biArICIgbGVuZ3RoICIgKyBsZW4gKyAiOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHdlIHB1dCByYW5kb20gZGF0YSBpbiB0aGUgVXNlckRhdGEgc3VicGFyYW0uCisgICAgcHVibGljIHZvaWQgdGVzdFJhbmRvbVVzZXJEYXRhKCkgeworICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oOTQwNDApOworICAgICAgICBmb3IgKGludCBydW4gPSAwOyBydW4gPCAxMDAwOyBydW4rKykgeworICAgICAgICAgICAgaW50IGNhdGVnb3J5ID0gMHgwZmYwICsgci5uZXh0SW50KDMyKTsgIC8vIGhhbGYgQ01BUywgaGFsZiBub24tQ01BUworICAgICAgICAgICAgUGFyY2VsIHAgPSBjcmVhdGVCcm9hZGNhc3RQYXJjZWwoY2F0ZWdvcnkpOworICAgICAgICAgICAgaW50IGxlbiA9IHIubmV4dEludCgxNDApOworICAgICAgICAgICAgLy8gTG9nLmQoIkNkbWFTbXNDYlRlc3QiLCAidHJ5aW5nIHJhbmRvbSB1c2VyIGRhdGEgcnVuICIgKyBydW4gKyAiIGxlbmd0aCAiICsgbGVuKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCaXR3aXNlT3V0cHV0U3RyZWFtIGJvcyA9IGNyZWF0ZUJlYXJlckRhdGFTdHJlYW0oci5uZXh0SW50KDY1NTM2KSwgci5uZXh0SW50KDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgci5uZXh0SW50KDI1NikpOworCisgICAgICAgICAgICAgICAgYm9zLndyaXRlKDgsIFNVQlBBUkFNX1VTRVJfREFUQSk7CisgICAgICAgICAgICAgICAgYm9zLndyaXRlKDgsIGxlbik7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZSg4LCByLm5leHRJbnQoMjU2KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVNZXNzYWdlRnJvbVBhcmNlbChwLCBib3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgU21zQ2JNZXNzYWdlIGNiTWVzc2FnZSA9IG1zZy5wYXJzZUJyb2FkY2FzdFNtcygpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZCgiQ2RtYVNtc0NiVGVzdCIsICJleGNlcHRpb24gdGhyb3duIiwgZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIGRlY29kZXIgYXQgcnVuICIgKyBydW4gKyAiIGxlbmd0aCAiICsgbGVuICsgIjogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhIFBhcmNlbCBmb3IgaW5jb21pbmcgU2VydmljZSBDYXRlZ29yeSBQcm9ncmFtIERhdGEgdGVsZXNlcnZpY2UuIFRoZSBjYWxsZXIgd2lsbAorICAgICAqIHdyaXRlIHRoZSBiZWFyZXIgZGF0YSBhbmQgdGhlbiBjb252ZXJ0IGl0IHRvIGFuIFNtc01lc3NhZ2UuCisgICAgICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZWQgUGFyY2VsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFyY2VsIGNyZWF0ZVNlcnZpY2VDYXRlZ29yeVByb2dyYW1EYXRhUGFyY2VsKCkgeworICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBwLndyaXRlSW50KFNtc0VudmVsb3BlLlRFTEVTRVJWSUNFX1NDUFQpOworICAgICAgICBwLndyaXRlQnl0ZSgoYnl0ZSkgMCk7ICAvLyBub24temVybyBmb3IgTUVTU0FHRV9UWVBFX0JST0FEQ0FTVAorICAgICAgICBwLndyaXRlSW50KDApOworCisgICAgICAgIC8vIGR1bW15IGFkZHJlc3MgKFJJTCBtYXkgZ2VuZXJhdGUgYSBkaWZmZXJlbnQgZHVtbXkgYWRkcmVzcyBmb3IgYnJvYWRjYXN0cykKKyAgICAgICAgcC53cml0ZUludChDZG1hU21zQWRkcmVzcy5ESUdJVF9NT0RFXzRCSVRfRFRNRik7ICAgICAgICAgICAgLy8gc0FkZHJlc3MuZGlnaXRfbW9kZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLk5VTUJFUl9NT0RFX05PVF9EQVRBX05FVFdPUkspOyAgICAvLyBzQWRkcmVzcy5udW1iZXJfbW9kZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLlRPTl9VTktOT1dOKTsgICAgICAgICAgICAgICAgICAgICAvLyBzQWRkcmVzcy5udW1iZXJfdHlwZQorICAgICAgICBwLndyaXRlSW50KENkbWFTbXNBZGRyZXNzLk5VTUJFUklOR19QTEFOX0lTRE5fVEVMRVBIT05ZKTsgICAvLyBzQWRkcmVzcy5udW1iZXJfcGxhbgorICAgICAgICBwLndyaXRlQnl0ZSgoYnl0ZSkgMCk7ICAgICAgLy8gc0FkZHJlc3MubnVtYmVyX29mX2RpZ2l0cworICAgICAgICBwLndyaXRlSW50KChieXRlKSAwKTsgICAgICAgLy8gc1N1YkFkZHJlc3Muc3ViYWRkcmVzc1R5cGUKKyAgICAgICAgcC53cml0ZUJ5dGUoKGJ5dGUpIDApOyAgICAgIC8vIHNTdWJBZGRyZXNzLm9kZAorICAgICAgICBwLndyaXRlQnl0ZSgoYnl0ZSkgMCk7ICAgICAgLy8gc1N1YkFkZHJlc3MubnVtYmVyX29mX2RpZ2l0cworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUX0VYVFJFTUVfVEhSRUFUID0gIkV4dHJlbWUgVGhyZWF0IHRvIExpZmUgYW5kIFByb3BlcnR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUX1NFVkVSRV9USFJFQVQgPSAiU2V2ZXJlIFRocmVhdCB0byBMaWZlIGFuZCBQcm9wZXJ0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVF9BTUJFUl9BTEVSVFMgPSAiQU1CRVIgQWxlcnRzIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQ2F0ZWdvcnlQcm9ncmFtRGF0YUFkZENhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBwID0gY3JlYXRlU2VydmljZUNhdGVnb3J5UHJvZ3JhbURhdGFQYXJjZWwoKTsKKyAgICAgICAgQml0d2lzZU91dHB1dFN0cmVhbSBib3MgPSBjcmVhdGVCZWFyZXJEYXRhU3RyZWFtKDEyMywgLTEsIC0xKTsKKworICAgICAgICBpbnQgY2F0ZWdvcnlOYW1lTGVuZ3RoID0gQ0FUX0VYVFJFTUVfVEhSRUFULmxlbmd0aCgpOworICAgICAgICBpbnQgc3VicGFyYW1MZW5ndGhCaXRzID0gKDUzICsgKGNhdGVnb3J5TmFtZUxlbmd0aCAqIDcpKTsKKyAgICAgICAgaW50IHN1YnBhcmFtTGVuZ3RoQnl0ZXMgPSAoc3VicGFyYW1MZW5ndGhCaXRzICsgNykgLyA4OworICAgICAgICBpbnQgc3VicGFyYW1QYWRCaXRzID0gKHN1YnBhcmFtTGVuZ3RoQnl0ZXMgKiA4KSAtIHN1YnBhcmFtTGVuZ3RoQml0czsKKworICAgICAgICBib3Mud3JpdGUoOCwgU1VCUEFSQU1fU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEEpOworICAgICAgICBib3Mud3JpdGUoOCwgc3VicGFyYW1MZW5ndGhCeXRlcyk7CisgICAgICAgIGJvcy53cml0ZSg1LCBVc2VyRGF0YS5FTkNPRElOR183QklUX0FTQ0lJKTsKKworICAgICAgICBib3Mud3JpdGUoNCwgQ2RtYVNtc0NiUHJvZ3JhbURhdGEuT1BFUkFUSU9OX0FERF9DQVRFR09SWSk7CisgICAgICAgIGJvcy53cml0ZSg4LCAoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFUID4+PiA4KSk7CisgICAgICAgIGJvcy53cml0ZSg4LCAoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFUICYgMHhmZikpOworICAgICAgICBib3Mud3JpdGUoOCwgQmVhcmVyRGF0YS5MQU5HVUFHRV9FTkdMSVNIKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIDEwMCk7ICAvLyBtYXggbWVzc2FnZXMKKyAgICAgICAgYm9zLndyaXRlKDQsIENkbWFTbXNDYlByb2dyYW1EYXRhLkFMRVJUX09QVElPTl9ERUZBVUxUX0FMRVJUKTsKKworICAgICAgICBib3Mud3JpdGUoOCwgY2F0ZWdvcnlOYW1lTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeU5hbWVMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYm9zLndyaXRlKDcsIENBVF9FWFRSRU1FX1RIUkVBVC5jaGFyQXQoaSkpOworICAgICAgICB9CisgICAgICAgIGJvcy53cml0ZShzdWJwYXJhbVBhZEJpdHMsIDApOworCisgICAgICAgIFNtc01lc3NhZ2UgbXNnID0gY3JlYXRlTWVzc2FnZUZyb21QYXJjZWwocCwgYm9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1zZyk7CisgICAgICAgIG1zZy5wYXJzZVNtcygpOworICAgICAgICBMaXN0PENkbWFTbXNDYlByb2dyYW1EYXRhPiBwcm9ncmFtRGF0YUxpc3QgPSBtc2cuZ2V0U21zQ2JQcm9ncmFtRGF0YSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb2dyYW1EYXRhTGlzdCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9ncmFtRGF0YUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgQ2RtYVNtc0NiUHJvZ3JhbURhdGEgcHJvZ3JhbURhdGEgPSBwcm9ncmFtRGF0YUxpc3QuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2RtYVNtc0NiUHJvZ3JhbURhdGEuT1BFUkFUSU9OX0FERF9DQVRFR09SWSwgcHJvZ3JhbURhdGEuZ2V0T3BlcmF0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0VYVFJFTUVfVEhSRUFULCBwcm9ncmFtRGF0YS5nZXRDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENBVF9FWFRSRU1FX1RIUkVBVCwgcHJvZ3JhbURhdGEuZ2V0Q2F0ZWdvcnlOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgcHJvZ3JhbURhdGEuZ2V0TGFuZ3VhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBwcm9ncmFtRGF0YS5nZXRNYXhNZXNzYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENkbWFTbXNDYlByb2dyYW1EYXRhLkFMRVJUX09QVElPTl9ERUZBVUxUX0FMRVJULCBwcm9ncmFtRGF0YS5nZXRBbGVydE9wdGlvbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUNhdGVnb3J5UHJvZ3JhbURhdGFEZWxldGVUd29DYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBwID0gY3JlYXRlU2VydmljZUNhdGVnb3J5UHJvZ3JhbURhdGFQYXJjZWwoKTsKKyAgICAgICAgQml0d2lzZU91dHB1dFN0cmVhbSBib3MgPSBjcmVhdGVCZWFyZXJEYXRhU3RyZWFtKDQ1NiwgLTEsIC0xKTsKKworICAgICAgICBpbnQgY2F0ZWdvcnkxTmFtZUxlbmd0aCA9IENBVF9TRVZFUkVfVEhSRUFULmxlbmd0aCgpOworICAgICAgICBpbnQgY2F0ZWdvcnkyTmFtZUxlbmd0aCA9IENBVF9BTUJFUl9BTEVSVFMubGVuZ3RoKCk7CisKKyAgICAgICAgaW50IHN1YnBhcmFtTGVuZ3RoQml0cyA9ICgxMDEgKyAoY2F0ZWdvcnkxTmFtZUxlbmd0aCAqIDcpICsgKGNhdGVnb3J5Mk5hbWVMZW5ndGggKiA3KSk7CisgICAgICAgIGludCBzdWJwYXJhbUxlbmd0aEJ5dGVzID0gKHN1YnBhcmFtTGVuZ3RoQml0cyArIDcpIC8gODsKKyAgICAgICAgaW50IHN1YnBhcmFtUGFkQml0cyA9IChzdWJwYXJhbUxlbmd0aEJ5dGVzICogOCkgLSBzdWJwYXJhbUxlbmd0aEJpdHM7CisKKyAgICAgICAgYm9zLndyaXRlKDgsIFNVQlBBUkFNX1NFUlZJQ0VfQ0FURUdPUllfUFJPR1JBTV9EQVRBKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIHN1YnBhcmFtTGVuZ3RoQnl0ZXMpOworICAgICAgICBib3Mud3JpdGUoNSwgVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSSk7CisKKyAgICAgICAgYm9zLndyaXRlKDQsIENkbWFTbXNDYlByb2dyYW1EYXRhLk9QRVJBVElPTl9ERUxFVEVfQ0FURUdPUlkpOworICAgICAgICBib3Mud3JpdGUoOCwgKFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19TRVZFUkVfVEhSRUFUID4+PiA4KSk7CisgICAgICAgIGJvcy53cml0ZSg4LCAoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX1NFVkVSRV9USFJFQVQgJiAweGZmKSk7CisgICAgICAgIGJvcy53cml0ZSg4LCBCZWFyZXJEYXRhLkxBTkdVQUdFX0VOR0xJU0gpOworICAgICAgICBib3Mud3JpdGUoOCwgMCk7ICAvLyBtYXggbWVzc2FnZXMKKyAgICAgICAgYm9zLndyaXRlKDQsIENkbWFTbXNDYlByb2dyYW1EYXRhLkFMRVJUX09QVElPTl9OT19BTEVSVCk7CisKKyAgICAgICAgYm9zLndyaXRlKDgsIGNhdGVnb3J5MU5hbWVMZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5MU5hbWVMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYm9zLndyaXRlKDcsIENBVF9TRVZFUkVfVEhSRUFULmNoYXJBdChpKSk7CisgICAgICAgIH0KKworICAgICAgICBib3Mud3JpdGUoNCwgQ2RtYVNtc0NiUHJvZ3JhbURhdGEuT1BFUkFUSU9OX0RFTEVURV9DQVRFR09SWSk7CisgICAgICAgIGJvcy53cml0ZSg4LCAoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0NISUxEX0FCRFVDVElPTl9FTUVSR0VOQ1kgPj4+IDgpKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIChTbXNFbnZlbG9wZS5TRVJWSUNFX0NBVEVHT1JZX0NNQVNfQ0hJTERfQUJEVUNUSU9OX0VNRVJHRU5DWSAmIDB4ZmYpKTsKKyAgICAgICAgYm9zLndyaXRlKDgsIEJlYXJlckRhdGEuTEFOR1VBR0VfRU5HTElTSCk7CisgICAgICAgIGJvcy53cml0ZSg4LCAwKTsgIC8vIG1heCBtZXNzYWdlcworICAgICAgICBib3Mud3JpdGUoNCwgQ2RtYVNtc0NiUHJvZ3JhbURhdGEuQUxFUlRfT1BUSU9OX05PX0FMRVJUKTsKKworICAgICAgICBib3Mud3JpdGUoOCwgY2F0ZWdvcnkyTmFtZUxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnkyTmFtZUxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBib3Mud3JpdGUoNywgQ0FUX0FNQkVSX0FMRVJUUy5jaGFyQXQoaSkpOworICAgICAgICB9CisKKyAgICAgICAgYm9zLndyaXRlKHN1YnBhcmFtUGFkQml0cywgMCk7CisKKyAgICAgICAgU21zTWVzc2FnZSBtc2cgPSBjcmVhdGVNZXNzYWdlRnJvbVBhcmNlbChwLCBib3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobXNnKTsKKyAgICAgICAgbXNnLnBhcnNlU21zKCk7CisgICAgICAgIExpc3Q8Q2RtYVNtc0NiUHJvZ3JhbURhdGE+IHByb2dyYW1EYXRhTGlzdCA9IG1zZy5nZXRTbXNDYlByb2dyYW1EYXRhKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJvZ3JhbURhdGFMaXN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByb2dyYW1EYXRhTGlzdC5zaXplKCkpOworCisgICAgICAgIENkbWFTbXNDYlByb2dyYW1EYXRhIHByb2dyYW1EYXRhID0gcHJvZ3JhbURhdGFMaXN0LmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENkbWFTbXNDYlByb2dyYW1EYXRhLk9QRVJBVElPTl9ERUxFVEVfQ0FURUdPUlksIHByb2dyYW1EYXRhLmdldE9wZXJhdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNtc0VudmVsb3BlLlNFUlZJQ0VfQ0FURUdPUllfQ01BU19TRVZFUkVfVEhSRUFULCBwcm9ncmFtRGF0YS5nZXRDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENBVF9TRVZFUkVfVEhSRUFULCBwcm9ncmFtRGF0YS5nZXRDYXRlZ29yeU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBwcm9ncmFtRGF0YS5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9ncmFtRGF0YS5nZXRNYXhNZXNzYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENkbWFTbXNDYlByb2dyYW1EYXRhLkFMRVJUX09QVElPTl9OT19BTEVSVCwgcHJvZ3JhbURhdGEuZ2V0QWxlcnRPcHRpb24oKSk7CisKKyAgICAgICAgcHJvZ3JhbURhdGEgPSBwcm9ncmFtRGF0YUxpc3QuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2RtYVNtc0NiUHJvZ3JhbURhdGEuT1BFUkFUSU9OX0RFTEVURV9DQVRFR09SWSwgcHJvZ3JhbURhdGEuZ2V0T3BlcmF0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU21zRW52ZWxvcGUuU0VSVklDRV9DQVRFR09SWV9DTUFTX0NISUxEX0FCRFVDVElPTl9FTUVSR0VOQ1ksCisgICAgICAgICAgICAgICAgcHJvZ3JhbURhdGEuZ2V0Q2F0ZWdvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDQVRfQU1CRVJfQUxFUlRTLCBwcm9ncmFtRGF0YS5nZXRDYXRlZ29yeU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBwcm9ncmFtRGF0YS5nZXRMYW5ndWFnZUNvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9ncmFtRGF0YS5nZXRNYXhNZXNzYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENkbWFTbXNDYlByb2dyYW1EYXRhLkFMRVJUX09QVElPTl9OT19BTEVSVCwgcHJvZ3JhbURhdGEuZ2V0QWxlcnRPcHRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU21zQ2JUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TbXNDYlRlc3QuamF2YQppbmRleCA0MTdhYWM0Li44MmM2OTQ0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNDYlRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU21zQ2JUZXN0LmphdmEKQEAgLTE0LDM0ICsxNCw1NCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CiAKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNDYkV0d3NJbmZvOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc0NiTG9jYXRpb247CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKIC8qKgogICogVGVzdCBjYXNlcyBmb3IgYmFzaWMgU21zQ2JNZXNzYWdlIG9wZXJhdGlvbnMKICAqLwogcHVibGljIGNsYXNzIEdzbVNtc0NiVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKLSAgICBwcml2YXRlIHZvaWQgZG9UZXN0R2VvZ3JhcGhpY2FsU2NvcGVWYWx1ZShieXRlW10gcGR1LCBieXRlIGIsIGludCBleHBlY3RlZEdzKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJHc21TbXNDYlRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU21zQ2JMb2NhdGlvbiBzVGVzdExvY2F0aW9uID0gbmV3IFNtc0NiTG9jYXRpb24oIjk0MDQwIiwgMTIzNCwgNTY3OCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTbXNDYk1lc3NhZ2UgY3JlYXRlRnJvbVBkdShieXRlW10gcGR1KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTbXNDYkhlYWRlciBoZWFkZXIgPSBuZXcgU21zQ2JIZWFkZXIocGR1KTsKKyAgICAgICAgICAgIGJ5dGVbXVtdIHBkdXMgPSBuZXcgYnl0ZVsxXVtdOworICAgICAgICAgICAgcGR1c1swXSA9IHBkdTsKKyAgICAgICAgICAgIHJldHVybiBHc21TbXNDYk1lc3NhZ2UuY3JlYXRlU21zQ2JNZXNzYWdlKGhlYWRlciwgc1Rlc3RMb2NhdGlvbiwgcGR1cyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZG9UZXN0R2VvZ3JhcGhpY2FsU2NvcGVWYWx1ZShieXRlW10gcGR1LCBieXRlIGIsIGludCBleHBlY3RlZEdzKSB7CiAgICAgICAgIHBkdVswXSA9IGI7Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBnZW9ncmFwaGljYWwgc2NvcGUgZGVjb2RlZCIsIGV4cGVjdGVkR3MsIG1zZwogICAgICAgICAgICAgICAgIC5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTnVsbFBkdSgpIHsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KG51bGwpOwotCisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KG51bGwpOwogICAgICAgICBhc3NlcnROdWxsKCJjcmVhdGVGcm9tUGR1KGJ5dGVbXSB3aXRoIG51bGwgcGR1IHNob3VsZCByZXR1cm4gbnVsbCIsIG1zZyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRvb1Nob3J0UGR1KCkgewogICAgICAgICBieXRlW10gcGR1ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydE51bGwoImNyZWF0ZUZyb21QZHUoYnl0ZVtdIHdpdGggdG9vIHNob3J0IHBkdSBzaG91bGQgcmV0dXJuIG51bGwiLCBtc2cpOwogICAgIH0KQEAgLTk0LDcgKzExNCw3IEBACiAgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAogICAgICAgICB9OwogCi0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBnZW9ncmFwaGljYWwgc2NvcGUgZGVjb2RlZCIsCiAgICAgICAgICAgICAgICAgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREUsIG1zZy5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKQEAgLTExNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCiAgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAogICAgICAgICB9OwotICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IGNyZWF0ZUZyb21QZHUocGR1KTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAogICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCkBAIC0xNDYsNyArMTY2LDcgQEAKIAogICAgICAgICAgICAgICAgIChieXRlKTB4MzQKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKICAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIHdpdGggY2FycmlhZ2UgcmV0dXJuIHBhZGRpbmciLApAQCAtMTkzLDcgKzIxMyw3IEBACiAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDBBCiAgICAgICAgIH07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtdWx0aXBhZ2UgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAogICAgICAgICAgICAgICAgICJGaXJzdCBwYWdlK1NlY29uZCBwYWdlIiwKQEAgLTIxNiw3ICsyMzYsNyBAQAogICAgICAgICAgICAgICAgIChieXRlKTB4OTAsIChieXRlKTB4RkIsIChieXRlKTB4MEQsIChieXRlKTB4ODIsIChieXRlKTB4ODcsIChieXRlKTB4QzksIChieXRlKTB4RTQsCiAgICAgICAgICAgICAgICAgKGJ5dGUpMHhCNCwgKGJ5dGUpMHhGQiwgKGJ5dGUpMHgxQywgKGJ5dGUpMHgwMgogICAgICAgICB9OwotICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IGNyZWF0ZUZyb21QZHUocGR1KTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoCiAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLApAQCAtMjQ4LDcgKzI2OCw3IEBACiAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDUyCiAgICAgICAgIH07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygKICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCkBAIC0yNzMsNyArMjkzLDcgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAogICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKICAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIHdpdGggY2FycmlhZ2UgcmV0dXJuIHBhZGRpbmciLApAQCAtMjk4LDcgKzMxOCw3IEBACiAgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKICAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwCiAgICAgICAgIH07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCiAgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSB3aXRoIGNhcnJpYWdlIHJldHVybiBwYWRkaW5nIiwKQEAgLTMzMCw3ICszNTAsNyBAQAogCiAgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNwogICAgICAgICB9OwotICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IGNyZWF0ZUZyb21QZHUocGR1KTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgNy1iaXQgc3RyaW5nIGRlY29kZWQiLAogICAgICAgICAgICAgICAgICJBIEdTTSBkZWZhdWx0IGFscGhhYmV0IG1lc3NhZ2Ugd2l0aCBjYXJyaWFnZSByZXR1cm4gcGFkZGluZyIsCkBAIC0zNTUsNyArMzc1LDcgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDQyLCAoYnl0ZSkweDQzLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ1LCAoYnl0ZSkweDQ2LCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDQxLAogICAgICAgICAgICAgICAgIChieXRlKTB4NDIsIChieXRlKTB4NDMsIChieXRlKTB4NDQsIChieXRlKTB4NDUKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCI4LWJpdCBtZXNzYWdlIGJvZHkgc2hvdWxkIGJlIGVtcHR5IiwgIiIsIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKICAgICB9CkBAIC0zNzYsNyArMzk2LDcgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLAogICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MEQsIChieXRlKTB4MDAsIChieXRlKTB4MEQKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKICAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CkBAIC00MDUsNyArNDI1LDcgQEAKIAogICAgICAgICAgICAgICAgIChieXRlKTB4NEUKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKICAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CkBAIC00NTEsNyArNDcxLDcgQEAKIAogICAgICAgICAgICAgICAgIChieXRlKTB4MDYKICAgICAgICAgfTsKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG11bHRpcGFnZSBVQ1MyIHN0cmluZyBkZWNvZGVkIiwKICAgICAgICAgICAgICAgICAiQUFBQkJCIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwpAQCAtNDczLDcgKzQ5Myw3IEBACiAgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwKICAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDBECiAgICAgICAgIH07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCiAgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwpAQCAtNTA0LDcgKzUyNCw3IEBACiAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDUwCiAgICAgICAgIH07Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCiAgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwpAQCAtNTI5LDkgKzU0OSw5IEBACiAgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAogICAgICAgICB9OwogCi0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGlkZW50aWZpZXIgZGVjb2RlZCIsIDEyMzQ1LCBtc2cuZ2V0TWVzc2FnZUlkZW50aWZpZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGlkZW50aWZpZXIgZGVjb2RlZCIsIDEyMzQ1LCBtc2cuZ2V0U2VydmljZUNhdGVnb3J5KCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlSWRlbnRpZmllclVtdHMoKSB7CkBAIC01NTgsOSArNTc4LDkgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDM0CiAgICAgICAgIH07CiAKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgaWRlbnRpZmllciBkZWNvZGVkIiwgMTIzNDUsIG1zZy5nZXRNZXNzYWdlSWRlbnRpZmllcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgaWRlbnRpZmllciBkZWNvZGVkIiwgMTIzNDUsIG1zZy5nZXRTZXJ2aWNlQ2F0ZWdvcnkoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VDb2RlKCkgewpAQCAtNTgwLDkgKzYwMCwxMCBAQAogICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAKICAgICAgICAgfTsKIAotICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IGNyZWF0ZUZyb21QZHUocGR1KTsKKyAgICAgICAgaW50IG1lc3NhZ2VDb2RlID0gKG1zZy5nZXRTZXJpYWxOdW1iZXIoKSAmIDB4M2ZmMCkgPj4gNDsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjb2RlIGRlY29kZWQiLCA2ODIsIG1zZy5nZXRNZXNzYWdlQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY29kZSBkZWNvZGVkIiwgNjgyLCBtZXNzYWdlQ29kZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VDb2RlVW10cygpIHsKQEAgLTYwOSw5ICs2MzAsMTAgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDM0CiAgICAgICAgIH07CiAKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIGludCBtZXNzYWdlQ29kZSA9IChtc2cuZ2V0U2VyaWFsTnVtYmVyKCkgJiAweDNmZjApID4+IDQ7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY29kZSBkZWNvZGVkIiwgNjgyLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNvZGUgZGVjb2RlZCIsIDY4MiwgbWVzc2FnZUNvZGUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGVOdW1iZXIoKSB7CkBAIC02MzEsOSArNjUzLDEwIEBACiAgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMAogICAgICAgICB9OwogCi0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShwZHUpOworICAgICAgICBpbnQgdXBkYXRlTnVtYmVyID0gbXNnLmdldFNlcmlhbE51bWJlcigpICYgMHgwMDBmOwogCi0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB1cGRhdGUgbnVtYmVyIGRlY29kZWQiLCA1LCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdXBkYXRlIG51bWJlciBkZWNvZGVkIiwgNSwgdXBkYXRlTnVtYmVyKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRlTnVtYmVyVW10cygpIHsKQEAgLTY2MCw5ICs2ODMsMTAgQEAKICAgICAgICAgICAgICAgICAoYnl0ZSkweDM0CiAgICAgICAgIH07CiAKLSAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KHBkdSk7CisgICAgICAgIGludCB1cGRhdGVOdW1iZXIgPSBtc2cuZ2V0U2VyaWFsTnVtYmVyKCkgJiAweDAwMGY7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHVwZGF0ZSBudW1iZXIgZGVjb2RlZCIsIDUsIG1zZy5nZXRVcGRhdGVOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB1cGRhdGUgbnVtYmVyIGRlY29kZWQiLCA1LCB1cGRhdGVOdW1iZXIpOwogICAgIH0KIAogICAgIC8qIEVUV1MgVGVzdCBtZXNzYWdlIGluY2x1ZGluZyBoZWFkZXIgKi8KQEAgLTY4NCwyOSArNzA4LDUxIEBACiAgICAgLy8gRklYTUU6IGFkZCBleGFtcGxlIG9mIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb24gUERVCiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXR3c01lc3NhZ2VOb3JtYWwoKSB7Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZU5vcm1hbCk7Ci0gICAgICAgIExvZy5kKCJHc21TbXNDYlRlc3QiLCBtc2cudG9TdHJpbmcoKSk7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBjcmVhdGVGcm9tUGR1KGV0d3NNZXNzYWdlTm9ybWFsKTsKKyAgICAgICAgTG9nLmQoVEFHLCBtc2cudG9TdHJpbmcoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiR1MgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBjb2RlIG1pc21hdGNoIiwgMCwgbXNnLmdldE1lc3NhZ2VDb2RlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVwZGF0ZSBudW1iZXIgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgSUQgbWlzbWF0Y2giLCAweDExMDAsIG1zZy5nZXRNZXNzYWdlSWRlbnRpZmllcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXJpYWwgbnVtYmVyIG1pc21hdGNoIiwgMCwgbXNnLmdldFNlcmlhbE51bWJlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIElEIG1pc21hdGNoIiwgMHgxMTAwLCBtc2cuZ2V0U2VydmljZUNhdGVnb3J5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndhcm5pbmcgdHlwZSBtaXNtYXRjaCIsIFNtc0NiRXR3c0luZm8uRVRXU19XQVJOSU5HX1RZUEVfRUFSVEhRVUFLRSwKKyAgICAgICAgICAgICAgICBtc2cuZ2V0RXR3c1dhcm5pbmdJbmZvKCkuZ2V0V2FybmluZ1R5cGUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdEV0d3NNZXNzYWdlQ2FuY2VsKCkgewotICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUoZXR3c01lc3NhZ2VDYW5jZWwpOwotICAgICAgICBMb2cuZCgiR3NtU21zQ2JUZXN0IiwgbXNnLnRvU3RyaW5nKCkpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZUNhbmNlbCk7CisgICAgICAgIExvZy5kKFRBRywgbXNnLnRvU3RyaW5nKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkdTIG1pc21hdGNoIiwgMCwgbXNnLmdldEdlb2dyYXBoaWNhbFNjb3BlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgY29kZSBtaXNtYXRjaCIsIDAsIG1zZy5nZXRNZXNzYWdlQ29kZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cGRhdGUgbnVtYmVyIG1pc21hdGNoIiwgMCwgbXNnLmdldFVwZGF0ZU51bWJlcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIElEIG1pc21hdGNoIiwgMHgxMTAwLCBtc2cuZ2V0TWVzc2FnZUlkZW50aWZpZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2VyaWFsIG51bWJlciBtaXNtYXRjaCIsIDAsIG1zZy5nZXRTZXJpYWxOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBJRCBtaXNtYXRjaCIsIDB4MTEwMCwgbXNnLmdldFNlcnZpY2VDYXRlZ29yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3YXJuaW5nIHR5cGUgbWlzbWF0Y2giLCBTbXNDYkV0d3NJbmZvLkVUV1NfV0FSTklOR19UWVBFX0VBUlRIUVVBS0UsCisgICAgICAgICAgICAgICAgbXNnLmdldEV0d3NXYXJuaW5nSW5mbygpLmdldFdhcm5pbmdUeXBlKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RFdHdzTWVzc2FnZVRlc3QoKSB7Ci0gICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZVRlc3QpOwotICAgICAgICBMb2cuZCgiR3NtU21zQ2JUZXN0IiwgbXNnLnRvU3RyaW5nKCkpOworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZVRlc3QpOworICAgICAgICBMb2cuZChUQUcsIG1zZy50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHUyBtaXNtYXRjaCIsIDAsIG1zZy5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIGNvZGUgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXBkYXRlIG51bWJlciBtaXNtYXRjaCIsIDAsIG1zZy5nZXRVcGRhdGVOdW1iZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBJRCBtaXNtYXRjaCIsIDB4MTEwMywgbXNnLmdldE1lc3NhZ2VJZGVudGlmaWVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNlcmlhbCBudW1iZXIgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0U2VyaWFsTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgSUQgbWlzbWF0Y2giLCAweDExMDMsIG1zZy5nZXRTZXJ2aWNlQ2F0ZWdvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2FybmluZyB0eXBlIG1pc21hdGNoIiwgU21zQ2JFdHdzSW5mby5FVFdTX1dBUk5JTkdfVFlQRV9URVNUX01FU1NBR0UsCisgICAgICAgICAgICAgICAgbXNnLmdldEV0d3NXYXJuaW5nSW5mbygpLmdldFdhcm5pbmdUeXBlKCkpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgd2UgZmVlZCByYW5kb20gZGF0YSB0byB0aGUgUERVIHBhcnNlci4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tUGR1cygpIHsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKDk0MDQwKTsKKyAgICAgICAgZm9yIChpbnQgcnVuID0gMDsgcnVuIDwgMTAwMDA7IHJ1bisrKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gci5uZXh0SW50KDE0MCk7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YVtpXSA9IChieXRlKSByLm5leHRJbnQoMjU2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgcmV0dXJuIGEgU21zQ2JNZXNzYWdlIG9iamVjdCBvciBudWxsIGZvciBpbnZhbGlkIGRhdGEKKyAgICAgICAgICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gY3JlYXRlRnJvbVBkdShkYXRhKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXhjZXB0aW9uIHRocm93biIsIGUpOworICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBkZWNvZGVyIGF0IHJ1biAiICsgcnVuICsgIiBsZW5ndGggIiArIGxlbiArICI6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKaW5kZXggNWZhYjJiYi4uYmY1ODNlMSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEKQEAgLTI1MSwxNiArMjUxLDMzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eShJbnRlbnQgaW50ZW50LCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGludGVudHMsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIHN0YXJ0QWN0aXZpdGllcyhpbnRlbnRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydEludGVudFNlbmRlcihJbnRlbnRTZW5kZXIgaW50ZW50LAogICAgICAgICAgICAgSW50ZW50IGZpbGxJbkludGVudCwgaW50IGZsYWdzTWFzaywgaW50IGZsYWdzVmFsdWVzLCBpbnQgZXh0cmFGbGFncykKICAgICAgICAgICAgIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyKEludGVudFNlbmRlciBpbnRlbnQsCisgICAgICAgICAgICBJbnRlbnQgZmlsbEluSW50ZW50LCBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIGludCBleHRyYUZsYWdzLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0SW50ZW50U2VuZGVyKGludGVudCwgZmlsbEluSW50ZW50LCBmbGFnc01hc2ssIGZsYWdzVmFsdWVzLCBleHRyYUZsYWdzKTsKKyAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2VuZEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CmRpZmYgLS1naXQgYS90ZXN0cy9TbW9rZVRlc3QvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntb2tldGVzdC9Qcm9jZXNzRXJyb3JzVGVzdC5qYXZhIGIvdGVzdHMvU21va2VUZXN0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbW9rZXRlc3QvUHJvY2Vzc0Vycm9yc1Rlc3QuamF2YQppbmRleCAzZWZkNjU4Li5iM2EyNjAwIDEwMDY0NAotLS0gYS90ZXN0cy9TbW9rZVRlc3QvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Ntb2tldGVzdC9Qcm9jZXNzRXJyb3JzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL1Ntb2tlVGVzdC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21va2V0ZXN0L1Byb2Nlc3NFcnJvcnNUZXN0LmphdmEKQEAgLTEyMCwxMyArMTIwLDIwIEBACiAgICAgICogVGhlIG1ldGhvZCB3aWxsIGxhdW5jaCB0aGUgYXBwLCB3YWl0IGZvciA3IHNlY29uZHMsIGNoZWNrIGZvciBhcHBzIGluIHRoZSBlcnJvciBzdGF0ZSwgc2VuZAogICAgICAqIHRoZSBIb21lIGludGVudCwgd2FpdCBmb3IgMiBzZWNvbmRzLCBhbmQgdGhlbiByZXR1cm4uCiAgICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248UHJvY2Vzc0Vycm9yU3RhdGVJbmZvPiBydW5PbmVBY3Rpdml0eShSZXNvbHZlSW5mbyBhcHApIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxQcm9jZXNzRXJyb3I+IHJ1bk9uZUFjdGl2aXR5KFJlc29sdmVJbmZvIGFwcCkgewogICAgICAgICBmaW5hbCBsb25nIGFwcExhdW5jaFdhaXQgPSA3MDAwOwogICAgICAgICBmaW5hbCBsb25nIGhvbWVMYXVuY2hXYWl0ID0gMjAwMDsKIAogICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIlJ1bm5pbmcgYWN0aXZpdHkgJXMvJXMiLCBhcHAuYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGFwcC5hY3Rpdml0eUluZm8ubmFtZSkpOwogCisgICAgICAgIC8vIFdlIGNoZWNrIGZvciBhbnkgQ3Jhc2ggb3IgQU5SIGRpYWxvZ3MgdGhhdCBhcmUgYWxyZWFkeSB1cCwgYW5kIHdlIGlnbm9yZSB0aGVtLiAgVGhpcyBpcworICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IHJlcG9ydCBjcmFzaGVzIHRoYXQgd2VyZSBjYXVzZWQgYnkgcHJpb3IgYXBwcyAod2hpY2ggdGhvc2UgcGFydGljdWxhcgorICAgICAgICAvLyB0ZXN0cyBzaG91bGQgaGF2ZSBjYXVnaHQgYW5kIHJlcG9ydGVkIGFscmVhZHkpLiAgT3RoZXJ3aXNlLCB0ZXN0IGZhaWx1cmVzIHdvdWxkIGNhc2NhZGUKKyAgICAgICAgLy8gZnJvbSB0aGUgaW5pdGlhbCBicm9rZW4gYXBwIHRvIG1hbnkvYWxsIG9mIHRoZSB0ZXN0cyBmb2xsb3dpbmcgdGhhdCBhcHAncyBsYXVuY2guCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248UHJvY2Vzc0Vycm9yPiBwcmVFcnJQcm9jcyA9CisgICAgICAgICAgICAgICAgUHJvY2Vzc0Vycm9yLmZyb21Db2xsZWN0aW9uKG1BY3Rpdml0eU1hbmFnZXIuZ2V0UHJvY2Vzc2VzSW5FcnJvclN0YXRlKCkpOworCiAgICAgICAgIC8vIGxhdW5jaCBhcHAsIGFuZCB3YWl0IDcgc2Vjb25kcyBmb3IgaXQgdG8gc3RhcnQvc2V0dGxlCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBpbnRlbnRGb3JBY3Rpdml0eShhcHApOwogICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwpAQCAtMTM2LDEwICsxNDMsNiBAQAogICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgIH0KIAotICAgICAgICAvLyBTZWUgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQcm9jZXNzRXJyb3JTdGF0ZUluZm8+IGVyclByb2NzID0KLSAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyLmdldFByb2Nlc3Nlc0luRXJyb3JTdGF0ZSgpOwotCiAgICAgICAgIC8vIFNlbmQgdGhlICJob21lIiBpbnRlbnQgYW5kIHdhaXQgMiBzZWNvbmRzIGZvciB1cyB0byBnZXQgdGhlcmUKICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkobUhvbWVJbnRlbnQpOwogICAgICAgICB0cnkgewpAQCAtMTQ4LDI4ICsxNTEsMzUgQEAKICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICB9CiAKKyAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzLiAgV2Ugd2FpdCB1bnRpbCBkb3duIGhlcmUgdG8gZ2l2ZSBBTlJzIGFzIG11Y2ggdGltZSBhcworICAgICAgICAvLyBwb3NzaWJsZSB0byBvY2N1ci4KKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQcm9jZXNzRXJyb3I+IGVyclByb2NzID0KKyAgICAgICAgICAgICAgICBQcm9jZXNzRXJyb3IuZnJvbUNvbGxlY3Rpb24obUFjdGl2aXR5TWFuYWdlci5nZXRQcm9jZXNzZXNJbkVycm9yU3RhdGUoKSk7CisgICAgICAgIC8vIFRha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXJyb3IgcHJvY2Vzc2VzIHdlIHNlZSBub3csIGFuZCB0aGUgb25lcyB0aGF0IHdlcmUKKyAgICAgICAgLy8gcHJlc2VudCB3aGVuIHdlIHN0YXJ0ZWQKKyAgICAgICAgaWYgKGVyclByb2NzICE9IG51bGwgJiYgcHJlRXJyUHJvY3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZXJyUHJvY3MucmVtb3ZlQWxsKHByZUVyclByb2NzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBlcnJQcm9jczsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBIHRlc3QgdGhhdCBydW5zIGFsbCBMYXVuY2hlci1sYXVuY2hhYmxlIGFjdGl2aXRpZXMgYW5kIHZlcmlmaWVzIHRoYXQgbm8gQU5ScyBvciBjcmFzaGVzCiAgICAgICogaGFwcGVuZWQgd2hpbGUgZG9pbmcgc28uCi0gICAgICogPHAgLz4KLSAgICAgKiBGSVhNRTogRG9lc24ndCBkZXRlY3QgbXVsdGlwbGUgY3Jhc2hpbmcgYXBwcyBwcm9wZXJseSwgc2luY2UgdGhlIGNyYXNoIGRpYWxvZyBmb3IgdGhlCi0gICAgICogRklYTUU6IGZpcnN0IGFwcCBkb2Vzbid0IGdvIGF3YXkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkFsbEFjdGl2aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU2V0PFByb2Nlc3NFcnJvcj4gZXJyU2V0ID0gbmV3IEhhc2hTZXQ8UHJvY2Vzc0Vycm9yPigpOwogCiAgICAgICAgIGZvciAoUmVzb2x2ZUluZm8gYXBwIDogZ2V0TGF1bmNoZXJBY3Rpdml0aWVzKG1QYWNrYWdlTWFuYWdlcikpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248UHJvY2Vzc0Vycm9yU3RhdGVJbmZvPiBlcnJQcm9jcyA9IHJ1bk9uZUFjdGl2aXR5KGFwcCk7CisgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFByb2Nlc3NFcnJvcj4gZXJyUHJvY3MgPSBydW5PbmVBY3Rpdml0eShhcHApOwogICAgICAgICAgICAgaWYgKGVyclByb2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlcnJTZXQuYWRkQWxsKFByb2Nlc3NFcnJvci5mcm9tQ29sbGVjdGlvbihlcnJQcm9jcykpOworICAgICAgICAgICAgICAgIGVyclNldC5hZGRBbGwoZXJyUHJvY3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFlcnJTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIkdvdCAlZCBlcnJvcnM6ICVzIiwgZXJyU2V0LnNpemUoKSwKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiR290ICVkIGVycm9yczpcbiVzIiwgZXJyU2V0LnNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgcmVwb3J0V3JhcHBlZExpc3RDb250ZW50cyhlcnJTZXQpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDAsMTkgKzIxMCwyMSBAQAogICAgICAgICAgICAgU3RyaW5nIGNvbmRpdGlvbjsKICAgICAgICAgICAgIHN3aXRjaCAoZW50cnkuY29uZGl0aW9uKSB7CiAgICAgICAgICAgICBjYXNlIEFjdGl2aXR5TWFuYWdlci5Qcm9jZXNzRXJyb3JTdGF0ZUluZm8uQ1JBU0hFRDoKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAiQ1JBU0hFRCI7CisgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gImEgQ1JBU0giOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuUHJvY2Vzc0Vycm9yU3RhdGVJbmZvLk5PVF9SRVNQT05ESU5HOgotICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICJBTlIiOworICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICJhbiBBTlIiOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAiPHVua25vd24+IjsKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAiYW4gdW5rbm93biBlcnJvciI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJQcm9jZXNzIGVycm9yICIpLmFwcGVuZChjb25kaXRpb24pLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAiKS5hcHBlbmQoZW50cnkuc2hvcnRNc2cpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBkZXRlY3RlZCBpbiAiKS5hcHBlbmQoZW50cnkucHJvY2Vzc05hbWUpLmFwcGVuZCgiICIpLmFwcGVuZChlbnRyeS50YWcpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiUHJvY2VzcyAlcyBlbmNvdW50ZXJlZCAlcyAoJXMpIiwgZW50cnkucHJvY2Vzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwgZW50cnkuc2hvcnRNc2cpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb25kaXRpb24gPT0gQWN0aXZpdHlNYW5hZ2VyLlByb2Nlc3NFcnJvclN0YXRlSW5mby5DUkFTSEVEKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiIHdpdGggc3RhY2sgdHJhY2U6XG4lc1xuIiwgZW50cnkuc3RhY2tUcmFjZSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKQEAgLTIzMSw2ICsyNDMsMTAgQEAKIAogICAgICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UHJvY2Vzc0Vycm9yPiBmcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPFByb2Nlc3NFcnJvclN0YXRlSW5mbz4gaW4pCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgTGlzdDxQcm9jZXNzRXJyb3I+IG91dCA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc0Vycm9yPihpbi5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChQcm9jZXNzRXJyb3JTdGF0ZUluZm8gaW5mbyA6IGluKSB7CiAgICAgICAgICAgICAgICAgb3V0LmFkZChuZXcgUHJvY2Vzc0Vycm9yKGluZm8pKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL1Ntb2tlVGVzdC90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc21va2V0ZXN0L1Ntb2tlVGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvU21va2VUZXN0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbW9rZXRlc3QvU21va2VUZXN0UnVubmVyLmphdmEKaW5kZXggNDBiMTFjNS4uNTEzMzFmZSAxMDA2NDQKLS0tIGEvdGVzdHMvU21va2VUZXN0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbW9rZXRlc3QvU21va2VUZXN0UnVubmVyLmphdmEKKysrIGIvdGVzdHMvU21va2VUZXN0L3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zbW9rZXRlc3QvU21va2VUZXN0UnVubmVyLmphdmEKQEAgLTczLDEzICs3MywxMyBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PFByb2Nlc3NFcnJvcj4gZXJyU2V0ID0gbmV3IEhhc2hTZXQ8UHJvY2Vzc0Vycm9yPigpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFByb2Nlc3NFcnJvclN0YXRlSW5mbz4gZXJyUHJvY3MgPSBydW5PbmVBY3Rpdml0eShhcHApOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFByb2Nlc3NFcnJvcj4gZXJyUHJvY3MgPSBydW5PbmVBY3Rpdml0eShhcHApOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyUHJvY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyU2V0LmFkZEFsbChQcm9jZXNzRXJyb3IuZnJvbUNvbGxlY3Rpb24oZXJyUHJvY3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyclNldC5hZGRBbGwoZXJyUHJvY3MpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIkdvdCAlZCBlcnJvcnM6ICVzIiwgZXJyU2V0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiR290ICVkIGVycm9yczpcbiVzIiwgZXJyU2V0LnNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0V3JhcHBlZExpc3RDb250ZW50cyhlcnJTZXQpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlQ29udGV4dC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCA1OGRjMmQ0Li42YzQ5YmFiIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlQ29udGV4dC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VDb250ZXh0LmphdmEKQEAgLTEyMzQsNyArMTIzNCwxMSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGFyZzApIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoSW50ZW50IGFyZzAsIEJ1bmRsZSBhcmcxKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEyNDUsNiArMTI0OSwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0SW50ZW50U2VuZGVyKEludGVudFNlbmRlciBpbnRlbnQsCisgICAgICAgICAgICBJbnRlbnQgZmlsbEluSW50ZW50LCBpbnQgZmxhZ3NNYXNrLCBpbnQgZmxhZ3NWYWx1ZXMsIGludCBleHRyYUZsYWdzLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydEluc3RydW1lbnRhdGlvbihDb21wb25lbnROYW1lIGFyZzAsIFN0cmluZyBhcmcxLAogICAgICAgICAgICAgQnVuZGxlIGFyZzIpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgpAQCAtMTI4Nyw2ICsxMjk4LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0aWVzKEludGVudFtdIGFyZzAsIEJ1bmRsZSBhcmcxKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3ZvaXAvam5pL3J0cC9BbmRyb2lkLm1rIGIvdm9pcC9qbmkvcnRwL0FuZHJvaWQubWsKaW5kZXggMDgxNTI5NC4uNDliNzExZCAxMDA2NDQKLS0tIGEvdm9pcC9qbmkvcnRwL0FuZHJvaWQubWsKKysrIGIvdm9pcC9qbmkvcnRwL0FuZHJvaWQubWsKQEAgLTUwLDcgKzUwLDcgQEAKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL2luY2x1ZGUgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYyBcCi0Jc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogCg==