New abiword exporter

Jean Bréfort <[email protected]> Sun, 01 Mar 2015 16:22:07 +0100
Newsgroups gmane.editors.abiword.devel
Message-ID <[email protected]>

--=-hSnJGdFQ9nC6oOqTVXOP
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit

Hi,

I tried to rewrite the abiword exporter using GsfXMLOut so that we don't
directly write xml code directly there. See attached diff file. Changes
for the .h file are trivial and the new IE_Exp_XML class does the dirty
job. This still needs testing.
Joining new and modified files (except Makefile.am
I probably should investigate to rewrite .odt and .docx export too so
that we can avoid bugs like #13707, but this is another story.

I also intend to test using GsfXMLIn for loading, by the way.

Cheers,
Jean

--=-hSnJGdFQ9nC6oOqTVXOP
Content-Disposition: attachment; filename="ie_exp_Abiword_1.patch"
Content-Transfer-Encoding: base64
Content-Type: text/x-patch; name="ie_exp_Abiword_1.patch"; charset="UTF-8"

SW5kZXg6IHNyYy93cC9pbXBleHAveHAvTWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3JjL3dw
L2ltcGV4cC94cC9NYWtlZmlsZS5hbQkocsOpdmlzaW9uIDM1MDcyKQorKysgc3JjL3dwL2ltcGV4
cC94cC9NYWtlZmlsZS5hbQkoY29waWUgZGUgdHJhdmFpbCkKQEAgLTM2LDYgKzM2LDggQEAKIAlp
ZV9leHBfUlRGX2xpc3RlbmVyV3JpdGVEb2MuaCBcCiAJaWVfZXhwX1RleHQuY3BwIFwKIAlpZV9l
eHBfVGV4dC5oIFwKKwlpZV9leHBfWE1MLmNwcCBcCisJaWVfZXhwX1hNTC5oIFwKIAlpZV9GaWxl
SW5mby5jcHAgXAogCWllX0ZpbGVJbmZvLmggXAogCWllX2ltcF9BYmlXb3JkXzEuY3BwIFwKSW5k
ZXg6IHNyYy93cC9pbXBleHAveHAvaWVfZXhwX0FiaVdvcmRfMS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3JjL3dwL2ltcGV4cC94cC9pZV9leHBfQWJpV29yZF8xLmNwcAkocsOpdmlzaW9uIDM1MDcyKQor
Kysgc3JjL3dwL2ltcGV4cC94cC9pZV9leHBfQWJpV29yZF8xLmNwcAkoY29waWUgZGUgdHJhdmFp
bCkKQEAgLTMyLDEwICszMiw2IEBACiAjaW5jbHVkZSAidXRfc3RyaW5nX2NsYXNzLmgiCiAjaW5j
bHVkZSAidXRfdXVpZC5oIgogCi0jaWZkZWYgRU5BQkxFX1JFU09VUkNFX01BTkFHRVIKLSNpbmNs
dWRlICJ4YXBfUmVzb3VyY2VNYW5hZ2VyLmgiCi0jZW5kaWYKLQogI2luY2x1ZGUgInhhcF9BcHAu
aCIKIAogI2luY2x1ZGUgInB0X1R5cGVzLmgiCkBAIC0xMTQsNyArMTEwLDcgQEAKIC8qKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
Ki8KIAogSUVfRXhwX0FiaVdvcmRfMTo6SUVfRXhwX0FiaVdvcmRfMShQRF9Eb2N1bWVudCAqIHBE
b2N1bWVudCwgYm9vbCBpc1RlbXBsYXRlLCBib29sIGlzQ29tcHJlc3NlZCkKLQk6IElFX0V4cChw
RG9jdW1lbnQpLCBtX2JJc1RlbXBsYXRlKGlzVGVtcGxhdGUpLCBtX2JJc0NvbXByZXNzZWQoaXND
b21wcmVzc2VkKSwgbV9wTGlzdGVuZXIoMCksIG1fb3V0cHV0KDApCisJOiBJRV9FeHBfWE1MKHBE
b2N1bWVudCksIG1fYklzVGVtcGxhdGUoaXNUZW1wbGF0ZSksIG1fYklzQ29tcHJlc3NlZChpc0Nv
bXByZXNzZWQpLCBtX3BMaXN0ZW5lcigwKQogewogCW1fZXJyb3IgPSAwOwogCkBAIC0xMzEsNTcg
KzEyNywxMCBAQAogewogfQogCi1VVF91aW50MzIgSUVfRXhwX0FiaVdvcmRfMTo6X3dyaXRlQnl0
ZXMoY29uc3QgVVRfQnl0ZSAqIHBCeXRlcywgVVRfdWludDMyIGxlbmd0aCkKLXsKLQlpZighcEJ5
dGVzIHx8ICFsZW5ndGgpCi0JICByZXR1cm4gMDsKLQotCWlmIChtX291dHB1dCkKLQkJewotCQkJ
Z3NmX291dHB1dF93cml0ZShtX291dHB1dCwgbGVuZ3RoLCBwQnl0ZXMpOwotCQkJcmV0dXJuIGxl
bmd0aDsKLQkJfQotCWVsc2UKLQkJewotCQkJcmV0dXJuIElFX0V4cDo6X3dyaXRlQnl0ZXMocEJ5
dGVzLCBsZW5ndGgpOwotCQl9Ci19Ci0KLXZvaWQgSUVfRXhwX0FiaVdvcmRfMTo6X3NldHVwRmls
ZSgpCi17Ci0JLy8gYWxsb3cgcGVvcGxlIHRvIG92ZXJyaWRlIHRoaXMgb24gdGhlIGNvbW1hbmQg
bGluZSBvciBvdGhlcndpc2UKLQljb25zdCBzdGQ6OnN0cmluZyAmIHByb3AgPSAoZ2V0UHJvcGVy
dHkgKCJjb21wcmVzcyIpKTsKLQlpZiAoIXByb3AuZW1wdHkoKSkKLQkJbV9iSXNDb21wcmVzc2Vk
ID0gVVRfcGFyc2VCb29sKHByb3AuY19zdHIgKCksIG1fYklzQ29tcHJlc3NlZCk7Ci0JCi0JaWYg
KG1fYklzQ29tcHJlc3NlZCkKLQl7Ci0JCUdzZk91dHB1dCAqIGd6aXAgPSBnc2Zfb3V0cHV0X2d6
aXBfbmV3KGdldEZwICgpLCBOVUxMKTsKLQkJbV9vdXRwdXQgPSBnemlwOwotCX0KLQllbHNlCi0J
ewotCQltX291dHB1dCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV9nc2ZfaGFuZGxl
KEdzZk91dHB1dCAqIG91dHB1dCkKLXsKLQlpZiAob3V0cHV0KQotCQl7Ci0JCQlnc2Zfb3V0cHV0
X2Nsb3NlIChvdXRwdXQpOwotCQkJZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChvdXRwdXQpKTsK
LQkJfQotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBFTkFCTEVfUkVTT1VS
Q0VfTUFOQUdFUgotY2xhc3MgQUJJX0VYUE9SVCBzX0FiaVdvcmRfMV9MaXN0ZW5lciA6IHB1Ymxp
YyBQTF9MaXN0ZW5lciwgWEFQX1Jlc291cmNlTWFuYWdlcjo6V3JpdGVyCi0jZWxzZQogY2xhc3Mg
QUJJX0VYUE9SVCBzX0FiaVdvcmRfMV9MaXN0ZW5lciA6IHB1YmxpYyBQTF9MaXN0ZW5lcgotI2Vu
ZGlmCiB7CiBwdWJsaWM6CiAJc19BYmlXb3JkXzFfTGlzdGVuZXIoUERfRG9jdW1lbnQgKiBwRG9j
dW1lbnQsCkBAIC0yMjcsMTggKzE3NiwxNyBAQAogICAgIHZvaWQgICAgICAgICAgICAgICAgX2Ns
b3NlUkRGQW5jaG9yKHZvaWQpOwogCXZvaWQJCQkJX2Nsb3NlVGFnKHZvaWQpOwogCXZvaWQJCQkJ
X29wZW5TcGFuKFBUX0F0dHJQcm9wSW5kZXggYXBpU3Bhbik7Ci0Jdm9pZAkJCQlfb3BlblRhZyhj
b25zdCBjaGFyICogc3pQcmVmaXgsIGNvbnN0IGNoYXIgKiBzelN1ZmZpeCwKLQkJCQkJCQkJIGJv
b2wgYk5ld0xpbmVBZnRlciwgUFRfQXR0clByb3BJbmRleCBhcGksCi0JCQkJCQkJCSBVVF91aW50
MzIgaVhJRCwKKwl2b2lkCQkJCV9vcGVuVGFnKGNvbnN0IGNoYXIgKiBzelByZWZpeCwgYm9vbCBi
SGFzQ29udGVudCwKKwkJCQkJCQkJIFBUX0F0dHJQcm9wSW5kZXggYXBpLCBVVF91aW50MzIgaVhJ
RCwKIAkJCQkJCQkJIGJvb2wgYklnbm9yZVByb3BlcnRpZXMgPSBmYWxzZSk7Ci0Jdm9pZAkJCQlf
b3V0cHV0RGF0YShjb25zdCBVVF9VQ1NDaGFyICogcCwgVVRfdWludDMyIGxlbmd0aCk7Ci0Jdm9p
ZAkJCQlfb3V0cHV0WE1MQ2hhcihjb25zdCBnY2hhciAqIGRhdGEsIFVUX3VpbnQzMiBsZW5ndGgp
OwotCXZvaWQgICAgICAgICAgICAgICAgX291dHB1dFhNTENoYXIoY29uc3Qgc3RkOjpzdHJpbmcg
JiBzKQorCS8vdm9pZAkJCQlfb3V0cHV0RGF0YShjb25zdCBVVF9VQ1NDaGFyICogcCwgVVRfdWlu
dDMyIGxlbmd0aCk7CisJLy92b2lkCQkJCV9vdXRwdXRYTUxDaGFyKGNvbnN0IGdjaGFyICogZGF0
YSwgVVRfdWludDMyIGxlbmd0aCk7CisJLyp2b2lkICAgICAgICAgICAgICAgIF9vdXRwdXRYTUxD
aGFyKGNvbnN0IHN0ZDo6c3RyaW5nICYgcykKIAl7CiAJCV9vdXRwdXRYTUxDaGFyKHMuY19zdHIo
KSwgcy5zaXplKCkpOwotCX0KLQl2b2lkCQkJCV9vdXRwdXRYTUxBdHRyaWJ1dGUoY29uc3QgZ2No
YXIgKiBrZXksIGNvbnN0IGdjaGFyICogdmFsdWUsIFVUX3VpbnQzMiBsZW5ndGgpOwotCXZvaWQJ
CQkJX291dHB1dFhNTEF0dHJpYnV0ZShjb25zdCBnY2hhciAqIGtleSwgY29uc3Qgc3RkOjpzdHJp
bmcmIHZhbHVlICk7CisJfSovCisJLy92b2lkCQkJCV9vdXRwdXRYTUxBdHRyaWJ1dGUoY29uc3Qg
Z2NoYXIgKiBrZXksIGNvbnN0IGdjaGFyICogdmFsdWUsIFVUX3VpbnQzMiBsZW5ndGgpOworCS8v
dm9pZAkJCQlfb3V0cHV0WE1MQXR0cmlidXRlKGNvbnN0IGdjaGFyICoga2V5LCBjb25zdCBzdGQ6
OnN0cmluZyYgdmFsdWUgKTsKIAl2b2lkCQkJCV9oYW5kbGVTdHlsZXModm9pZCk7CiAJdm9pZAkJ
CQlfaGFuZGxlTGlzdHModm9pZCk7CiAJdm9pZAkJCQlfaGFuZGxlUGFnZVNpemUodm9pZCk7CkBA
IC0yNzgsNyArMjI2LDcgQEAKIAlpZiAoIW1fYkluU2VjdGlvbikKIAkJcmV0dXJuOwogCi0JbV9w
aWUtPndyaXRlKCI8L3NlY3Rpb24+XG4iKTsKKwltX3BpZS0+ZW5kRWxlbWVudCgpOwogCW1fYklu
U2VjdGlvbiA9IGZhbHNlOwogCXJldHVybjsKIH0KQEAgLTI4OSw3ICsyMzcsNyBAQAogCWlmICht
X2lJblRhYmxlID09IDApCiAJCXJldHVybjsKIAotCW1fcGllLT53cml0ZSgiPC90YWJsZT5cbiIp
OworCW1fcGllLT5lbmRFbGVtZW50KCk7CiAJbV9pSW5UYWJsZS0tOwogCXJldHVybjsKIH0KQEAg
LTMwMCw3ICsyNDgsNyBAQAogCWlmIChtX2lJbkNlbGwgPT0gMCkKIAkJcmV0dXJuOwogCi0JbV9w
aWUtPndyaXRlKCI8L2NlbGw+XG4iKTsKKwltX3BpZS0+ZW5kRWxlbWVudCgpOwogCW1faUluQ2Vs
bC0tOwogCXJldHVybjsKIH0KQEAgLTMxMCw4ICsyNTgsMTAgQEAKIAlpZiAoIW1fYkluQmxvY2sp
CiAJCXJldHVybjsKIAotCW1fcGllLT53cml0ZSgiPC9wPlxuIik7CisJbV9waWUtPmVuZEVsZW1l
bnQoKTsKIAltX2JJbkJsb2NrID0gZmFsc2U7CisJbV9waWUtPnNldFByZXR0eVByaW50KHRydWUp
OworCW1fcGllLT5hZGRTdHJpbmcoTlVMTCwgIlxuIik7CiAJcmV0dXJuOwogfQogCkBAIC0zMjcs
NyArMjc3LDggQEAKIAogdm9pZCBzX0FiaVdvcmRfMV9MaXN0ZW5lcjo6X2Nsb3NlVGFnKHZvaWQp
CiB7Ci0JaWYgKG1fYk9wZW5DaGFyKSBtX3BpZS0+d3JpdGUoIjwvYz4iKTsKKwlpZiAobV9iT3Bl
bkNoYXIpCisJCW1fcGllLT5lbmRFbGVtZW50KCk7CiAJbV9iT3BlbkNoYXIgPSBmYWxzZTsKIH0K
IApAQCAtMzM2LDcgKzI4Nyw3IEBACiAJaWYgKCFtX3BDdXJyZW50RmllbGQpCiAJCXJldHVybjsK
ICAgICBfY2xvc2VTcGFuKCk7Ci0JbV9waWUtPndyaXRlKCI8L2ZpZWxkPiIpOworCW1fcGllLT5l
bmRFbGVtZW50KCk7CiAgICAgbV9wQ3VycmVudEZpZWxkID0gTlVMTDsKIAlyZXR1cm47CiB9CkBA
IC0zNDYsNyArMjk3LDcgQEAKIAlpZiAoIW1fYkluSHlwZXJsaW5rKQogCQlyZXR1cm47CiAgICAg
X2Nsb3NlU3BhbigpOwotCW1fcGllLT53cml0ZSgiPC9hPiIpOworCW1fcGllLT5lbmRFbGVtZW50
KCk7CiAgICAgbV9iSW5IeXBlcmxpbmsgPSBmYWxzZTsKIAlyZXR1cm47CiB9CkBAIC0zNTgsNyAr
MzA5LDcgQEAKIAkJcmV0dXJuOwogCVVUX0RFQlVHTVNHKCgiRG9pbmcgY2xvc2UgYW5ub3RhdGlv
biBvYmplY3QgbWV0aG9kIFxuIikpOwogICAgIF9jbG9zZVNwYW4oKTsKLQltX3BpZS0+d3JpdGUo
IjwvYW5uPiIpOworCW1fcGllLT5lbmRFbGVtZW50KCk7CiAgICAgbV9iSW5Bbm5vdGF0aW9uID0g
ZmFsc2U7CiAJcmV0dXJuOwogfQpAQCAtMzY3LDcgKzMxOCw3IEBACiB7CiAJVVRfREVCVUdNU0co
KCJEb2luZyBjbG9zZSByZGYgYW5jaG9yIG9iamVjdCBtZXRob2QgXG4iKSk7CiAgICAgX2Nsb3Nl
U3BhbigpOwotCW1fcGllLT53cml0ZSgiPC90ZXh0bWV0YT4iKTsKKwltX3BpZS0+ZW5kRWxlbWVu
dCgpOwogCXJldHVybjsKIH0KIApAQCAtMzgzLDEzMyArMzM0LDI2IEBACiAJaWYgKCFhcGlTcGFu
KQkJCQkvLyBkb24ndCB3cml0ZSB0YWcgZm9yIGVtcHR5IEEvUAogCQlyZXR1cm47CiAKLQlfb3Bl
blRhZygiYyIsIiIsZmFsc2UsYXBpU3BhbiwwKTsKKwlfb3BlblRhZygiYyIsdHJ1ZSxhcGlTcGFu
LDApOwogCW1fYkluU3BhbiA9IHRydWU7CiAJbV9hcGlMYXN0U3BhbiA9IGFwaVNwYW47CiAJcmV0
dXJuOwogfQogCi12b2lkIHNfQWJpV29yZF8xX0xpc3RlbmVyOjpfb3BlblRhZyhjb25zdCBjaGFy
ICogc3pQcmVmaXgsIGNvbnN0IGNoYXIgKiBzelN1ZmZpeCwKLQkJCQkJCQkJCWJvb2wgYk5ld0xp
bmVBZnRlciwgUFRfQXR0clByb3BJbmRleCBhcGksCi0JCQkJCQkJCQlVVF91aW50MzIgaVhJRCwK
K3ZvaWQgc19BYmlXb3JkXzFfTGlzdGVuZXI6Ol9vcGVuVGFnKGNvbnN0IGNoYXIgKiBzelByZWZp
eCwgYm9vbCBiSGFzQ29udGVudCwKKwkJCQkJCQkJCVBUX0F0dHJQcm9wSW5kZXggYXBpLCBVVF91
aW50MzIgaVhJRCwKIAkJCQkJCQkJCWJvb2wgYklnbm9yZVByb3BlcnRpZXMpCiB7Ci0jaWZkZWYg
RU5BQkxFX1JFU09VUkNFX01BTkFHRVIKLQlVVF9BU1NFUlRfSEFSTUxFU1MgKCFtX2JPcGVuQ2hh
cik7Ci0KLQlVVF9VVEY4U3RyaW5nIHRhZygiPCIpOwotCVVUX1VURjhTdHJpbmcgdXJsOwotCVVU
X1VURjhTdHJpbmcgZXNjOwotCQotCXRhZyArPSBzelByZWZpeDsKLQogCWNvbnN0IFBQX0F0dHJQ
cm9wICogcEFQID0gTlVMTDsKLQlib29sIGJIYXZlUHJvcCA9IG1fcERvY3VtZW50LT5nZXRBdHRy
UHJvcCAoYXBpLCAmcEFQKTsKLQlpZiAoYkhhdmVQcm9wICYmIHBBUCkKLQl7Ci0JCWNvbnN0IGdj
aGFyICogc3pOYW1lID0gMDsKLQkJY29uc3QgZ2NoYXIgKiBzelZhbHVlID0gMDsKLQotCQlVVF91
aW50MzIgayA9IDA7Ci0JCXdoaWxlIChwQVAtPmdldE50aEF0dHJpYnV0ZSAoaysrLCBzek5hbWUs
IHN6VmFsdWUpKQotCQl7Ci0jaWYgMAotCQkJLy8KLQkJCS8vIFN0cmlwIG91dCBBdXRob3IgYXR0
cmlidXRlcyBmb3Igbm93LgotCQkJLy8KLQkJCWlmKCAhbV9wRG9jdW1lbnQtPmlzRXhwb3J0QXV0
aG9yQXR0cygpICYmIHN0cmNtcChzek5hbWUsUFRfQVVUSE9SX05BTUUpID09IDApCi0JCQkJY29u
dGludWU7Ci0jZW5kaWYKLQkJCXRhZyArPSAiICI7Ci0JCQl0YWcgKz0gc3pOYW1lOwotCQkJdGFn
ICs9ICI9XCIiOwotCi0JCQlpZiAoKHN0cmNtcCAoc3pOYW1lLCAiaHJlZiIpID09IDApIHx8IChz
dHJjbXAgKHN6TmFtZSwgInhsaW5rOmhyZWYiKSA9PSAwKSkKLQkJCXsKLQkJCQlpZigqc3pWYWx1
ZSA9PSAnLycpCi0JCQkJewotCQkJCQlYQVBfUmVzb3VyY2VNYW5hZ2VyICYgUk0gPSBtX3BEb2N1
bWVudC0+cmVzb3VyY2VNYW5hZ2VyICgpOwotCQkJCQlYQVBfRXh0ZXJuYWxSZXNvdXJjZSAqIHJl
ID0gZHluYW1pY19jYXN0PFhBUF9FeHRlcm5hbFJlc291cmNlICo+KFJNLnJlc291cmNlIChzelZh
bHVlLCBmYWxzZSkpOwotCQkJCQlpZiAocmUpCi0JCQkJCXsKLQkJCQkJCXVybCA9IHJlLT5VUkwg
KCk7Ci0JCQkJCQl1cmwuZXNjYXBlVVJMKCk7Ci0JCQkJCQl0YWcgKz0gdXJsOwotCQkJCQl9Ci0J
CQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXVybCA9IHN6VmFsdWU7Ci0JCQkJCXVybC5lc2Nh
cGVVUkwoKTsKLQkJCQkJdGFnICs9IHVybDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0J
CQkJZXNjID0gc3pWYWx1ZTsKLQkJCQllc2MuZXNjYXBlWE1MKCk7Ci0JCQkJdGFnICs9IGVzYzsK
LQkJCX0KLQkJCQotCi0JCQl0YWcgKz0gIlwiIjsKLQkJfQotCi0JCWlmKGlYSUQgIT0gMCkKLQkJ
ewotCQkJLy8gaW5zZXJ0IHhpZCBhdHRyaWJ1dGUKLQkJCXRhZyArPSAiICI7Ci0JCQl0YWcgKz0g
UFRfWElEX0FUVFJJQlVURV9OQU1FOwotCQkJdGFnICs9ICI9XCIiOwotCQkJVVRfVVRGOFN0cmlu
ZyBzOwotCQkJVVRfVVRGOFN0cmluZ19zcHJpbnRmKHMsICIlZFwiIiwgaVhJRCk7Ci0JCQl0YWcg
Kz0gczsKLQkJfQotCQkKLQkJaWYgKCFiSWdub3JlUHJvcGVydGllcykKLQkJewotCQkJayA9IDA7
Ci0JCQl3aGlsZSAocEFQLT5nZXROdGhQcm9wZXJ0eSAoaysrLCBzek5hbWUsIHN6VmFsdWUpKQot
CQkJewotCQkJCWlmIChrID09IDEpCi0JCQkJewotCQkJCQl0YWcgKz0gIiAiOwotCQkJCQl0YWcg
Kz0gUFRfUFJPUFNfQVRUUklCVVRFX05BTUU7Ci0JCQkJCXRhZyArPSAiPVwiIjsKLQkJCQl9Ci0J
CQkJZWxzZSB0YWcgKz0gIjsgIjsKLQotCQkJCXRhZyArPSBzek5hbWU7Ci0JCQkJdGFnICs9ICI6
IjsKLQotCQkJCWVzYyA9IHN6VmFsdWU7Ci0JCQkJZXNjLmVzY2FwZVhNTCgpOwotCQkJCXRhZyAr
PSBlc2M7Ci0JCQl9Ci0JCQlpZiAoayA+IDEpIHRhZyArPSAiXCIiOwotCQl9Ci0JfQotCWlmIChz
elN1ZmZpeCkKLQkJaWYgKCpzelN1ZmZpeCA9PSAnLycpCi0JCQl0YWcgKz0gIi8iOwotCXRhZyAr
PSAiPiI7Ci0JaWYgKGJOZXdMaW5lQWZ0ZXIpIHRhZyArPSAiXG4iOwotCW1fcGllLT53cml0ZSAo
dGFnLnV0Zjhfc3RyICgpLCB0YWcuYnl0ZUxlbmd0aCgpKTsKLQotCWlmIChzdHJjbXAgKHN6UHJl
Zml4LCAiYyIpID09IDApIG1fYk9wZW5DaGFyID0gdHJ1ZTsKLQotI2Vsc2UgLyogRU5BQkxFX1JF
U09VUkNFX01BTkFHRVIgKi8KLQljb25zdCBQUF9BdHRyUHJvcCAqIHBBUCA9IE5VTEw7CiAJYm9v
bCBiSGF2ZVByb3AgPSBtX3BEb2N1bWVudC0+Z2V0QXR0clByb3AoYXBpLCZwQVApOwotCXh4eF9V
VF9ERUJVR01TRygoIl9vcGVuVGFnOiBhcGkgJWQsIGJIYXZlUHJvcCAlZFxuIixhcGksIGJIYXZl
UHJvcCkpOworCXh4eF9VVF9ERUJVR01TRygoIl9vcGVuVGFnOiBhcGkgJWQsIGJIYXZlUHJvcCAl
ZFxuIiwgYXBpLCBiSGF2ZVByb3ApKTsKIAogCVVUX3JldHVybl9pZl9mYWlsKHN6UHJlZml4ICYm
ICpzelByZWZpeCk7CiAKLQltX3BpZS0+d3JpdGUoIjwiKTsKKwltX3BpZS0+c3RhcnRFbGVtZW50
KHN6UHJlZml4KTsKIAogCWlmKHN0cmNtcChzelByZWZpeCwiYyIpPT0gMCkKIAkJbV9iT3BlbkNo
YXIgPSB0cnVlOwotCW1fcGllLT53cml0ZShzelByZWZpeCk7CiAJaWYgKGJIYXZlUHJvcCAmJiBw
QVApCiAJewogCQlVVF9VVEY4U3RyaW5nIHVybDsKQEAgLTUyOSw0MSArMzczLDI3IEBACiAJCQlp
ZiggIW1fcERvY3VtZW50LT5pc0V4cG9ydEF1dGhvckF0dHMoKSAmJiBzdHJjbXAoc3pOYW1lLFBU
X0FVVEhPUl9OQU1FKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCi0JCQltX3BpZS0+d3JpdGUoIiAi
KTsKLQkJCW1fcGllLT53cml0ZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3pOYW1lKSk7Ci0J
CQltX3BpZS0+d3JpdGUoIj1cIiIpOwotCiAJCQlpZiAoKHN0cmNtcCAoc3pOYW1lLCAiaHJlZiIp
ID09IDApIHx8IChzdHJjbXAgKHN6TmFtZSwgInhsaW5rOmhyZWYiKSA9PSAwKSkKIAkJCXsKIAkJ
CQl1cmwgPSBzelZhbHVlOwogCQkJCXVybC5lc2NhcGVVUkwoKTsKLQkJCQlfb3V0cHV0WE1MQ2hh
cih1cmwudXRmOF9zdHIoKSwgdXJsLmJ5dGVMZW5ndGgoKSk7CisJCQkJbV9waWUtPmFkZFN0cmlu
Zyhzek5hbWUsIHVybC51dGY4X3N0cigpKTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQlfb3V0
cHV0WE1MQ2hhcihzelZhbHVlLCBzdHJsZW4oc3pWYWx1ZSkpOworCQkJCW1fcGllLT5hZGRTdHJp
bmcoc3pOYW1lLCBzelZhbHVlKTsKIAkJCX0KIAkJCQotCQkJbV9waWUtPndyaXRlKCJcIiIpOwog
CQl9CiAJCWlmKGlYSUQgIT0gMCkKIAkJewogCQkJLy8gaW5zZXJ0IHhpZCBhdHRyaWJ1dGUKLQkJ
CW1fcGllLT53cml0ZSgiICIpOwotCQkJbV9waWUtPndyaXRlKFBUX1hJRF9BVFRSSUJVVEVfTkFN
RSk7Ci0JCQltX3BpZS0+d3JpdGUoIj1cIiIpOwotCQkJVVRfU3RyaW5nIHM7Ci0JCQlVVF9TdHJp
bmdfc3ByaW50ZihzLCAiJWRcIiIsIGlYSUQpOwotCQkJbV9waWUtPndyaXRlKHMuY19zdHIoKSk7
CisJCQltX3BpZS0+YWRkSW50KCJ4aWQiLCBpWElEKTsKIAkJfQogCQlpZiAoIWJJZ25vcmVQcm9w
ZXJ0aWVzICYmIHBBUC0+Z2V0TnRoUHJvcGVydHkoMCxzek5hbWUsc3pWYWx1ZSkpCiAJCXsKLQkJ
CW1fcGllLT53cml0ZSgiICIpOwotCQkJbV9waWUtPndyaXRlKHN0YXRpY19jYXN0PGNvbnN0IGNo
YXIqPihQVF9QUk9QU19BVFRSSUJVVEVfTkFNRSkpOwotCQkJbV9waWUtPndyaXRlKCI9XCIiKTsK
LQkJCW1fcGllLT53cml0ZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3pOYW1lKSk7Ci0JCQlt
X3BpZS0+d3JpdGUoIjoiKTsKLQkJCV9vdXRwdXRYTUxDaGFyKHN6VmFsdWUsIHN0cmxlbihzelZh
bHVlKSk7CisJCQlzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOworCQkJYnVmIDw8IHN6TmFtZSA8PCAi
OiIgPDwgc3pWYWx1ZTsKIAkJCVVUX3VpbnQzMiBqID0gMTsKIAkJCXdoaWxlIChwQVAtPmdldE50
aFByb3BlcnR5KGorKyxzek5hbWUsc3pWYWx1ZSkpCiAJCQl7CkBAIC01NzIsMjI0ICs0MDIsNzkg
QEAKIAkJCQkvLyB0aGUgcHJvcGVydHkgYXQgYWxsPyBGb3Igbm93IEkgZml4ZWQgaXQgYnkgdGhl
IGxhdHRlci4KIAkJCQlpZiAoKnN6VmFsdWUpCiAJCQkJewotCQkJCQltX3BpZS0+d3JpdGUoIjsg
Iik7Ci0JCQkJCW1fcGllLT53cml0ZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3pOYW1lKSk7
Ci0JCQkJCW1fcGllLT53cml0ZSgiOiIpOwotCQkJCQlfb3V0cHV0WE1MQ2hhcihzelZhbHVlLCBz
dHJsZW4oc3pWYWx1ZSkpOworCQkJCQlidWYgPDwgIjsgIiA8PCBzek5hbWUgPDwgIjoiIDw8IHN6
VmFsdWU7CiAJCQkJfQogCQkJfQotCQkJbV9waWUtPndyaXRlKCJcIiIpOworCQkJbV9waWUtPmFk
ZFN0cmluZyhQVF9QUk9QU19BVFRSSUJVVEVfTkFNRSwgYnVmLnN0cigpKTsKIAkJfQogCX0KIAlp
ZihzdHJjbXAoc3pQcmVmaXgsIm1hdGgiKSA9PSAwKQogCXsKLQkJVVRfVVRGOFN0cmluZyB0YWc7
CiAJCWNvbnN0IGNoYXIgKiBzelByb3BWYWwgPSBOVUxMOwogCQlwQVAtPmdldEF0dHJpYnV0ZSgi
ZGF0YWlkIixzelByb3BWYWwpOwogCQlpZihzelByb3BWYWwgIT0gTlVMTCkKIAkJewotCQkJdGFn
ID0gIj4iOwotCQkJaWYgKGJOZXdMaW5lQWZ0ZXIpIHRhZyArPSAiXG4iOwotCQkJbV9waWUtPndy
aXRlICh0YWcudXRmOF9zdHIgKCksIHRhZy5ieXRlTGVuZ3RoKCkpOwotCQkJdGFnLmNsZWFyKCk7
Ci0JCQl0YWcgPSAiPGltYWdlIGRhdGFpZD0iOwotCQkJdGFnICs9ICJcIiI7Ci0JCQl0YWcgKz0g
InNuYXBzaG90LXN2Zy0iOworCQkJbV9waWUtPnN0YXJ0RWxlbWVudCgiaW1hZ2UiKTsKKwkJCXN0
ZDo6c3RyaW5nIHRhZyA9ICJzbmFwc2hvdC1zdmctIjsKIAkJCXRhZyArPSBzelByb3BWYWw7Ci0J
CQl0YWcgKz0gIlwiIjsKLQkJCXRhZyArPSAiICI7Ci0JCQl0YWcgKz0gUFRfUFJPUFNfQVRUUklC
VVRFX05BTUU7Ci0JCQl0YWcgKz0gIj1cIiI7CisJCQltX3BpZS0+YWRkU3RyaW5nKCJkYXRhaWQi
LCB0YWcpOwogCQkJYm9vbCBiRm91bmQgPSBwQVAtPmdldFByb3BlcnR5KCJoZWlnaHQiLCBzelBy
b3BWYWwpOwotCQkJVVRfVVRGOFN0cmluZyBzVmFsOworCQkJc3RkOjpvc3RyaW5nc3RyZWFtIGJ1
ZjsKKwkJCWJvb2wgbmVlZF9zZXAgPSBmYWxzZTsKIAkJCWlmKGJGb3VuZCkKIAkJCXsKIAkJCQlk
b3VibGUgZEluY2ggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGF0b2koc3pQcm9wVmFsKSkvVVRfTEFZ
T1VUX1JFU09MVVRJT047Ci0JCQkJVVRfVVRGOFN0cmluZ19zcHJpbnRmKHNWYWwsIiVmaW4iLGRJ
bmNoKTsKLQkJCQl0YWcgKz0gImhlaWdodDoiOwotCQkJCXRhZyArPSBzVmFsOwotCQkJCXRhZyAr
PSAiOyAiOworCQkJCWJ1ZiA8PCAiaGVpZ2h0OiIgPDwgZEluY2ggPDwgImluIjsKKwkJCQluZWVk
X3NlcCA9IHRydWU7CiAJCQl9CiAJCQliRm91bmQgPSBwQVAtPmdldFByb3BlcnR5KCJ3aWR0aCIs
IHN6UHJvcFZhbCk7CiAJCQlpZihiRm91bmQpCiAJCQl7CisJCQkJaWYgKG5lZWRfc2VwKQorCQkJ
CQlidWYgPDwgIjsgIjsKIAkJCQlkb3VibGUgZEluY2ggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGF0
b2koc3pQcm9wVmFsKSkvVVRfTEFZT1VUX1JFU09MVVRJT047Ci0JCQkJVVRfVVRGOFN0cmluZ19z
cHJpbnRmKHNWYWwsIiVmaW4iLGRJbmNoKTsKLQkJCQl0YWcgKz0gIndpZHRoOiI7Ci0JCQkJdGFn
ICs9IHNWYWw7CisJCQkJYnVmIDw8ICJ3aWR0aDoiIDw8IGRJbmNoIDw8ICJpbiI7CiAJCQl9Ci0J
CQl0YWcgKz0gIlwiIjsKLQkJCXRhZyArPSAiLyI7Ci0JCQl0YWcgKz0gIj4iOwotCQkJdGFnICs9
ICI8L21hdGgiOwotCQkJdGFnICs9ICI+IjsKKwkJCW1fcGllLT5hZGRTdHJpbmcoUFRfUFJPUFNf
QVRUUklCVVRFX05BTUUsIGJ1Zi5zdHIoKSk7CisJCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQl9
Ci0JCWVsc2UKLQkJewotCQkJaWYgKHN6U3VmZml4KQotCQkJCWlmICgqc3pTdWZmaXggPT0gJy8n
KQotCQkJCQl0YWcgKz0gIi8iOwotCQkJdGFnICs9ICI+IjsKLQkJCWlmIChiTmV3TGluZUFmdGVy
KSB0YWcgKz0gIlxuIjsKLQkJfQotCQltX3BpZS0+d3JpdGUgKHRhZy51dGY4X3N0ciAoKSwgdGFn
LmJ5dGVMZW5ndGgoKSk7CiAJfQogCWVsc2UgaWYoc3RyY21wKHN6UHJlZml4LCJlbWJlZCIpID09
IDApCiAJewotCQlVVF9VVEY4U3RyaW5nIHRhZzsKIAkJY29uc3QgY2hhciAqIHN6UHJvcFZhbCA9
IE5VTEw7CiAJCXBBUC0+Z2V0QXR0cmlidXRlKCJkYXRhaWQiLHN6UHJvcFZhbCk7CiAJCWlmKHN6
UHJvcFZhbCAhPSBOVUxMKQogCQl7Ci0JCQlib29sIGhhc19zdmc7Ci0JCQl0YWcgPSAiPiI7Ci0J
CQlpZiAoYk5ld0xpbmVBZnRlcikgdGFnICs9ICJcbiI7Ci0JCQlzdGQ6OnN0cmluZyBzSUQgPSBz
dGQ6OnN0cmluZygic25hcHNob3Qtc3ZnLSIpICsgc3pQcm9wVmFsOwotCQkJaGFzX3N2ZyA9IG1f
cERvY3VtZW50LT5nZXREYXRhSXRlbURhdGFCeU5hbWUoc0lELmNfc3RyICgpLCBOVUxMLCBOVUxM
LCBOVUxMKTsKLQkJCW1fcGllLT53cml0ZSAodGFnLnV0Zjhfc3RyICgpLCB0YWcuYnl0ZUxlbmd0
aCgpKTsKLQkJCXRhZy5jbGVhcigpOwotCQkJdGFnID0gIjxpbWFnZSBkYXRhaWQ9IjsKLQkJCXRh
ZyArPSAiXCIiOwotCQkJdGFnICs9IChoYXNfc3ZnKT8gInNuYXBzaG90LXN2Zy0iOiAic25hcHNo
b3QtcG5nLSI7Ci0JCQl0YWcgKz0gc3pQcm9wVmFsOwotCQkJdGFnICs9ICJcIiI7Ci0JCQl0YWcg
Kz0gIiAiOwotCQkJdGFnICs9IFBUX1BST1BTX0FUVFJJQlVURV9OQU1FOwotCQkJdGFnICs9ICI9
XCIiOworCQkJbV9waWUtPnN0YXJ0RWxlbWVudCgiaW1hZ2UiKTsKKwkJCXN0ZDo6c3RyaW5nIHRh
ZyA9IHN0ZDo6c3RyaW5nKCJzbmFwc2hvdC1zdmctIikgKyBzelByb3BWYWw7CisJCQlpZiAoIW1f
cERvY3VtZW50LT5nZXREYXRhSXRlbURhdGFCeU5hbWUodGFnLmNfc3RyICgpLCBOVUxMLCBOVUxM
LCBOVUxMKSkKKwkJCQl0YWcgPSBzdGQ6OnN0cmluZygic25hcHNob3QtcG5nLSIpICsgc3pQcm9w
VmFsOworCQkJbV9waWUtPmFkZFN0cmluZygiZGF0YWlkIiwgdGFnKTsKIAkJCWJvb2wgYkZvdW5k
ID0gcEFQLT5nZXRQcm9wZXJ0eSgiaGVpZ2h0Iiwgc3pQcm9wVmFsKTsKLQkJCVVUX1VURjhTdHJp
bmcgc1ZhbDsKKwkJCXN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CisJCQlib29sIG5lZWRfc2VwID0g
ZmFsc2U7CiAJCQlpZihiRm91bmQpCiAJCQl7CiAJCQkJZG91YmxlIGRJbmNoID0gc3RhdGljX2Nh
c3Q8ZG91YmxlPihhdG9pKHN6UHJvcFZhbCkpL1VUX0xBWU9VVF9SRVNPTFVUSU9OOwotCQkJCVVU
X1VURjhTdHJpbmdfc3ByaW50ZihzVmFsLCIlZmluIixkSW5jaCk7Ci0JCQkJdGFnICs9ICJoZWln
aHQ6IjsKLQkJCQl0YWcgKz0gc1ZhbDsKLQkJCQl0YWcgKz0gIjsgIjsKKwkJCQlidWYgPDwgImhl
aWdodDoiIDw8IGRJbmNoIDw8ICJpbiI7CisJCQkJbmVlZF9zZXAgPSB0cnVlOwogCQkJfQogCQkJ
YkZvdW5kID0gcEFQLT5nZXRQcm9wZXJ0eSgid2lkdGgiLCBzelByb3BWYWwpOwogCQkJaWYoYkZv
dW5kKQogCQkJeworCQkJCWlmIChuZWVkX3NlcCkKKwkJCQkJYnVmIDw8ICI7ICI7CiAJCQkJZG91
YmxlIGRJbmNoID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihhdG9pKHN6UHJvcFZhbCkpL1VUX0xBWU9V
VF9SRVNPTFVUSU9OOwotCQkJCVVUX1VURjhTdHJpbmdfc3ByaW50ZihzVmFsLCIlZmluIixkSW5j
aCk7Ci0JCQkJdGFnICs9ICJ3aWR0aDoiOwotCQkJCXRhZyArPSBzVmFsOworCQkJCWJ1ZiA8PCAi
d2lkdGg6IiA8PCBkSW5jaCA8PCAiaW4iOwogCQkJfQotCQkJdGFnICs9ICJcIiI7Ci0JCQl0YWcg
Kz0gIi8iOwotCQkJdGFnICs9ICI+IjsKLQkJCXRhZyArPSAiPC9lbWJlZCI7Ci0JCQl0YWcgKz0g
Ij4iOworCQkJbV9waWUtPmFkZFN0cmluZyhQVF9QUk9QU19BVFRSSUJVVEVfTkFNRSwgYnVmLnN0
cigpKTsKKwkJCW1fcGllLT5lbmRFbGVtZW50KCk7CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAo
c3pTdWZmaXgpCi0JCQkJaWYgKCpzelN1ZmZpeCA9PSAnLycpCi0JCQkJCXRhZyArPSAiLyI7Ci0J
CQl0YWcgKz0gIj4iOwotCQkJaWYgKGJOZXdMaW5lQWZ0ZXIpIHRhZyArPSAiXG4iOwotCQl9Ci0J
CW1fcGllLT53cml0ZSAodGFnLnV0Zjhfc3RyICgpLCB0YWcuYnl0ZUxlbmd0aCgpKTsKIAl9Ci0J
ZWxzZQotCXsKLQkJaWYgKHN6U3VmZml4KQotCQkJaWYgKCpzelN1ZmZpeCA9PSAnLycpCi0JCQkJ
bV9waWUtPndyaXRlICgiLyIpOwotCQltX3BpZS0+d3JpdGUgKCI+Iik7Ci0JCWlmIChiTmV3TGlu
ZUFmdGVyKQotCQkJbV9waWUtPndyaXRlICgiXG4iKTsKLQl9Ci0JLy8JbV9iSW5UYWcgPSB0cnVl
OwotI2VuZGlmIC8qIEVOQUJMRV9SRVNPVVJDRV9NQU5BR0VSICovCisJaWYgKCFiSGFzQ29udGVu
dCkKKwkJbV9waWUtPmVuZEVsZW1lbnQoKTsKIH0KIAotLy8gVGhpcyBtZXRob2QgaXMgdmVyeSBt
dWNoIGxpa2UgX291dHB1dERhdGEgYnV0IHVzZXMgZ2NoYXJzIGluc3RlYWQgb2YgVVRfVUNTNF9D
aGFyJ3MuCi12b2lkIHNfQWJpV29yZF8xX0xpc3RlbmVyOjpfb3V0cHV0WE1MQ2hhcihjb25zdCBn
Y2hhciAqIGRhdGEsIFVUX3VpbnQzMiBsZW5ndGgpCi17Ci0JVVRfVVRGOFN0cmluZyBzQnVmIChk
YXRhLCBsZW5ndGgpOwotCXNCdWYuZXNjYXBlWE1MKCk7Ci0JCi0JbV9waWUtPndyaXRlKHNCdWYu
dXRmOF9zdHIoKSxzQnVmLmJ5dGVMZW5ndGgoKSk7Ci19Ci0KLS8vIFRoaXMgaXMgdmVyeSBtdWNo
IGxpa2UgX291dHB1dFhNTENoYXIgYnV0IGFkZHMgdGhlID4+PiBrZXk9InZhbHVlIiA8PDwgcGFk
ZGluZyBhbiBxdW90aW5nIGZvciB5b3UgCi12b2lkIHNfQWJpV29yZF8xX0xpc3RlbmVyOjpfb3V0
cHV0WE1MQXR0cmlidXRlKGNvbnN0IGdjaGFyICoga2V5LCBjb25zdCBnY2hhciAqIHZhbHVlLCBV
VF91aW50MzIgbGVuZ3RoKQotewotICAgIG1fcGllLT53cml0ZSgiICIpOwotICAgIG1fcGllLT53
cml0ZShrZXkpOwotICAgIG1fcGllLT53cml0ZSgiPVwiIik7Ci0gICAgX291dHB1dFhNTENoYXIg
KCB2YWx1ZSwgbGVuZ3RoICk7Ci0gICAgbV9waWUtPndyaXRlKCJcIiAiKTsgICAgCi19Ci0KLXZv
aWQgc19BYmlXb3JkXzFfTGlzdGVuZXI6Ol9vdXRwdXRYTUxBdHRyaWJ1dGUoY29uc3QgZ2NoYXIg
KiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSApCi17Ci0gICAgX291dHB1dFhNTEF0dHJp
YnV0ZSgga2V5LCB2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSApOwotfQotCi0KLQotdm9p
ZCBzX0FiaVdvcmRfMV9MaXN0ZW5lcjo6X291dHB1dERhdGEoY29uc3QgVVRfVUNTQ2hhciAqIGRh
dGEsIFVUX3VpbnQzMiBsZW5ndGgpCi17Ci0JVVRfVVRGOFN0cmluZyBzQnVmOwotCWNvbnN0IFVU
X1VDU0NoYXIgKiBwRGF0YTsKLQotCVVUX3JldHVybl9pZl9mYWlsKHNpemVvZihVVF9CeXRlKSA9
PSBzaXplb2YoY2hhcikpOwotCXNCdWYucmVzZXJ2ZShsZW5ndGgpOwotCi0JZm9yIChwRGF0YT1k
YXRhOyAocERhdGE8ZGF0YStsZW5ndGgpOyAvKiovKQotCXsKLQkJc3dpdGNoICgqcERhdGEpCi0J
CXsKLQkJY2FzZSAnPCc6Ci0JCQlzQnVmICs9ICImbHQ7IjsKLQkJCXBEYXRhKys7Ci0JCQlicmVh
azsKLQotCQljYXNlICc+JzoKLQkJCXNCdWYgKz0gIiZndDsiOwotCQkJcERhdGErKzsKLQkJCWJy
ZWFrOwotCi0JCWNhc2UgJyYnOgotCQkJc0J1ZiArPSAiJmFtcDsiOwotCQkJcERhdGErKzsKLQkJ
CWJyZWFrOwotCi0JCWNhc2UgVUNTX0xGOgkJCQkJLy8gTEYgLS0gcmVwcmVzZW50aW5nIGEgRm9y
Y2VkLUxpbmUtQnJlYWsKLQkJCXNCdWYgKz0gIjxici8+IjsKLQkJCXBEYXRhKys7Ci0JCQlicmVh
azsKLQotCQljYXNlIFVDU19WVEFCOgkJCQkJLy8gVlRBQiAtLSByZXByZXNlbnRpbmcgYSBGb3Jj
ZWQtQ29sdW1uLUJyZWFrCi0JCQlzQnVmICs9ICI8Y2JyLz4iOwotCQkJcERhdGErKzsKLQkJCWJy
ZWFrOwotCi0JCWNhc2UgVUNTX1RBQjoKLQkJCXNCdWYgKz0gIlx0IjsKLQkJCXBEYXRhKys7Ci0J
CQlicmVhazsKLQotCQljYXNlIFVDU19GRjoJCQkJCS8vIEZGIC0tIHJlcHJlc2VudGluZyBhIEZv
cmNlZC1QYWdlLUJyZWFrCi0JCQlzQnVmICs9ICI8cGJyLz4iOwotCQkJcERhdGErKzsKLQkJCWJy
ZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlpZiAoKnBEYXRhIDwgMHgyMCkgICAgICAgICAvLyBTaWxl
bnRseSBlYXQgdGhlc2UgY2hhcmFjdGVycy4KLQkJCQlwRGF0YSsrOwotCQkJZWxzZQotCQkJCXsK
LQkJCQkJc0J1Zi5hcHBlbmRVQ1M0IChwRGF0YSwgMSk7Ci0JCQkJCXBEYXRhKys7Ci0JCQkJfQot
CQl9Ci0JfQotCi0JbV9waWUtPndyaXRlKHNCdWYudXRmOF9zdHIoKSxzQnVmLmJ5dGVMZW5ndGgo
KSk7Ci19Ci0KIHNfQWJpV29yZF8xX0xpc3RlbmVyOjpzX0FiaVdvcmRfMV9MaXN0ZW5lcihQRF9E
b2N1bWVudCAqIHBEb2N1bWVudCwKIAkJCQkJCQkJCQkgICBJRV9FeHBfQWJpV29yZF8xICogcGll
LAogCQkJCQkJCQkJCSAgIGJvb2wgaXNUZW1wbGF0ZSkKQEAgLTgxMCw5ICs0OTUsNiBAQAogCW1f
aUluQ2VsbCA9IDA7CiAJbV9iSW5Bbm5vdGF0aW9uID0gZmFsc2U7CiAKLQltX3BpZS0+d3JpdGUo
Ijw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7Ci0JbV9waWUt
PndyaXRlICgiPCFET0NUWVBFIGFiaXdvcmQgUFVCTElDIFwiLS8vQUJJU09VUkNFLy9EVEQgQVdN
TCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy5hYmlzb3VyY2UuY29tL2F3bWwuZHRkXCI+
XG4iKTsKLQogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgICAgIFRoZSBmaXhl
ZCBhdHRyaWJ1dGVzIG9mIHRoZSA8YWJpd29yZD4gdG9rZW4gdGhhdCB1c2VkIHRvIHJlc2lkZQpA
QCAtODE5LDYgKzUwMSw3IEBACiAgICAgICAgIGhlcmUgYXJlIG5vdyBmb3VuZCBpbiBQRF9Eb2N1
bWVudDo6c2V0QXR0clByb3AoKQogCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCW1f
cGllLT5zZXREb2NUeXBlICgiPCFET0NUWVBFIGFiaXdvcmQgUFVCTElDIFwiLS8vQUJJU09VUkNF
Ly9EVEQgQVdNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy5hYmlzb3VyY2UuY29tL2F3
bWwuZHRkXCI+XG4iKTsKIAogCS8vIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBYSUQgY291bnRlciBh
bmQgdGhlIHRlbXBsYXRlIHN0YXR1cwogCVVUX1N0cmluZyBzOwpAQCAtODMzLDE4ICs1MTYsMjAg
QEAKIAkKIAlwRG9jdW1lbnQtPnNldEF0dHJpYnV0ZXMoYXR0cik7CiAKLQlfb3BlblRhZygiYWJp
d29yZCIsIE5VTEwsIHRydWUsIHBEb2N1bWVudC0+Z2V0QXR0clByb3BJbmRleCgpLGZhbHNlLDAp
OworCV9vcGVuVGFnKCJhYml3b3JkIiwgdHJ1ZSwgcERvY3VtZW50LT5nZXRBdHRyUHJvcEluZGV4
KCksZmFsc2UsMCk7CiAKIAkvLyBOT1RFIHdlIG91dHB1dCB0aGUgZm9sbG93aW5nIHByZWFtYmxl
IGluIFhNTCBjb21tZW50cy4KIAkvLyBOT1RFIHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIGh1bWFu
IHZpZXdpbmcgb25seS4KIAotCW1fcGllLT53cml0ZSgiPCEtLSA9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+
XG4iKTsKLQltX3BpZS0+d3JpdGUoIjwhLS0gVGhpcyBmaWxlIGlzIGFuIEFiaVdvcmQgZG9jdW1l
bnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuIik7Ci0JbV9w
aWUtPndyaXRlKCI8IS0tIEFiaVdvcmQgaXMgYSBmcmVlLCBPcGVuIFNvdXJjZSB3b3JkIHByb2Nl
c3Nvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAtLT5cbiIpOwotCW1fcGllLT53cml0ZSgi
PCEtLSBNb3JlIGluZm9ybWF0aW9uIGFib3V0IEFiaVdvcmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6
Ly93d3cuYWJpc291cmNlLmNvbS8gLS0+XG4iKTsKLQltX3BpZS0+d3JpdGUoIjwhLS0gWW91IHNo
b3VsZCBub3QgZWRpdCB0aGlzIGZpbGUgYnkgaGFuZC4gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC0tPlxuIik7Ci0JbV9waWUtPndyaXRlKCI8IS0tID09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAt
LT5cblxuIik7Ci0KKwltX3BpZS0+YWRkU3RyaW5nKE5VTEwsICJcbiIpOworCW1fcGllLT5hZGRD
b21tZW50KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKwltX3BpZS0+YWRkQ29tbWVudCgiVGhpcyBmaWxl
IGlzIGFuIEFiaVdvcmQgZG9jdW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIik7CisJbV9waWUtPmFkZENvbW1lbnQoIkFiaVdvcmQgaXMgYSBmcmVlLCBPcGVuIFNv
dXJjZSB3b3JkIHByb2Nlc3Nvci4gICAgICAgICAgICAgICAgICAgICAgICAgICIpOworCW1fcGll
LT5hZGRDb21tZW50KCJNb3JlIGluZm9ybWF0aW9uIGFib3V0IEFiaVdvcmQgaXMgYXZhaWxhYmxl
IGF0IGh0dHA6Ly93d3cuYWJpc291cmNlLmNvbS8iKTsKKwltX3BpZS0+YWRkQ29tbWVudCgiWW91
IHNob3VsZCBub3QgZWRpdCB0aGlzIGZpbGUgYnkgaGFuZC4gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIik7CisJbV9waWUtPmFkZENvbW1lbnQoIj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwor
CW1fcGllLT5hZGRTdHJpbmcoTlVMTCwgIlxuIik7CisJCQogCS8vIGVuZCBvZiBwcmVhbWJsZS4K
IAkvLyBub3cgd2UgYmVnaW4gdGhlIGFjdHVhbCBkb2N1bWVudC4KIApAQCAtODY5LDcgKzU1NCw3
IEBACiAJX2Nsb3NlU2VjdGlvbigpOwogCV9oYW5kbGVEYXRhSXRlbXMoKTsKIAotCW1fcGllLT53
cml0ZSgiPC9hYml3b3JkPlxuIik7CisJbV9waWUtPmVuZEVsZW1lbnQoKTsKIAlVVF9WRUNUT1Jf
UFVSR0VBTEwoVVRfVVRGOFN0cmluZyAqICxtX3ZlY1NuYXBOYW1lcyk7CiB9CiAKQEAgLTkwNiw3
ICs1OTEsNyBAQAogCQkJX29wZW5TcGFuKGFwaSk7CiAKIAkJCVBUX0J1ZkluZGV4IGJpID0gcGNy
cy0+Z2V0QnVmSW5kZXgoKTsKLQkJCV9vdXRwdXREYXRhKG1fcERvY3VtZW50LT5nZXRQb2ludGVy
KGJpKSxwY3JzLT5nZXRMZW5ndGgoKSk7CisJCQltX3BpZS0+YWRkU3RyaW5nKE5VTEwsIG1fcERv
Y3VtZW50LT5nZXRQb2ludGVyKGJpKSwgcGNycy0+Z2V0TGVuZ3RoKCkpOwogCiAJCQlyZXR1cm4g
dHJ1ZTsKIAkJfQpAQCAtOTIxLDEyICs2MDYsMTAgQEAKIAkJCQl7CiAJCQkJX2Nsb3NlU3Bhbigp
OwogICAgICAgICAgICAgICAgIF9jbG9zZUZpZWxkKCk7Ci0jaWZuZGVmIEVOQUJMRV9SRVNPVVJD
RV9NQU5BR0VSCiAJCQkJY29uc3QgZ2NoYXIqIGltYWdlX25hbWUgPSBnZXRPYmplY3RLZXkoYXBp
LCBzdGF0aWNfY2FzdDxjb25zdCBnY2hhcio+KCJkYXRhaWQiKSk7CiAJCQkJaWYgKGltYWdlX25h
bWUpCiAJCQkJCW1fcFVzZWRJbWFnZXMuaW5zZXJ0KGltYWdlX25hbWUpOwotI2VuZGlmCi0JCQkJ
X29wZW5UYWcoImltYWdlIiwiLyIsZmFsc2UsYXBpLHBjci0+Z2V0WElEKCkpOworCQkJCV9vcGVu
VGFnKCJpbWFnZSIsZmFsc2UsYXBpLHBjci0+Z2V0WElEKCkpOwogCiAJCQkJcmV0dXJuIHRydWU7
CiAJCQkJfQpAQCAtOTM0LDcgKzYxNyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAg
ICAgICAgICAgICBfY2xvc2VTcGFuKCk7CiAgICAgICAgICAgICAgICAgICAgIF9jbG9zZUZpZWxk
KCk7Ci0gICAgICAgICAgICAgICAgICAgIF9vcGVuVGFnKCJmaWVsZCIsIiIsZmFsc2UsYXBpLHBj
ci0+Z2V0WElEKCkpOworICAgICAgICAgICAgICAgICAgICBfb3BlblRhZygiZmllbGQiLHRydWUs
YXBpLHBjci0+Z2V0WElEKCkpOwogICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50RmllbGQg
PSBwY3JvLT5nZXRGaWVsZCgpOwogICAgICAgICAgICAgICAgICAgICBVVF9BU1NFUlRfSEFSTUxF
U1MobV9wQ3VycmVudEZpZWxkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBA
IC05NDMsNyArNjI2LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg
IF9jbG9zZVNwYW4oKTsKICAgICAgICAgICAgICAgICAgICAgX2Nsb3NlRmllbGQoKTsKLSAgICAg
ICAgICAgICAgICAgICAgX29wZW5UYWcoIm1hdGgiLCIvIixmYWxzZSxhcGkscGNyLT5nZXRYSUQo
KSk7CisgICAgICAgICAgICAgICAgICAgIF9vcGVuVGFnKCJtYXRoIixmYWxzZSxhcGkscGNyLT5n
ZXRYSUQoKSk7CiAJCQkJCWNvbnN0IGdjaGFyKiBpbWFnZV9uYW1lID0gZ2V0T2JqZWN0S2V5KGFw
aSwgc3RhdGljX2Nhc3Q8Y29uc3QgZ2NoYXIqPigiZGF0YWlkIikpOwogCQkJCQlpZiAoaW1hZ2Vf
bmFtZSkKIAkJCQkJewpAQCAtOTY3LDcgKzY1MCw3IEBACiAgICAgICAgICAgICAgICAgewogICAg
ICAgICAgICAgICAgICAgICBfY2xvc2VTcGFuKCk7CiAgICAgICAgICAgICAgICAgICAgIF9jbG9z
ZUZpZWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9vcGVuVGFnKCJlbWJlZCIsIi8iLGZhbHNl
LGFwaSxwY3ItPmdldFhJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgX29wZW5UYWcoImVtYmVk
IixmYWxzZSxhcGkscGNyLT5nZXRYSUQoKSk7CiAJCQkJCWNvbnN0IGdjaGFyKiBpbWFnZV9uYW1l
ID0gZ2V0T2JqZWN0S2V5KGFwaSwgc3RhdGljX2Nhc3Q8Y29uc3QgZ2NoYXIqPigiZGF0YWlkIikp
OwogCQkJCQlpZiAoaW1hZ2VfbmFtZSkKIAkJCQkJewpAQCAtOTg3LDcgKzY3MCw3IEBACiAgICAJ
CQkJewogICAgCQkJCQlfY2xvc2VTcGFuKCk7CiAgICAJCQkJCV9jbG9zZUZpZWxkKCk7Ci0gICAJ
CQkJCV9vcGVuVGFnKCJib29rbWFyayIsICIvIixmYWxzZSwgYXBpLHBjci0+Z2V0WElEKCksdHJ1
ZSk7CisgICAJCQkJCV9vcGVuVGFnKCJib29rbWFyayIsIGZhbHNlLCBhcGkscGNyLT5nZXRYSUQo
KSx0cnVlKTsKICAgIAkJCQkJcmV0dXJuIHRydWU7CiAgICAJCQkJfQogCkBAIC0xMDEzLDcgKzY5
Niw3IEBACiAJCQkJCWlmKGJGb3VuZCkKIAkJCQkJewogCQkJCQkJLy90aGlzIGlzIHRoZSBzdGFy
dCBvZiB0aGUgaHlwZXJsaW5rCi0gICAJCQkJCQlfb3BlblRhZygiYSIsICIiLGZhbHNlLCBhcGks
cGNyLT5nZXRYSUQoKSx0cnVlKTsKKyAgIAkJCQkJCV9vcGVuVGFnKCJhIiwgdHJ1ZSwgYXBpLHBj
ci0+Z2V0WElEKCksdHJ1ZSk7CiAgICAJCQkJCQltX2JJbkh5cGVybGluayA9IHRydWU7CiAgICAJ
CQkJCX0KIApAQCAtMTA0MCw3ICs3MjMsNyBAQAogCQkJCQlpZihiRm91bmQpCiAJCQkJCXsKIAkJ
CQkJCS8vdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIEFubm90YXRpb24KLSAgIAkJCQkJCV9vcGVu
VGFnKCJhbm4iLCAiIixmYWxzZSwgYXBpLHBjci0+Z2V0WElEKCksdHJ1ZSk7CisgICAJCQkJCQlf
b3BlblRhZygiYW5uIiwgdHJ1ZSwgYXBpLHBjci0+Z2V0WElEKCksdHJ1ZSk7CiAJCQkJCQlVVF9E
RUJVR01TRygoIkRvaW5nIG9wZW4gYW5ub3RhdGlvbiBvYmplY3QgXG4iKSk7CiAgICAJCQkJCQlt
X2JJbkFubm90YXRpb24gPSB0cnVlOwogICAgCQkJCQl9CkBAIC0xMDU3LDcgKzc0MCw3IEBACiAg
ICAgICAgICAgICAgICAgICAgIFJERkFuY2hvciBhKCBwQVAgKTsKICAgICAgICAgICAgICAgICAg
ICAgaWYoICFhLmlzRW5kKCkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAJCQkJCQlfb3Bl
blRhZygidGV4dG1ldGEiLCAiIixmYWxzZSwgYXBpLHBjci0+Z2V0WElEKCksdHJ1ZSk7CisgICAJ
CQkJCQlfb3BlblRhZygidGV4dG1ldGEiLCB0cnVlLCBhcGkscGNyLT5nZXRYSUQoKSx0cnVlKTsK
ICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAg
ICAgICAgICAgICAgIHsKQEAgLTEwOTgsMTIgKzc4MSwxMCBAQAogCVVUX3JldHVybl92YWxfaWZf
ZmFpbChwY3ItPmdldFR5cGUoKSA9PSBQWF9DaGFuZ2VSZWNvcmQ6OlBYVF9JbnNlcnRTdHJ1eCwg
ZmFsc2UpOwogCWNvbnN0IFBYX0NoYW5nZVJlY29yZF9TdHJ1eCAqIHBjcnggPSBzdGF0aWNfY2Fz
dDxjb25zdCBQWF9DaGFuZ2VSZWNvcmRfU3RydXggKj4gKHBjcik7CiAJKnBzZmggPSAwOwkJCQkJ
CQkvLyB3ZSBkb24ndCBuZWVkIGl0LgotI2lmbmRlZiBFTkFCTEVfUkVTT1VSQ0VfTUFOQUdFUgog
CVBUX0F0dHJQcm9wSW5kZXggYXBpID0gcGNyLT5nZXRJbmRleEFQKCk7CiAJY29uc3QgZ2NoYXIq
IGltYWdlX25hbWUgPSBnZXRPYmplY3RLZXkoYXBpLCBzdGF0aWNfY2FzdDxjb25zdCBnY2hhcio+
KFBUX1NUUlVYX0lNQUdFX0RBVEFJRCkpOwogCWlmIChpbWFnZV9uYW1lKQogCQltX3BVc2VkSW1h
Z2VzLmluc2VydChpbWFnZV9uYW1lKTsKLSNlbmRpZgogCiAJc3dpdGNoIChwY3J4LT5nZXRTdHJ1
eFR5cGUoKSkKIAl7CkBAIC0xMTE2LDcgKzc5Nyw3IEBACiAJCQlfY2xvc2VBbm5vdGF0aW9uKCk7
CiAJCQlfY2xvc2VCbG9jaygpOwogCQkJX2Nsb3NlU2VjdGlvbigpOwotCQkJX29wZW5UYWcoInNl
Y3Rpb24iLCIiLHRydWUscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CisJCQlfb3Bl
blRhZygic2VjdGlvbiIsdHJ1ZSxwY3ItPmdldEluZGV4QVAoKSxwY3ItPmdldFhJRCgpKTsKIAkJ
CW1fYkluU2VjdGlvbiA9IHRydWU7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTEyNyw3ICs4
MDgsNyBAQAogICAgICAgICAgICAgX2Nsb3NlSHlwZXJsaW5rKCk7CiAJCQlfY2xvc2VBbm5vdGF0
aW9uKCk7CiAJCQlfY2xvc2VCbG9jaygpOwotCQkJX29wZW5UYWcoInRhYmxlIiwiIix0cnVlLHBj
ci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkpOworCQkJX29wZW5UYWcoInRhYmxlIix0cnVl
LHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkpOwogCQkJbV9pSW5UYWJsZSsrOwogCQkJ
cmV0dXJuIHRydWU7CiAJCX0KQEAgLTExMzgsNyArODE5LDcgQEAKICAgICAgICAgICAgIF9jbG9z
ZUh5cGVybGluaygpOwogCQkJX2Nsb3NlQW5ub3RhdGlvbigpOwogCQkJX2Nsb3NlQmxvY2soKTsK
LQkJCV9vcGVuVGFnKCJjZWxsIiwiIix0cnVlLHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElE
KCkpOworCQkJX29wZW5UYWcoImNlbGwiLHRydWUscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRY
SUQoKSk7CiAJCQltX2lJbkNlbGwrKzsKIAkJCXJldHVybiB0cnVlOwogCQl9CkBAIC0xMTQ5LDcg
KzgzMCw3IEBACiAgICAgICAgICAgICBfY2xvc2VIeXBlcmxpbmsoKTsKIAkJCV9jbG9zZUFubm90
YXRpb24oKTsKIAkJCW1fYkluQmxvY2sgPSBmYWxzZTsKLQkJCV9vcGVuVGFnKCJmb290IiwiIix0
cnVlLHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkpOworCQkJX29wZW5UYWcoImZvb3Qi
LHRydWUscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CiAJCQlyZXR1cm4gdHJ1ZTsK
IAkJfQogCWNhc2UgUFRYX1NlY3Rpb25Bbm5vdGF0aW9uOgpAQCAtMTE3MSw3ICs4NTIsNyBAQAog
ICAgICAgICAgICAgX2Nsb3NlSHlwZXJsaW5rKCk7CiAJCQlfY2xvc2VBbm5vdGF0aW9uKCk7CiAJ
CQltX2JJbkJsb2NrID0gZmFsc2U7Ci0JCQlfb3BlblRhZygiZW5kbm90ZSIsIiIsdHJ1ZSxwY3It
PmdldEluZGV4QVAoKSxwY3ItPmdldFhJRCgpKTsKKwkJCV9vcGVuVGFnKCJlbmRub3RlIix0cnVl
LHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0K
IAljYXNlIFBUWF9TZWN0aW9uVE9DOgpAQCAtMTE4Miw3ICs4NjMsNyBAQAogCQkJX2Nsb3NlQW5u
b3RhdGlvbigpOwogCQkJX2Nsb3NlQmxvY2soKTsKIAkJCW1fYkluQmxvY2sgPSBmYWxzZTsKLQkJ
CV9vcGVuVGFnKCJ0b2MiLCIiLHRydWUscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7
CisJCQlfb3BlblRhZygidG9jIix0cnVlLHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkp
OwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAljYXNlIFBUWF9TZWN0aW9uTWFyZ2lubm90ZToKQEAg
LTExOTIsNyArODczLDcgQEAKICAgICAgICAgICAgIF9jbG9zZUh5cGVybGluaygpOwogCQkJX2Ns
b3NlQW5ub3RhdGlvbigpOwogCQkJX2Nsb3NlQmxvY2soKTsKLQkJCV9vcGVuVGFnKCJtYXJnaW4i
LCIiLHRydWUscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CisJCQlfb3BlblRhZygi
bWFyZ2luIix0cnVlLHBjci0+Z2V0SW5kZXhBUCgpLHBjci0+Z2V0WElEKCkpOwogCQkJcmV0dXJu
IHRydWU7CiAJCX0KIAljYXNlIFBUWF9TZWN0aW9uRnJhbWU6CkBAIC0xMjAyLDcgKzg4Myw3IEBA
CiAgICAgICAgICAgICBfY2xvc2VIeXBlcmxpbmsoKTsKIAkJCV9jbG9zZUFubm90YXRpb24oKTsK
IAkJCV9jbG9zZUJsb2NrKCk7Ci0JCQlfb3BlblRhZygiZnJhbWUiLCIiLHRydWUscGNyLT5nZXRJ
bmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CisJCQlfb3BlblRhZygiZnJhbWUiLHRydWUscGNyLT5n
ZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCWNhc2Ug
UFRYX0VuZFRhYmxlOgpAQCAtMTIzMiw3ICs5MTMsNyBAQAogICAgICAgICAgICAgX2Nsb3NlSHlw
ZXJsaW5rKCk7CiAJCQlfY2xvc2VBbm5vdGF0aW9uKCk7CiAJCQlfY2xvc2VCbG9jaygpOwotCQkJ
bV9waWUtPndyaXRlKCI8L2Zvb3Q+Iik7CisJCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQkJbV9i
SW5CbG9jayA9IHRydWU7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTI0NCw3ICs5MjUsNyBA
QAogCQkJLy8gTGV0cyBub3QgY2xvc2Ugb3V0IGh5cGVybGlua3MgdG8gc3RhcnQgd2l0aAogCQkJ
Ly8gICAgICAgICAgICBfY2xvc2VIeXBlcmxpbmsoKTsKIAkJCV9jbG9zZUJsb2NrKCk7Ci0JCQlt
X3BpZS0+d3JpdGUoIjwvYW5ub3RhdGU+Iik7CisJCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQkJ
bV9iSW5CbG9jayA9IHRydWU7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTI1NSw3ICs5MzYs
NyBAQAogICAgICAgICAgICAgX2Nsb3NlSHlwZXJsaW5rKCk7CiAJCQlfY2xvc2VBbm5vdGF0aW9u
KCk7CiAJCQlfY2xvc2VCbG9jaygpOwotCQkJbV9waWUtPndyaXRlKCI8L2VuZG5vdGU+Iik7CisJ
CQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQkJbV9iSW5CbG9jayA9IHRydWU7CiAJCQlyZXR1cm4g
dHJ1ZTsKIAkJfQpAQCAtMTI2Niw3ICs5NDcsNyBAQAogICAgICAgICAgICAgX2Nsb3NlSHlwZXJs
aW5rKCk7CiAJCQlfY2xvc2VBbm5vdGF0aW9uKCk7CiAJCQlfY2xvc2VCbG9jaygpOwotCQkJbV9w
aWUtPndyaXRlKCI8L3RvYz4iKTsKKwkJCW1fcGllLT5lbmRFbGVtZW50KCk7CiAJCQlyZXR1cm4g
dHJ1ZTsKIAkJfQogCWNhc2UgUFRYX0VuZE1hcmdpbm5vdGU6CkBAIC0xMjg1LDcgKzk2Niw3IEBA
CiAgICAgICAgICAgICBfY2xvc2VIeXBlcmxpbmsoKTsKIAkJCV9jbG9zZUFubm90YXRpb24oKTsK
IAkJCV9jbG9zZUJsb2NrKCk7Ci0JCQltX3BpZS0+d3JpdGUoIjwvZnJhbWU+Iik7CisJCQltX3Bp
ZS0+ZW5kRWxlbWVudCgpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAljYXNlIFBUWF9CbG9jazoK
QEAgLTEyOTQsNyArOTc1LDggQEAKICAgICAgICAgICAgIF9jbG9zZUZpZWxkKCk7CiAJCQlfY2xv
c2VIeXBlcmxpbmsoKTsKIAkJCV9jbG9zZUJsb2NrKCk7Ci0JCQlfb3BlblRhZygicCIsIiIsZmFs
c2UscGNyLT5nZXRJbmRleEFQKCkscGNyLT5nZXRYSUQoKSk7CisJCQlfb3BlblRhZygicCIsdHJ1
ZSxwY3ItPmdldEluZGV4QVAoKSxwY3ItPmdldFhJRCgpKTsKKwkJCW1fcGllLT5zZXRQcmV0dHlQ
cmludChmYWxzZSk7CiAJCQltX2JJbkJsb2NrID0gdHJ1ZTsKIAkJCXJldHVybiB0cnVlOwogCQl9
CkBAIC0xMzMwLDY1ICsxMDEyLDIxIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBiYXNlNjQt
ZW5jb2RlZCBvYmplY3QgZGF0YQotICovCi1VVF9FcnJvciBzX0FiaVdvcmRfMV9MaXN0ZW5lcjo6
d3JpdGVfYmFzZTY0ICh2b2lkICogLypjb250ZXh0Ki8sIGNvbnN0IGNoYXIgKiBiYXNlNjQsIFVU
X3VpbnQzMiBsZW5ndGgsIGJvb2wgLypmaW5hbCovKQotewotCW1fcGllLT53cml0ZSAoYmFzZTY0
LCBsZW5ndGgpOwotCW1fcGllLT53cml0ZSAoIlxuIik7Ci0KLQlyZXR1cm4gVVRfT0s7Ci19Ci0K
LS8qIHN0YXJ0IHRhZyAmIGF0dHJpYnV0ZXMKLSAqLwotVVRfRXJyb3Igc19BYmlXb3JkXzFfTGlz
dGVuZXI6OndyaXRlX3htbCAodm9pZCAqIC8qY29udGV4dCovLCBjb25zdCBjaGFyICogbmFtZSwg
Y29uc3QgY2hhciAqIGNvbnN0ICogYXR0cykKLXsKLQlVVF9VVEY4U3RyaW5nIHRhZygiIDwiKTsK
LQotCXRhZyArPSBuYW1lOwotCi0JY29uc3QgY2hhciAqIGNvbnN0ICogYXR0ciA9IGF0dHM7Ci0J
d2hpbGUgKCphdHRyKQotCQl7Ci0JCQl0YWcgKz0gIiAiOwotCQkJdGFnICs9ICphdHRyKys7Ci0J
CQl0YWcgKz0gIj1cIiI7Ci0JCQl0YWcgKz0gKmF0dHIrKzsKLQkJCXRhZyArPSAiXCIiOwotCQl9
Ci0JdGFnICs9ICI+XG4iOwotCi0JbV9waWUtPndyaXRlICh0YWcudXRmOF9zdHIgKCksIHRhZy5i
eXRlTGVuZ3RoKCkpOwotCi0JcmV0dXJuIFVUX09LOwotfQotCi0vKiBlbmQgdGFnCi0gKi8KLVVU
X0Vycm9yIHNfQWJpV29yZF8xX0xpc3RlbmVyOjp3cml0ZV94bWwgKHZvaWQgKiAvKmNvbnRleHQq
LywgY29uc3QgY2hhciAqIG5hbWUpCi17Ci0JVVRfVVRGOFN0cmluZyB0YWcoIiA8LyIpOwotCi0J
dGFnICs9IG5hbWU7Ci0JdGFnICs9ICI+XG4iOwotCi0JbV9waWUtPndyaXRlICh0YWcudXRmOF9z
dHIgKCksIHRhZy5ieXRlTGVuZ3RoKCkpOwotCi0JcmV0dXJuIFVUX09LOwotfQotCiAvKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKiovCiAKIFVUX0Vycm9yIElFX0V4cF9BYmlXb3JkXzE6Ol93cml0ZURvY3Vt
ZW50KHZvaWQpCiB7Ci0JX3NldHVwRmlsZSgpOworCS8vIGFsbG93IHBlb3BsZSB0byBvdmVycmlk
ZSB0aGlzIG9uIHRoZSBjb21tYW5kIGxpbmUgb3Igb3RoZXJ3aXNlCisJY29uc3Qgc3RkOjpzdHJp
bmcgJiBwcm9wID0gKGdldFByb3BlcnR5ICgiY29tcHJlc3MiKSk7CisJaWYgKCFwcm9wLmVtcHR5
KCkpCisJCW1fYklzQ29tcHJlc3NlZCA9IFVUX3BhcnNlQm9vbChwcm9wLmNfc3RyICgpLCBtX2JJ
c0NvbXByZXNzZWQpOworCXNldHVwRmlsZShtX2JJc0NvbXByZXNzZWQpOwogCiAJbV9wTGlzdGVu
ZXIgPSBuZXcgc19BYmlXb3JkXzFfTGlzdGVuZXIoZ2V0RG9jKCksdGhpcywgbV9iSXNUZW1wbGF0
ZSk7CiAJaWYgKCFtX3BMaXN0ZW5lcikKIAl7Ci0JCWNsb3NlX2dzZl9oYW5kbGUobV9vdXRwdXQp
OworCQljbG9zZUhhbmRsZSgpOwogCQlyZXR1cm4gVVRfSUVfTk9NRU1PUlk7CiAJfQogCkBAIC0x
NDA0LDcgKzEwNDIsNyBAQAogCQogCWRlbGV0ZSBtX3BMaXN0ZW5lcjsKIAltX3BMaXN0ZW5lciA9
IE5VTEw7Ci0JY2xvc2VfZ3NmX2hhbmRsZShtX291dHB1dCk7CisJY2xvc2VIYW5kbGUoKTsKIAog
CWlmICghYlN0YXR1c1RlbGxMaXN0ZW5lcikKIAl7CkBAIC0xNDM0LDEyICsxMDcyLDEyIEBACiAJ
CXBTdHlsZSA9IHZlY1N0eWxlcy5nZXROdGhJdGVtKGspOwogCQlpZiAoIWJXcm90ZU9wZW5TdHls
ZVNlY3Rpb24pCiAJCXsKLQkJCW1fcGllLT53cml0ZSgiPHN0eWxlcz5cbiIpOworCQkJbV9waWUt
PnN0YXJ0RWxlbWVudCgic3R5bGVzIik7CiAJCQliV3JvdGVPcGVuU3R5bGVTZWN0aW9uID0gdHJ1
ZTsKIAkJfQogCiAJCVBUX0F0dHJQcm9wSW5kZXggYXBpID0gcFN0eWxlLT5nZXRJbmRleEFQKCk7
Ci0JCV9vcGVuVGFnKCJzIiwiLyIsdHJ1ZSxhcGksMCk7CisJCV9vcGVuVGFnKCJzIixmYWxzZSxh
cGksMCk7CiAJfQogCiAJVVRfR2VuZXJpY1ZlY3RvcjxQRF9TdHlsZSo+ICogcFN0eWxlcyA9IE5V
TEw7CkBAIC0xNDU3LDE4ICsxMDk1LDE4IEBACiAKIAkJaWYgKCFiV3JvdGVPcGVuU3R5bGVTZWN0
aW9uKQogCQl7Ci0JCQltX3BpZS0+d3JpdGUoIjxzdHlsZXM+XG4iKTsKKwkJCW1fcGllLT5zdGFy
dEVsZW1lbnQoInN0eWxlcyIpOwogCQkJYldyb3RlT3BlblN0eWxlU2VjdGlvbiA9IHRydWU7CiAJ
CX0KIAogCQlQVF9BdHRyUHJvcEluZGV4IGFwaSA9IHBTdHlsZS0+Z2V0SW5kZXhBUCgpOwotCQlf
b3BlblRhZygicyIsIi8iLHRydWUsYXBpLDApOworCQlfb3BlblRhZygicyIsZmFsc2UsYXBpLDAp
OwogCX0KIAogCWRlbGV0ZSBwU3R5bGVzOwogCQogCWlmIChiV3JvdGVPcGVuU3R5bGVTZWN0aW9u
KQotCQltX3BpZS0+d3JpdGUoIjwvc3R5bGVzPlxuIik7CisJCW1fcGllLT5lbmRFbGVtZW50KCk7
CiAKIAlyZXR1cm47CiB9CkBAIC0xNDk3LDEwICsxMTM1LDEwIEBACiAJCQogCQlpZiAoIWJXcm90
ZU9wZW5MaXN0U2VjdGlvbikKIAkJewotCQkJbV9waWUtPndyaXRlKCI8bGlzdHM+XG4iKTsKKwkJ
CW1fcGllLT5zdGFydEVsZW1lbnQoImxpc3RzIik7CiAJCQliV3JvdGVPcGVuTGlzdFNlY3Rpb24g
PSB0cnVlOwogCQl9Ci0JCW1fcGllLT53cml0ZSgiPGwiKTsKKwkJbV9waWUtPnN0YXJ0RWxlbWVu
dCgibCIpOwogCQlmb3IgKFVUX3NpbnQzMiBpID0gMDsgaSA8ICgoVVRfc2ludDMyKXZBdHRycy5z
aXplKCkpIC0gMTsKIAkJCSBpICs9IDIpCiAJCXsKQEAgLTE1MTMsMTQgKzExNTEsMTAgQEAKIAkJ
CQlMQ2hlY2soImxpc3QtZGVsaW0iKSAgIHx8CiAJCQkJTENoZWNrKCJsaXN0LWRlY2ltYWwiKSkK
IAkJCXsKLQkJCQltX3BpZS0+d3JpdGUoIiAiKTsKLQkJCQltX3BpZS0+d3JpdGUocy51dGY4X3N0
cigpKTsKLQkJCQltX3BpZS0+d3JpdGUoIj1cIiIpOwotCQkJCW1fcGllLT53cml0ZSh2QXR0cnNb
aSsxXS51dGY4X3N0cigpKTsKLQkJCQltX3BpZS0+d3JpdGUoIlwiIik7CisJCQkJbV9waWUtPmFk
ZFN0cmluZyhzLnV0Zjhfc3RyKCksIHZBdHRyc1tpKzFdLnV0Zjhfc3RyKCkpOwogCQkJfQogCQl9
Ci0JCW1fcGllLT53cml0ZSgiLz5cbiIpOworCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQkvLyBO
bywgbm8sIHlvdSBjYW4ndCBnX2ZyZWUgYXR0ciBhbmQgZXhwZWN0IGdvb2QgdGhpbmdzIHRvIGhh
cHBlbi4KIAkJRlJFRVAoYXR0cjApOwogCX0KQEAgLTE1MjksNyArMTE2Myw3IEBACiAjdW5kZWYg
TENoZWNrCiAKIAlpZiAoYldyb3RlT3Blbkxpc3RTZWN0aW9uKQotCQltX3BpZS0+d3JpdGUoIjwv
bGlzdHM+XG4iKTsKKwkJbV9waWUtPmVuZEVsZW1lbnQoKTsKIAogCXJldHVybjsKIH0KQEAgLTE1
NjEsMjUgKzExOTUsMjQgQEAKICAgICByZXR1cm4gOwogICB9CiAKLSAgbV9waWUtPndyaXRlKCI8
bWV0YWRhdGE+XG4iKTsKKyAgbV9waWUtPnN0YXJ0RWxlbWVudCgibWV0YWRhdGEiKTsKIAogICBz
dGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0g
cmVmLmJlZ2luKCk7CiAgIGZvciAoIDsgaXRlciAhPSByZWYuZW5kKCk7ICsraXRlciApIHsKIAkg
IGlmKCAhaXRlci0+c2Vjb25kLmVtcHR5KCkgKSB7Ci0JICAgICAgbV9waWUtPndyaXRlKCAiPG0g
a2V5PVwiIiApIDsKLQkgICAgICBfb3V0cHV0WE1MQ2hhciAoIGl0ZXItPmZpcnN0ICkgOwotCSAg
ICAgIG1fcGllLT53cml0ZSAoICJcIj4iICkgOwotCSAgICAgIF9vdXRwdXRYTUxDaGFyICggaXRl
ci0+c2Vjb25kICkgOwotCSAgICAgIG1fcGllLT53cml0ZSAoICI8L20+XG4iICkgOworCSAgICAg
IG1fcGllLT5zdGFydEVsZW1lbnQoIm0iKTsKKwkJICBtX3BpZS0+YWRkU3RyaW5nKCJrZXkiLCBp
dGVyLT5maXJzdCk7CisJICAgICAgbV9waWUtPmFkZFN0cmluZyhOVUxMLCBpdGVyLT5zZWNvbmQp
OworCSAgICAgIG1fcGllLT5lbmRFbGVtZW50KCkgOwogCSAgfQogICB9CiAKLSAgbV9waWUtPndy
aXRlKCI8L21ldGFkYXRhPlxuIik7CisgIG1fcGllLT5lbmRFbGVtZW50KCk7CiB9CiAKIHZvaWQg
c19BYmlXb3JkXzFfTGlzdGVuZXI6Ol9oYW5kbGVSREYodm9pZCkKIHsKLSAgbV9waWUtPndyaXRl
KCI8cmRmPlxuIik7CisgIG1fcGllLT5zdGFydEVsZW1lbnQoInJkZiIpOwogCiAgIC8vCiAgIC8v
IFdhbGsgZXZlcnkgc3ViamVjdCBpbiB0aGUgUkRGIG1vZGVsCkBAIC0xNjAzLDI0ICsxMjM2LDIy
IEBACiAgICAgICAgICAgUERfVVJJICAgIHByZWRpY2F0ZSA9IHBvaXRlci0+Zmlyc3Q7CiAgICAg
ICAgICAgUERfT2JqZWN0IG9iamVjdCA9IHBvaXRlci0+c2Vjb25kOwogCi0gICAgICAgICAgCi0g
ICAgICAgICAgbV9waWUtPndyaXRlKCI8dCAiKTsKLSAgICAgICAgICBfb3V0cHV0WE1MQXR0cmli
dXRlKCAicyIsIHN1YmplY3QudG9TdHJpbmcoKSApOwotICAgICAgICAgIF9vdXRwdXRYTUxBdHRy
aWJ1dGUoICJwIiwgcHJlZGljYXRlLnRvU3RyaW5nKCkgKTsKKyAgICAgICAgICBtX3BpZS0+c3Rh
cnRFbGVtZW50KCJ0Iik7CisgICAgICAgICAgbV9waWUtPmFkZFN0cmluZygicyIsIHN1YmplY3Qu
dG9TdHJpbmcoKSk7CisgICAgICAgICAgbV9waWUtPmFkZFN0cmluZygicCIsIHByZWRpY2F0ZS50
b1N0cmluZygpKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFt
IHNzOwogICAgICAgICAgICAgICBzcyA8PCBvYmplY3QuZ2V0T2JqZWN0VHlwZSgpOwotICAgICAg
ICAgICAgICBfb3V0cHV0WE1MQXR0cmlidXRlKCAib2JqZWN0dHlwZSIsIHNzLnN0cigpICk7Cisg
ICAgICAgICAgICAgIG1fcGllLT5hZGRTdHJpbmcoIm9iamVjdHR5cGUiLCBzcy5zdHIoKSk7CiAg
ICAgICAgICAgfQotICAgICAgICAgIF9vdXRwdXRYTUxBdHRyaWJ1dGUoICJ4c2R0eXBlIiwgICAg
b2JqZWN0LmdldFhTRFR5cGUoKSApOwotICAgICAgICAgIG1fcGllLT53cml0ZSgiID4iKTsKKyAg
ICAgICAgICBtX3BpZS0+YWRkU3RyaW5nKCJ4c2R0eXBlIiwgb2JqZWN0LmdldFhTRFR5cGUoKSk7
CiAgICAgICAgICAgVVRfVVRGOFN0cmluZyBlc2MgPSBvYmplY3QudG9TdHJpbmcoKS5jX3N0cigp
OwotICAgICAgICAgIF9vdXRwdXRYTUxDaGFyICggZXNjLnV0Zjhfc3RyKCksIGVzYy5ieXRlTGVu
Z3RoKCkgKSA7Ci0gICAgICAgICAgbV9waWUtPndyaXRlKCI8L3Q+XG4iKTsKLSAgICAgIH0KKyAg
ICAgICAgICBtX3BpZS0+YWRkU3RyaW5nKE5VTEwsIGVzYy51dGY4X3N0cigpKTsKKyAgICAgICAg
IG1fcGllLT5lbmRFbGVtZW50KCk7CisgICAgICAgfQogICB9CiAgIAotICBtX3BpZS0+d3JpdGUo
IjwvcmRmPlxuIik7CisgIG1fcGllLT5lbmRFbGVtZW50KCk7CiB9CiAKIHZvaWQgc19BYmlXb3Jk
XzFfTGlzdGVuZXI6Ol9oYW5kbGVQYWdlU2l6ZSh2b2lkKQpAQCAtMTYyOCwzMSArMTI1OSwyMSBA
QAogICAvLwogICAvLyBDb2RlIHRvIHdyaXRlIG91dCB0aGUgUGFnZVNpemUgRGVmaW5pdGlvbnMg
dG8gZGlzawogICAvLwotCW1fcGllLT53cml0ZSgiPHBhZ2VzaXplIHBhZ2V0eXBlPVwiIik7Ci0J
bV9waWUtPndyaXRlKG1fcERvY3VtZW50LT5tX2RvY1BhZ2VTaXplLmdldFByZWRlZmluZWROYW1l
KCkpOwotCW1fcGllLT53cml0ZSgiXCIiKTsKLQotCW1fcGllLT53cml0ZSgiIG9yaWVudGF0aW9u
PVwiIik7Ci0JaWYobV9wRG9jdW1lbnQtPm1fZG9jUGFnZVNpemUuaXNQb3J0cmFpdCgpID09IHRy
dWUpCi0JICAgICAgICBtX3BpZS0+d3JpdGUoInBvcnRyYWl0XCIiKTsKLQllbHNlCi0JICAgICAg
ICBtX3BpZS0+d3JpdGUoImxhbmRzY2FwZVwiIik7CisJbV9waWUtPnN0YXJ0RWxlbWVudCgicGFn
ZXNpemUiKTsKKwltX3BpZS0+YWRkU3RyaW5nKCJwYWdldHlwZSIsIG1fcERvY3VtZW50LT5tX2Rv
Y1BhZ2VTaXplLmdldFByZWRlZmluZWROYW1lKCkpOworCW1fcGllLT5hZGRTdHJpbmcoIm9yaWVu
dGF0aW9uIiwKKwkgICAgICAgICAgICAgICAgIChtX3BEb2N1bWVudC0+bV9kb2NQYWdlU2l6ZS5p
c1BvcnRyYWl0KCkgPT0gdHJ1ZSk/CisJICAgICAgICAgICAgIAkgICAicG9ydHJhaXQiOiAibGFu
ZHNjYXBlIik7CiAJVVRfRGltZW5zaW9uIGRvY1VuaXQgPSBtX3BEb2N1bWVudC0+bV9kb2NQYWdl
U2l6ZS5nZXREaW1zKCk7Ci0KLQlVVF9Mb2NhbGVUcmFuc2FjdG9yIHQoTENfTlVNRVJJQywgIkMi
KTsKLQltX3BpZS0+d3JpdGUoIFVUX1N0cmluZ19zcHJpbnRmKCIgd2lkdGg9XCIlZlwiIiwgbV9w
RG9jdW1lbnQtPm1fZG9jUGFnZVNpemUuV2lkdGgoZG9jVW5pdCkpLmNfc3RyKCkgKTsKLQltX3Bp
ZS0+d3JpdGUoIFVUX1N0cmluZ19zcHJpbnRmKCIgaGVpZ2h0PVwiJWZcIiIsbV9wRG9jdW1lbnQt
Pm1fZG9jUGFnZVNpemUuSGVpZ2h0KGRvY1VuaXQpKS5jX3N0cigpICk7Ci0JbV9waWUtPndyaXRl
KCIgdW5pdHM9XCIiKTsKLQltX3BpZS0+d3JpdGUoVVRfZGltZW5zaW9uTmFtZShkb2NVbml0KSk7
Ci0JbV9waWUtPndyaXRlKCJcIiIpOwotCW1fcGllLT53cml0ZSggVVRfU3RyaW5nX3NwcmludGYo
IiBwYWdlLXNjYWxlPVwiJWZcIi8+XG4iLG1fcERvY3VtZW50LT5tX2RvY1BhZ2VTaXplLmdldFNj
YWxlKCkpLmNfc3RyKCkgKTsKKwltX3BpZS0+YWRkRmxvYXQoIndpZHRoIiwgbV9wRG9jdW1lbnQt
Pm1fZG9jUGFnZVNpemUuV2lkdGgoZG9jVW5pdCkpOworCW1fcGllLT5hZGRGbG9hdCgiaGVpZ2h0
IiwgbV9wRG9jdW1lbnQtPm1fZG9jUGFnZVNpemUuSGVpZ2h0KGRvY1VuaXQpKTsKKwltX3BpZS0+
YWRkU3RyaW5nKCJ1bml0cyIsIFVUX2RpbWVuc2lvbk5hbWUoZG9jVW5pdCkpOworCW1fcGllLT5h
ZGRGbG9hdCgicGFnZS1zY2FsZSIsIG1fcERvY3VtZW50LT5tX2RvY1BhZ2VTaXplLmdldFNjYWxl
KCkpOworCW1fcGllLT5lbmRFbGVtZW50KCk7CiB9CiAKIHZvaWQgc19BYmlXb3JkXzFfTGlzdGVu
ZXI6Ol9oYW5kbGVEYXRhSXRlbXModm9pZCkKIHsKLSNpZmRlZiBFTkFCTEVfUkVTT1VSQ0VfTUFO
QUdFUgotCW1fcERvY3VtZW50LT5yZXNvdXJjZU1hbmFnZXIoKS53cml0ZV94bWwgKDAsICp0aGlz
KTsKLSNlbHNlCiAJYm9vbCBiV3JvdGVPcGVuRGF0YVNlY3Rpb24gPSBmYWxzZTsKIAogCWNvbnN0
IGNoYXIgKiBzek5hbWU7CkBAIC0xNjgyLDcgKzEzMDMsNyBAQAogCiAJCWlmICghYldyb3RlT3Bl
bkRhdGFTZWN0aW9uKQogCQl7Ci0JCQltX3BpZS0+d3JpdGUoIjxkYXRhPlxuIik7CisJCQltX3Bp
ZS0+c3RhcnRFbGVtZW50KCJkYXRhIik7CiAJCQliV3JvdGVPcGVuRGF0YVNlY3Rpb24gPSB0cnVl
OwogCQl9CiAKQEAgLTE3MjMsMjAgKzEzNDQsMTcgQEAKIAogCSAgIAlpZiAoc3RhdHVzKQogCSAg
ICB7Ci0JICAgCQltX3BpZS0+d3JpdGUoIjxkIG5hbWU9XCIiKTsKLQkJCS8vIFdlIGFzc3VtZSB0
aGF0IFVUX2djaGFyIGlzIGVxdWl2YWxlbnQgdG8gY2hhci4KLQkJCS8vIFRoYXQncyBub3QgcmVh
bGx5IGEgZ29vZCBhc3N1bXB0aW9uLCBidXQsIGhleS4KLQkJCS8vIFRPRE86IG1ha2Ugc3pOYW1l
LCBzek1pbWVUeXBlIGJlIFVUX2djaGFycy4KLQkJCV9vdXRwdXRYTUxDaGFyKHN6TmFtZSwgc3Ry
bGVuKHN6TmFtZSkpOworCSAgIAkJbV9waWUtPnN0YXJ0RWxlbWVudCgiZCIpOworCQkJbV9waWUt
PmFkZFN0cmluZygibmFtZSIsIHN6TmFtZSk7CiAJCSAgIAlpZiAoIW1pbWVUeXBlLmVtcHR5KCkp
CiAJCQl7Ci0JCQkgICBtX3BpZS0+d3JpdGUoIlwiIG1pbWUtdHlwZT1cIiIpOwotCQkJICAgX291
dHB1dFhNTENoYXIobWltZVR5cGUuY19zdHIoKSwgbWltZVR5cGUuc2l6ZSgpKTsKKwkJCSAgIG1f
cGllLT5hZGRTdHJpbmcoIm1pbWUtdHlwZSIsIG1pbWVUeXBlLmNfc3RyKCkpOwogCQkJfQogCQkg
ICAJaWYgKGVuY29kZWQpCiAJCSAgICB7Ci0JCQkgICAJbV9waWUtPndyaXRlKCJcIiBiYXNlNjQ9
XCJ5ZXNcIj5cbiIpOwotCQkJCS8vIGJyZWFrIHVwIHRoZSBCYXNlNjQgYmxvYiBhcyBhIHNlcmll
cyBsaW5lcworCQkJCXN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CisJCQkgICAJbV9waWUtPmFkZFN0
cmluZygiYmFzZTY0IiwgInllcyIpOworCQkJCSAgIC8vIGJyZWFrIHVwIHRoZSBCYXNlNjQgYmxv
YiBhcyBhIHNlcmllcyBsaW5lcwogCQkJCS8vIGxpa2UgTUlNRSBkb2VzLgogCiAJCQkJVVRfdWlu
dDMyIGpMaW1pdCA9IGJiRW5jb2RlZC5nZXRMZW5ndGgoKTsKQEAgLTE3NDUsMjIgKzEzNjMsMjEg
QEAKIAkJCQlmb3IgKGo9MDsgajxqTGltaXQ7IGorPTcyKQogCQkJCXsKIAkJCQkJalNpemUgPSBV
VF9NSU4oNzIsKGpMaW1pdC1qKSk7Ci0JCQkJCW1fcGllLT53cml0ZShyZWludGVycHJldF9jYXN0
PGNvbnN0IGNoYXIgKj4oYmJFbmNvZGVkLmdldFBvaW50ZXIoaikpLGpTaXplKTsKLQkJCQkJbV9w
aWUtPndyaXRlKCJcbiIpOworCQkJCQlidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBj
aGFyICo+KGJiRW5jb2RlZC5nZXRQb2ludGVyKGopKSxqU2l6ZSk7CisJCQkJCWJ1ZiA8PCBzdGQ6
OmVuZGw7CiAJCQkJfQogCQkJfQogCQkgICAJZWxzZQogCQkgICAgewotCQkgICAgIAltX3BpZS0+
d3JpdGUoIlwiIGJhc2U2ND1cIm5vXCI+XG4iKTsKLQkJCSAgIAltX3BpZS0+d3JpdGUocmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYmJFbmNvZGVkLmdldFBvaW50ZXIoMCkpLCBiYkVuY29k
ZWQuZ2V0TGVuZ3RoKCkpOworCQkJICAgCW1fcGllLT5hZGRTdHJpbmcoImJhc2U2NCIsICJubyIp
OworCQkJICAgCW1fcGllLT5hZGRTdHJpbmcoTlVMTCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBj
aGFyKj4oYmJFbmNvZGVkLmdldFBvaW50ZXIoMCkpKTsKIAkJCX0KLQkJCW1fcGllLT53cml0ZSgi
PC9kPlxuIik7CisJCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCQl9CiAJfQogCiAJaWYgKGJXcm90
ZU9wZW5EYXRhU2VjdGlvbikKLQkJbV9waWUtPndyaXRlKCI8L2RhdGE+XG4iKTsKLSNlbmRpZgor
CQltX3BpZS0+ZW5kRWxlbWVudCgpOwogfQogCiB2b2lkIHNfQWJpV29yZF8xX0xpc3RlbmVyOjpf
aGFuZGxlUmV2aXNpb25zKHZvaWQpCkBAIC0xNzgwLDM0ICsxMzk3LDMwIEBACiAJCQogCQlpZiAo
IWJXcm90ZU9wZW5SZXZpc2lvbnNTZWN0aW9uKQogCQl7Ci0JCQlzID0gVVRfc3RkX3N0cmluZ19z
cHJpbnRmKCI8cmV2aXNpb25zIHNob3c9XCIlZFwiIG1hcms9XCIlZFwiIHNob3ctbGV2ZWw9XCIl
ZFwiIGF1dG89XCIlZFwiPlxuIiwKLQkJCQkJCQkgIG1fcERvY3VtZW50LT5pc1Nob3dSZXZpc2lv
bnMoKSwKLQkJCQkJCQkgIG1fcERvY3VtZW50LT5pc01hcmtSZXZpc2lvbnMoKSwKLQkJCQkJCQkg
IG1fcERvY3VtZW50LT5nZXRTaG93UmV2aXNpb25JZCgpLAotCQkJCQkJCSAgbV9wRG9jdW1lbnQt
PmlzQXV0b1JldmlzaW9uaW5nKCkpOwotCQkJCi0JCQltX3BpZS0+d3JpdGUocy5jX3N0cigpKTsK
KwkJCW1fcGllLT5zdGFydEVsZW1lbnQoInJldmlzaW9ucyIpOworCQkJbV9waWUtPmFkZEJvb2wo
InNob3ciLCBtX3BEb2N1bWVudC0+aXNTaG93UmV2aXNpb25zKCkpOworCQkJbV9waWUtPmFkZEJv
b2woIm1hcmsiLCBtX3BEb2N1bWVudC0+aXNNYXJrUmV2aXNpb25zKCkpOworCQkJbV9waWUtPmFk
ZEludCgic2hvdy1sZXZlbCIsIG1fcERvY3VtZW50LT5nZXRTaG93UmV2aXNpb25JZCgpKTsKKwkJ
CW1fcGllLT5hZGRCb29sKCJhdXRvIiwgbV9wRG9jdW1lbnQtPmlzQXV0b1JldmlzaW9uaW5nKCkp
OwogCQkJYldyb3RlT3BlblJldmlzaW9uc1NlY3Rpb24gPSB0cnVlOwogCQl9CiAKLQkJcyA9IFVU
X3N0ZF9zdHJpbmdfc3ByaW50ZigiPHIgaWQ9XCIldVwiIHRpbWUtc3RhcnRlZD1cIiVsZFwiIHZl
cnNpb249XCIldVwiPiIsCi0JCQkJCQkgIHBSZXYtPmdldElkKCksCi0JCQkJCQkgIHBSZXYtPmdl
dFN0YXJ0VGltZSgpLAotCQkJCQkJICBwUmV2LT5nZXRWZXJzaW9uKCkpOwotCQkKLQkJbV9waWUt
PndyaXRlKHMuY19zdHIoKSk7CisJCW1fcGllLT5zdGFydEVsZW1lbnQoInIiKTsKKwkJbV9waWUt
PmFkZFVpbnQoImlkIixwUmV2LT5nZXRJZCgpKTsKKwkJbV9waWUtPmFkZExpbnQoInRpbWUtc3Rh
cnRlZCIsIHBSZXYtPmdldFN0YXJ0VGltZSgpKTsKKwkJbV9waWUtPmFkZFVpbnQoInZlcnNpb24i
LCBwUmV2LT5nZXRWZXJzaW9uKCkpOwogCiAJCWlmKHBSZXYtPmdldERlc2NyaXB0aW9uKCkpCiAJ
CXsKLQkJCV9vdXRwdXREYXRhKHBSZXYtPmdldERlc2NyaXB0aW9uKCksIFVUX1VDUzRfc3RybGVu
KHBSZXYtPmdldERlc2NyaXB0aW9uKCkpKTsKKwkJCW1fcGllLT5hZGRTdHJpbmcoTlVMTCwgcFJl
di0+Z2V0RGVzY3JpcHRpb24oKSwgVVRfVUNTNF9zdHJsZW4ocFJldi0+Z2V0RGVzY3JpcHRpb24o
KSkpOwogCQl9CiAJCQogCi0JCW1fcGllLT53cml0ZSgiPC9yPlxuIik7CisJCW1fcGllLT5lbmRF
bGVtZW50KCk7CiAJfQogCiAJaWYgKGJXcm90ZU9wZW5SZXZpc2lvbnNTZWN0aW9uKQotCQltX3Bp
ZS0+d3JpdGUoIjwvcmV2aXNpb25zPlxuIik7CisJCW1fcGllLT5lbmRFbGVtZW50KCk7CiAKIAly
ZXR1cm47CiB9CkBAIC0xODMzLDI0ICsxNDQ2LDI1IEBACiAJCQogCQlpZiAoIWJXcm90ZU9wZW5T
ZWN0aW9uKQogCQl7Ci0JCQlVVF9VVEY4U3RyaW5nX3NwcmludGYocywgIjxoaXN0b3J5IHZlcnNp
b249XCIlZFwiIGVkaXQtdGltZT1cIiVkXCIgbGFzdC1zYXZlZD1cIiVkXCIgdWlkPVwiJXNcIj5c
biIsCi0JCQkJCQkJICBtX3BEb2N1bWVudC0+Z2V0RG9jVmVyc2lvbigpLAotCQkJCQkJCSAgc3Rh
dGljX2Nhc3Q8VVRfc2ludDMyPihtX3BEb2N1bWVudC0+Z2V0RWRpdFRpbWUoKSksCi0JCQkJCQkJ
ICBzdGF0aWNfY2FzdDxVVF9zaW50MzI+KG1fcERvY3VtZW50LT5nZXRMYXN0U2F2ZWRUaW1lKCkp
LAotCQkJCQkJCSAgbV9wRG9jdW1lbnQtPmdldERvY1VVSURTdHJpbmcoKSk7Ci0JCQkKLQkJCW1f
cGllLT53cml0ZShzLnV0Zjhfc3RyKCkpOworCQkJbV9waWUtPnN0YXJ0RWxlbWVudCgiaGlzdG9y
eSIpOworCQkJbV9waWUtPmFkZEludCgidmVyc2lvbiIsIG1fcERvY3VtZW50LT5nZXREb2NWZXJz
aW9uKCkpOworCQkJbV9waWUtPmFkZEludCgiZWRpdC10aW1lIiwgc3RhdGljX2Nhc3Q8VVRfc2lu
dDMyPihtX3BEb2N1bWVudC0+Z2V0RWRpdFRpbWUoKSkpOworCQkJbV9waWUtPmFkZEludCgibGFz
dC1zYXZlZCIsIHN0YXRpY19jYXN0PFVUX3NpbnQzMj4obV9wRG9jdW1lbnQtPmdldExhc3RTYXZl
ZFRpbWUoKSkpOworCQkJbV9waWUtPmFkZFN0cmluZygidWlkIiwgbV9wRG9jdW1lbnQtPmdldERv
Y1VVSURTdHJpbmcoKSk7CiAJCQliV3JvdGVPcGVuU2VjdGlvbiA9IHRydWU7CiAJCX0KIAotCQlV
VF9VVEY4U3RyaW5nX3NwcmludGYocywgIjx2ZXJzaW9uIGlkPVwiJWRcIiBzdGFydGVkPVwiJWRc
IiB1aWQ9XCIlc1wiIGF1dG89XCIlZFwiIHRvcC14aWQ9XCIlZFwiLz5cbiIsCi0JCQkJCQkgIGlW
ZXJzaW9uLCBzdGF0aWNfY2FzdDxVVF9zaW50MzI+KHRTdGFydGVkKSwgaFVpZC51dGY4X3N0cigp
LGJBdXRvLCBpWElEKTsKLQkJCi0JCW1fcGllLT53cml0ZShzLnV0Zjhfc3RyKCkpOworCQltX3Bp
ZS0+c3RhcnRFbGVtZW50KCJ2ZXJzaW9uIik7CisJCW1fcGllLT5hZGRJbnQoImlkIiwgaVZlcnNp
b24pOworCQltX3BpZS0+YWRkSW50KCJzdGFydGVkIiwgc3RhdGljX2Nhc3Q8VVRfc2ludDMyPih0
U3RhcnRlZCkpOworCQltX3BpZS0+YWRkU3RyaW5nKCJ1aWQiLCBoVWlkLnV0Zjhfc3RyKCkpOwor
CQltX3BpZS0+YWRkQm9vbCgiYXV0byIsIGJBdXRvKTsKKwkJbV9waWUtPmFkZEludCgidG9wLXhp
ZCIsIGlYSUQpOworCQltX3BpZS0+ZW5kRWxlbWVudCgpOwogCX0KIAogCWlmIChiV3JvdGVPcGVu
U2VjdGlvbikKLQkJbV9waWUtPndyaXRlKCI8L2hpc3Rvcnk+XG4iKTsKKwkJbV9waWUtPmVuZEVs
ZW1lbnQoKTsKIAogCXJldHVybjsKIH0KQEAgLTE4NjAsMjEgKzE0NzQsMTggQEAKIAlVVF9zaW50
MzIgbkF1dGhvcnMgPSBtX3BEb2N1bWVudC0+IGdldE51bUF1dGhvcnMoKTsKIAlpZihuQXV0aG9y
cyA8PSAwKQogCQlyZXR1cm47Ci0JbV9waWUtPndyaXRlKCI8YXV0aG9ycz5cbiIpOworCW1fcGll
LT5zdGFydEVsZW1lbnQoImF1dGhvcnMiKTsKIAlVVF9zaW50MzIgaSA9IDA7CiAJVVRfU3RyaW5n
IHNWYWw7CiAJZm9yKGk9MDtpPG5BdXRob3JzO2krKykKIAl7CiAJCXBwX0F1dGhvciAqIHBBdXRo
b3IgPSBtX3BEb2N1bWVudC0+Z2V0TnRoQXV0aG9yKGkpOwotCQltX3BpZS0+d3JpdGUoIjxhdXRo
b3IgaWQ9XCIiKTsKLQkJVVRfU3RyaW5nX3NwcmludGYoc1ZhbCwiJWQiLHBBdXRob3ItPmdldEF1
dGhvckludCgpKTsKLQkJbV9waWUtPndyaXRlKHNWYWwuY19zdHIoKSk7Ci0JCW1fcGllLT53cml0
ZSgiXCIgIik7CisJCW1fcGllLT5zdGFydEVsZW1lbnQoImF1dGhvciIpOworCQltX3BpZS0+YWRk
SW50KCJpZCIsIHBBdXRob3ItPmdldEF1dGhvckludCgpKTsKIAkJUFBfQXR0clByb3AgKiBwQVAg
PSBwQXV0aG9yLT5nZXRBdHRyUHJvcCgpOwogCQlpZihwQVAtPmdldFByb3BlcnR5Q291bnQoKT4w
KQogCQl7Ci0JCQltX3BpZS0+d3JpdGUoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KFBUX1BST1BT
X0FUVFJJQlVURV9OQU1FKSk7Ci0JCQltX3BpZS0+d3JpdGUoIj1cIiIpOworCQkJc3RkOjpvc3Ry
aW5nc3RyZWFtIGJ1ZjsKIAkJCWNvbnN0IGdjaGFyICogc3pOYW1lID0gTlVMTDsKIAkJCWNvbnN0
IGdjaGFyICogc3pWYWx1ZSA9IE5VTEw7CiAJCQlVVF91aW50MzIgaiA9IDA7CkBAIC0xODgzLDE2
ICsxNDk0LDE0IEBACiAJCQkJaWYgKHN6TmFtZSAmJiAqc3pOYW1lICYmIHN6VmFsdWUgJiYgKnN6
VmFsdWUpCiAJCQkJewogCQkJCQlpZihqPjEpCi0JCQkJCQltX3BpZS0+d3JpdGUoIjsgIik7Ci0J
CQkJCW1fcGllLT53cml0ZShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3pOYW1lKSk7Ci0JCQkJ
CW1fcGllLT53cml0ZSgiOiIpOwotCQkJCQlfb3V0cHV0WE1MQ2hhcihzelZhbHVlLCBzdHJsZW4o
c3pWYWx1ZSkpOworCQkJCQkJYnVmIDw8ICI7ICI7CisJCQkJCWJ1ZiA8PCBzek5hbWUgPDwgIjoi
IDw8IHN6VmFsdWU7CiAJCQkJfQogCQkJfQotCQltX3BpZS0+d3JpdGUoIlwiIik7CisJCQltX3Bp
ZS0+YWRkU3RyaW5nKFBUX1BST1BTX0FUVFJJQlVURV9OQU1FLGJ1Zi5zdHIoKSk7CiAJCX0KLQkJ
bV9waWUtPndyaXRlKCIvPlxuIik7CisJCW1fcGllLT5lbmRFbGVtZW50KCk7CiAJfQotCW1fcGll
LT53cml0ZSgiPC9hdXRob3JzPlxuIik7CisJbV9waWUtPmVuZEVsZW1lbnQoKTsKIH0KIApJbmRl
eDogc3JjL3dwL2ltcGV4cC94cC9pZV9leHBfQWJpV29yZF8xLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3Jj
L3dwL2ltcGV4cC94cC9pZV9leHBfQWJpV29yZF8xLmgJKHLDqXZpc2lvbiAzNTA3MikKKysrIHNy
Yy93cC9pbXBleHAveHAvaWVfZXhwX0FiaVdvcmRfMS5oCShjb3BpZSBkZSB0cmF2YWlsKQpAQCAt
MjEsOCArMjEsOSBAQAogI2lmbmRlZiBJRV9FWFBfQUJJV09SRF8xX0gKICNkZWZpbmUgSUVfRVhQ
X0FCSVdPUkRfMV9ICiAKLSNpbmNsdWRlICJpZV9leHAuaCIKKyNpbmNsdWRlICJpZV9leHBfWE1M
LmgiCiAjaW5jbHVkZSAicGxfTGlzdGVuZXIuaCIKKy8vI2luY2x1ZGUgPGdzZi9nc2Ytb3V0cHV0
LWxpYnhtbC5oPgogY2xhc3MgUERfRG9jdW1lbnQ7CiBjbGFzcyBzX0FiaVdvcmRfMV9MaXN0ZW5l
cjsKIApAQCAtNDYsNyArNDcsNyBAQAogCQkJCQkJCQkJCUlFX0V4cCAqKiBwcGllKTsKIH07CiAK
LWNsYXNzIEFCSV9FWFBPUlQgSUVfRXhwX0FiaVdvcmRfMSA6IHB1YmxpYyBJRV9FeHAKK2NsYXNz
IEFCSV9FWFBPUlQgSUVfRXhwX0FiaVdvcmRfMSA6IHB1YmxpYyBJRV9FeHBfWE1MCiB7CiBwdWJs
aWM6CiAJSUVfRXhwX0FiaVdvcmRfMShQRF9Eb2N1bWVudCAqIHBEb2N1bWVudCwgYm9vbCBpc1Rl
bXBsYXRlID0gZmFsc2UsIGJvb2wgaXNDb21wcmVzc2VkID0gZmFsc2UpOwpAQCAtNTQsMTUgKzU1
LDExIEBACiAKIHByb3RlY3RlZDoKIAl2aXJ0dWFsIFVUX0Vycm9yCV93cml0ZURvY3VtZW50KHZv
aWQpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgIF9zZXR1cEZpbGUodm9pZCk7Ci0JdmlydHVh
bCBVVF91aW50MzIJX3dyaXRlQnl0ZXMoY29uc3QgVVRfQnl0ZSAqIHBCeXRlcywgVVRfdWludDMy
IGxlbmd0aCk7CiAKIHByaXZhdGU6CiAJYm9vbCBtX2JJc1RlbXBsYXRlOwogCWJvb2wgbV9iSXND
b21wcmVzc2VkOwogCXNfQWJpV29yZF8xX0xpc3RlbmVyICoJbV9wTGlzdGVuZXI7Ci0KLQlHc2ZP
dXRwdXQgKiBtX291dHB1dDsKIH07CiAKICNlbmRpZiAvKiBJRV9FWFBfQUJJV09SRF8xX0ggKi8K
SW5kZXg6IHNyYy93cC9pbXBleHAveHAvaWVfZXhwX1hNTC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3Jj
L3dwL2ltcGV4cC94cC9pZV9leHBfWE1MLmNwcAkocsOpdmlzaW9uIDApCisrKyBzcmMvd3AvaW1w
ZXhwL3hwL2llX2V4cF9YTUwuY3BwCShjb3BpZSBkZSB0cmF2YWlsKQpAQCAtMCwwICsxLDE4OCBA
QAorLyogQWJpV29yZAorICogQ29weXJpZ2h0IChDKSAyMDE1IEplYW4gQnJlZm9ydCA8amVhbi5i
cmVmb3J0QG5vcm1hbGVzdXAub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICog
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEK
KyAqIDAyMTEwLTEzMDEgVVNBLgorICovCisjaW5jbHVkZSAiaWVfZXhwX1hNTC5oIgorI2luY2x1
ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidXRfZGVidWdtc2cuaCIKKworSUVfRXhwX1hNTDo6SUVf
RXhwX1hNTChQRF9Eb2N1bWVudCAqIHBEb2N1bWVudCk6CisJSUVfRXhwIChwRG9jdW1lbnQpLCBt
X3ppcCgwKSwgbV94bWwoMCkKK3sKK30KKworSUVfRXhwX1hNTDo6fklFX0V4cF9YTUwoKQorewor
fQorCit2b2lkIElFX0V4cF9YTUw6OnNldHVwRmlsZShib29sIGNvbXByZXNzZWQpCit7CisJVVRf
QVNTRVJUX0hBUk1MRVNTICghbV94bWwpOworCWlmIChjb21wcmVzc2VkKQorCXsKKwkJbV96aXAg
PSBnc2Zfb3V0cHV0X2d6aXBfbmV3KGdldEZwICgpLCBOVUxMKTsKKwkJbV94bWwgPSBnc2ZfeG1s
X291dF9uZXcgKG1femlwKTsKKwl9CisJZWxzZQorCXsKKwkJbV96aXAgPSBHU0ZfT1VUUFVUKGdf
b2JqZWN0X3JlZihnZXRGcCAoKSkpOworCQltX3htbCA9IGdzZl94bWxfb3V0X25ldyAoZ2V0RnAo
KSk7CisJfQorfQorCit2b2lkIElFX0V4cF9YTUw6OmNsb3NlSGFuZGxlKCkKK3sKKwlpZiAobV94
bWwpIHsKKwkJZ19vYmplY3RfdW5yZWYobV94bWwpOworCQltX3htbCA9IDA7CisJfQorCWlmICht
X3ppcCkgeworCQlnX29iamVjdF91bnJlZihtX3ppcCk7CisJCW1femlwID0gMDsKKwl9Cit9CisK
K3ZvaWQgSUVfRXhwX1hNTDo6c2V0RG9jVHlwZShjaGFyIGNvbnN0ICpkb2N0eXBlKQoreworCWdz
Zl94bWxfb3V0X3NldF9kb2NfdHlwZShtX3htbCwgZG9jdHlwZSk7Cit9CisKK3ZvaWQgSUVfRXhw
X1hNTDo6c3RhcnRFbGVtZW50KGNoYXIgY29uc3QgKm5hbWUpCit7CisJZ3NmX3htbF9vdXRfc3Rh
cnRfZWxlbWVudChtX3htbCwgbmFtZSk7Cit9CisKK3ZvaWQgSUVfRXhwX1hNTDo6ZW5kRWxlbWVu
dCh2b2lkKQoreworCWdzZl94bWxfb3V0X2VuZF9lbGVtZW50KG1feG1sKTsKK30KKwordm9pZCBJ
RV9FeHBfWE1MOjphZGRCb29sKGNoYXIgY29uc3QgKmlkLCBib29sIHZhbHVlKQoreworCWdzZl94
bWxfb3V0X2FkZF9ib29sKG1feG1sLCBpZCwgdmFsdWUpOworfQorCit2b2lkIElFX0V4cF9YTUw6
OmFkZENvbW1lbnQoY2hhciBjb25zdCAqY29tbWVudCkKK3sKKwlnc2Zfb3V0cHV0X3dyaXRlKG1f
emlwLCA1LCByZWludGVycHJldF9jYXN0PGNvbnN0IGd1aW50OCo+KCI8IS0tICIpKTsKKwlnc2Zf
b3V0cHV0X3dyaXRlKG1femlwLCBzdHJsZW4oY29tbWVudCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgZ3VpbnQ4Kj4oY29tbWVudCkpOworCWdzZl9vdXRwdXRfd3JpdGUobV96aXAsIDUsIHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgZ3VpbnQ4Kj4oIiAtLT5cbiIpKTsKK30KKwordm9pZCBJRV9FeHBf
WE1MOjphZGRGbG9hdChjaGFyIGNvbnN0ICppZCwgZG91YmxlIHZhbHVlLCBpbnQgcHJlY2lzaW9u
KQoreworCWdzZl94bWxfb3V0X2FkZF9mbG9hdChtX3htbCwgaWQsIHZhbHVlLCBwcmVjaXNpb24p
OworfQorCit2b2lkIElFX0V4cF9YTUw6OmFkZEludChjaGFyIGNvbnN0ICppZCwgaW50IHZhbHVl
KQoreworCWdzZl94bWxfb3V0X2FkZF9pbnQobV94bWwsIGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQg
SUVfRXhwX1hNTDo6YWRkTGludChjaGFyIGNvbnN0ICppZCwgbG9uZyB2YWx1ZSkKK3sKKwlzdGQ6
Om9zdHJpbmdzdHJlYW0gYnVmOworCWJ1ZiA8PCB2YWx1ZTsKKwlnc2ZfeG1sX291dF9hZGRfY3N0
cl91bmNoZWNrZWQobV94bWwsIGlkLCBidWYuc3RyKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgSUVf
RXhwX1hNTDo6YWRkTHVpbnQoY2hhciBjb25zdCAqaWQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7
CisJc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKKwlidWYgPDwgdmFsdWU7CisJZ3NmX3htbF9vdXRf
YWRkX2NzdHJfdW5jaGVja2VkKG1feG1sLCBpZCwgYnVmLnN0cigpLmNfc3RyKCkpOworfQorCit2
b2lkIElFX0V4cF9YTUw6OmFkZFN0cmluZyhjaGFyIGNvbnN0ICppZCwgY2hhciBjb25zdCAqdmFs
dWUpCit7CisJZ3NmX3htbF9vdXRfYWRkX2NzdHIobV94bWwsIGlkLCB2YWx1ZSk7Cit9CisKK3Zv
aWQgSUVfRXhwX1hNTDo6YWRkU3RyaW5nKGNoYXIgY29uc3QgKmlkLCBzdGQ6OnN0cmluZyBjb25z
dCAmdmFsdWUpCit7CisJZ3NmX3htbF9vdXRfYWRkX2NzdHIobV94bWwsIGlkLCB2YWx1ZS5jX3N0
cigpKTsKK30KKwordm9pZCBJRV9FeHBfWE1MOjphZGRTdHJpbmcoY2hhciBjb25zdCAqaWQsIFVU
X1VDU0NoYXIgY29uc3QgKmRhdGEsIGludCBsZW5ndGgpCit7CisJVVRfVVRGOFN0cmluZyBzQnVm
OworCWNvbnN0IFVUX1VDU0NoYXIgKiBwRGF0YTsKKworCVVUX3JldHVybl9pZl9mYWlsKHNpemVv
ZihVVF9CeXRlKSA9PSBzaXplb2YoY2hhcikpOworCXNCdWYucmVzZXJ2ZShsZW5ndGgpOworCisJ
Zm9yIChwRGF0YT1kYXRhOyAocERhdGE8ZGF0YStsZW5ndGgpOyAvKiovKQorCXsKKwkJc3dpdGNo
ICgqcERhdGEpCisJCXsKKwkJY2FzZSAnPCc6CisJCQlzQnVmICs9ICImbHQ7IjsKKwkJCXBEYXRh
Kys7CisJCQlicmVhazsKKworCQljYXNlICc+JzoKKwkJCXNCdWYgKz0gIiZndDsiOworCQkJcERh
dGErKzsKKwkJCWJyZWFrOworCisJCWNhc2UgJyYnOgorCQkJc0J1ZiArPSAiJmFtcDsiOworCQkJ
cERhdGErKzsKKwkJCWJyZWFrOworCisJCWNhc2UgVUNTX0xGOgkJCQkJLy8gTEYgLS0gcmVwcmVz
ZW50aW5nIGEgRm9yY2VkLUxpbmUtQnJlYWsKKwkJCXNCdWYgKz0gIjxici8+IjsKKwkJCXBEYXRh
Kys7CisJCQlicmVhazsKKworCQljYXNlIFVDU19WVEFCOgkJCQkJLy8gVlRBQiAtLSByZXByZXNl
bnRpbmcgYSBGb3JjZWQtQ29sdW1uLUJyZWFrCisJCQlzQnVmICs9ICI8Y2JyLz4iOworCQkJcERh
dGErKzsKKwkJCWJyZWFrOworCisJCWNhc2UgVUNTX1RBQjoKKwkJCXNCdWYgKz0gIlx0IjsKKwkJ
CXBEYXRhKys7CisJCQlicmVhazsKKworCQljYXNlIFVDU19GRjoJCQkJCS8vIEZGIC0tIHJlcHJl
c2VudGluZyBhIEZvcmNlZC1QYWdlLUJyZWFrCisJCQlzQnVmICs9ICI8cGJyLz4iOworCQkJcERh
dGErKzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoKnBEYXRhIDwgMHgyMCkgICAg
ICAgICAvLyBTaWxlbnRseSBlYXQgdGhlc2UgY2hhcmFjdGVycy4KKwkJCQlwRGF0YSsrOworCQkJ
ZWxzZQorCQkJCXsKKwkJCQkJc0J1Zi5hcHBlbmRVQ1M0IChwRGF0YSwgMSk7CisJCQkJCXBEYXRh
Kys7CisJCQkJfQorCQl9CisJfQorCWdzZl94bWxfb3V0X2FkZF9jc3RyX3VuY2hlY2tlZChtX3ht
bCwgaWQsIHNCdWYudXRmOF9zdHIoKSk7Cit9CisKK3ZvaWQgSUVfRXhwX1hNTDo6YWRkVWludChj
aGFyIGNvbnN0ICppZCwgdW5zaWduZWQgdmFsdWUpCit7CisJZ3NmX3htbF9vdXRfYWRkX3VpbnQo
bV94bWwsIGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQgSUVfRXhwX1hNTDo6c2V0UHJldHR5UHJpbnQo
Ym9vbCBwcmV0dHkpCit7CisJZ19vYmplY3Rfc2V0IChtX3htbCwgInByZXR0eS1wcmludCIsIHBy
ZXR0eSwgTlVMTCk7Cit9CkluZGV4OiBzcmMvd3AvaW1wZXhwL3hwL2llX2V4cF9YTUwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBzcmMvd3AvaW1wZXhwL3hwL2llX2V4cF9YTUwuaAkocsOpdmlzaW9uIDApCisr
KyBzcmMvd3AvaW1wZXhwL3hwL2llX2V4cF9YTUwuaAkoY29waWUgZGUgdHJhdmFpbCkKQEAgLTAs
MCArMSw1OCBAQAorLyogQWJpV29yZAorICogQ29weXJpZ2h0IChDKSAyMDE1IEplYW4gQnJlZm9y
dCA8amVhbi5icmVmb3J0QG5vcm1hbGVzdXAub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp
b24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv
bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBLgorICovCisKKworI2lmbmRlZiBJRV9FWFBfWE1M
X0gKKyNkZWZpbmUgSUVfRVhQX1hNTF9ICisKKyNpbmNsdWRlICJpZV9leHAuaCIKKyNpbmNsdWRl
IDxzdHJpbmc+CisKK2NsYXNzIEFCSV9FWFBPUlQgSUVfRXhwX1hNTDogcHVibGljIElFX0V4cAor
eworcHVibGljOgorCUlFX0V4cF9YTUwoUERfRG9jdW1lbnQgKiBwRG9jdW1lbnQpOworCXZpcnR1
YWwgfklFX0V4cF9YTUwoKTsKKworcHVibGljOgorICAgIHZvaWQgc2V0dXBGaWxlKGJvb2wgY29t
cHJlc3NlZCk7CisgICAgdm9pZCBjbG9zZUhhbmRsZSgpOworICAgIHZvaWQgc2V0RG9jVHlwZShj
aGFyIGNvbnN0ICpkb2N0eXBlKTsKKyAgICB2b2lkIHN0YXJ0RWxlbWVudChjaGFyIGNvbnN0ICpu
YW1lKTsKKyAgICB2b2lkIGVuZEVsZW1lbnQoKTsKKwl2b2lkIGFkZEJvb2woY2hhciBjb25zdCAq
aWQsIGJvb2wgdmFsdWUpOworCXZvaWQgYWRkQ29tbWVudChjaGFyIGNvbnN0ICpjb21tZW50KTsK
Kwl2b2lkIGFkZEZsb2F0KGNoYXIgY29uc3QgKmlkLCBkb3VibGUgdmFsdWUsIGludCBwcmVjaXNp
b24gPSAtMSk7CisJdm9pZCBhZGRJbnQoY2hhciBjb25zdCAqaWQsIGludCB2YWx1ZSk7CisJdm9p
ZCBhZGRMaW50KGNoYXIgY29uc3QgKmlkLCBsb25nIHZhbHVlKTsKKwl2b2lkIGFkZEx1aW50KGNo
YXIgY29uc3QgKmlkLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKwl2b2lkIGFkZFN0cmluZyhjaGFy
IGNvbnN0ICppZCwgY2hhciBjb25zdCAqdmFsdWUpOworCXZvaWQgYWRkU3RyaW5nKGNoYXIgY29u
c3QgKmlkLCBzdGQ6OnN0cmluZyBjb25zdCAmdmFsdWUpOworCXZvaWQgYWRkU3RyaW5nKGNoYXIg
Y29uc3QgKmlkLCBVVF9VQ1NDaGFyIGNvbnN0ICpkYXRhLCBpbnQgbGVuZ3RoKTsKKwl2b2lkIGFk
ZFVpbnQoY2hhciBjb25zdCAqaWQsIHVuc2lnbmVkIHZhbHVlKTsKKworCXZvaWQgc2V0UHJldHR5
UHJpbnQoYm9vbCBwcmV0dHkpOworCitwcml2YXRlOgorCisgICAgR3NmT3V0cHV0ICptX3ppcDsK
KyAgICBHc2ZYTUxPdXQgKm1feG1sOworfTsKKworI2VuZGlmIC8qIElFX0VYUF9YTUxfSCAqLwoK



--=-hSnJGdFQ9nC6oOqTVXOP--