LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSAibG9nbWF0Y2guaCIKCiNpZmRlZiBIQVZFX1JFR0VYX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cmVnZXguaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJ1dGlsX2Z1bmNzL2hlYWRlcl9nZW5lcmljLmgiCiNpbmNsdWRlICJ1dGlsX2Z1bmNzL2hlYWRlcl9zaW1wbGVfdGFibGUuaCIKCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGZpbGVuYW1lIHBhdHRlcm4KICogIGNvbnRhaW5zIHRoZSAlIGNoYXJhY3RlciBpbmRpY2F0aW5nIGEgdmFyaWFibGUKICogIGZpbGVuYW1lIChpLmUuIGl0IHVzZXMgZGF0ZS90aW1lIGZvcm1hdCBjb250cm9sCiAqICBjb2Rlcywgc2VlICdtYW4gZGF0ZScpIHRoZW4gZXhwYW5kcyB0aG9zZSBjb250cm9sCiAqICBjb2RlcyBiYXNlZCBvbiBjdXJyZW50IHRpbWUgYW5kIHNldHMgdGhlCiAqICBmaWxlbmFtZSBmaWVsZCBpbiB0aGUgc3RydWN0LgogKiAgUmV0dXJucyAxIGlmIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCAwIG90aGVyd2lzZQogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCnN0YXRpYyBpbnQKbG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKiBwYXR0ZXJuLCBjaGFyICogY3VycmVudEZpbGVuYW1lKQp7CiAgICB0aW1lX3QgdDsKICAgIHN0cnVjdCB0bSAqdG1wOwogICAgY2hhciBuZXdGaWxlbmFtZVsyNTZdOwoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiBpZiB0aGUgZmlsZW5hbWUgcGF0dGVybiBkb2Vzbid0IGhhdmUgdGhlICIlIiBjaGFyYWN0ZXIganVzdCByZXR1cm4sCiAgICAgKiBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqLwogICAgaWYgKHN0cmNocihwYXR0ZXJuLCAnJScpID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB0ID0gdGltZShOVUxMKTsKICAgIHRtcCA9IGxvY2FsdGltZSgmdCk7CgogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgcGVycm9yKCJsb2NhbHRpbWUiKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiByZXN1bHQgb2YgZXhwYW5zaW9uIG11c3QgZml0IGludG8gbmV3RmlsZW5hbWUsIG90aGVyd2lzZSByZXR1cm5pbmcgKi8KICAgIGlmIChzdHJmdGltZShuZXdGaWxlbmFtZSwgc2l6ZW9mKG5ld0ZpbGVuYW1lKSwgcGF0dGVybiwgdG1wKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogaWYgc2FtZSBhcyBjdXJyZW50IGZpbGVuYW1lLCBqdXN0IHJldHVybiAqLwogICAgaWYgKHN0cmNtcChjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIC8qIG90aGVyd2lzZSB1cGRhdGUgY3VycmVudEZpbGVuYW1lIGFuZCByZXR1cm4gMSAqLwogICAgICAgIHN0cmNweShjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKc3RydWN0IGxvZ21hdGNoc3RhdCB7CiAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVQYXR0ZXJuWzI1Nl07CiAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVbMjU2XTsKICAgIGNoYXIgICAgICAgICAgICByZWdFeFsyNTZdOwogICAgY2hhciAgICAgICAgICAgIG5hbWVbMjU2XTsKICAgIEZJTEUgICAgICAgICAgICpsb2dmaWxlOwogICAgbG9uZyAgICAgICAgICAgIGN1cnJlbnRGaWxlUG9zaXRpb247CiAgICB1bnNpZ25lZCBsb25nICAgZ2xvYmFsTWF0Y2hDb3VudGVyOwogICAgdW5zaWduZWQgbG9uZyAgIGN1cnJlbnRNYXRjaENvdW50ZXI7CiAgICB1bnNpZ25lZCBsb25nICAgbWF0Y2hDb3VudGVyOwogICAgcmVnZXhfdCAgICAgICAgIHJlZ2V4QnVmZmVyOwogICAgaW50ICAgICAgICAgICAgIG15UmVnZXhFcnJvcjsKICAgIGludCAgICAgICAgICAgICB2aXJnaW47CiAgICBpbnQgICAgICAgICAgICAgdGhpc0luZGV4OwogICAgaW50ICAgICAgICAgICAgIGZyZXF1ZW5jeTsKfTsKCiNkZWZpbmUgTUFYTE9HTUFUQ0ggICAyNTAKCnN0YXRpYyBzdHJ1Y3QgbG9nbWF0Y2hzdGF0IGxvZ21hdGNoVGFibGVbTUFYTE9HTUFUQ0hdOwpzdGF0aWMgaW50ICAgICAgICAgICAgICAgICBsb2dtYXRjaENvdW50ID0gMDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIHVwZGF0ZUxvZ21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmFjayBieSBzbm1wZCBhbGFybXMgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp1cGRhdGVMb2dtYXRjaChpbnQgaWluZGV4KQp7CgogICAgaW50ICAgICAgICAgICAgIG1hdGNoUmVzdWx0Q29kZTsKICAgIGNoYXIgICAgICAgICAgICBpbmJ1ZlsxMDI0XTsKICAgIGNoYXIgICAgICAgICAgICBwZXJmaWxlbmFtZVsxMDI0XTsKICAgIEZJTEUgICAgICAgICAgICpwZXJmaWxlOwogICAgdW5zaWduZWQgbG9uZyAgIHBvcywgY2NvdW50ZXIsIGNvdW50ZXI7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwogICAgaW50ICAgICAgICAgICAgIHRvb2JpZzsKICAgIGludCAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gRkFMU0U7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2I7CiAgICBjaGFyICAgICAgICAgICAgbGFzdEZpbGVuYW1lWzI1Nl07CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIHdlIGNhbiBuZXZlciBiZSBzdXJlIGlmIHRoaXMgaXMgdGhlICAKICAgICAqIGxhc3QgdGltZSB3ZSBhcmUgYmVpbmcgY2FsbGVkIGhlcmUsICAKICAgICAqIHNvIHdlIGFsd2F5cyB1cGRhdGUgYSBwZXJzaXN0ZW50ICAgICAKICAgICAqIGRhdGEgZmlsZSB3aXRoIG91ciBjdXJyZW50IGZpbGUgICAgICAKICAgICAqIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIHNucHJpbnRmKHBlcmZpbGVuYW1lLCBzaXplb2YocGVyZmlsZW5hbWUpLCAiJXMvc25tcGRfbG9nbWF0Y2hfJXMucG9zIiwKICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubmFtZSk7CgogICAgaWYgKGxvZ21hdGNoVGFibGVbaWluZGV4XS52aXJnaW4pIHsKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICogdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgYmVpbmcgIAogICAgICAgICAqIGNhbGxlZDsgbGV0J3MgdHJ5IHRvIGZpbmQgYW4gb2xkICAgICAKICAgICAgICAgKiBmaWxlIHBvc2l0aW9uIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQgCiAgICAgICAgICogZGF0YSBmaWxlIGFuZCByZXN0b3JlIGl0ICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKChwZXJmaWxlID0gZm9wZW4ocGVyZmlsZW5hbWUsICJyIikpKSB7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW50IGRhdGEgZmlsZSBleGlzdHMgc28gICAKICAgICAgICAgICAgICogbGV0J3MgcmVhZCBpdCBvdXQgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgIHBvcyA9IGNvdW50ZXIgPSBjY291bnRlciA9IDA7CgogICAgICAgICAgICBpZiAoZnNjYW5mKHBlcmZpbGUsICIlbHUgJWx1ICVsdSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgJnBvcywgJmNjb3VudGVyLCAmY291bnRlciwgbGFzdEZpbGVuYW1lKSkgewoKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICogdGhlIGRhdGEgY291bGQgYmUgcmVhZDsgbm93IGxldCdzICAgIAogICAgICAgICAgICAgICAgICogdHJ5IHRvIG9wZW4gdGhlICBsb2dmaWxlIHRvIGJlICAgICAgIAogICAgICAgICAgICAgICAgICogc2Nhbm5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgaWYgKGxvZ21hdGNoX3VwZGF0ZV9maWxlbmFtZShsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWVQYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RmlsZW5hbWUpID09IDApIHsKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZW5hbWUgaXMgc3RpbGwgdGhlIHNhbWUgYXMgCiAgICAgICAgICAgICAgICAgICAgICogdGhlIG9uZSBzdG9yZWQgaW4gdGhlIHBlcnNpc3RlbnQKICAgICAgICAgICAgICAgICAgICAgKiBkYXRhIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGlmICgobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUgPQogICAgICAgICAgICAgICAgICAgICAgICBmb3Blbihsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWUsICJyIikpKSB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbG9nIGZpbGUgY291bGQgYmUgb3BlbmVkOyBub3cgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGxldCdzIHRyeSB0byBzZXQgdGhlIHBvaW50ZXIgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnNlZWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwgcG9zLCBTRUVLX1NFVCkpIHsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBwb2ludGVyIGNvdWxkIGJlIHNldCAtIHRoaXMgaXMgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBtb3N0IHRoYXQgd2UgY2FuIGRvOiBpZiB0aGUgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBmaWxlICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemUgd2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgcG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0aWxsIHBvaW50cyB0byB3aGVyZSBpdCByZWFkIHRoZSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGUgbGFzdCB0aW1lOyBsZXQncyByZXN0b3JlIHRoZSAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gcG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjb3VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5nbG9iYWxNYXRjaENvdW50ZXIgPSBjb3VudGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmY2xvc2UocGVyZmlsZSk7CiAgICAgICAgfQoKICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0udmlyZ2luID0gRkFMU0U7CiAgICB9CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqIGNoZWNrIGlmIGEgbmV3IGlucHV0IGZpbGUgbmVlZHMgdG8gYmUgb3BlbmVkCiAgICAgKiBpZiB5ZXMsIHJlc2V0IGNvdW50ZXIgYW5kIHBvc2l0aW9uCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKi8KCiAgICBpZiAobG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZVBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSkgPT0gMSkgewogICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gMDsgCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIgPSAwOwogICAgfQoKCiAgICAvKgogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICogbm93IHRoZSBwb2ludGVyIGFuZCB0aGUgY291bnRlciBhcmUgIAogICAgICogc2V0IGVpdGhlciB6ZXJvIG9yIHJlc2V0IHRvIG9sZCAgICAgIAogICAgICogdmFsdWU7IG5vdyBsZXQncyB0cnkgdG8gcmVhZCBzb21lICAgIAogICAgICogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICovCgogICAgaWYgKHN0YXQobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lLCAmc2IpID09IDApIHsKCiAgICAgICAgaWYgKGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID4gc2Iuc3Rfc2l6ZSkgewogICAgICAgICAgICB0b29iaWcgPSBUUlVFOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRvb2JpZyA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgICAgaWYgKChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSA9CiAgICAgICAgICAgIGZvcGVuKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSwgInIiKSkpIHsKCiAgICAgICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgICAgICBmc2Vlayhsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwKICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uLCBTRUVLX1NFVCk7CgogICAgICAgICAgICBpZiAocmVzdWx0IHx8IHRvb2JpZyB8fCAoZXJybm8gPT0gRUlOVkFMKQogICAgICAgICAgICAgICAgfHwgZmVvZihsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSkpIHsKCgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAqIHdoZW4gd2UgYXJlIGhlcmUgdGhhdCBtZWFucyB3ZSAgICAgICAKICAgICAgICAgICAgICAgICAqIGNvdWxkJ3Qgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG1heWJlICAKICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlIHdhcyByb3RhdGVkOyBsZXQncyByZXNldCAgICAKICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlcG9pbnRlciwgYnV0IG5vdCB0aGUgY291bnRlciAKICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICBmc2Vlayhsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSwgMCwgU0VFS19TRVQpOwogICAgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IFRSVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChmZ2V0cwogICAgICAgICAgICAgICAgICAgKGluYnVmLCBzaXplb2YoaW5idWYpLCBsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSkpIHsKCiAgICAgICAgICAgICAgICBtYXRjaFJlc3VsdENvZGUgPQogICAgICAgICAgICAgICAgICAgIHJlZ2V4ZWMoJihsb2dtYXRjaFRhYmxlW2lpbmRleF0ucmVnZXhCdWZmZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYsIDAsIE5VTEwsIFJFR19OT1RFT0wpOwoKICAgICAgICAgICAgICAgIGlmIChtYXRjaFJlc3VsdENvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5nbG9iYWxNYXRjaENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5tYXRjaENvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPQogICAgICAgICAgICAgICAgZnRlbGwobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgICAgICBmY2xvc2UobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmxvZ2ZpbGUpOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqIGF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHNhZmUgdGhhdCAgICAKICAgICAqIG91ciBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgICAgICAgICAKICAgICAqIHN0cmFpZ2h0ZW5lZCBvdXQgby5rLiAtIHdlIG5ldmVyICAgICAKICAgICAqIGtub3cgaWYgdGhpcyBpcyB0aGUgbGFzdCB0aW1lIHdlIGFyZSAKICAgICAqIGJlaW5nIGNhbGxlZCBzbyBzYXZlIHRoZSBwb3NpdGlvbiAgICAKICAgICAqIGluIGEgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAqLwoKICAgIGlmIChhbnlDaGFuZ2VzICYmIChwZXJmaWxlID0gZm9wZW4ocGVyZmlsZW5hbWUsICJ3IikpKSB7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKiBvLmsuIGxldHMgd3JpdGUgb3V0IG91ciB2YXJpYWJsZSAgICAgCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqLwoKICAgICAgICBmcHJpbnRmKHBlcmZpbGUsICIlbHUgJWx1ICVsdSAlc1xuIiwKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRNYXRjaENvdW50ZXIsCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uZ2xvYmFsTWF0Y2hDb3VudGVyLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lKTsKCiAgICAgICAgZmNsb3NlKHBlcmZpbGUpOwogICAgfQoKfQoKCnN0YXRpYyB2b2lkCnVwZGF0ZUxvZ21hdGNoX1NjaGVkdWxlZCh1bnNpZ25lZCBpbnQgcmVnaXN0cmF0aW9uTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvZ21hdGNoc3RhdCAqbG9nbWF0Y2h0YWJsZSkKewogICAgdXBkYXRlTG9nbWF0Y2gobG9nbWF0Y2h0YWJsZS0+dGhpc0luZGV4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogbG9nbWF0Y2hfcGFyc2VfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBwYXJzZSBvbmUgbGluZSBmcm9tIHNubXBkLmNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCmxvZ21hdGNoX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY3B0cikKewoKICAgIGNoYXIgc3BhY2VfbmFtZTsKICAgIGNoYXIgc3BhY2VfcGF0aDsKCiAgICBpZiAobG9nbWF0Y2hDb3VudCA8IE1BWExPR01BVENIKSB7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPSAzMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnRoaXNJbmRleCA9IGxvZ21hdGNoQ291bnQ7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqIGJlIGNhcmVmdWwgdGhpcyBjb3VudGVyIG5lZWRzIHRvIGJlCiAgICAgICAgICogcmVzZXQgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5nbG9iYWxNYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uY3VycmVudE1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5tYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0udmlyZ2luID0gVFJVRTsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSAwOwoKCiAgICAgICAgLyoKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiBiZSBjYXJlZnVsOiB0aGUgZmxhZyAyNTUgbXVzdCBmaXQgdG8KICAgICAgICAgKiB0aGUgc2l6ZSBvZiByZWdFeCBhcyBkZWZpbmRlZCBpbgogICAgICAgICAqIGxvZ21hdGNoLmgKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgc3NjYW5mKGNwdHIsICIlMjU1cyVjJTI1NXMlYyAlZCAlMjU1Y1xuIiwKICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5uYW1lLAoJICAgICAgICZzcGFjZV9uYW1lLAogICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZpbGVuYW1lUGF0dGVybiwKCSAgICAgICAmc3BhY2VfcGF0aCwKICAgICAgICAgICAgICAgJihsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZyZXF1ZW5jeSksCiAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXgpOwoKICAgICAgICAvKiBmaWxsIGluIGZpbGVuYW1lIHdpdGggaW5pdGlhbCBkYXRhICovCiAgICAgICAgc3RyY3B5KGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUsCiAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWVQYXR0ZXJuKTsKICAgICAgICBsb2dtYXRjaF91cGRhdGVfZmlsZW5hbWUobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5maWxlbmFtZVBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUpOwoKCS8qCgkgKiBMb2cgYW4gZXJyb3IgdGhlbiByZXR1cm4gaWYgYW55IG9mIHRoZSBzdHJpbmdzIHNjYW5uZWQgaW4gd2VyZQoJICogbGFyZ2VyIHRoZW4gdGhleSBzaG91bGQgaGF2ZSBiZWVuLgoJICovCglpZiAoc3BhY2VfbmFtZSAhPSAnICcpIHsKCQlzbm1wX2xvZyhMT0dfRVJSLCAibG9nbWF0Y2hfcGFyc2VfY29uZmlnOiB0aGUgbmFtZSBzY2FubmVkICIgXAoJCSAiaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYgKHNwYWNlX3BhdGggIT0gJyAnKSB7CgkJc25tcF9sb2coTE9HX0VSUiwgImxvZ21hdGNoX3BhcnNlX2NvbmZpZzogdGhlIGZpbGUgbmFtZSAiIFwKCQkgInNjYW5uZWQgaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSAgICBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9CgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICoganVzdCB0byBiZSBzYWZlICJOVUxMIiB0aGUgZW5kIG9mCiAgICAgICAgICogdGhlIGFyYXJ5IHJlZ0V4IGFzIHNzY2FuZiB3b24ndCBkbwogICAgICAgICAqIGl0IHdpdGggdGhlICVjIG1vZGlmaWVyCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICovCgogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXhbMjU1XSA9ICdcMCc7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqIG5vdyBjb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5teVJlZ2V4RXJyb3IgPQogICAgICAgICAgICByZWdjb21wKCZsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnJlZ2V4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXgsCiAgICAgICAgICAgICAgICAgICAgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKTsKCiAgICAgICAgaWYgKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ubXlSZWdleEVycm9yKSB7CiAgICAgICAgICAgIGNoYXIgcmVnZXhFcnJvclN0cmluZ1sxMDBdOwogICAgICAgICAgICByZWdlcnJvcihsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLm15UmVnZXhFcnJvciwKICAgICAgICAgICAgICAgICAgICAgJmxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnZXhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgIHJlZ2V4RXJyb3JTdHJpbmcsIDEwMCk7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJDb3VsZCBub3QgcHJvY2VzcyB0aGUgbG9nbWF0Y2ggcmVnZXggLSAlcywiIFwKICAgICAgICAgICAgICAgICAgICAgIlxuIHNpbmNlIHJlZ2NvbXAoKSBmYWlsZWQgd2l0aCAtICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnJlZ0V4LCByZWdleEVycm9yU3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPiAwKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTk1QQWxhcm1DYWxsYmFjayAqKSB1cGRhdGVMb2dtYXRjaF9TY2hlZHVsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0pOwogICAgICAgIH0KCiAgICAgICAgbG9nbWF0Y2hDb3VudCsrOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBsb2dtYXRjaF9mcmVlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIG1pYiBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQKbG9nbWF0Y2hfZnJlZV9jb25maWcodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgLyoKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogdGhlIG9ubHkgbWVtb3J5IHdlIGhhdmUgYWxsb2NhdGVkCiAgICAgKiBpcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSByZWdjb21wCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCBsb2dtYXRjaENvdW50OyBpKyspIHsKICAgICAgICBpZiAobG9nbWF0Y2hUYWJsZVtpXS5teVJlZ2V4RXJyb3IgPT0gMCkKICAgICAgICAgICAgcmVnZnJlZSgmbG9nbWF0Y2hUYWJsZVtpXS5yZWdleEJ1ZmZlcik7CiAgICB9CiAgICBsb2dtYXRjaENvdW50ID0gMDsKfQoKCiNkZWZpbmUgTE9HTUFUQ0hfSU5GTyAgICAgICAwCiNkZWZpbmUgTE9HTUFUQ0hfSU5ERVggICAgICAxCiNkZWZpbmUgTE9HTUFUQ0hfTkFNRSAgICAgICAyCiNkZWZpbmUgTE9HTUFUQ0hfRklMRU5BTUUgICAzCiNkZWZpbmUgTE9HTUFUQ0hfUkVHRVggICAgICA0CiNkZWZpbmUgTE9HTUFUQ0hfR0xPQkFMQ1RSICA1CiNkZWZpbmUgTE9HTUFUQ0hfR0xPQkFMQ05UICA2CiNkZWZpbmUgTE9HTUFUQ0hfQ1VSUkVOVENUUiA3CiNkZWZpbmUgTE9HTUFUQ0hfQ1VSUkVOVENOVCA4CiNkZWZpbmUgTE9HTUFUQ0hfQ09VTlRFUiAgICA5CiNkZWZpbmUgTE9HTUFUQ0hfQ09VTlQgICAgICAxMAojZGVmaW5lIExPR01BVENIX0ZSRVEgICAgICAgMTEKI2RlZmluZSBMT0dNQVRDSF9FUlJPUiAgICAgIDEwMAojZGVmaW5lIExPR01BVENIX01TRyAgICAgICAgMTAxCgovKgogKiBPSUQgZnVuY3Rpb25zIAogKi8KCnN0YXRpYyB1X2NoYXIgKgp2YXJfbG9nbWF0Y2hfdGFibGUoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0YXRpYyBjaGFyICAgICBtZXNzYWdlWzEwMjRdOwogICAgaW50ICAgICAgICAgICAgIGlpbmRleDsKICAgIHN0cnVjdCBsb2dtYXRjaHN0YXQgKmxvZ21hdGNoOwoKICAgIGlmICh2cC0+bWFnaWMgPT0gTE9HTUFUQ0hfSU5GTykgewogICAgICAgIGlmIChoZWFkZXJfZ2VuZXJpYyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKQogICAgICAgICAgICA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgICAgICh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kLAogICAgICAgICAgICAgbG9nbWF0Y2hDb3VudCkpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CgogICAgICAgIGlpbmRleCA9IG5hbWVbKmxlbmd0aCAtIDFdIC0gMTsKICAgICAgICBsb2dtYXRjaCA9ICZsb2dtYXRjaFRhYmxlW2lpbmRleF07CgogICAgICAgIGlmIChsb2dtYXRjaC0+bXlSZWdleEVycm9yID09IDApCiAgICAgICAgICAgIHVwZGF0ZUxvZ21hdGNoKGlpbmRleCk7CiAgICB9CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTE9HTUFUQ0hfSU5GTzoKICAgICAgICBsb25nX3JldCA9IE1BWExPR01BVENIOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9JTkRFWDoKICAgICAgICBsb25nX3JldCA9IGlpbmRleCArIDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX05BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obG9nbWF0Y2gtPm5hbWUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGxvZ21hdGNoLT5uYW1lOwoKICAgIGNhc2UgTE9HTUFUQ0hfRklMRU5BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obG9nbWF0Y2gtPmZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBsb2dtYXRjaC0+ZmlsZW5hbWU7CgogICAgY2FzZSBMT0dNQVRDSF9SRUdFWDoKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihsb2dtYXRjaC0+cmVnRXgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGxvZ21hdGNoLT5yZWdFeDsKCiAgICBjYXNlIExPR01BVENIX0dMT0JBTENUUjoKICAgIGNhc2UgTE9HTUFUQ0hfR0xPQkFMQ05UOgogICAgICAgIGxvbmdfcmV0ID0gKGxvZ21hdGNoLT5nbG9iYWxNYXRjaENvdW50ZXIpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9DVVJSRU5UQ1RSOgogICAgY2FzZSBMT0dNQVRDSF9DVVJSRU5UQ05UOgogICAgICAgIGxvbmdfcmV0ID0gKGxvZ21hdGNoLT5jdXJyZW50TWF0Y2hDb3VudGVyKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfQ09VTlRFUjoKICAgIGNhc2UgTE9HTUFUQ0hfQ09VTlQ6CiAgICAgICAgbG9uZ19yZXQgPSAobG9nbWF0Y2gtPm1hdGNoQ291bnRlcik7CiAgICAgICAgbG9nbWF0Y2gtPm1hdGNoQ291bnRlciA9IDA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0ZSRVE6CiAgICAgICAgbG9uZ19yZXQgPSBsb2dtYXRjaC0+ZnJlcXVlbmN5OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9FUlJPUjoKICAgICAgICBpZiAobG9nbWF0Y2gtPmZyZXF1ZW5jeSA+PSAwICYmIGxvZ21hdGNoLT5teVJlZ2V4RXJyb3IgPT0gMCkKICAgICAgICAgICAgbG9uZ19yZXQgPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXQgPSAxOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfTVNHOgoKICAgICAgICByZWdlcnJvcihsb2dtYXRjaC0+bXlSZWdleEVycm9yLCAmKGxvZ21hdGNoLT5yZWdleEJ1ZmZlciksIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lc3NhZ2UpKTsKCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obWVzc2FnZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbWVzc2FnZTsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfbG9nbWF0Y2hfdGFibGVcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKaW5pdF9sb2dtYXRjaCh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUyIGxvZ21hdGNoX2luZm9bXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5GTywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDB9CiAgICB9OwoKICAgIHN0cnVjdCB2YXJpYWJsZTIgbG9nbWF0Y2hfdGFibGVbXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MX19LAogICAgICAgIHtMT0dNQVRDSF9OQU1FLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7Mn19LAogICAgICAgIHtMT0dNQVRDSF9GSUxFTkFNRSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezN9fSwKICAgICAgICB7TE9HTUFUQ0hfUkVHRVgsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs0fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENUUiwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs1fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENOVCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs2fX0sCiAgICAgICAge0xPR01BVENIX0NVUlJFTlRDVFIsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7N319LAogICAgICAgIHtMT0dNQVRDSF9DVVJSRU5UQ05ULCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezh9fSwKICAgICAgICB7TE9HTUFUQ0hfQ09VTlRFUiwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs5fX0sCiAgICAgICAge0xPR01BVENIX0NPVU5ULCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwfX0sCiAgICAgICAge0xPR01BVENIX0ZSRVEsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTF9fSwKICAgICAgICB7TE9HTUFUQ0hfRVJST1IsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTAwfX0sCiAgICAgICAge0xPR01BVENIX01TRywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwMX19CiAgICB9OwoKICAgIC8qCiAgICAgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICAgICAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGgKICAgICAqLwogICAgb2lkICAgICAgICAgICAgIGxvZ21hdGNoX2luZm9fb2lkW10gPSB7IE5FVFNOTVBfVUNEQVZJU19NSUIsIDE2LCAxIH07CiAgICBvaWQgICAgICAgICAgICAgbG9nbWF0Y2hfdmFyaWFibGVzX29pZFtdID0geyBORVRTTk1QX1VDREFWSVNfTUlCLCAxNiwgMiwgMSB9OwoKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZQogICAgICovCiAgICBSRUdJU1RFUl9NSUIoInVjZC1zbm1wL2xvZ21hdGNoIiwgbG9nbWF0Y2hfaW5mbywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGxvZ21hdGNoX2luZm9fb2lkKTsKICAgIFJFR0lTVEVSX01JQigidWNkLXNubXAvbG9nbWF0Y2giLCBsb2dtYXRjaF90YWJsZSwgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGxvZ21hdGNoX3ZhcmlhYmxlc19vaWQpOwoKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJsb2dtYXRjaCIsIGxvZ21hdGNoX3BhcnNlX2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoX2ZyZWVfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ21hdGNoIG5hbWUgcGF0aCBjeWNsZXRpbWUgcmVnZXgiKTsKCn0KCiNlbmRpZiAvKiBIQVZFX1JFR0VYX0ggKi8K