ZGlmZiAtLWdpdCBhL3Avc2VydmljZS9wYWRyZWljL21ucGMvLnJlYWRtZSBiL3Avc2VydmljZS9wYWRyZWljL21ucGMvLnJlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE5N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy8ucmVhZG1lCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBEZXIgdWx0aW1hdGl2ZSBOUEMgOiBtbnBjLmMgKEMpIGJ5IFNpciBMdW5jaCBhIGxvdAorICogJElkOiBtbnBjLmMsdiAxLjEgMTk5My8xMC8xMiAxNjoyMzowNyBkamMgRXhwIGRqYyAkCisgKi8KKworRGllc2VyIHVyc3BydWVuZ2xpY2hlIG1ucGMgd3VyZGUgdm9uIG1pciB3ZWl0ZXJlbnR3aWNrZWx0IHVuZCBzdGFyaworb3B0aW1pZXJ0LiBFciBpc3QgZ2VkYWNodCB1bSByZWxhdGl2IGVpbmZhY2gsIGVmZml6aWVudGUgTGF1Zm5wY3MgenUKK3Byb2dyYW1taWVyZW4gdW5kIGVyc3BhcnQgZWluZW0gZGFkdXJjaCBkYXMgUmFkIGVybmV1dCBlcmZpbmRlbiB6dSBtdWVzc2VuLgorRGVyIFVyc3BydWVuZ2xpY2hlIG1ucGMuYyB2b24gU2lyIGxpZWd0IGZ1ZXIgaW50ZXJlc3NpZXJ0ZSB3ZWl0ZXJoaW4gaW4KKytkL3VudGVyd2VsdC9zdGQvbW5wYy5zaXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZHJlaWMKKworbW5wYy5oICAgLSAgZGllIEluY2x1ZGVkYXRlaSBtaXQgZGVuIHp1bSBtbnBjIGdlaG9lcmVuZGVuIFByb3BlcnR5cworbW5wYy5kb2MgLSAgZWluZSBrbGVpbmUgRG9rdW1lbnRhdGlvbiB6dW0gbW5wYworbW5wYy5jICAgLSAgZGllc2VzIEZpbGUgd2lyZCBhbnN0ZWxsZSB2b24gc3RkL25wYyBpbmhlcml0ZXQgdW0gZWluZW4gTGF1Zm5wYworICAgICAgICAgICAgenUgZXJ6ZXVnZW4uCittb3ZpbmcuYyAtICBkaWUgZWlnZW50bGljaCBSb3V0aW5lbiB3dXJkZW4gYXVzZ2VsYWdlcnQsIGRhbWl0IHNpZSBhdWNoCisgICAgICAgICAgICBtaXQgYW5kZXJlbiBzdGRucGNzIHp1c2FtbWVuICh6LkIuIEdpbGRlbm5wY3MpIGJlbnV0enQgd2VyZGVuCisgICAgICAgICAgICBrb2VubmVuLgord2Fsa19tYXN0ZXIuYyAtIGRpZXNlciBXYWxrbWFzdGVyIG11c3MgaW4gZGVuIHNlbHRlbnN0ZW4gRmFlbGxlbiBkaXJla3QKKyAgICAgICAgICAgIHZlcndlbmRldCB3ZXJkZW4sIGRhIGlobiB6LkIuIGRlciBtbnBjLmMgYXV0b21hdGlzY2ggdm9uIHNlbGJzdAorICAgICAgICAgICAgYmVudXR6dC4gU2lubiBkZXMgbWFzdGVyczogY2FsbF9vdXQtS2V0dGVuIGVpbnNwYXJlbi4KZGlmZiAtLWdpdCBhL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5jIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy9tbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyMjMwMwotLS0gL2Rldi9udWxsCisrKyBiL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENoYW5nZWxvZzoKKyAgICogMTEuMDkuMjAwNywgWmVzc3RyYQorICAgICBzdHJvbmdfdHlwZXMgdW5kIHNhdmVfdHlwZXMgYWt0aXZpZXJ0LgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKworI2luY2x1ZGUgIi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuaCIKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworaW5oZXJpdCBNTlBDX01PVklORzsKKwordm9pZCBjcmVhdGUoKQoreworICAgbnBjOjpjcmVhdGUoKTsKKyAgIG1vdmluZzo6bW5wY19jcmVhdGUoKTsKK30KKwordm9pZCByZXNldCgpCit7CisgICBucGM6OnJlc2V0KCk7CisgICBtb3Zpbmc6Om1ucGNfcmVzZXQoKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgIG5wYzo6aW5pdCgpOworICAgbW92aW5nOjptbnBjX2luaXQoKTsKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBlbmVteSkKK3sKKyAgIGludCBpID0gbnBjOjpJbnNlcnRFbmVteShlbmVteSk7CisgICBpZiAoIWkpIHJldHVybiAwOworICAgbW92aW5nOjptbnBjX0luc2VydEVuZW15KGVuZW15KTsKKyAgIHJldHVybiBpOworfQorCit2YXJhcmdzIGludCBtb3ZlKG9iamVjdHxzdHJpbmcgZGVzdCwgaW50IG1ldGgsIHN0cmluZyBkaXIsIHN0cmluZyBvdXQsCisgIHN0cmluZyBpbikKK3sKKyAgIGludCBpPW5wYzo6bW92ZShkZXN0LCBtZXRoLCBkaXIsIG91dCwgaW4pOworICAgaWYgKGkhPTEpIHJldHVybiBpOworICAgbW92aW5nOjptbnBjX21vdmUoKTsKKyAgIHJldHVybiAxOworfQorCitpbnQgUHJldmVudEZvbGxvdyhvYmplY3QgZGVzdCkKK3sgIHJldHVybiBtb3Zpbmc6Om1ucGNfUHJldmVudEZvbGxvdyhkZXN0KTsgIH0KZGlmZiAtLWdpdCBhL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5kb2MgYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTlmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuZG9jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogRGVyIHVsdGltYXRpdmUgTlBDIDogbW5wYy5jIChDKSBieSBTaXIgTHVuY2ggYSBsb3QKKyAqICRJZDogbW5wYy5jLHYgMS4xIDE5OTMvMTAvMTIgMTY6MjM6MDcgZGpjIEV4cCBkamMgJAorICovCisKK0RpZXNlciB1cnNwcnVlbmdsaWNoZSBtbnBjIHd1cmRlIHZvbiBtaXIgd2VpdGVyZW50d2lja2VsdCB1bmQgc3RhcmsKK29wdGltaWVydC4gRXIgaXN0IGdlZGFjaHQgdW0gcmVsYXRpdiBlaW5mYWNoLCBlZmZpemllbnRlIExhdWZucGNzIHp1Citwcm9ncmFtbWllcmVuIHVuZCBlcnNwYXJ0IGVpbmVtIGRhZHVyY2ggZGFzIFJhZCBlcm5ldXQgZXJmaW5kZW4genUgbXVlc3Nlbi4KK0RlciBVcnNwcnVlbmdsaWNoZSBtbnBjLmMgdm9uIFNpciBsaWVndCBmdWVyIGludGVyZXNzaWVydGUgd2VpdGVyaGluIGluCisrZC91bnRlcndlbHQvc3RkL21ucGMuc2lyLgorCitEaWUgRWlnZW5zY2hhZnRlbiBpbSBVZWJlcmJsaWNrOgorCitNTlBDX0FSRUEgLSBJbiBkaWVzZW0gRmVsZCBzdGVoZW4gZGllIFJhZXVtZSwgaW4gZGVuZW4gZGVyIE5QQyBoZXJ1bWxhdWZlbgorICAga2FubiwgKHt9KSBiZWRldXRldCwgZGFzIGRlciBOUEMgdWViZXJhbGwgaGluIGthbm4gKGJpdHRlIG51ciBtaXQKKyAgIGFldXNzZXJzdGVyIFZvcnNpY2h0IHVuZCBBYnNwcmFjaGUgZGVzIFJNcyBiZW51dHplbiEhISkuCisgICBCc3AuOiBTZXRQcm9wKE1OUENfQVJFQSwgKHsgIi9kL2ViZW5lL3Jvb20vYWtfc3RyIiB9KSk7CisgICAgIERpZXNlciBOUEMga2FubiB1ZWJlciBzYWVtdGxpY2hlIFJhZXVtZSBkZXIgQWthZGVtaWVzdHJhc3NlIGxhdWZlbiwgYWxzbworICAgICB6LmIuIGluIGVpbmVuIFJhdW0gbWl0IGRlbSBGaWxlbmFtZW4gL2QvZWJlbmUvcm9vbS9ha19zdHIxCisgICAgIGFiZXIgYXVjaCBpbiBhbGxlIFJhZXVtZSBpbiBlaW5lbSBWZXJ6ZWljaG5pcyAvZC9lYmVuZS9yb29tL2FrX3N0ci8qCisKK01OUENfSE9NRSAtIGRlciBTdGFydHJhdW0gZGVzIE5QQ3MgaW4gZGVuIGVyIHNwYWV0ZXIgZ2dmLiBhdWNoIHdpZWRlcgorICAgenVydWVja2tlaHJ0LiBTZXR6dCBtYW4gZGllc2UgUHJvcGVydHkgbmljaHQsIHdpcmQgdmVyc3VjaHQsIGRlbiBPcnQgZGVzCisgICBDbG9uZW5zIHp1IGVycmF0ZW4vYmVzdGltbWVuLCBhYmVyIHdlbm4gbWFuIHNpY2hlciBnZWhlbiBtb2VjaHRlLCBkYXNzIGRlcgorICAgTU5QQyBkYXMgSG9tZSBoYXQsIHdhcyBtYW4gZGVua3QsIHNvbGx0ZSBtYW4gZXMgZXhwbGl6aXQgc2V0emVuLgorCitNTlBDX0RFTEFZIHVuZC4gTU5QQ19SQU5ET00KKyAgTU5QQ19ERUxBWSArIHJhbmRvbShNTlBDX1JBTkRPTSkgZXJnaWJ0IGRlbiBBYnN0YW5kIHp3aXNjaGVuIHp3ZWkKKyAgQmV3ZWd1bmdlbiBkZXMgTlBDcy4KKyAgQUNIVFVORzogCisgICAgMS4gRGllc2UgV2VydGUgbXVlc3NlbiBnZXNldHp0IHdlcmRlbiwgX2Jldm9yXyBNTlBDX0ZMQUdTIAorICAgIGdlc2V0enQgd2VyZGVuLCBkYSBkaWUgU2V0LU1ldGhvZGUgdm9uIE1OUENfRkxBR1MgZGllIEFubWVsZHVuZyBpbQorICAgIHdhbGtfbWFzdGVyIGR1cmNoZnVlaHJ0LiBTb25zdCB3ZXJkZW4gZGllIERlZmF1bHQtV2VydGUgYmVudXR6dCEKKyAgICAyLiBXZW5uIGRpZXNlIFdlcnRlIGdlYWVuZGVydCB3ZXJkZW4sIHNvbGx0ZSBtYW4gZGllIE1OUENfRkxBR1MgbmV1CisgICAgc2V0emVuLCB1bSBzbyBkaWUgTmV1YW5tZWxkdW5nIGltIHdhbGtfbWFzdGVyIGF1c3p1bG9lc2VuLgorCitNTlBDX1dBTEtfVElNRSAtIFplaXRhbmdhYmUgd2llIGxhbmdlIGVzIGRhdWVydCBiaXMgZGVyIE5QQyBzdGVoZW4gYmxlaWJ0CisgICBmYWxscyBlciBrZWluZW4gU3BpZWxlciBtZWhyIHRyaWZmdC4gRGllc2VyIFdlcnQgc29sbHRlIGV0d2EgMy0xMCBtYWwgc28KKyAgIGdyb3NzIHNlaW4sIHdpZSBkaWUgZHVyY2hzY2huaXR0bGljaGUgTGF1Zmdlc2Nod2luZGlna2VpdC4gV2VubiBkZXIgTlBDCisgICBkYW5uIGVpbmVuIHJlc2V0IGxhbmcga2VpbmVuIFNwaWVsZXIgbWVociB0cmlmZnQsIG1vdnQgZXIgd2llZGVyIGluCisgICBzZWluZW4gU3RhcnRyYXVtIHVuZCB3YXJ0ZXQgZG9ydCBhdWYgbmV1ZSBTcGllbGVyLgorICAgRGVmYXVsdG1hZXNzaWcgNjAwIHNlay4KKworTU5QQ19GTEFHUyAtIHByb3BlcnR5IG1pdCBlaW5lbSBvZGVyIG1laHJlcmVuIGdlc2V0enRlbiBGbGFncworICBNTlBDX1dBTEsgIC0gIHVlYmVyIGRpZXNlcyBGbGFnIGthbm4gZGFzIGxhdWZlbiBlaW4tIGJ6dy4gYXVzZ2VzY2hhbHRldAorICAgICB3ZXJkZW4uCisKKyAgTU5QQ19GT0xMT1dfUExBWUVSICAtICBkZXIgTlBDIHZlcmZvbGd0IGRpZSBTcGllbGVyLCBkaWUgZXIgdHJpZmZ0CisKKyAgTU5QQ19OT19XQUxLX0lOX0ZJR0hUICAtICBkZXIgTlBDIGJsZWlidCBiZWltIGthZW1wZmVuIHVuZCByZW5udCBuaWNodCB3ZWcKKworICBNTlBDX0dPX0hPTUVfV0hFTl9TVE9QUEVEICAtICBkZXIgTlBDIGdlaHQgc29mb3J0IG5hY2ggSGF1c2Ugd2VubiBzZWluZQorICAgICBaZWl0IGFiZ2VsYXVmZW4gaXN0LgorCisgIE1OUENfT05MWV9FWElUUyAtIGRlciBOUEMgYmVudXR6dCBiZWltIGxhdWZlbiBrZWluZSBTcGVjaWFsRXhpdHMKKyAgICAgRGllc2UgRnVua3Rpb24gaXN0IHNlaHIgd2ljaHRpZywgZGEgZHVyY2ggU3BlY2lhbEV4aXRzIGF1Y2ggUmFldW1lCisgICAgIGJldHJldGVuIHdlcmRlbiBrb2VubmVuIGRpZSBuaWNodCBpbiBNTlBDX0FSRUEgZXJsYXVidCB3dXJkZW4hIEhpZXJhdWYKKyAgICAgbXVzcyBkYW5uIGJlcmVpdHMgYmVpIGRlciBHZWJpZXRza29uc3RydWt0aW9uIGdlYWNodGV0IHdlcmRlbi4KKworICBNTlBDX0VYQUNUX0FSRUFfTUFUQ0ggLSBEaWUgaW4gTU5QQ19BUkVBIGFuZ2ViZWJlbiBGaWxlbmFtZW4gd2VyZGVuIGV4YWt0CisgICAgIGdlcHJ1ZWZ0LCBkLmguIHRlbXBlbDEgbWF0Y2h0IGF1Y2ggbnVyIHRlbXBlbDEsIGFiZXIgbmljaHQgbWVociB0ZW1wZWwxNC4KKyAgICAgRm9sZ2U6IGluIE1OUENfQVJFQSBtdWVzc3RlbiBudW4gX2FsbGVfIFJhZXVtZSBlaW56ZWxuIGFuZ2VnZWJlbiB3ZXJkZW4sIGRpZQorICAgICBiZXRyZXRlbiB3ZXJkZW4gZHVlcmZlbi4KKworICBNTlBDX05PX01PVkVfSE9NRSAtIERlciBNTlBDIGdlaHQgaW0gcmVzZXQoKSBuaWNodCBuYWNoIEhhdXNlLCB3ZW5uIGVyCisgICAgIGxhZW5nZXIga2VpbmVuIFNwaWVsZXJrb250YWt0IGhhdHRlLCBzb25kZXJuIGJsZWlidCBhbiBkZW0gU3RhbmRvcnQsCisgICAgIHdvIGVyIHN0ZWhlbiBibGllYi4KKyAgICAgQWNodHVuZzogc29sbHRlIGRpZXNlciBSYXVtIGVudGxhZGVuIHdlcmRlbiwgd2lyZCBkZXIgTU5QQyBkb3J0CisgICAgIHp1ZXJzdG9lcnQuIERlciBIZWltYXRyYXVtIGRlcyBNTlBDIHNvbGx0ZSBkYWZ1ZXIgdm9yc29yZ2VuIChzLiBBZGRJdGVtKS4KKyAgICAgRWJlbnNvIGthbm4gZXMgcGFzc2llcmVuLCBkYXNzIGRlciBNTlBDIHNlaHIgc2VociBsYW5nZSBuaWNodCBtZWhyCisgICAgIGxvc2xhZXVmdCwgc29sbHRlIHNlaW4gU3RhbmRvcnQgZWluc2FtIGxpZWdlbi4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTnVuIG5vY2ggZWluIEJlaXNwaWVsIGZ1ZXIgZWluZW4gTGF1Zm5wYyBpbSBHbG9ja2Vud2FsZDoKKworICBjcmVhdGUoKQorICB7CisgICAgIDo6Y3JlYXRlKCk7CisgICAgIFNldFByb3AoTU5QQ19ERUxBWSwgMzApOworICAgICBTZXRQcm9wKE1OUENfUkFORE9NLCAzMCk7CisgICAgIFNldFByb3AoTU5QQ19GTEFHUywgTU5QQ19XQUxLfE1OUENfRk9MTE9XX1BMQVlFUnxNTlBDX05PX1dBTEtfSU5fRklHSFQpOworICAgICBTZXRQcm9wKE1OUENfQVJFQSwgKHsgIi9kL3dhbGQvdHJveS9nbG9ja2Vud2FsZCIgfSkpOworICAgICAuLi4KKyAgfQorCisgIC8vIGRpZXNlIEZ1bmt0aW9uIGVudHNjaGVpZGV0IGRhcnVlYmVyIG9iIGVpbiBSYXVtIGJldHJldGVuIHdlcmRlbiBkYXJmLAorICAvLyBvZGVyIG5pY2h0IChoaWVyIHdpcmQgYWxzbyBhdWNoIE1OUENfQVJFQSBhYmdlYXJiZWl0ZXQpLiBFaW4KKyAgLy8gVWViZXJzY2hyZWliZW4gZGllc2VyIEZ1bmt0aW9uIGthbm4gbWFuY2htYWwgc2lubnZvbGwgc2VpbiwgdW0KKyAgLy8ga29tcGxleGVyZSBCZWRpbmd1bmdlbiB6dSBpbXBsZW1lbnRpZXJlbi4KKyAgaW50IFByZXZlbnRFbnRlcihzdHJpbmcgZmlsZSkKKyAgeworICAgIGNhbGxfb3RoZXIoZmlsZSwgIj8/PyIpOworICAgIGlmICg6OlByZXZlbnRFbnRlcihmaWxlKSB8fCBwcmVzZW50KCJlbHN0ZXIiLCBmaW5kX29iamVjdChmaWxlKSkpCisgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorIAorRGllc2VyIE5QQyBsYWV1ZnQgZHVyY2ggZGVuIEdsb2NrZW53YWxkIHVuZCBzb2JhbGQgZXIgZWluZW4gU3BpZWxlciB0cmlmZnQsCit2ZXJmb2xndCBlciBkaWVzZW4sIGJpcyB6dW0gUmFuZGUgZGVzIEdsb2NrZW53YWxkZXMuIFdlbm4gZWluIFNwaWVsZXIgaWhuCithbmdyZWlmdCwgYmxlaWJ0IGVyIGF1dG9tYXRpc2NoIHN0ZWhlbi4gRGllIFNwaWVsZXIgc2luZCBudXIgaW4gUmFldW1lbgorc2ljaGVyLCBpbiBkZW5lbiBzaWNoIGVpbmUgRWxzdGVyIGJlZmluZGV0LCBkZW5uIGRpZXNlIFJhZXVtZSBiZXRyaXR0IGRlcgorTlBDIG5pY2h0LgpkaWZmIC0tZ2l0IGEvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy9tbnBjLmggYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjNhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy9tbnBjLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfTU5QQ19IXworI2RlZmluZSBfTU5QQ19IXworCisvKgorICAgICBmb2xnZW5kZSBQcm9wZXJ0eXMga29lbm5lbiBpbiBtbnBjJ3MgZ2VzZXR6dCB3ZXJkZW4uLi4KKyovCisKKy8vIGJpdHRlIGRpZXNlICNkZWZpbmUgaW5oZXJpdGVuIHVuZCBuaWNodCBkaXJla3RlbiBQZmFkIGJlbnV0emVuCisjZGVmaW5lIE1OUEMgICAgICAgICAgICAgICAgICAgICAiL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5jIgorI2RlZmluZSBNTlBDX01PVklORyAgICAgICAgICAgICAgIi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21vdmluZy5jIgorCisvLyBiaXR0ZSBkaWVzZXMgI2RlZmluZSBiZW51dHplbiB1bmQgbmljaHQgZGVuIGRpcmVrdGVuIFBmYWQgdmVyd2VuZGVuCisjZGVmaW5lIFdBTEtfTUFTVEVSICAgICAgICAgICAgICAiL3Avc2VydmljZS9wYWRyZWljL21ucGMvd2Fsa19tYXN0ZXIiCisjZGVmaW5lIE1BWF9NQVNURVJfVElNRSAgICAgICAgICAxODAKKworLy8gaXN0IGF1dG9tYXRpc2NoIGluIGplZGVtIG1ucGMgZ2VzZXR6dAorI2RlZmluZSBQX01OUEMgICAgICAgICAgICAgICAgICAgICJtbnBjIgorCisvLyBNTlBDX0RFTEFZICsgcmFuZG9tKE1OUENfUkFORE9NKSBlcmdpYnQgZGVuIEFic3RhbmQgendpc2NoZW4gZGVtIGxhdWZlbgorI2RlZmluZSBNTlBDX0RFTEFZICAgICAgICAgICAgICAgICJtbnBjX2RlbGF5IgorI2RlZmluZSBNTlBDX1JBTkRPTSAgICAgICAgICAgICAgICJtbnBjX3JhbmRvbSIKKworLy8gZGllc2UgTlBDIHdpcmQgYXVmZ2VydWZlbiBuYWNoZGVtIGRlciBOUEMgZWluZW4gUmF1bSBiZXRyZXRlbiBoYXQuCisjZGVmaW5lIE1OUENfRlVOQyAgICAgICAgICAgICAgICAgIm1ucGNfZnVuYyIKKworLy8gUmF1bSBhbmdlYmVuIGluIGRlbSBkZXIgTlBDIHp1IEhhdXNlIGlzdCAoZG9ydGhpbiB3aXJkIGltIHJlc2V0IGdnZi4gZ2Vtb3Z0KQorLy8gZmFsbHMgbmljaHQgYW5nZWdlYmVuLCBpc3QgZXMgZGVyIE9ydCBkZXMgQ2xvbmVucworI2RlZmluZSBNTlBDX0hPTUUgICAgICAgICAgICAgICAgICJtbnBjX2hvbWUiCisKKy8vIGFycmF5IGRpZSBkaWUgYXJlYSBpbiBkZXIgZGVyIE5QQyBzaWNoIGJld2VnZW4gZGFyZiBhYmdyZW50enQKKyNkZWZpbmUgTU5QQ19BUkVBICAgICAgICAgICAgICAgICAibW5wY19hcmVhIgorCisvLyB3aWUgbGFuZ2UgbGFldWZ0IGRlciBOUEMgYmlzIGVyIHN0ZWhlbiBibGVpYnQKKyNkZWZpbmUgTU5QQ19XQUxLX1RJTUUgICAgICAgICAgICAibW5wY193YWxrX3RpbWUiCisKKy8vIGhpZXIga29lbm5lbiBlaW5pZ2UgRmxhZ3MgZ2VzZXR6dCB3ZXJkZW4KKyNkZWZpbmUgTU5QQ19GTEFHUyAgICAgICAgICAgICAgICAibW5wY19mbGFncyIKKworLy8gZGllIGVpbnplbG5lbiBGbGFncy4uLgorI2RlZmluZSBNTlBDX1dBTEsgICAgICAgICAgICAgICAgICAgMHgwMSAgLyogTlBDIGlzdCBlaW4gTGF1Zm5wYyAqLworI2RlZmluZSBNTlBDX0ZPTExPV19QTEFZRVIgICAgICAgICAgMHgwMiAgLyogTlBDIHZlcmZvbGd0IFNwaWVsZXIgKi8KKyNkZWZpbmUgTU5QQ19GT0xMT1dfRU5FTVkgICAgICAgICAgIDB4MDYgIC8qIE5QQyB2ZXJmb2xndCBmZWluZGxpY2hlIFNwaWVsZXIgKi8KKyNkZWZpbmUgTU5QQ19PTkxZX0VYSVRTICAgICAgICAgICAgIDB4MDggIC8qIE5QQyBudXR6dCBrZWluZSBTcGVjaWFsRXhpdHMgKi8KKyNkZWZpbmUgTU5QQ19OT19XQUxLX0lOX0ZJR0hUICAgICAgIDB4MTAgIC8qIE5QQyBibGVpYnQgaW0gS2FtcGYgc3RlaGVuICovCisjZGVmaW5lIE1OUENfR09fSE9NRV9XSEVOX1NUT1BQRUQgICAweDIwICAvKiBOUEMgd2FydGV0IG5pY2h0IGJpcyB6dW0gcmVzZXQgKi8KKy8vIHdpcmQgaW50ZXJuIGluIG5vbiBsaXZpbmdzIGdlc2V0enQgLSBtYW51ZWxsZXMgc2V0emVuIG5pY2h0IG5vZXRpZworLy8gbm9uIGxpdmluZ3Mga29lbm5lbiBqZWRvY2ggX25pZV8gc3BlY2lhbCBleGl0cyBudXR6ZW4uLi4KKyNkZWZpbmUgTU5QQ19ESVJFQ1RfTU9WRSAgICAgICAgICAgIDB4NDAgIC8qIE5QQyBsYWV1ZnQgbWl0IG1vdmUgc3RhdHQgbWl0IGNvbW1hbmRfbWUgKi8KKy8vIE1hbmNoZSBNYWdpZXIgd29sbGVuIGluIE1OUENfQVJFQSBrZWluZSBTdWJzdHJpbmdzLCBzb25kZXJuIGV4YWt0ZQorLy8gRmlsZW5hbWVuIGFuZ2ViZW4uIFdlbm4gZGllc2VzIEZsYWcgZ2VzZXR6dCB3aXJkLCB3ZXJkZW4gZGllIFN0cmluZ3MgaW4KKy8vIE1OUENfQVJFQSBleGFrdCBnZXBydWVmdCwgbmljaHQgbWl0IHN0cnN0cigpCisjZGVmaW5lIE1OUENfRVhBQ1RfQVJFQV9NQVRDSCAgICAgIDB4ODAKKy8vIE1hbmNoZSBNYWdpZXIgd29sbGVuIG5pY2h0LCBkYXNzIGRlciBNTlBDIHNpY2ggaW0gcmVzZXQgbmFjaCBIYXVzZSBiZXdlZ3QKKyNkZWZpbmUgTU5QQ19OT19NT1ZFX0hPTUUgICAgICAgICAgMHgxMDAKKworLyoKKyAgIEZvbGdlbmRlcyBzaW5kIGludGVybmUgRGVmYXVsdHdlcnRlIGZhbGxzIGRpZSB3ZXJ0ZSBuaWNodCBnZXNldHp0IHdlcmRlbi4KKyovCisKKy8vIGRlZmF1bHQgZGVsYXkgd2lyZCBnZW5vbW1lbiwgZmFsbHMga2VpbiBiZXN0aW1tdGVzIGVpZ2VuZXMgYW5nZWdlYmVuIHdpcmQKKyNkZWZpbmUgTU5QQ19ERkxUX0RFTEFZICAgICAgICAgICAzMAorLy8gc3RhbmRhcmRob21lIGZhbGxzIGtlaW4gYmVzc2VyZXMgaG9tZSBlcm1pdHRlbGJhciBpc3QKKyNkZWZpbmUgTU5QQ19ERkxUX0hPTUUgICAgICAgICAgICAiL3Jvb20vdm9pZCIKKy8vIGRlciBOUEMgYmxlaWJ0IG5hY2ggZGllc2VyIFplaXQgc3RlaGVuIHVuZCBnZWh0IGltIHJlc2V0IG5hY2ggSGF1c2UKKyNkZWZpbmUgTU5QQ19ERkxUX1dBTEsgICAgICAgICAgICAzNjAgICAgICAgICAgICAgIC8qIHZvcmVyc3QgNiBtaW4uICovCisvLyBEaWVzZSBGdW5rdGlvbiB3aXJkIGF1ZmdlcnVmZW4gd2VubiBkZXIgTlBDIGVpbmVuIHJhdW0gYmV0cml0dAorCisvKgorICAgaW50ZXJuZSBkZWZpbmVzCisqLworI2RlZmluZSBNTlBDX1BVUlNVRVIgICAgICAgICAgICAgIm1ucGM6cHVyc3VlciIgIC8qIG51ciBpbnRlcm4gKi8KKyNkZWZpbmUgTU5QQ19MQVNUX01FRVQgICAgICAgICAgICJtbnBjX2xhc3RfbWVldCIKKworI2VuZGlmIC8vIF9NTlBDX0hfCmRpZmYgLS1naXQgYS9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21vdmluZy5jIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy9tb3ZpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdkNTAzCi0tLSAvZGV2L251bGwKKysrIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy9tb3ZpbmcuYwpAQCAtMCwwICsxLDQyMSBAQAorI3ByYWdtYSBzYXZlX3R5cGVzLHN0cm9uZ190eXBlcyxydHRfY2hlY2tzLHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvbGl2aW5nL21vdmluZyI7CisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuaCIKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8bGl2aW5nL2NvbWJhdC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGNvbWJhdC5oPgorCisjZGVmaW5lIEVOViAgICBlbnZpcm9ubWVudAorI2RlZmluZSBQTyAgICAgcHJldmlvdXNfb2JqZWN0KCkKKworLy8gTGV0enRlciBTcGllbGVya29udGFrdC4gLTEsIHdlbm4gZGVyIE1OUEMgaW5ha3RpdiB6dWhhdXNlIHJ1bXN0ZWh0CitzdGF0aWMgaW50IG1lZXRfbGFzdF9wbGF5ZXI7CisKK3N0YXRpYyB2b2lkIG1ucGNfY3JlYXRlKCkKK3sKKyAgaWYgKFBPICYmIG1lbWJlcihpbmhlcml0X2xpc3QoUE8pLCAiL3N0ZC9yb29tLmMiKSE9LTEpCisgICAgU2V0UHJvcChNTlBDX0hPTUUsIG9iamVjdF9uYW1lKFBPKSk7CisgIGVsc2UgaWYgKFBMICYmIEVOVihQTCkpCisgICAgU2V0UHJvcChNTlBDX0hPTUUsIG9iamVjdF9uYW1lKEVOVihQTCkpKTsKKyAgZWxzZQorICAgIFNldFByb3AoTU5QQ19IT01FLCBNTlBDX0RGTFRfSE9NRSk7CisgIFNldFByb3AoUF9NTlBDLCAxKTsKKyAgU2V0UHJvcChNTlBDX0FSRUEsICh7fSkpOworICBTZXRQcm9wKE1OUENfREVMQVksIE1OUENfREZMVF9ERUxBWSk7CisgIFNldFByb3AoTU5QQ19GVU5DLCAwKTsKKyAgU2V0UHJvcChNTlBDX1JBTkRPTSwgMCk7CisgIFNldFByb3AoTU5QQ19XQUxLX1RJTUUsIE1OUENfREZMVF9XQUxLKTsKKyAgU2V0UHJvcChNTlBDX0ZMQUdTLCAwKTsKKyAgU2V0UHJvcChQX0VOQUJMRV9JTl9BVFRBQ0tfT1VULCAxKTsKKyAgbWVldF9sYXN0X3BsYXllcj10aW1lKCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIFJlZ2lzdGVyV2FsaygpCit7CisgIGlmICgoUXVlcnlQcm9wKE1OUENfREVMQVkpK1F1ZXJ5UHJvcChNTlBDX1JBTkRPTSkpPD1NQVhfTUFTVEVSX1RJTUUpCisgICAgV0FMS19NQVNURVItPlJlZ2lzdGVyV2Fsa2VyKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQcm9wKE1OUENfUkFORE9NKSk7CisgIGVsc2UKKyAgICBjYWxsX291dCgiV2FsayIsIFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStyYW5kb20oUXVlcnlQcm9wKE1OUENfUkFORE9NKSkpOworfQorCisvLyBDYW4gYmUgdXNlZCB0byBtYW51YWxseSByZXN0YXJ0IHRoZSBNTlBDIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGV2ZW4gaWYKKy8vIHRoZSBNTlBDIGhhZCBub3QgcGxheWVyIGNvbnRhY3QuCitwdWJsaWMgaW50IFJlc3RhcnRXYWxrKCkKK3sKKyAgaW50IGZsYWdzID0gUXVlcnlQcm9wKE1OUENfRkxBR1MpOworICAvLyBGYWxscyBuaWNodCBsYXVmZW5kLCB3aXJkIGdhciBuaWNodHMgZ2VtYWNodC4KKyAgaWYgKGZsYWdzICYgTU5QQ19XQUxLKQorICB7CisgICAgLy9TcGllbGVya29udGFrdCBzaW11bGllcmVuCisgICAgbWVldF9sYXN0X3BsYXllcj10aW1lKCk7CisgICAgLy8gRmFsbHMgTU5QQyBub2NoIHJlZ2lzdHJpZXJ0IGlzdCBvZGVyIG5vY2ggZWluZW4gQ2FsbG91dCBhdWYgV2FsayBoYXQsCisgICAgLy8gbXVzcyBuaWNodHMgd2VpdGVyIGdlbWFjaHQgd2VyZGVuLgorICAgIGlmIChXQUxLX01BU1RFUi0+UmVnaXN0cmF0aW9uKCkKKyAgICAgICAgfHwgZmluZF9jYWxsX291dCgiV2FsayIpID4gLTEpCisgICAgICByZXR1cm4gLTE7CisgICAgLy8gYW5zb25zdGVuIE1OUEMgcmVnaXN0cmllcmVuLCBmYWxscyBnZWVpZ25ldC4KKyAgICBpZiAoKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStRdWVyeVByb3AoTU5QQ19SQU5ET00pKTw9TUFYX01BU1RFUl9USU1FKQorICAgICAgV0FMS19NQVNURVItPlJlZ2lzdGVyV2Fsa2VyKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKSwgUXVlcnlQcm9wKE1OUENfUkFORE9NKSk7CisgICAgLy8gdW5kIG1pdCBrdXJ6ZXIgVmVyem9lZ2VydW5nIGVpbm1hbCBsYXVmZW4uIChqYSwgYWJzaWNodCwgaGllcgorICAgIC8vIE1OUENfREVMQVkgenUgbnV0emVuIC0gZGVubiBzb2xhbmdlIGRhdWVydCBkYXMgV2FsayB2b20gTWFzdGVyCisgICAgLy8gbWluZGVzdGVucy4pCisgICAgY2FsbF9vdXQoIldhbGsiLDErcmFuZG9tKCBtaW4oUXVlcnlQcm9wKE1OUENfREVMQVkpLTEsOCkgKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3Byb3RlY3RlZCB2b2lkIFN0b3AoaW50IG1vdmVob21lKQoreworICBpZiAoV0FMS19NQVNURVItPlJlZ2lzdHJhdGlvbigpKQorICAgIFdBTEtfTUFTVEVSLT5SZW1vdmVXYWxrZXIoKTsKKyAgZWxzZSBpZiAoZmluZF9jYWxsX291dCgiV2FsayIpIT0tMSkKKyAgICByZW1vdmVfY2FsbF9vdXQoIldhbGsiKTsKKyAgaWYgKG1vdmVob21lKQorICB7CisgICAgbW92ZShRdWVyeVByb3AoTU5QQ19IT01FKSwgTV9UUE9SVHxNX05PQ0hFQ0spOworICAgIG1lZXRfbGFzdF9wbGF5ZXI9LTE7CisgIH0KK30KKworc3RhdGljIGludCBfc2V0X21ucGNfZmxhZ3MoaW50IGZsYWdzKQoreworICBpZiAoZmxhZ3MgJiBNTlBDX1dBTEspCisgIHsKKyAgICBpZiAoIVF1ZXJ5UHJvcChNTlBDX0hPTUUpKQorICAgICAgcmFpc2VfZXJyb3IoInVua25vd24gTU5QQ19IT01FXG4iKTsKKyAgICAvL3dlbm4gZGllIEZsYWdzIG5ldSBnZXNldHp0IHdlcmRlbiwgd2lyZCBkZXIgTU5QQyBkYXMgendlaXRlIE1hbCBpbQorICAgIC8vTWFzdGVyIGFuZ2VtZWxkZXQgLT4gdm9yaGVyIGFibWVsZGVuIChaZXNzdHJhKQorICAgIGlmIChRdWVyeVByb3AoTU5QQ19GTEFHUykgJiBNTlBDX1dBTEspCisgICAgeworICAgICAgU3RvcCgwKTsKKyAgICB9CisgICAgUmVnaXN0ZXJXYWxrKCk7CisgIH0KKyAgLy8gZWxzZSBuaWNodCB2b24gQmVkZXV0dW5nLCBkYSBpbiBXYWxrKCkgZGFzIGZsYWcgZ2V0ZXN0ZXQgd2lyZAorICBpZiAoZmxhZ3MgJiBNTlBDX0ZPTExPV19QTEFZRVIpCisgIHsKKyAgICBpZiAoIVF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpKQorICAgIHsgLy8gd3VyZGUgZGllc2VzIEZsYWcgbmV1IGVpbmdlc2NoYWx0ZXQ/CisgICAgICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgICAgIHsgLy8gVmVyZm9sZ3VuZyBhdWZuZWhtZW4uLi4KKyAgICAgICAgb2JqZWN0ICpwdXJzdWVyID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkoRU5WKCkpLCAjJ2ludGVyYWN0aXZlKTsKKyAgICAgICAgZmlsdGVyX29iamVjdHMocHVyc3VlciwgIkFkZFB1cnN1ZXIiLCBNRSk7CisgICAgICAgIFNldFByb3AoTU5QQ19QVVJTVUVSLCBwdXJzdWVyKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsICh7fSkpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChwb2ludGVycChRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSkpCisgIHsgLy8gd2lyZCBkZXJ6ZWl0IGlyZ2VuZHdlciB2ZXJmb2xndD8KKyAgICAvLyBhbGxlIFZlcmZvbGd1bmdlbiBhYmJyZWNoZW4uLi4KKyAgICBmaWx0ZXJfb2JqZWN0cyhRdWVyeVByb3AoTU5QQ19QVVJTVUVSKS0oeyAwIH0pLCAiUmVtb3ZlUHVyc3VlciIsIE1FKTsKKyAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgMCk7IC8vIFNwZWljaGVyIGZyZWlnZWJlbi4uLgorICB9CisgIGVsc2UKKyAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgMCk7CisKKyAgLy8gbnVyIGxpdmluZ3Mga29lbm5lbiBjb21tYW5kX21lIG51dHplbi4uLgorICBpZiAoIWxpdmluZyhNRSkpCisgICAgZmxhZ3MgfD0gTU5QQ19ESVJFQ1RfTU9WRTsKKworICByZXR1cm4gU2V0KE1OUENfRkxBR1MsIGZsYWdzLCBGX1ZBTFVFKTsKK30KKworc3RhdGljIHZvaWQgbW5wY19JbnNlcnRFbmVteShvYmplY3QgZW5lbXkpCit7CisgIGlmICggKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRk9MTE9XX0VORU1ZKSAmJgorICAgICAgICAgKG1lbWJlcihRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSwgUEwpPT0tMSkpCisgIHsKKyAgICAgUEwtPkFkZFB1cnN1ZXIoTUUpOworICAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgUXVlcnlQcm9wKE1OUENfUFVSU1VFUikrKHsgUEwgfSkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1ucGNfcmVzZXQoKQoreworICBpbnQgZmxhZ3MgPSBRdWVyeVByb3AoTU5QQ19GTEFHUyk7CisgIC8vIG1lZXRfbGFzdF9wbGF5ZXIgPCAwIHplaWd0IGFuLCBkYXNzIGRlciBNTlBDIHNjaG9uIHp1aGF1c2UgaXN0LgorICBpZiAobWVldF9sYXN0X3BsYXllciA8IDAKKyAgICAgIHx8ICEoZmxhZ3MgJiBNTlBDX1dBTEspCisgICAgICB8fCAoZmxhZ3MgJiBNTlBDX05PX01PVkVfSE9NRSkpCisgICAgcmV0dXJuOworCisgIC8vIExhbmdlIGtlaW5lbiBTcGllbGVya29udGFrdCB1bmQga2VpbiBTcGllbGVyIGltIFJhdW06IG5hY2ggSGF1c2UgZ2VoZW4uCisgIGlmIChRdWVyeVByb3AoTU5QQ19XQUxLX1RJTUUpK21lZXRfbGFzdF9wbGF5ZXIgPCB0aW1lKCkKKyAgICAgICYmIGVudmlyb25tZW50KCkgJiYgIXNpemVvZihmaWx0ZXIoCisgICAgICBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKSkKKyAgeworICAgIC8vIEFic2NoYWx0ZW4gdW5kIEhlaW1nZWhlbiB1bmQgZG9ydCB3YXJ0ZW4uCisgICAgU3RvcCgxKTsKKyAgfQorfQorCitzdGF0aWMgaW50IF9xdWVyeV9tbnBjX2xhc3RfbWVldCgpCit7ICAgcmV0dXJuIG1lZXRfbGFzdF9wbGF5ZXI7ICAgfQorCitzdGF0aWMgdm9pZCBtbnBjX2luaXQoKQoreworICBpZiAoaW50ZXJhY3RpdmUoUEwpKQorICB7CisgICAgaWYgKG1lZXRfbGFzdF9wbGF5ZXI8PTApCisgICAgeworICAgICAgUmVnaXN0ZXJXYWxrKCk7CisgICAgfQorICAgIGlmICggKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRk9MTE9XX1BMQVlFUikgJiYKKyAgICAgICAgIChtZW1iZXIoUXVlcnlQcm9wKE1OUENfUFVSU1VFUiksIFBMKT09LTEpICYmCisgICAgICAgICghKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRk9MTE9XX0VORU1ZKSB8fCBJc0VuZW15KFBMKSkpCisgICAgeworICAgICAgUEwtPkFkZFB1cnN1ZXIoTUUpOworICAgICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsIFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpKyh7IFBMIH0pKTsKKyAgICB9CisgICAgbWVldF9sYXN0X3BsYXllcj10aW1lKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gV2VubiBkZXIgcmVpbmtvbW1lbmRlIGF1Y2ggZWluIE1OUENfTEFTVF9NRUVUIGdyb2Vzc2VyIDAgaGF0LCBpc3QgZXMKKyAgICAvLyBlaW4gTU5QQywgZGVyIG5vY2ggbGFldWZ0LiBXZW5uIHdpciBuaWNodCBsYXVmZW4sIGxhdWZlbiB3aXIgbG9zLgorICAgIC8vIEluIGRpZXNlbSB1bmQgYXVjaCBpbSBhbmRlcmVuIEZhbGwgdWViZXJuZWhtZW4gd2lyIGFiZXIgbWFsIHNlaW5lbgorICAgIC8vIGxldHp0ZW4gU3BpZWxlcmtvbnRha3QsIGRlbm4gZGVyIGlzdCBqdWVuZ2VyIGFscyB1bnNlcmVyLgorICAgIGludCBsbSA9IFBMLT5RdWVyeVByb3AoTU5QQ19MQVNUX01FRVQpOworICAgIGlmIChtZWV0X2xhc3RfcGxheWVyPD0wICYmIGxtPjApCisgICAgeworICAgICAgUmVnaXN0ZXJXYWxrKCk7CisgICAgICBtZWV0X2xhc3RfcGxheWVyPWxtOworICAgIH0KKyAgICBlbHNlIGlmIChtZWV0X2xhc3RfcGxheWVyPGxtKQorICAgICAgIG1lZXRfbGFzdF9wbGF5ZXI9bG07CisgIH0KK30KKworc3RhdGljIHZvaWQgbW5wY19tb3ZlKCkKK3sKKyAgaWYgKGVudmlyb25tZW50KCkgJiYgKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRk9MTE9XX1BMQVlFUikpCisgIHsKKyAgICBvYmplY3QgKmxpdiA9IFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpICYgYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKTsKKyAgICBmaWx0ZXJfb2JqZWN0cyhRdWVyeVByb3AoTU5QQ19QVVJTVUVSKS1saXYtKHsgMCB9KSwgIlJlbW92ZVB1cnN1ZXIiLCBNRSk7CisgICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsIGxpdik7CisgIH0KKyAgaWYgKFF1ZXJ5UHJvcChNTlBDX0ZVTkMpKQorICAgIE1FLT5RdWVyeVByb3AoTU5QQ19GVU5DKTsKK30KKworc3RhdGljIGludCBQcmV2ZW50RW50ZXIoc3RyaW5nIGZpbGUpCisvLyBkYXJmIGRlciBSYXVtIGJldHJldGVuIHdlcmRlbj8KK3sKKyAgc3RyaW5nICphcmVhOworCisgIGlmICghc2l6ZW9mKGFyZWE9UXVlcnlQcm9wKE1OUENfQVJFQSkpKQorICAgIHJldHVybiAwOyAvLyBSYXVtIGRhcmYgYmV0cmV0ZW4gd2VyZGVuCisgIGVsc2UKKyAgeworICAgIGludCBpOworICAgIHN0YXR1cyBleGFjdG1hdGNoOworICAgIGV4YWN0bWF0Y2g9UXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19FWEFDVF9BUkVBX01BVENIOworICAgIGlmICgoaT1zdHJzdHIoZmlsZSwgIiMiKSkhPS0xKSBmaWxlPWZpbGVbMC4uaS0xXTsKKyAgICBmb3IgKGk9c2l6ZW9mKGFyZWEpLTE7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICBpZiAoZXhhY3RtYXRjaCkKKyAgICAgIHsKKyAgICAgICAgLy9leGFrdGVyIFZlcmdsZWljaCwga2VpbiBTdWJzdHJpbmd2ZXJnbGVpY2ggZ2V3dWVuc2NodAorICAgICAgICBpZiAoZmlsZT09YXJlYVtpXSkKKyAgICAgICAgICByZXR1cm4gMDsgIC8vYmV0cmV0ZW4KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0cnN0cihmaWxlLCBhcmVhW2ldKT09MCkKKyAgICAgICAgICByZXR1cm4gMDsgLy8gUmF1bSBiZXRyZXRlbgorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgLy8gIFJhdW0gZGFyZiBuaWNodCBiZXRyZXRlbiB3ZXJkZW4KKyAgfQorfQorCitzdGF0aWMgaW50IG1ucGNfUHJldmVudEZvbGxvdyhvYmplY3QgZGVzdCkKK3sKKyAgaWYgKGRlc3QgJiYgUHJldmVudEVudGVyKG9iamVjdF9uYW1lKGRlc3QpKSkKKyAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEJld2VndW5nc3NpbXVsYXRpb24gKEJld2VndW5nc21lbGR1bmcpIGZ1ZXIgYmV3ZWdlbmRlIG5vbi1saXZpbmdzCitzdGF0aWMgaW50IGRpcmVjdF9tb3ZlKG1peGVkIGRlc3QsIGludCBtZXRob2QsIHN0cmluZyBkaXJlY3Rpb24pCit7CisgICBpbnQgcmVzLCBwYXJhLCB0bXA7CisgICBzdHJpbmcgdGV4dG91dCwgdGV4dGluLCAqbW91dCwgdmMsIGZuOworICAgb2JqZWN0IG9sZGVudiwgKmludjsKKworICAgaWYgKGxpdmluZyhNRSkpCisgICAgICByZXR1cm4gY2FsbF9vdGhlcihNRSwgIm1vdmUiLCBkZXN0LCBtZXRob2QpOworICAgZWxzZQorICAgeworICAgICAgb2xkZW52ID0gZW52aXJvbm1lbnQoKTsKKyAgICAgIHBhcmE9UXVlcnlQcm9wKFBfUEFSQSk7CisgICAgICBpZiAoKHBhcmE+MCkgJiYgc3RyaW5ncChkZXN0KSkKKyAgICAgIHsKKyAgICAgICAgIGZuPWRlc3QrIl4iK3BhcmE7CisgICAgICAgICBpZiAoZmluZF9vYmplY3QoZm4pIHx8IChmaWxlX3NpemUoZm4rIi5jIik+MCkpCisgICAgICAgICAgICBkZXN0PWZuOworICAgICAgICAgZWxzZSBpZiAoZmlsZV9zaXplKHZjPWltcGxvZGUoZXhwbG9kZShmbiwiLyIpWzAuLjwyXSwiLyIpCisgICAgICAgICAgICAgICAgICArIi92aXJ0dWFsX2NvbXBpbGVyLmMiKT4wKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gd2VubiBlaW4gVkMgZXhpc3RpZXJ0LCBwcvxmZW4gb2IgZGllc2VyIFBhcmFPYmplY3RlIHVudGVyc3R1ZXR6dAorICAgICAgICAgICAgLy8gd2VubiBqYSwgZGFubiB0ZXN0ZW4gb2Igc2ljaCBSYXVtIGxhZGVuIGxhZXNzdC4uLgorICAgICAgICAgICAgaWYgKCghY2F0Y2godG1wPShpbnQpY2FsbF9vdGhlcih2YywiTm9QYXJhT2JqZWN0cyIpKSAmJiAoIXRtcCkpICYmCisgICAgICAgICAgICAgICAgKCFjYXRjaChjYWxsX290aGVyKCBmbiwgIj8/PyIgKSkpKQorICAgICAgICAgICAgICAgIGRlc3Q9Zm47CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlcyA9IChpbnQpY2FsbF9vdGhlcihNRSwgIm1vdmUiLCBkZXN0LCBNX05PQ0hFQ0spOworCisgICAgICBpZiAob2xkZW52PT1lbnZpcm9ubWVudCgpKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAvLyBhbHMgZXJzdGVzIGRpZSBNZWxkdW5nIGZ1ZXIgZGFzIFZlcmxhc3NlbiBkZXMgUmF1bWVzLi4uCisgICAgICBpZiAoIG1ldGhvZCAmIE1fVFBPUlQgKQorICAgICAgICB0ZXh0b3V0ID0gKHN0cmluZykgUXVlcnlQcm9wKFBfTU1TR09VVCkgfHwgKHN0cmluZykgUXVlcnlQcm9wKFBfTVNHT1VUKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbW91dCA9IGV4cGxvZGUoIChzdHJpbmcpIFF1ZXJ5UHJvcChQX01TR09VVCkgfHwgIiIsICIjIiApOworICAgICAgICB0ZXh0b3V0ID0gbW91dFswXSB8fCAoc3RyaW5nKSBRdWVyeVByb3AoUF9NTVNHT1VUKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmluZ3AodGV4dG91dCkpCisgICAgICB7CisgICAgICAgICBpZiAoICFzaXplb2YoZGlyZWN0aW9uKSApCisgICAgICAgICAgIGRpcmVjdGlvbiA9IDA7CisKKyAgICAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkob2xkZW52KSAtICh7IHRoaXNfb2JqZWN0KCkgfSk7CisgICAgICAgICBpbnYgPSBmaWx0ZXIoIGludiwgIydsaXZpbmcpOworICAgICAgICAgaW52IC09IGZpbHRlcl9vYmplY3RzKCBpbnYsICJDYW5ub3RTZWUiLCAxICk7CisgICAgICAgICBmaWx0ZXIoIGludiwgIyd0ZWxsX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgTmFtZSggV0VSLCAyICkgKyAiICIgKyB0ZXh0b3V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA/ICIgIiArIGRpcmVjdGlvbiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YobW91dCkgPiAxID8gbW91dFsxXSA6ICIiKSArICIuXG4iICk7CisgICAgICB9CisKKyAgICAgIC8vIG51biBkaWUgTWVsZHVuZyBm/HIgZGFzICJCZXRyZXRlbiIgZGVzIFJhdW1lcy4uLgorCisgICAgICBpZiAoIG1ldGhvZCAmIE1fVFBPUlQgKQorICAgICAgICB0ZXh0aW4gPSAoc3RyaW5nKSBRdWVyeVByb3AoUF9NTVNHSU4pOworICAgICAgZWxzZQorICAgICAgICB0ZXh0aW4gPSAoc3RyaW5nKSBRdWVyeVByb3AoUF9NU0dJTik7CisKKyAgICAgIGlmIChzdHJpbmdwKHRleHRpbikpCisgICAgICB7CisgICAgICAgICBpbnYgPSBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpIC0gKHsgdGhpc19vYmplY3QoKSB9KTsKKyAgICAgICAgIGludiA9IGZpbHRlciggaW52LCAjJ2xpdmluZyk7CisgICAgICAgICBpbnYgLT0gZmlsdGVyX29iamVjdHMoIGludiwgIkNhbm5vdFNlZSIsIDEgKTsKKyAgICAgICAgIGZpbHRlciggaW52LCAjJ3RlbGxfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUoIFdFUiwgMCApKSArICIgIiArIHRleHRpbiArICIuXG4iICk7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworaW50IFdhbGsoKQoreworICBpbnQgICAgIGk7CisgIG1hcHBpbmcgZXhpdHM7CisgIHN0cmluZyAgKnJvb21zLCAqZGlycywgKmV4LCB0bXA7CisKKyAgaWYgKCFlbnZpcm9ubWVudCgpKQorICB7CisgICAgLy8gZGFyZiBlaWdlbnRsaWNoIG5pY2h0IHZvcmtvbW1lbi4KKyAgICByYWlzZV9lcnJvcigiTU5QQyBvaG5lIEVudmlyb25tZW50LlxuIik7CisgIH0KKworICBpbnQgZmxhZ3M9UXVlcnlQcm9wKE1OUENfRkxBR1MpOworICBpZiAoIShmbGFncyAmIE1OUENfV0FMSykpCisgICAgcmV0dXJuIDA7CisKKyAgLy9nZ2YuIG5ldWVuIENhbGxvdXQgZWludHJhZ2VuLCBiZXZvciBpcmdlbmR3YXMgYW5kZXJlcyBnZW1hY2h0IHdpcmQuCisgIGlmICgoUXVlcnlQcm9wKE1OUENfREVMQVkpK1F1ZXJ5UHJvcChNTlBDX1JBTkRPTSkpPk1BWF9NQVNURVJfVElNRSkKKyAgICBjYWxsX291dCgiV2FsayIsIFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStyYW5kb20oUXVlcnlQcm9wKE1OUENfUkFORE9NKSkpOworCisgIC8vIEltIEthbXBmIGdnZi4gbmljaHQgd2VpdGVyZ2VoZW4uCisgIGlmICgoZmxhZ3MgJiBNTlBDX05PX1dBTEtfSU5fRklHSFQpICYmIEluRmlnaHQoKSkKKyAgeworICAgIG1lZXRfbGFzdF9wbGF5ZXI9dGltZSgpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gTU5QQyBhbmhhbHRlbiwgd2VubiBsYW5nZSBrZWluIFNwaWVsZXJrb250YWt0CisgIGlmIChRdWVyeVByb3AoTU5QQ19XQUxLX1RJTUUpK21lZXRfbGFzdF9wbGF5ZXIgPCB0aW1lKCkKKyAgICAgICYmICFzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSksCisgICAgICAgICAgICAgICAgICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkpCisgICAgICApCisgIHsKKyAgICAvLyBhbmhhbHRlbiB1bmQgZ2dmLiBhdWNoIGRpcmVrdCBuYWNoIEhhdXNlIGdlaGVuLgorICAgIFN0b3AoZmxhZ3MgJiBNTlBDX0dPX0hPTUVfV0hFTl9TVE9QUEVEKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEF1c2dhZW5nZSBlcm1pdHRlbG4uCisgIGV4aXRzID0gKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0VYSVRTKSk7CisgIHJvb21zID0gbV92YWx1ZXMoZXhpdHMpOworICBkaXJzICA9IG1faW5kaWNlcyhleGl0cyk7CisgIGV4ID0gKHt9KTsKKworICBmb3IgKGk9c2l6ZW9mKHJvb21zKS0xOyBpPj0wOyBpLS0pCisgIHsKKyAgICBpZiAoIVByZXZlbnRFbnRlcihyb29tc1tpXSkpCisgICAgICBleCArPSAoeyBkaXJzW2ldIH0pOworICB9CisgIC8qIEhpZXIgbXVlc3NlbiB3aXIgYXVmIGRpZSBadXZlcmxhZXNzaWdrZWl0IHVuc2VyZXIgTWFnaWVyIGJhdWVuIC4uLiAqLworICBpZiAoZmxhZ3MgJiBNTlBDX0RJUkVDVF9NT1ZFKQorICB7CisgICAgLy8gaW0gZGlyZWN0IG1vZGUga2VpbmUgU0VzIGJlbnV0emJhci4uLgorICAgIGlmIChzaXplb2YoZXgpKQorICAgIHsKKyAgICAgICB0bXA9ZXhbcmFuZG9tKHNpemVvZihleCkpXTsKKyAgICAgICBkaXJlY3RfbW92ZShleHBsb2RlKGV4aXRzW3RtcF0sICIjIilbPDFdLCBNX0dPLCAibmFjaCAiK2NhcGl0YWxpemUodG1wKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgLy8gSG5nbC4gTmFjaCBIYXVzZS4uLgorICAgICAgIGRpcmVjdF9tb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSywgMCk7CisgICAgICAgbWVldF9sYXN0X3BsYXllcj0tMTsKKyAgICAgfQorICB9CisgIGVsc2UgaWYgKGZsYWdzICYgTU5QQ19PTkxZX0VYSVRTKQorICB7CisgICAgLy8gbG9naXNjaGVyd2Vpc2UgYXVjaCBrZWluZSBTRXMgYmVudXR6ZW4uLi4KKyAgICBpZiAoc2l6ZW9mKGV4KSkKKyAgICB7CisgICAgICBjb21tYW5kKGV4W3JhbmRvbShzaXplb2YoZXgpKV0pOyAvKiBJcmdlbmR3b2hpbiBnZWhlbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gSG5nbC4gTmFjaCBIYXVzZS4uLgorICAgICAgbW92ZShRdWVyeVByb3AoTU5QQ19IT01FKSwgTV9UUE9SVHxNX05PQ0hFQ0spOworICAgICAgbWVldF9sYXN0X3BsYXllcj0tMTsKKyAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBTcGVjaWFsIEV4aXRzIG1pdGJlbnV0emVuLgorICAgIGV4ICs9IG1faW5kaWNlcyhFTlYoKS0+UXVlcnlQcm9wKFBfU1BFQ0lBTF9FWElUUykpOworICAgIGlmIChzaXplb2YoZXgpKQorICAgIHsKKyAgICAgIGNvbW1hbmQoZXhbcmFuZG9tKHNpemVvZihleCkpXSk7IC8qIElyZ2VuZHdvaGluIGdlaGVuICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBIbmdsLiBHYXIga2VpbmUgQXVzZ2FlbmdlLiBOYWNoIEhhdXNlLi4uCisgICAgICBtb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSyk7CisgICAgICBtZWV0X2xhc3RfcGxheWVyPS0xOworICAgIH0KKyAgfQorCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy93YWxrX21hc3Rlci5jIGIvcC9zZXJ2aWNlL3BhZHJlaWMvbW5wYy93YWxrX21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDAzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL3dhbGtfbWFzdGVyLmMKQEAgLTAsMCArMSwxODYgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworLyogMTIgSnVsaSAxOTk4LCBQYWRyZWljCisgKgorICogRGllc2VyIE1hc3RlciBkaWVudCB6dW0gZWluc3BhcmVuIHZvbiBjYWxsX291dCBLZXR0ZW4gYmVpIExhdWZucGNzLgorICogQW5tZWxkZW4gYmVpIGRpZXNlbSBNYXN0ZXIgZ2VzY2hpZWh0IHVlYmVyIGRpZSBGdW5rdGlvbiBSZWdpc3RlcldhbGtlcigpLgorICogdmFyYXJncyB2b2lkIFJlZ2lzdGVyV2Fsa2VyKGludCB0aW1lLCBpbnQgcmFuZG9tLCBjbG9zdXJlIHdhbGtfY2xvc3VyZSkKKyAqICAgdGltZSAtIGluIHdlbGNoZW4gQWJzdGFlbmRlbiBzb2xsIGRhcyBPYmpla3QgYmV3ZWd0IHdlcmRlbgorICogICByYW5kIC0gZGllc2VyIFdlcnQgd2lyZCBhbHMgcmFuZG9tIGltbWVyIGJlaW0gYmV3ZWdlbiB6dSB0aW1lIGFkZGllcnQKKyAqICAgd2Fsa19jbG9zdXJlIC0gZGllIENsb3N1cmUgZGllIGltbWVyIGF1ZmdlcnVmZW4gd2VyZGVuIG11c3MsIHdlbm4gZGllc2VyCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciB3ZWdnZWxhc3NlbiB3aXJkLCB3aXJkIHN0YXRkZXNzZW4gZGllIEZ1bmt0aW9uCisgKiAgICAgICAgICAgICAgICAgIFdhbGsoKSBpbSBOUEMgYXVmZ2VydWZlbi4KKyAqCisgKiBBYmdlbWVsZGV0IHdpcmQgZGVyIE5QQyBzb2JhbGQgZGllIENsb3N1cmUgYnp3LiBkaWUgV2Fsay1GdW5rdGlvbiAwCisgKiByZXR1cm5lZC4gQmVpIGFsbGVuIFdlcnRlbiAhPTAgYmxlaWJ0IGRlciBOUEMgYWt0aXYuCisgKgorICogSGlud2VpczogRGVyIE5QQyBtdXNzIHNpY2ggbWluZC4gYWxsZSAxODAgc2VrLiBiZXdlZ2VuICh0aW1lK3JhbmRvbSksCisgKiAgICAgICAgICBhbnNvbnN0ZW4ga2FubiBkaWVzZXIgTWFzdGVyIG5pY2h0IHZlcndlbmRldCB3ZXJkZW4uCisgKi8KKworI2RlZmluZSBNQVhfREVMQVlUSU1FICAgICAgIDkwICAgLyogbWF4LiBkZWxheSBpc3QgMipNQVhfREVMQVlUSU1FICovCisjZGVmaW5lIERFRkFVTFRfV0FMS19ERUxBWSAxODAgICAvKiBpc3QgZGVyIGJpbGxpZ3N0ZSBXZXJ0IDopICovCisjZGVmaW5lIE1BWF9KT0JfQ09TVCAgICAyMDAwMDAgICAvKiBXaWV2aWVsIFplaXQgZGFyZiBlaW4gTlBDIG1heC4gbnV0emVuICovCisKKy8vIEZ1bmt0aW9uZW4genVtIHZlcmVpbmZhY2h0ZW4gWnVncmlmZiBhdWYgZGllIEtvbXByaW1pZXJ0ZW4gRGF0ZW4KKy8vIGltIFdhbGtlcmFycmF5CisjZGVmaW5lIFRJTUUodCkgICAgICAgICh0ICYgMHgwMGZmKSAgICAgICAgICAgICAgICAgICAvKiA4IEJpdCA9IDI1NiAqLworI2RlZmluZSBSQU5ET00ocikgICAgICgociAmIDB4ZmYwMCkgPj4gOCkgICAgICAgICAgICAgLyogOCBCaXQgPSAyNTYgKi8KKyNkZWZpbmUgV0VSVCh0LCByKSAgICAoKHQgJiAweDAwZmYpKygociA8PCA4KSAmIDB4ZmYwMCkpICAgLyogMTYgQml0ICovCisKK3N0YXRpYyBpbnQgY291bnRlcjsgICAgLy8genVyIE9yaWVudGllcnVuZyBpbSB3YWxrZXItYXJyYXkKK3N0YXRpYyBpbnQgbnVtX3dhbGtlcjsgLy8gYW56YWhsIGRlciB3YWxrZXIgaW0gYXJyYXkKKy8vc3RhdGljIG1peGVkICp3YWxrZXI7ICAvLyAoeyAuLi4sICh7IC4uLiwgKHsgd2VydCwgY2xvc3VyZSB9KSwgLi4ufSksIC4uLn0pCitub3NhdmUgPCA8IDxpbnR8Y2xvc3VyZT4qID4qID4qIHdhbGtlcjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKGNsb25lcCh0aGlzX29iamVjdCgpKSkgeworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKCJ3YWxrX21hc3RlciBjYW4ndCBiZSBjbG9uZW5kLlxuIik7CisgIH0KKyAgd2Fsa2VyPSh7fSk7CisgIG51bV93YWxrZXI9MDsKKyAgZW5hYmxlX2NvbW1hbmRzKCk7IC8vIG9obmUgZGFzLCBrZWluIGhlYXJ0X2JlYXQoKQorfQorCisjZGVmaW5lIEVSUk9SKHgpIHJhaXNlX2Vycm9yKHNwcmludGYoeCwgcHJldmlvdXNfb2JqZWN0KCkpKTsKKworLy8gTWFuIG11c3Mgc2VsYnN0IGRhcmF1ZiBhdWZwYXNzZW4sIGRhcyBzaWNoIGVpbiBOUEMgaW1tZXIgbnVyIGVpbm1hbAorLy8gYW5tZWxkZXQsIGRhIHNvbnN0IGF1Y2ggbWVocmVyZSBQYXJhbGVsbGUgV2Fsay1LZXR0ZW4gbGF1ZmVuISEhCisvLyBBbSBiZXN0ZW4gbmllIGRpcmVrdCBzb25kZXJuIG51ciB1ZWJlciBlaW5lbiBTdGFuZGFyZG5wYyBiZW51dHplbi4KK3ZhcmFyZ3Mgdm9pZCBSZWdpc3RlcldhbGtlcihpbnQgdGltZSwgaW50IHJhbmQsIGNsb3N1cmUgd2Fsa19jbG9zdXJlKQoreworICBpbnQgd2VydCwgbmV4dDsKKyAgY2xvc3VyZSBmdW5jOworICAKKyAgLy8gcHJ1ZWZlbiBvYiBkaWUgUGFyYW10ZXIgenVsYWVzc2lnIHNpbmQuLi4KKyAgaWYgKHRpbWU8MCkgRVJST1IoIm5lZ2F0aXZlIHRpbWUgdG8gUmVnaXN0ZXJXYWxrZXIoKSBmcm9tICVPLlxuIik7CisgIGlmIChyYW5kPDApIEVSUk9SKCJuZWdhdGl2ZSByYW5kb20gdG8gUmVnaXN0ZXJXYWxrZXIoKSBmcm9tICVPLlxuIik7CisgIGlmICgodGltZStyYW5kKSA+ICgyKk1BWF9ERUxBWVRJTUUpKSAKKyAgICBFUlJPUigiVG9vIGxvbmcgZGVsYXl0aW1lIGZyb20gJXMgdG8gUmVnaXN0ZXJXYWxrZXIoKS5cbiIpOworCisgIHdlcnQ9V0VSVCh0aW1lLCByYW5kKTsKKyAgaWYgKCF3ZXJ0ICYmICFyYW5kKSB3ZXJ0PURFRkFVTFRfV0FMS19ERUxBWTsKKyAgaWYgKHdhbGtfY2xvc3VyZSkKKyAgICBmdW5jPXdhbGtfY2xvc3VyZTsKKyAgZWxzZSB7CisgICAgZnVuYz1zeW1ib2xfZnVuY3Rpb24oIldhbGsiLCBwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKCFmdW5jKQorICAgICAgcmFpc2VfZXJyb3IoIlJlZ2lzdGVyV2Fsa2VyKCkgY2FsbCBmcm9tIE9iamVjdCB3aXRob3V0IFdhbGsoKSBmdW5jdGlvbi5cbiIpOworICB9CisgIGlmICghbnVtX3dhbGtlcikgeworICAgIHNldF9oZWFydF9iZWF0KDEpOworICAgIGlmICghcG9pbnRlcnAod2Fsa2VyKSB8fCAhc2l6ZW9mKHdhbGtlcikpCisgICAgICB3YWxrZXI9bWFwKGFsbG9jYXRlKE1BWF9ERUxBWVRJTUUrMSksICMnYWxsb2NhdGUpOworICB9CisgIG5leHQ9Y291bnRlcjsKKyAgbmV4dCs9KHRpbWUrcmFuZG9tKHJhbmQpKS8yOworICBpZiAobmV4dD5NQVhfREVMQVlUSU1FKSBuZXh0LT1NQVhfREVMQVlUSU1FOworICB3YWxrZXJbbmV4dF0rPSh7ICh7IHdlcnQsIGZ1bmMgfSkgfSk7CisgIG51bV93YWxrZXIrKzsKK30KKworaW50IGR1bW15X3dhbGsoKSAgLy8gbGllZmVydCBpbW1lciAwIGZ1ZXIgYWJicmVjaGVuLi4uCit7ICAgcmV0dXJuIDA7ICB9CisKKy8vIEF1ZnJ1ZiBuYWNoIE1vZWdsaWNoa2VpdCBiaXR0ZSB2ZXJtZWlkZW4sIGRhIHJlY2h0IGF1ZndlbmRpZy4gTWVpc3QgaXN0CisvLyBlcyBsZWljaHQgaW0gTlBDICJzYXViZXIgQnVjaCB6dSBmdWVocmVuIiB1bmQgZGFubiBnZ2YuIGF1cyBXYWxrKCkgCisvLyAwIHp1IHJldHVybmVuLgordm9pZCBSZW1vdmVXYWxrZXIoKQoreworICBpbnQgaSwgajsKKyAgaWYgKCFudW1fd2Fsa2VyKSByZXR1cm47CisgIGZvciAoaT1NQVhfREVMQVlUSU1FOyBpPj0wOyBpLS0pIHsKKyAgICBmb3IgKGo9c2l6ZW9mKHdhbGtlcltpXSktMTsgaj49MDsgai0tKQorICAgIHsKKyAgICAgIGlmIChnZXRfdHlwZV9pbmZvKHdhbGtlcltpXVtqXVsxXSwgMik9PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgeworICAgICAgICBpZiAoaT09Y291bnRlcikgLy8ga29lbm50ZSBnZXJhZGUgaW0gaGVhcnRfYmVhdCBzdGVja2VuLi4uCisgICAgICAgICAgd2Fsa2VyW2ldW2pdPSh7IDAsICMnZHVtbXlfd2FsayB9KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdhbGtlcltpXVtqXT0wOworICAgICAgICBudW1fd2Fsa2VyLS07CisgICAgICB9CisgICAgfQorICAgIGlmIChpIT1jb3VudGVyKSAvLyBrb2VubnRlIGdlcmFkZSBpbSBoZWFydF9iZWF0IHN0ZWNrZW4uLi4KKyAgICAgIHdhbGtlcltpXS09KHsgMCB9KTsKKyAgfQorfQorCisvLyBBdWZydWYgbmFjaCBNb2VnbGljaGtlaXQgYml0dGUgdmVybWVpZGVuLCBkYSByZWNodCBhdWZ3ZW5kaWcuIE1laXN0IGlzdAorLy8gZXMgbGVpY2h0ZXIgaW0gTlBDICJzYXViZXIgQnVjaCB6dSBmdWVocmVuIiB1bmQgc2ljaCB6dSBtZXJrZW4sIG9iIGVyCisvLyBiZXJlaXRzIGFuZ2VtZWxkZXQgaXN0LiBMaWVmZXJ0IHp1cnVlY2ssIHdpZSBvZnQgZWluIE5QQyBhbHMgV2Fsa2VyCisvLyBhbmdlbWVsZGV0IGlzdCAobm9ybWFsZmFsbCBuaWUgbWVociBhbHMgMSkuCitpbnQgUmVnaXN0cmF0aW9uKCkKK3sKKyAgaW50IGksIGosIHJlZzsKKyAgaWYgKCFudW1fd2Fsa2VyKSByZXR1cm4gMDsKKyAgcmVnPTA7CisgIGZvciAoaT1NQVhfREVMQVlUSU1FOyBpPj0wOyBpLS0pCisgIHsKKyAgICBmb3IgKGo9c2l6ZW9mKHdhbGtlcltpXSktMTsgaj49MDsgai0tKQorICAgICAgaWYgKGdldF90eXBlX2luZm8od2Fsa2VyW2ldW2pdWzFdLCAyKT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgIHJlZysrOworICB9CisgIHJldHVybiByZWc7Cit9CisKK3ZvaWQgaGVhcnRfYmVhdCgpCit7CisgICBpbnQgaTsKKyAgIGlmIChudW1fd2Fsa2VyICYmIGk9c2l6ZW9mKHdhbGtlcltjb3VudGVyXSkpIHsKKyAgICAgaW50IHRtcDsKKyAgICAgbnVtX3dhbGtlci09aTsKKyAgICAgZm9yIChpLS07aT49MDtpLS0pIHsKKyAgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgTUFYX0pPQl9DT1NUKSB7CisgICAgICAgICAvLyBuaWNodCBhYmdlZmVydGlndGUgTlBDcyBpbSBuYWVjaHN0ZW4gaGVhcnRfYmVhdCBhdXNmdWVocmVuCisgICAgICAgICB3YWxrZXJbY291bnRlcl09d2Fsa2VyW2NvdW50ZXJdWzAuLmldOworICAgICAgICAgbnVtX3dhbGtlcis9aSsxOworICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgIGlmICh3YWxrZXJbY291bnRlcl1baV1bMV0gJiYKKyAgICAgICAgICAgICAhY2F0Y2godG1wPShpbnQpZnVuY2FsbCh3YWxrZXJbY291bnRlcl1baV1bMV0pKSAmJiB0bXApIHsKKyAgICAgICAgICAgdG1wPWNvdW50ZXIrKFRJTUUod2Fsa2VyW2NvdW50ZXJdW2ldWzBdKQorICAgICAgICAgICAgICArcmFuZG9tKFJBTkRPTSh3YWxrZXJbY291bnRlcl1baV1bMF0pKSkvMjsKKyAgICAgICAgICAgaWYgKHRtcD5NQVhfREVMQVlUSU1FKSB0bXAtPU1BWF9ERUxBWVRJTUU7CisgICAgICAgICAgIHdhbGtlclt0bXBdKz0oeyB3YWxrZXJbY291bnRlcl1baV0gfSk7CisgICAgICAgICAgIG51bV93YWxrZXIrKzsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgICAgd2Fsa2VyW2NvdW50ZXJdPSh7fSk7IC8vIGtvbXBsZXR0IGxlZXJlbgorICAgfQorICAgaWYgKGNvdW50ZXIgPT0gTUFYX0RFTEFZVElNRSkKKyAgICAgY291bnRlcj0wOworICAgZWxzZSBjb3VudGVyKys7CisgICBpZiAoIW51bV93YWxrZXIpIHsKKyAgICAgc2V0X2hlYXJ0X2JlYXQoMCk7CisgICAgIHdhbGtlcj0oe30pOyAvLyBTcGVpY2hlciBmcmVpZ2ViZW4uLi4KKyAgIH0KK30KKwordm9pZCByZXNldCgpCisvLyBrb3N0ZXQgbWF4aW1hbCBlaW5lbiB1bm5vZXRpZ2VuIGhlYXJ0X2JlYXQoKSBwcm8gcmVzZXQgLT4gdmVydHJldGJhcgorLy8gZGllbnQgenUgZWluZW0gd2llZGVyIGFud2VyZmVuIGltIEZhbGxlIGVpbmVzIEZlaGxlcnMgaW0gaGVhcnRfYmVhdCgpCit7CisgIGlmIChzZXRfaGVhcnRfYmVhdCgwKTw9MCkgeworICAgIGludCBpOworICAgIG51bV93YWxrZXI9MDsgLy8gbmV1IGJlcmVjaG5lbi4uLgorICAgIGlmICghc2l6ZW9mKHdhbGtlcikpIHJldHVybjsKKyAgICBmb3IgKGk9TUFYX0RFTEFZVElNRTsgaT49MDsgaS0tKQorICAgICAgbnVtX3dhbGtlcis9c2l6ZW9mKHdhbGtlcltpXSk7CisgICAgaWYgKG51bV93YWxrZXI+MCkgeworICAgICAgIHdyaXRlX2ZpbGUob2JqZWN0X25hbWUoKSsiLmVyciIsIHNwcmludGYoCisgICAgICAgICAiJXM6IEZlaGxlciBpbSBoZWFydF9iZWF0KCkuICVkIGFrdGl2ZSBQcm96ZXNzZS5cbiIsCisgICAgICAgICAgZHRpbWUodGltZSgpKSwgbnVtX3dhbGtlcikpOworICAgICAgIGVuYWJsZV9jb21tYW5kcygpOworICAgICAgIHNldF9oZWFydF9iZWF0KDEpOworICAgIH0KKyAgfQorICBlbHNlIHNldF9oZWFydF9iZWF0KDEpOworfQorCittaXhlZCAqV2Fsa2VyTGlzdCgpIC8vIG51ciBmdWVyIERlYnVnendlY2tlCit7ICByZXR1cm4gKHsgbnVtX3dhbGtlciwgd2Fsa2VyLCBjb3VudGVyIH0pOyAgfQo=