ZGlmZiAtLWdpdCBhL21haWwvbmVkaXQuYyBiL21haWwvbmVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMyYmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbC9uZWRpdC5jCkBAIC0wLDAgKzEsNTQ1IEBACisjcHJhZ21hIHN0cmljdF90eXBlcworCisvKiBuZWRpdC5jCisgICBFZGl0b3IgZnVlciBuZXdzLCBtYWlsIHVzdy4KKyAgIFZlcnNpb24gMSAoQykgMTk5MyBMb2NvCisgICBWZXJzaW9uIDIgKEMpIDE5OTUgV2FyZ29uCisKKyAgIFZlcndlbmR1bmcgYXVzc2VyaGFsYiB2b24gTW9yZ2VuZ3JhdWVuIGlzdCBnZXN0YXR0ZXQgdW50ZXIgZm9sZ2VuZGVuCisgICBCZWRpbmd1bmdlbjoKKyAgIC0gQmVudXR6dW5nIGVyZm9sZ3QgYXVmIGVpZ2VuZSBHZWZhaHIuIEplZ2xpY2hlIFZlcmFudHdvcnR1bmcgd2lyZAorICAgICBhYmdlbGVobnQuCisgICAtIEF1Y2ggaW4gdmVyYWVuZGVydGVuIG9kZXIgYWJnZWxlaXRldGVuIE9iamVrdGVuIG11c3MgZWluIEhpbndlaXMgYXVmCisgICAgIGRpZSBIZXJrdW5mdCBlcmhhbHRlbiBibGVpYmVuLgorICAgRWluIFVwZGF0ZS1TZXJ2aWNlIGJlc3RlaHQgbmljaHQuCisKKyAgIEFud2VuZHVuZzoKKyAgICAjaW5oZXJpdCAiL21haWwvbmVkaXQiOyAgICAgICh6dXNhZXR6bGljaCB6dSBhbmRlcmVuIGluaGVyaXRzKQorCisgICAgIG5lZGl0KHN0cmluZyBmdW5jbmFtZSk7ICAgICAgICAgICAgICAgICAgICBvZGVyCisgICAgbmVkaXQoc3RyaW5nIGZ1bmNuYW1lLHN0cmluZyBwcmV0ZXh0KTsKKyAgICBOYWNoIEJlZW5kaWd1bmcgZGVzIEVkaXRvcnMgd2lyZCBkaWUgRnVua3Rpb24gZnVuY25hbWUgYXVmZ2VydWZlbi4KKyAgICBTaWUgYmVrb21tdCBhbHMgQXJndW1lbnQgZWluZW4gc3RyaW5nIG1pdCBkZW0gZmVydGlnZW4gZWRpdGllcnRlbiBUZXh0CisgICAgdWViZXJnZWJlbiBiencuIDAsIHdlbm4gZGVyIEVkaXRvciBtaXQgfnEgYWJnZWJyb2NoZW4gd3VyZGUuCisgICAgT3B0aW9uYWxlcyBBcmd1bWVudCBwcmV0ZXh0IGlzdCBkZXIgenUgZWRpdGllcmVuZGUgVGV4dC4gV2VubiAwIG9kZXIgbmljaHQKKyAgICB1ZWJlcmdlYmVuLCB3aXJkIGVpbiBuZXVlciBUZXh0IGJlZ29ubmVuLgorKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI2RlZmluZSBUUCB0aGlzX3BsYXllcigpCisKKyNkZWZpbmUgRl9PVlIgMSAgLy8gT3ZlcndyaXRlLU1vZHVzCisjZGVmaW5lIEZfQkxLIDIgIC8vIEJsb2Nrc2F0egorCisjZGVmaW5lIE1BWF9MSU5FUyAxMDAwCisKK3N0YXRpYyBtaXhlZCBuZWRpdHRleHQsIG5leGl0ZnVuYywgZWRpdG9yX3VzZWQ7CitzdGF0aWMgaW50IGJzdGFydCwgYmVuZDsgIC8vIEFuZmFuZyB1bmQgRW5kZSBkZXMgQmxvY2tzCitzdGF0aWMgaW50IGN1cjsgICAgICAgICAgIC8vIEFrdHVlbGxlIFplaWxlCitzdGF0aWMgaW50IGxlbjsgICAgICAgICAgIC8vIExhZW5nZSBkZXMgR2VzYW10dGV4dGVzCitzdGF0aWMgaW50IGZsYWdzOyAgICAgICAgICAvLyBPdmVyd3JpdGVtb2R1cworCitzdGF0aWMgaW50IGdldF9lZGl0X2xpbmUoc3RyaW5nIHN0cik7CitzdGF0aWMgaW50IFNob3dXcml0dGVuKGludCBmLCBpbnQgbCwgaW50IG51bSk7CitzdGF0aWMgc3RyaW5nIGtpbGxjdHJsKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IFNob3dIZWxwKCk7CitzdGF0aWMgaW50IGRlbExpbmUoaW50IGwpOworc3RhdGljIHZvaWQgZGVsQmxvY2soKTsKK3N0YXRpYyBpbnQgaW5wdXRfZnVuYygpOwordmFyYXJncyBzdGF0aWMgdm9pZCBtb3ZlQmxvY2soaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVhbCk7CisKK3ZvaWQgaW5pdF9yZXNjdWUoKSB7CisgIGFkZF9hY3Rpb24oIlJlc2N1ZVRleHQiLCJ+ciIpOworfQorCitwcml2YXRlIHN0cmluZyBuZWRpdF9wcm9tcHQoKQoreworICBpZiAoc2l6ZW9mKG5lZGl0dGV4dCkgPD0gTUFYX0xJTkVTKQorICAgIHJldHVybigiXSIpOworICBlbHNlIHsKKyAgICBuZWRpdHRleHQgPSBuZWRpdHRleHRbMC4uTUFYX0xJTkVTLTFdOworICAgIGxlbiA9IE1BWF9MSU5FUzsKKyAgICBpZiAoY3VyID49IE1BWF9MSU5FUykKKyAgICAgIGN1ciA9IE1BWF9MSU5FUy0xOworICAgIGlmIChic3RhcnQgPj0gTUFYX0xJTkVTKQorICAgICAgYnN0YXJ0ID0gTUFYX0xJTkVTLTE7CisgICAgaWYgKGJlbmQgPj0gTUFYX0xJTkVTKQorICAgICAgYmVuZCA9IE1BWF9MSU5FUy0xOworICAgIHJldHVybiBzcHJpbnRmKCIqKiogTWVociBhbHMgJWQgWmVpbGVuISBUZXh0IHd1cmRlIGFiZ2VzY2huaXR0ZW4hICoqKlxuXSIsIE1BWF9MSU5FUyk7CisgIH0KK30KKworc3RhdGljIHZhcmFyZ3MgaW50IG5lZGl0KHN0cmluZyBleGl0ZnVuYyxzdHJpbmcgcHJldGV4dCkgeworICBpZiAoZWRpdG9yX3VzZWQpIHsKKyAgICB3cml0ZSgiT2ZmZW5zaWNodGxpY2ggc2NocmVpYnQgaGllciBzY2hvbiBqZW1hbmQgZHJhbi4gU29ycnkuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgIihGYWxscyBkdSBlcyBzZWxic3QgYmlzdCwgdGlwcGUgfnIgenVyIFdpZWRlcmF1Zm5haG1lIGVpbmVyIHZlcmxvcmVuZW4gU2l0enVuZylcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIXByZXRleHQpIG5lZGl0dGV4dD0oeyIifSk7CisgIGVsc2UgbmVkaXR0ZXh0PWV4cGxvZGUocHJldGV4dCwiXG4iKTsKKyAgYnN0YXJ0ID0gMDsKKyAgYmVuZCA9IGN1ciA9IGxlbiA9IHNpemVvZihuZWRpdHRleHQpLTE7CisgIG5leGl0ZnVuYz1leGl0ZnVuYzsKKyAgZmxhZ3MgPSAwOworICBlZGl0b3JfdXNlZD0oc3RyaW5nKVRQLT5xdWVyeV9yZWFsX25hbWUoKTsKKyAgaWYgKHByZXRleHQpCisgICAgZ2V0X2VkaXRfbGluZSgifnoiKTsKKyAgZWxzZSB7CisgICAgLy9uZWRpdF9wcm9tcHQoKTsKKyAgICBpbnB1dF90bygiZ2V0X2VkaXRfbGluZSIsIElOUFVUX1BST01QVCwgbmVkaXRfcHJvbXB0KCkpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9lZGl0X2xpbmUoc3RyaW5nIHN0cikgeworICBpbnQgZXJyOworICBpbnQgc3BhY2VzOworICBpbnQgZmZsYWc7CisgIGludCBzbDsKKworICBpZiAoIXN0cikgc3RyPSIiOworICBzdHI9a2lsbGN0cmwoc3RyKTsgLyoga2xlaW5lciBoYWNrIHdlZ2VuIENUUkwtY2hhcnMuICovCisgIGZmbGFnID0gMDsKKworICBzbCA9IHNpemVvZihzdHIpOworCisgIGlmIChzdHI9PSIqKiIgfHwgc3RyPT0ifi4iIHx8IHN0cj09Ii4iKSB7CisgICAgZWRpdG9yX3VzZWQ9MDsKKyAgICBzdHIgPSBpbXBsb2RlKG5lZGl0dGV4dCwgIlxuIik7CisgICAgbmVkaXR0ZXh0ID0gMDsKKyAgICBjYWxsX290aGVyKHRoaXNfb2JqZWN0KCksbmV4aXRmdW5jLHN0cik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0clswLi4wXT09ICJ+IiAmJiBzbCA+PSAyKSB7CisgICAgaWYgKHNsID09IDIpIHsKKyAgICAgIHN3aXRjaChzdHJbMC4uMV0pIHsKKyAgICAgIC8vIEFiYnJ1Y2g6CisgICAgICBjYXNlICJ+cSI6CisgICAgICAgIGVkaXRvcl91c2VkID0gMDsKKyAgICAgICAgcmV0dXJuIGNhbGxfb3RoZXIodGhpc19vYmplY3QoKSwgbmV4aXRmdW5jLCAwKTsKKyAgICAgIC8vIFRlbXBvcmFlciByYXVzZ2VoZW46CisgICAgICBjYXNlICJ+ISI6CisgICAgICAgIHdyaXRlKCJNaXQgfnIga2FubnN0IER1IHdlaXRlcnNjaHJlaWJlbi5cbiIpOworICAgICAgICBpbml0X3Jlc2N1ZSgpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIC8vIEdlc2FtdGVuIFRleHQgYW56ZWlnZW4KKyAgICAgIGNhc2UgIn5SIjoKKyAgICAgICAgZmZsYWcgPSAxOworICAgICAgY2FzZSAifnIiOgorICAgICAgICByZXR1cm4gU2hvd1dyaXR0ZW4oMCwgbGVuLCBmZmxhZyk7CisgICAgICAvLyBBdXNzY2huaXR0IHVtIEN1cnNvciBhbnplaWdlbgorICAgICAgY2FzZSAifloiOgorICAgICAgICBmZmxhZyA9IDE7CisgICAgICBjYXNlICJ+eiI6CisgICAgICAgIGludCBmID0gKGN1ciA+IDUpID8gY3VyLTUgOiAwOworICAgICAgICBpbnQgbCA9IChjdXIgPCBsZW4tNSkgPyBjdXIgKyA1IDogbGVuOworICAgICAgICByZXR1cm4gU2hvd1dyaXR0ZW4oZiwgbCwgZmZsYWcpOworICAgICAgLy8gSGlsZmVzZWl0ZSBhbnplaWdlbjoKKyAgICAgIGNhc2UgIn5oIjoKKyAgICAgICAgcmV0dXJuIFNob3dIZWxwKCk7CisgICAgICAvLyBaZWlsZSB1ZWJlciBDdXJzb3IgbG9lc2NoZW46CisgICAgICBjYXNlICJ+ZCI6CisgICAgICAgIHJldHVybiBkZWxMaW5lKGN1ci0xKTsKKyAgICAgIC8vIEJsb2NrIGxvZXNjaGVuOgorICAgICAgY2FzZSAifkQiOgorICAgICAgICBkZWxCbG9jaygpOworICAgICAgICB3cml0ZSggIkJsb2NrIGdlbG9lc2NodC5cbiIgKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X2Z1bmMoKTsKKyAgICAgIC8vIE92ZXJ3cml0ZS1Nb2R1cyB0b2dnZWxuOgorICAgICAgY2FzZSAifnYiOgorICAgICAgICBmbGFncyBePSBGX09WUjsKKyAgICAgICAgcHJpbnRmKCIlc21vZHVzIGVpbmdlc2NoYWx0ZXQuXG4iLAorICAgICAgICAgICAgICAoZmxhZ3MgJiBGX09WUikgPyAiVWViZXJzY2hyZWliIiA6ICJFaW5mdWVnZSIpOworICAgICAgICByZXR1cm4gaW5wdXRfZnVuYygpOworICAgICAgLy8gQmxvY2tzYXR6IHRvZ2dlbG46CisgICAgICBjYXNlICJ+YiI6CisgICAgICAgIGZsYWdzIF49IEZfQkxLOworICAgICAgICBwcmludGYoIiVzc2F0eiBha3RpdmllcnQuXG4iLAorICAgICAgICAgICAgICAoZmxhZ3MgJiBGX0JMSykgPyAiQmxvY2siIDogIkZsYXR0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X2Z1bmMoKTsKKyAgICAgIC8vIFN0YXR1c2luZm8gYW56ZWlnZW46CisgICAgICBjYXNlICJ+cyI6CisgICAgICAgIHByaW50ZigiWmVpbGU6ICVkIHwgTGFlbmdlOiAlZCB8IEJTdGFydDogJWQgfCBCRW5kZTogJWQgfCAiCisgICAgICAgICAgICAgICAiTW9kdXM6ICVzLyVzLlxuIiwKKyAgICAgICAgICAgICAgICBjdXIsIGxlbiwgYnN0YXJ0LCBiZW5kLCAoZmxhZ3MmRl9PVlIpPyJVZWJlci4iOiJFaW5mZy4iLAorICAgICAgICAgICAgICAgIChmbGFncyZGX0JMSyk/IkJsb2Nrc2F0eiI6IkZsYXR0ZXJzYXR6Iik7CisgICAgICAgIHJldHVybiBpbnB1dF9mdW5jKCk7CisgICAgICAvLyBCbG9jayB2ZXJzY2hpZWJlbjoKKyAgICAgIGNhc2UgIn5tIjoKKyAgICAgICAgbW92ZUJsb2NrKGJzdGFydCwgYmVuZCwgMSk7CisgICAgICAgIHJldHVybiBpbnB1dF9mdW5jKCk7CisgICAgICAvLyBCbG9jayB1bWZvcm1hdGllcmVuOgorICAgICAgY2FzZSAifkYiOgorICAgICAgICBpbnQgYnMgPSBic3RhcnQ7CisgICAgICAgIHN0ciA9IGltcGxvZGUobmVkaXR0ZXh0W2JzdGFydC4uYmVuZF0sICIgIik7CisgICAgICAgIGRlbEJsb2NrKCk7CisgICAgICAgIGJzdGFydCA9IGJlbmQgPSBjdXIgPSBiczsKKyAgICAgICAgZmZsYWcgPSAtMTsKKyAgICAgICAgd3JpdGUoIkJsb2NrIHd1cmRlIHVtZm9ybWF0aWVydC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIC8vIFplaWxlIHVtZm9ybWF0aWVyZW46CisgICAgICBjYXNlICJ+ZiI6CisgICAgICAgIHN0ciA9IG5lZGl0dGV4dFtjdXJdOworICAgICAgICBuZWRpdHRleHQgPSBuZWRpdHRleHRbMC4uY3VyLTFdICsgbmVkaXR0ZXh0W2N1cisxLi5dOworICAgICAgICBpZiAoY3VyIDw9IGJzdGFydCkKKyAgICAgICAgICBic3RhcnQtLTsKKyAgICAgICAgaWYgKGN1ciA8PSBiZW5kKQorICAgICAgICAgIGJlbmQtLTsKKyAgICAgICAgbGVuIC0tOworICAgICAgICBmZmxhZyA9IC0xOworICAgICAgICB3cml0ZSgiWmVpbGUgd3VyZGUgdW1mb3JtYXRpZXJ0LlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgfSAvLyBzd2l0Y2gKKyAgICB9IC8vIGlmIChzbCA9PSAyKQorICAgIGVsc2UgeworICAgICAgLy8gQ3Vyc29yYmV3ZWd1bmdlbiBhbiBiZXN0aW1tdGUgU3RlbGxlbjoKKyAgICAgIGlmIChzdHJbMC4uMV0gPT0gIn5jIiAmJiBzbCA9PSAzKSB7CisgICAgICAgIGZmbGFnID0gMTsKKyAgICAgICAgc3dpdGNoKHN0clsyXSkgeworICAgICAgICAgIGNhc2UgJ3UnOiBzcGFjZXMgPSAtMTsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2QnOiBzcGFjZXMgPSAxOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3QnOiBzcGFjZXMgPSAtbGVuOyAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2InOiBzcGFjZXMgPSBsZW47ICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3MnOiBzcGFjZXMgPSBic3RhcnQgLSBjdXI7IGJyZWFrOworICAgICAgICAgIGNhc2UgJ2UnOiBzcGFjZXMgPSBiZW5kIC0gY3VyOyAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6ICBzcGFjZXMgPSAwOworICAgICAgICAgICAgICAgICAgICBmZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBDdXJzb3JiZXdlZ3VuZyBtaXQgWmVpbGVubnVtbWVybjoKKyAgICAgIGlmIChzcGFjZXMgfHwgc3NjYW5mKHN0ciwgIn5jJWQiLCBzcGFjZXMpID09IDEpIHsKKyAgICAgICAgaWYgKGZmbGFnPjAgfHwgc3RyWzIuLjJdID09ICIrIiB8fCBzdHJbMi4uMl0gPT0gIi0iKQorICAgICAgICAgIGN1ciArPSBzcGFjZXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjdXIgPSBzcGFjZXMtMTsKKworICAgICAgICBpZiAoY3VyIDwgMCkKKyAgICAgICAgICBjdXIgPSAwOworICAgICAgICBlbHNlIGlmIChjdXIgPiBsZW4pCisgICAgICAgICAgY3VyID0gbGVuOworCisgICAgICAgIHByaW50ZigiJXNcbiIsbmVkaXR0ZXh0W2N1cl0pOworICAgICAgICByZXR1cm4gaW5wdXRfZnVuYygpOworICAgICAgfQorICAgICAgLy8gQmxvY2tncmVuemVuIHNldHplbjoKKyAgICAgIGlmICgoZXJyID0gKHN0clswLi4yXSA9PSAifmJzIikpIHx8IChzdHJbMC4uMl09PSJ+YmUiKSkgeworICAgICAgICBzdHJpbmcgb3V0LCBwOworICAgICAgICBpbnQgcG9zOworCisgICAgICAgIGludCB2YWxpZCA9IC0xOworCisgICAgICAgIGlmIChzbCA9PSAzKQorICAgICAgICAgIHBvcyA9IHZhbGlkID0gY3VyOworICAgICAgICBlbHNlIGlmIChzc2NhbmYoc3RyWzMuLl0sICIlZCVzIiwgcG9zLCBwKSA9PSAyICYmIHA9PSIiKQorICAgICAgICAgIHZhbGlkID0gcG9zLS07CisKKyAgICAgICAgaWYgKHZhbGlkID49IDApIHsKKyAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBic3RhcnQgPSBwb3M7CisgICAgICAgICAgICBpZiAocG9zID4gYmVuZCkKKyAgICAgICAgICAgICAgYmVuZCA9IGxlbjsKKyAgICAgICAgICAgIG91dCA9ICJCbG9ja2FuZmFuZyI7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHBvcyA8IGJzdGFydCkKKyAgICAgICAgICAgICAgYnN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGJlbmQgPSBwb3M7CisgICAgICAgICAgICBpZiAobGVuICYmIGJlbmQgPT0gbGVuKQorICAgICAgICAgICAgICBiZW5kLS07CisgICAgICAgICAgICBvdXQgPSAiQmxvY2tlbmRlIjsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCIlcyBnZXNldHp0LlxuIiwgb3V0KTsKKyAgICAgICAgICByZXR1cm4gaW5wdXRfZnVuYygpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEVyc2V0emVuOgorICAgICAgaWYgKChzaXplb2Yoc3RyKSA+PSA4KSAmJiBzdHJbMC4uMV0gPT0gIn5zIikgeworICAgICAgICBzdHJpbmcgKnMxLCAqczI7CisgICAgICAgIGludCBtOworCisgICAgICAgIG0gPSAoc3RyWzJdID09ICcgJykgPyAzIDogMjsKKworICAgICAgICBpZiAoc2l6ZW9mKHMxID0gZXhwbG9kZShzdHJbbS4uXSwgc3RyW20uLm1dKSkgPT0gNCkgeworICAgICAgICAgIHMyID0gZXhwbG9kZShuZWRpdHRleHRbY3VyXSwgczFbMV0pOworICAgICAgICAgIGlmIChzaXplb2YoczIpID4gMSkgeworICAgICAgICAgICAgczJbMV0gPSBzMlswXStzMVsyXStzMlsxXTsKKyAgICAgICAgICAgIG5lZGl0dGV4dFtjdXJdID0gaW1wbG9kZShzMlsxLi5dLCBzMVsxXSk7CisgICAgICAgICAgICBpZiAoczFbM10gPT0gInAiKQorICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBuZWRpdHRleHRbY3VyXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHdyaXRlKCJPSy5cbiIpOworICAgICAgICAgICAgLy9uZWRpdF9wcm9tcHQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIlwiJXNcIiBuaWNodCBnZWZ1bmRlbiFcbiIsIHMxWzFdKTsKKyAgICAgICAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLy8gaWYgKHNsID4gMikKKyAgfSAvLyBpZiAoc3RyWzAuLjBdID09ICJ+IikKKworICBzcGFjZXM9KHNpemVvZihzdHIpICYmIChzdHJbMF09PScgJyB8fCBzdHJbMF09PSdcdCcpKTsKKyAgaWYgKHNwYWNlcykgc3RyPSIkIitzdHI7ICAvKiBLbGVpbmVyIGhhY2sgd2VnZW4gZnVlaHJlbmRlbiBMZWVyemVpY2hlbiAqLworICBzdHI9YnJlYWtfc3RyaW5nKHN0ciw3OCwwLChmbGFncyZGX0JMSykgPyBCU19CTE9DS3xCU19OT19QQVJJTkRFTlQgOiAwKTsKKyAgaWYgKHNwYWNlcykgc3RyPXN0clsxLi48MV07CisgIGlmICggKChzdHJbMC4uMV09PSJ+ciIgJiYgc2l6ZW9mKHN0cik+MikgfHwgc3RyWzAuLjFdPT0ifmkiKSAmJiAKKyAgICAgICBJU19MRUFSTkVSKFRQKSApIAorICB7CisgICAgc3RyPXN0clsyLi48Ml07CisgICAgaWYgKHN0clswLi4wXT09IiAiKSBzdHI9c3RyWzEuLjwxXTsKKyAgICBpZiAoIXN0ciB8fCBjYXRjaChlcnI9ZmlsZV9zaXplKHN0cj0oc3RyaW5nKSIvc2VjdXJlL21hc3RlciItPl9nZXRfcGF0aChzdHIsZ2V0dWlkKFRQKSkpKSB8fCBlcnI8MCkgeworICAgICAgd3JpdGUoIkZpbGUgbmljaHQgZ2VmdW5kZW4uXG4iKTsKKyAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CisgICAgICBpbnB1dF90bygiZ2V0X2VkaXRfbGluZSIsIElOUFVUX1BST01QVCwgbmVkaXRfcHJvbXB0KCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHN0cj1yZWFkX2ZpbGUoc3RyKTsKKyAgICBpZiAoIXN0cil7CisgICAgICB3cml0ZSgiWnUgZ3Jvc3MhXG4iKTsKKyAgICAgIC8vbmVkaXRfcHJvbXB0KCk7CisgICAgICBpbnB1dF90bygiZ2V0X2VkaXRfbGluZSIsIElOUFVUX1BST01QVCwgbmVkaXRfcHJvbXB0KCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHdyaXRlKCJPay5cbiIpOworICB9CisgIGlmIChzdHI9PSIiIHx8ICFzdHIpIHN0cj0iXG4iOworICB7CisgICAgc3RyaW5nICp4OworICAgIGludCBzeDsKKworICAgIHggPSBleHBsb2RlKHN0ciwgIlxuIilbMC4uPDJdOworICAgIHN4ID0gc2l6ZW9mKHgpOworCisgICAgaWYgKGZsYWdzJkZfT1ZSICYmICFmZmxhZykgeworICAgICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLmN1ci0xXSArIHggKyBuZWRpdHRleHRbY3VyKzEuLl07CisgICAgICBzeC0tOworICAgIH0KKyAgICBlbHNlCisgICAgICBuZWRpdHRleHQgPSBuZWRpdHRleHRbMC4uY3VyLTFdICsgeCArIG5lZGl0dGV4dFtjdXIuLl07CisKKyAgICBpZiAoY3VyIDwgYnN0YXJ0KQorICAgICAgYnN0YXJ0ICs9IHN4OworICAgIGlmIChjdXIgPD0gYmVuZCkKKyAgICAgIGJlbmQgKz0gKHN4ICsgZmZsYWcpOworICAgIGN1ciArPSAoc3ggKyBmZmxhZyArICgoZmxhZ3MmRl9PVlIpID8gMTowKSk7CisgICAgbGVuICs9IHN4OworCisgICAgLy8gS2FubiBiZWltIFVtZm9ybWF0aWVyZW4gZGVzIGxldHp0ZW4gQWJzY2huaXR0cyB2b3Jrb21tZW4uCisgICAgaWYgKG5lZGl0dGV4dFtsZW5dICE9ICIiKSB7CisgICAgICBuZWRpdHRleHQgKz0gKHsgIiIgfSk7CisgICAgICBsZW4rKzsKKyAgICB9CisgIH0KKyAgLy9uZWRpdF9wcm9tcHQoKTsKKyAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIG5lZGl0X3Byb21wdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsTGluZShpbnQgbCkKK3sKKyAgc3RyaW5nIHByOworICBpZiAobCA8IDApCisgICAgcHI9IkRhIGlzdCBuaXggbWVociB6dW0gTG9lc2NoZW4hXG5dIjsKKyAgZWxzZSB7CisgICAgaWYgKGJzdGFydCA+PSBsKQorICAgICAgYnN0YXJ0LS07CisgICAgaWYgKGJlbmQgPj0gbCkKKyAgICAgIGJlbmQtLTsKKyAgICBpZiAoY3VyID49IGwpCisgICAgICBjdXItLTsKKyAgICBsZW4tLTsKKyAgICBuZWRpdHRleHQ9KG5lZGl0dGV4dFswLi5sLTFdK25lZGl0dGV4dFtsKzEuLl0pOworICAgIHdyaXRlKCJWb3JoZXJpZ2UgWmVpbGUgZ2Vsb2VzY2h0LlxuIik7CisgICAgcHI9bmVkaXRfcHJvbXB0KCk7CisgIH0KKyAgaW5wdXRfdG8oImdldF9lZGl0X2xpbmUiLCBJTlBVVF9QUk9NUFQsIHByKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRlbEJsb2NrKCkKK3sKKyAgaWYgKGN1ciA+IGJzdGFydCkgeworICAgIGlmIChjdXIgPD0gYmVuZCkKKyAgICAgIGN1ciA9IGJzdGFydDsKKyAgICBlbHNlCisgICAgICBjdXIgLT0gKGJlbmQgLSBic3RhcnQgKyAxKTsKKyAgfQorICBpZiAoYmVuZCA9PSBsZW4pCisgICAgbmVkaXR0ZXh0ID0gbmVkaXR0ZXh0WzAuLmJzdGFydC0xXTsKKyAgZWxzZQorICAgIG5lZGl0dGV4dCA9IG5lZGl0dGV4dFswLi5ic3RhcnQtMV0gKyBuZWRpdHRleHRbYmVuZCsxLi5dOworCisgIGJlbmQgPSBsZW4gPSBzaXplb2YobmVkaXR0ZXh0KS0xOworICBic3RhcnQgPSAwOworICBpZiAoY3VyID4gbGVuKQorICAgIGN1ciA9IGxlbjsKK30KKwordmFyYXJncyBzdGF0aWMgdm9pZCBtb3ZlQmxvY2soaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVhbCkKK3sKKyAgaW50IGJsZW47CisgIHN0cmluZyAqYmxvY2s7CisKKyAgaWYgKGN1ciA+PSBzdGFydCAmJiBjdXIgPD0gZW5kKQorICAgIHdyaXRlKCJBYmVyIGRlciBDdXJzb3Igc3RlaHQgaW5uZXJoYWxiIGRlcyBCbG9ja3MhXG4iKTsKKyAgZWxzZSB7CisgICAgYmxvY2sgPSBuZWRpdHRleHRbc3RhcnQuLmVuZF07CisgICAgYmxlbiA9IHNpemVvZihibG9jayktMTsKKyAgICBkZWxCbG9jaygpOworICAgIG5lZGl0dGV4dCA9IG5lZGl0dGV4dFswLi5jdXItMV0gKyBibG9jayArIG5lZGl0dGV4dFtjdXIuLl07CisgICAgaWYgKHJlYWwpIHsKKyAgICAgIGJzdGFydCA9IGN1cjsKKyAgICAgIGJlbmQgPSBjdXIgKyBibGVuOworICAgIH0KKyAgICBsZW4gKz0gKGJsZW4rMSk7CisgICAgd3JpdGUoIk9LLlxuIik7CisgIH0KK30KKworI2RlZmluZSBVTUxBVVQgKFsgXAorICAgICfkJzogImFlIiwgXAorICAgICf2JzogIm9lIiwgXAorICAgICf8JzogInVlIiwgXAorICAgICfEJzogIkFlIiwgXAorICAgICfWJzogIk9lIiwgXAorICAgICfcJzogIlVlIiwgXAorICAgICffJzogInNzIiAgXSkKKworc3RhdGljIHN0cmluZyBraWxsY3RybCggc3RyaW5nIHN0ciApCit7CisgICAgaW50IGksIGo7CisgICAgc3RyaW5nIHRtcDsKKworICAgIHRtcCA9ICIiOworICAgIAorICAgIGZvciAoIGogPSBzaXplb2Yoc3RyKSwgaSA9IDA7IGkgPCBqOyBpKysgKQorICAgICAgICB0bXAgKz0gKFVNTEFVVFtzdHJbaV1dIHx8IHN0cltpLi5pXSk7CisKKyAgICB0bXAgPSByZWdyZXBsYWNlKCB0bXAsICJbXiAtflx0XSIsICIiLCAxICk7CisgICAgCisgICAgaWYgKHNpemVvZih0bXApICYmICB0bXBbMF0gPCAzMiApCisgICAgICAgIHJldHVybiB0bXBbMS4uXTsKKyAgCisgICAgcmV0dXJuIHRtcDsKK30KKworbWl4ZWQgUmVzY3VlVGV4dCgpIHsKKyAgaWYgKCFuZWRpdHRleHQgfHwgIWVkaXRvcl91c2VkKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRHUgaGFzdCBuaXggYW5nZWZhbmdlbiB6dSBzY2hyZWliZW4hXG4iKSwwOworICBpZiAoVFAtPnF1ZXJ5X3JlYWxfbmFtZSgpIT1lZGl0b3JfdXNlZCkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkhpZXIgc2NocmVpYnQgIitjYXBpdGFsaXplKGVkaXRvcl91c2VkKSsiIVxuIiksMDsKKyAgaWYgKHF1ZXJ5X2lucHV0X3BlbmRpbmcoVFApKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRHUgc2NocmVpYnN0IGdlcmFkZSBzY2hvbiBpcmdlbmR3YXMuIFNvcnJ5Li4uXG4iKSwwOworICByZXR1cm4gU2hvd1dyaXR0ZW4oMCwgbGVuLCAwKTsKK30KKworc3RhdGljIGludCBTaG93V3JpdHRlbihpbnQgZiwgaW50IGwsIGludCBudW0pIHsKKyAgc3RyaW5nIHMsIHQsIGMsIHAsIGluOworICBpbnQgaTsKKworICBpZiAobnVtKSB7CisgICAgaWYgKGwgPj0gMTAwKSB7CisgICAgICBwID0gIiUzZCVzJXMiOworICAgICAgaW4gPSAiICI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcCA9ICIlMmQlcyVzIjsKKyAgICAgIGluID0gIiAgIjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGluID0gIiI7CisKKyAgZm9yICh0PSIiLCBpPWwtMTsgaT49ZjsgaS0tKSB7CisgICAgaWYgKGkgPT0gY3VyKQorICAgICAgYyA9ICggKChpID09IGJlbmQpIHx8IChpID09IGJzdGFydCkpID8gIiMiIDogIioiKTsKKyAgICBlbHNlIGlmIChpPT1ic3RhcnQgfHwgaT09YmVuZCkKKyAgICAgIGMgPSAiPiI7CisgICAgZWxzZSBjID0gIjoiOworCisgICAgaWYgKG51bSkKKyAgICAgIHQgPSAoc3ByaW50ZihwLCBpKzEsIGMsIG5lZGl0dGV4dFtpXSlbMC4uNzVdICsgIlxuIiArIHQpOworICAgIGVsc2UKKyAgICAgIHQgPSAoYyArIG5lZGl0dGV4dFtpXSsiXG4iICsgdCk7CisgIH0KKworICBpZiAobD09bGVuKSB7CisgICAgaWYgKGxlbiA9PSBjdXIpCisgICAgICBjID0gKCAobGVuID09IGJlbmQpID8gIiMiIDogIioiKTsKKyAgICBlbHNlIGlmIChsZW49PWJlbmQpCisgICAgICBjID0gIj4iOworICAgIGVsc2UgYyA9ICIgIjsKKyAgfQorICBlbHNlIGM9ICIgIjsKKworICBzPSJEYXMgaGFzdCBEdSBiaXNoZXIgZ2VzY2hyaWViZW46XG4iK2luKyIgXAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblwKKyIrdCtpbitjKyJcCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7CisgIHRoaXNfcGxheWVyKCktPk1vcmUocywwLHN5bWJvbF9mdW5jdGlvbigiaW5wdXRfZnVuYyIsdGhpc19vYmplY3QoKSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBTaG93SGVscCgpIHsKKyAgdGhpc19wbGF5ZXIoKS0+TW9yZSgiXAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblwKK0RlciBFZGl0b3IgdmVyc3RlaHQgZm9sZ2VuZGUgQmVmZWhsZTpcblwKKy0tLSBEYXRlaWtvbW1hbmRvczpcblwKK35oICAgICAgICAgICAgZGllc2UgSGlsZnNzZWl0ZVxuXAorfnIgLyB+UiAgICAgemVpZ3QgYW4sIHdhcyBEdSBiaXNoZXIgZ2VzY2hyaWViZW4gaGFzdFxuXAorfnogLyB+WiAgICAgemVpZ3QgZGVuIFRleHRhdXNzY2huaXR0IHVtIGRlbiBDdXJzb3IgaGVydW1cblwKKyIrKElTX1dJWkFSRChUUCkgPyAiXAorfmkgZmlsZW5hbWUgZnVlZ3QgZWluZSBEYXRlaSBpbiBkZW4gVGV4dCBlaW4gKGF1Y2ggfnIgZmlsZW5hbWUpXG5cCisiIDogIiIgKSsgIlwKK35xICAgICAgICAgICAgYnJpY2h0IGFiXG5cCisqKiBvZGVyIC4gICBiZWVuZGV0IHNhdWJlclxuXAorITxjbWQ+ICAgICAgICAgICAgZnVlaHJ0IDxjbWQ+IGF1cywgd2llIHdlbm4gRHUgZ2VyYWRlIG5pY2h0IHNjaHJlaWJlbiB3dWVyZGVzdFxuXAorfiEgICAgICAgICAgICB2ZXJsYWVzc3QgZGVuIEVkaXRvciB2b3J1ZWJlcmdlaGVuZFxuXAorfnMgICAgICAgICAgICBTdGF0dXNpbmZvcm1hdGlvbmVuIGFuemVpZ2VuXG5cCit+YiAgICAgICAgICAgIFdlY2hzZWx0IHp3aXNjaGVuIEZsYXR0ZXItIChkZWZhdWx0KSB1bmQgQmxvY2tzYXR6XG5cCistLS0gemVpbGVub3JpZW50aWVydGUgS29tbWFuZG9zOlxuXAorfmQgICAgICAgICAgICBsb2VzY2h0IGRpZSBsZXR6dGUgWmVpbGUgKFRleHQtLCBuaWNodCBFaW5nYWJlemVpbGUpXG5cCit+diAgICAgICAgICAgIHdlY2hzZWx0IHp3aXNjaGVuIEVpbmZ1ZWdlLSAoZGVmYXVsdCkgdW5kIFVlYmVyc2NocmVpYm1vZHVzXG5cCit+cyAhczEhczIhICBFcnNldHp0IGRhcyBlcnN0ZSBWb3Jrb21tbmlzIGRlcyBTdHJpbmdzIHMxIGR1cmNoIGRlbiBTdHJpbmcgczJcblwKKyAgICAgICAgICAgIGluIGRlciBha3R1ZWxsZW4gWmVpbGUuXG5cCisgICAgICAgICAgICBTdGF0dCBkdXJjaCAhIGtvZW5uZW4gZGllIFN0cmluZ3MgYXVjaCBkdXJjaCBiZWxpZWJpZ2UgYW5kZXJlXG5cCisgICAgICAgICAgICBaZWljaGVuIGdldHJlbm50IHdlcmRlbiwgZGllIHdlZGVyIGluIHMxIG5vY2ggaW4gczIgdm9ya29tbWVuLlxuXAorfmYgICAgICAgICAgICBGb3JtYXRpZXJ0IGRpZSBha3R1ZWxsZSBaZWlsZSBuZXVcblwKKy0tLSBDdXJzb3Jrb21tYW5kb3M6XG5cCit+Y3UgLyB+Y2QgICBDdXJzb3IgdW0gZWluZSBaZWlsZSBuYWNoIG9iZW4vdW50ZW4gYmV3ZWdlblxuXAorfmN0IC8gfmNiICAgQ3Vyc29yIGFuIEFuZmFuZy9FbmRlIGRlcyBUZXh0ZXMgYmV3ZWdlblxuXAorfmNzIC8gfmNlICAgQ3Vyc29yIGFuIEJsb2NrYW5mYW5nL0Jsb2NrZW5kZSBiZXdlZ2VuXG5cCit+Yzxucj4gICAgICAgICAgICBDdXJzb3IgbmFjaCBaZWlsZSA8bnI+IGJld2VnZW5cblwKK35jKzxucj4gICAgIEN1cnNvciB1bSA8bnI+IFplaWxlbiBuYWNoIHVudGVuIGJld2VnZW5cblwKK35jLTxucj4gICAgIEN1cnNvciB1bSA8bnI+IFplaWxlbiBuYWNoIG9iZW4gYmV3ZWdlblxuXAorLS0tIGJsb2Nrb3JpZW50aWVydGUgS29tbWFuZG9zOlxuXAorfmJzL35iczxucj4gc2V0enQgQmxvY2thbmZhbmcgYXVmIEN1cnNvcnBvc2l0aW9uIGJ6dy4gYXVmIFplaWxlIDxucj5cblwKK35iZS9+YmU8bnI+IHNldHp0IEJsb2NrZW5kZSBhdWYgQ3Vyc29ycG9zaXRpb24gYnp3LiBhdWYgWmVpbGUgPG5yPlxuXAorfkYgICAgICAgICAgICBmb3JtYXRpZXJ0IGRlbiBCbG9jayBuZXVcblwKK35EICAgICAgICAgICAgbG9lc2NodCBkZW4gbWFya2llcnRlbiBCbG9ja1xuXAorfm0gICAgICAgICAgICB2ZXJzY2hpZWJ0IGRlbiBtYXJraWVydGVuIEJsb2NrIGFuIGRpZSBDdXJzb3Jwb3NpdGlvblxuXAorLS0tXG5cCitBbGxlcyBhbmRlcmUgZ2lsdCBhbHMgVGV4dC4gVWViZXJsYW5nZSBaZWlsZW4gd2VyZGVuIGF1ZiBlaW5lIG1heGltYWxlXG5cCitMYWVuZ2Ugdm9uIDc4IFplaWNoZW4gdW1nZWJyb2NoZW4uXG5cCitOYWNoIH4hLCBvZGVyIHdlbm4gbWFuIHdhZWhyZW5kIGRlcyBTY2hyZWliZW5zIG5ldHp0b3Qgd2lyZCwga2FubiBtYW4gbWl0XG5cCisgfnIgd2llZGVyIGluIGRlbiBFZGl0b3IgZWluc3RlaWdlbi5cblwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cCisiLCAwLCBzeW1ib2xfZnVuY3Rpb24oImlucHV0X2Z1bmMiLCB0aGlzX29iamVjdCgpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlucHV0X2Z1bmMoKSB7CisgIC8vbmVkaXRfcHJvbXB0KCk7CisgIGlucHV0X3RvKCJnZXRfZWRpdF9saW5lIiwgSU5QVVRfUFJPTVBULCBuZWRpdF9wcm9tcHQoKSk7CisgIHJldHVybiAxOworfQo=