ZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM5N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL21vcnBoX3NoYWRvdy5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiAtKi0gbHBjIC0qLSAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgbW9ycGguYworLy8KKy8vICAgKGMpIFRyb3kgKHRyb3lAbWcubXVkLmRlKQorLy8gICBLb3BpZXJlbiwgVmVyYWVuZGVybiBvZGVyIFdlaXRlcmdhYmU6IG5hIGtsYXIsIGltbWVyIHp1LCBqZSBzY2hsaW1tZXIgCisvLyAgIHVtIHNvIGJlc3NlcgorLy8KKy8vICAgT2JqZWt0IGVyc3RlbGx0OiAxNC4wOC4wMSwgVHJveQorLy8KKy8vICAgRGllc2VyIHNoYWRvdyBpbXBsZW1lbnRpZXJ0IGdlbmVyaXNjaGUgVmVyd2FuZGx1bmdlbi4gSW0gR2VnZW5zYXR6IG9kZXIKKy8vICAgaW4gRXJn5G56dW5nIHp1bSBUYXJuaGVsbSBzaW5kIGRpZXNlIG5pY2h0IGF1ZiBkaWUgQmVzY2hyZWlidW5nCisvLyAgIGJlc2NocuRua3QsIHNvbmRlcm4gc2NobGFnZW4gc2ljaCBhdWNoIGluIGFuZGVyZW4gUHJvcGVydGllcyBuaWVkZXIuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgUHJvcGVydHktRWluc3RlbGx1bmdlbiBqZSBuYWNoIFJhc3NlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwcml2YXRlIG1hcHBpbmcgbW9ycGhfcHJvcGVydGllczsKKworcHJpdmF0ZSBvYmplY3QgcGw7IC8vIGRlciBzY2hhdHRpZXJ0ZSBTcGllbGVyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHN0YXJ0X3NoYWRvdyggU3BpZWxlciwgUHJvcGVydGllcyApCisvLworLy8gICBTdGFydGV0IGRhcyBTaGFkb3dpbmcgdm9uIFNwaWVsZXIuIFByb3BlcnRpZXMgaXN0IGVpbiBNYXBwaW5nIG1pdAorLy8gICBkZW4genUg5G5kZXJuZGVuIFByb3BlcnRpZXMuIERvcnQgbmljaHQgdm9yaGFuZGVuZSBQcm9wZXJ0aWVzIHdlcmRlbgorLy8gICB6dW0gU3BpZWxlciBkdXJjaGdlcmVpY2h0LiBFcyB3ZXJkZW4gZG9ydCBlbnR3ZWRlciBlaW56ZWxuZSBXZXJ0ZQorLy8gICBlcndhcnRldCAoQmVpc3BpZWw6IChbIFBfR0VOREVSOiBNQUxFIF0pKSwgZGllIGRhbm4gZvxyIGFsbGUgUmFzc2VuCisvLyAgIGdlbHRlbiwgb2RlciBjbG9zdXJlcywgZGllIGRhbm4gYXVzZ2Vm/GhydCB3ZXJkZW4gdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgIFNwaWVsZXJyYXNzZSBhbHMgUGFyYW1ldGVyIG9kZXIgYWJlciBNYXBwaW5ncyBtaXQgZGVuIFJhc3Nlbm5hbWVuCisvLyAgIChCZWlzcGllbDogKFsgUF9HRU5ERVI6IChbICJNZW5zY2giOiBORVVURVIsICJFbGYiOiBGRU1BTEUsCisvLyAgICJad2VyZyI6IE1BTEUsIC4uLiBdKaBdKSkuIElzdCBlaW5lIFJhc3NlIGluIGRlbSBSYXNzZW5tYXBwaW5nIG5pY2h0CisvLyAgIHZvcmhhbmRlbiwgc28gd2lyZCBkYXMgUHJvcGVydHkgenVtIFNwaWVsZXIgZHVyY2hnZXJlaWNodC4gU3BlemllbGwKKy8vICAgYmVoYW5kZWx0IHdlcmRlbiBQX0lEUyAoc2llaGUgX3F1ZXJ5X2lkcygpKSB1bmQgUF9OQU1FIChzaWVoZQorLy8gICBfcXVlcnlfbmFtZSgpKS4gCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHN0YXJ0X3NoYWRvdyggb2JqZWN0IF9wbCwgbWFwcGluZyBwcmVzZXQgKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDE7CisgIGlmICggIV9wbCB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggX3BsICkgKQorICAgIHJldHVybiByZW1vdmUoKTsKKyAgcGwgPSBfcGw7CisgIG1vcnBoX3Byb3BlcnRpZXMgPSBkZWVwX2NvcHkoIHByZXNldCApOworICBzaGFkb3coIHBsLCAxICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBzdG9wX3NoYWRvdygpCisvLworLy8gICBCZWVuZGV0IGRhcyBTaGFkb3dpbmcgdW5kIHplcnN09nJ0IGRpZXNlcyBPYmpla3QKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgc3RvcF9zaGFkb3coIC8qIHZvaWQgKi8gKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDA7CisgIHVuc2hhZG93KCk7CisgIHJldHVybiByZW1vdmUoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3Byb3BlcnR5KCBQcm9wZXJ0eSApCisvLworLy8gICBHZW5lcmlzY2hlIFByb3BlcnR5LU1hc2tpZXJ1bmcuIGxpZWZlcnQgYXVzIG1vcnBoX3Byb3BlcnRpZXMgZGVuIHp1cgorLy8gICBSYXNzZSBkZXMgVHLkZ2VycyBwYXNzZW5kZW4gRWludHJhZy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitub21hc2sgc3RhdGljIG1peGVkIF9xdWVyeV9wcm9wZXJ0eSggc3RyaW5nIHByb3AgKQoreworICBzdHJpbmcgcmFjZTsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIHByb3AgKSA9PSAwICkKKyAgICByZXR1cm4gcGwtPlF1ZXJ5KCBwcm9wICk7CisgIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdLCByYWNlICk7CisgIGlmICggbWFwcGluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgeworICAgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0sIHJhY2UgKSA9PSAwICkKKyAgICAgIHJldHVybiBwbC0+UXVlcnkoIHByb3AgKTsKKyAgICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApICkKKyAgICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApOworCisgICAgcmV0dXJuIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXVsgcmFjZSBdOworICB9CisgIHJldHVybiBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hcnRpY2xlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVJUSUNMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYXJ0aWNsZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BUlRJQ0xFICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hdmVyYWdlX3NpemUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9BVkVSQUdFX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfc2l6ZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BVkVSQUdFX1NJWkUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVZFUkFHRV9XRUlHSFQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChpbnQpX3F1ZXJ5X3Byb3BlcnR5KCBQX0FWRVJBR0VfV0VJR0hUICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9ib2R5KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQk9EWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYm9keSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9CT0RZICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9nZW5kZXIoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9HRU5ERVIKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2dlbmRlciggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9HRU5ERVIgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2hhbmRzKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaGFuZHMoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gX3F1ZXJ5X3Byb3BlcnR5KCBQX0hBTkRTICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9pZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9JRFMgLSBOaWNodC1TdGFuZGFyZCwgZGEgamUgbmFjaCBVcnNwcnVuZ3MtCisvLyAgIGdlc2NobGVjaHQgZGVzIFNwaWVsZXJzIHp1c+R0emxpY2hlIGlkcyBm5GxsaWcgd2VyZGVuLiBBYmxhdWY6IEVzIGdpYnQKKy8vICAgNSBTY2hyaXR0ZSwgYmVpIGRlcmVuIGpld2VpbGlnZW0gVmVyc2FnZW4gZGllIGlkcyBkZXMgU3BpZWxlcnMgZHVyY2gtCisvLyAgIGdlcmVpY2h0IHdlcmRlbjoKKy8vICAgMS4gUF9JRFMgaXN0IGltIHByb3BlcnR5LW1hcHBpbmcgdm9yaGFuZGVuCisvLyAgIDIuIGEpIGVzIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlcyB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXMgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXMgaXN0IGVpbiBtYXBwaW5nLiBIaWVyIG5laG1lbiB3aXIgbnVuIGRhcyD8YmxpY2hlIFJhc3Nlbm5hbWVuLQorLy8gICAgICAgICBtYXBwaW5nIGFuIC0+IDMuKQorLy8gICAzLiBG/HIgZGllIFJhc3NlIGRlcyBTcGllbGVycyB3aXJkIGVpbiBFaW50cmFnIGdlc3VjaHQKKy8vICAgICAgYSkgZXIgaXN0IGVpbiBzdHJpbmcgb2RlciBlaW4gYXJyYXk6IGVyIHdpcmQgYW4gZGllIGlkcyBkZXMgU3BpZWxlcnMKKy8vICAgICAgICAgYW5nZWjkbmd0IHVuZCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBiKSBlciBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgICAgICAgIFNwaWVsZXItaWRzLCBkZXIgUmFzc2UgZGVzIFNwaWVsZXJzIHVuZCBkZXIgR2VzY2hsZWNodGVyCisvLyAgICAgICAgIChkaWVzZXMgT2JqZWt0cyB1bmQgZGVzIFNwaWVsZXJzKS4gRGVyIEVyZ2Vibmlzd2VydCBkZXIgY2xvc3VyZQorLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBjKSBlciBpc3QgZWluIG1hcHBpbmcuIEVzIHdpcmQgYW5nZW5vbW1lbiwgZGFzcyBqZSBHZXNjaGxlY2h0IERJRVNFUworLy8gICAgICAgICBPYmpla3RzIGVpbiBFaW50cmFnIHZvcmhhbmRlbiBpc3QuIC0+IDQuKQorLy8gICA0LiBG/HIgZGFzIEdlc2NobGVjaHQgZGllc2VzIE9iamVrdHMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXIgaXN0IGVpbiBtYXBwaW5nLiBFcyB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamUgR2VzY2hsZWNodCBERVMKKy8vICAgICAgICAgU3BpZWxlcnMgZWluIEVpbnRyYWcgdm9yaGFuZGVuIGlzdC4gLT4gNS4pCisvLyAgIDUuIEb8ciBkYXMgR2VzY2hsZWNodCBkZXMgU3BpZWxlcnMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaWRzKCAvKiB2b2lkICovICkKK3sKKyAgc3RyaW5nIHJhY2U7CisgIG1peGVkIGlkczsKKyAgaW50IGdlbmRlciwgc2dlbmRlcjsKKworICAvLyBUZXN0IDEuCisgIGlkcyA9IHBsLT5RdWVyeSggUF9JRFMgKTsKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIFBfSURTICkgPT0gMCApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgLy8gR2VzY2hsZWNodGVyIGhvbGVuCisgIGdlbmRlciA9IF9xdWVyeV9nZW5kZXIoKTsKKyAgc2dlbmRlciA9IHBsLT5RdWVyeSggUF9HRU5ERVIgKTsKKworICAvLyBUZXN0IDIuCisgIC8vIHN0cmluZz8gRGFubiBlaW5mYWNoIGRlbiBub3JtYWxlbiBpZHMgZGF6dSwgZ2VuYXVzbyBtaXQgYXJyYXkKKyAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdLCBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cworICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gaWRzOworCisgIC8vIFRlc3QgMy4KKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0sIHJhY2UgKSA9PSAwICkKKyAgICByZXR1cm4gaWRzOworICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBUZXN0IDQuCisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGdlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSB9KTsKKyAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdICkgKQorICAgIHJldHVybiBpZHM7CisKKyAgLy8gVGVzdCA1LgorICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwgc2dlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gfSk7CisgIGlmICggcG9pbnRlcnAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisKKyAgcmV0dXJuIGlkczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2lzX21vcnBoZWQoKQorLy8KKy8vICAgUHJvcGVydHktTWV0aG9kZSBm/HIgImlzX21vcnBoZWQiCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9pc19tb3JwaGVkKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tYXhfaGFuZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NQVhfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X21heF9oYW5kcyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9NQVhfSEFORFMgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21tc2dpbigpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01NU0dJTgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NTVNHSU4gKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tbXNnb3V0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTU1TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ291dCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTU1TR09VVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ2luKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTVNHSU4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dJTiApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ291dCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbXNnb3V0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dPVVQgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9uYW1lKCkKKy8vCisvLyAgIFByb3BlcnR5LU1ldGhvZGUgZvxyIFBfTkFNRS4gTGVpZGVyIGlzdCBkaWUgcGxheWVyLXNoZWxsIHNvIGdyb3R0aWcsCisvLyAgIGRhc3Mg/GJlcmFsbCBhbmdlbm9tbWVuIHdpcmQsIFF1ZXJ5UHJvcChQX05BTUUpIGxpZWZlcmUgZWluZW4gU3RyaW5nIDotfAorLy8gICBWb2xsc3TkbmRpZ2VzIFByb3BlcnR5IGRhaGVyIHVudGVyIF9xdWVyeV9uYW1lX2Z1bGwoKS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X25hbWUoIC8qIHZvaWQgKi8gKQoreworICBtaXhlZCBwcm9wOworICBwcm9wID0gX3F1ZXJ5X3Byb3BlcnR5KCBQX05BTUUgKTsKKyAgaWYgKCBzdHJpbmdwKCBwcm9wICkgKQorICAgIHJldHVybiBzcHJpbnRmKCBwcm9wLCBwbC0+UXVlcnkoIFBfTkFNRSApICk7CisgIGlmICggcG9pbnRlcnAoIHByb3AgKSApCisgICAgcmV0dXJuIG1hcCggcHJvcCwKKwkJICAgICAgbGFtYmRhKCAoeyAnZWwsICdzIH0pLAorCQkJICAgICAgKHsjJ3NwcmludGYsICdlbCwgJ3N9KSApLAorCQkgICAgICBwbC0+UXVlcnkoIFBfTkFNRSApIClbIFdFUiBdOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X25hbWVfZnVsbCgpCisvLworLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciAibmFtZV9mdWxsIi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfbmFtZV9mdWxsKCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgcHJvcDsKKyAgcHJvcCA9IF9xdWVyeV9wcm9wZXJ0eSggUF9OQU1FICk7CisgIGlmICggc3RyaW5ncCggcHJvcCApICkKKyAgICByZXR1cm4gc3ByaW50ZiggcHJvcCwgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICBpZiAoIHBvaW50ZXJwKCBwcm9wICkgKQorICAgIHJldHVybiBtYXAoIHByb3AsCisJCSAgICAgIGxhbWJkYSggKHsgJ2VsLCAncyB9KSwKKwkJCSAgICAgICh7IydzcHJpbnRmLCAnZWwsICdzfSkgKSwKKwkJICAgICAgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3ByZXNheSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1BSRVNBWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcHJlc2F5KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9QUkVTQVkgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9yYWNlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfUkFDRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcmFjZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfUkFDRSApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3JhY2VzdHJpbmcoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9SQUNFU1RSSU5HCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nKiBfcXVlcnlfcmFjZXN0cmluZyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKilfcXVlcnlfcHJvcGVydHkoIFBfUkFDRVNUUklORyApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfc2l6ZSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X3NpemUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfU0laRSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfdGl0bGUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9USVRMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfdGl0bGUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX1RJVExFICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfV0VJR0hUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV93ZWlnaHQoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludCkoX3F1ZXJ5X3Byb3BlcnR5KCBQX1dFSUdIVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgaWQoIFRleHQsIExldmVsKQorLy8KKy8vICAgRGllIElkZW50aWZpemllcnVuZyBzcGlubnQgbWl0IFBfTkFNRS1BcnJheXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2YXJhcmdzIGludCBpZCggc3RyaW5nIHN0ciwgaW50IGx2bCApCit7CisgIHN0cmluZyBwbG5hbWU7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGlmICggc3RyID09ICJnZWlzdCIgKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoICggc3NjYW5mKCBzdHIsICJnZWlzdCB2b24gJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKCAoIHNzY2FuZiggc3RyLCAiZ2Vpc3QgJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiBwbC0+aWQoIHN0ciwgbHZsICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGxvbmcoKQorLy8KKy8vICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgaW0gU3BpZWxlciBoYWRlcnQgbWl0IGRlbSBHZXNjaGxlY2h0IE5FVVRFUi4uLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoIC8qIHZvaWQgKi8gKQoreworICBzdHJpbmcgc2xvbmc7CisgIHNsb25nID0gcGwtPmxvbmcoKTsKKworICBpZiAoIF9xdWVyeV9nZW5kZXIoKSA9PSBORVVURVIgKQorICB7CisgICAgc3RyaW5nICphbG9uZzsKKyAgICBpbnQgaTsKKworICAgIC8vIGFsbGUgRXItcyB1bmQgZXItcyBzdWNoZW4uLi4KKyAgICBhbG9uZyA9IHJlZ2V4cGxvZGUoIHNsb25nLCAiXFw8W0VlXXJcXD4iICk7CisgICAgLy8gLi4uIHVuZCBkYXMgciBkdXJjaCBlaW4gcyBlcnNldHplbi4KKyAgICBmb3IgKCBpID0gMSA7IGkgPCBzaXplb2YoIGFsb25nICkgOyBpICs9IDIgKQorICAgICAgYWxvbmdbIGkgXVsgMSBdID0gJ3MnOworICAgIHNsb25nID0gaW1wbG9kZSggYWxvbmcsICIiICk7CisgIH0KKworICByZXR1cm4gc2xvbmc7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHNob3J0KCkKKy8vCisvLyAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGltIFNwaWVsZXIgaGF0IGVpbiBQcm9ibGVtIG1pdCBQX05BTUUtQXJyYXlzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIHNob3J0KCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgbmFtZXM7CisgIHN0cmluZyBhbnN3ZXI7CisgIHN0cmluZyB0aXRsZTsKKworICBpZiAoIHBsLT5RdWVyeVByb3AoIFBfSU5WSVMgKSApCisgICAgaWYgKCBpbnRlcmFjdGl2ZSggcHJldmlvdXNfb2JqZWN0KCkgKSAmJgorCSBJU19MRUFSTklORyggcHJldmlvdXNfb2JqZWN0KCkgKSApCisgICAgICByZXR1cm4gIigiICsgcGwtPlF1ZXJ5KCBQX05BTUUgKSArICIpIFxuIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKHN0cmluZykwOworCisgIG5hbWVzID0gX3F1ZXJ5X25hbWVfZnVsbCgpOworICBpZiAoIHN0cmluZ3AoIG5hbWVzICkgKQorICAgIG5hbWVzID0gKHsgbmFtZXMsIG5hbWVzLCBuYW1lcywgbmFtZXMgfSk7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGFuc3dlciA9ICJEZXIgR2Vpc3QgIiArIHBsLT5RdWVyeUFydGljbGUoIFdFU1NFTiwgMCApICsgbmFtZXNbIFdFU1NFTiBdOworICBlbHNlCisgICAgYW5zd2VyID0gcGwtPlF1ZXJ5QXJ0aWNsZSggV0VSLCAwICkgKyBuYW1lc1sgV0VSIF07CisgIGlmICggKCB0aXRsZSA9IHBsLT5RdWVyeVByb3AoIFBfVElUTEUgKSApICYmCisgICAgICAgKCB0aXRsZSAhPSAiIiApICkKKyAgICAgYW5zd2VyICs9ICIgIiArIHRpdGxlOworICBpZiAoICFpbnRlcmFjdGl2ZSggcGwgKSApCisgICAgIGFuc3dlciArPSAiIChuZXR6dG90KSI7CisgIHJldHVybiBjYXBpdGFsaXplKCBhbnN3ZXIgKSArICIuXG4iOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICByZW1vdmUoIFNjaG5hdXplICkKKy8vCisvLyAgIGF1ZnLkdW1lbgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIC0tIEVOREUgLS0K