LyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCiNpbmNsdWRlICJjYWNoZS5oIgojaW5jbHVkZSA8bGltaXRzLmg+CgovKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLwpweXNxbGl0ZV9Ob2RlKiBweXNxbGl0ZV9uZXdfbm9kZShQeU9iamVjdCoga2V5LCBQeU9iamVjdCogZGF0YSkKewogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsKCiAgICBub2RlID0gKHB5c3FsaXRlX05vZGUqKSAocHlzcWxpdGVfTm9kZVR5cGUudHBfYWxsb2MoJnB5c3FsaXRlX05vZGVUeXBlLCAwKSk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBQeV9JTkNSRUYoa2V5KTsKICAgIG5vZGUtPmtleSA9IGtleTsKCiAgICBQeV9JTkNSRUYoZGF0YSk7CiAgICBub2RlLT5kYXRhID0gZGF0YTsKCiAgICBub2RlLT5wcmV2ID0gTlVMTDsKICAgIG5vZGUtPm5leHQgPSBOVUxMOwoKICAgIHJldHVybiBub2RlOwp9Cgp2b2lkIHB5c3FsaXRlX25vZGVfZGVhbGxvYyhweXNxbGl0ZV9Ob2RlKiBzZWxmKQp7CiAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKICAgIFB5X0RFQ1JFRihzZWxmLT5kYXRhKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCmludCBweXNxbGl0ZV9jYWNoZV9pbml0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgUHlPYmplY3QqIGZhY3Rvcnk7CiAgICBpbnQgc2l6ZSA9IDEwOwoKICAgIHNlbGYtPmZhY3RvcnkgPSBOVUxMOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpIiwgJmZhY3RvcnksICZzaXplKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBtaW5pbXVtIGNhY2hlIHNpemUgaXMgNSBlbnRyaWVzICovCiAgICBpZiAoc2l6ZSA8IDUpIHsKICAgICAgICBzaXplID0gNTsKICAgIH0KICAgIHNlbGYtPnNpemUgPSBzaXplOwogICAgc2VsZi0+Zmlyc3QgPSBOVUxMOwogICAgc2VsZi0+bGFzdCA9IE5VTEw7CgogICAgc2VsZi0+bWFwcGluZyA9IFB5RGljdF9OZXcoKTsKICAgIGlmICghc2VsZi0+bWFwcGluZykgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBQeV9JTkNSRUYoZmFjdG9yeSk7CiAgICBzZWxmLT5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICBzZWxmLT5kZWNyZWZfZmFjdG9yeSA9IDE7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgcHlzcWxpdGVfY2FjaGVfZGVhbGxvYyhweXNxbGl0ZV9DYWNoZSogc2VsZikKewogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsKICAgIHB5c3FsaXRlX05vZGUqIGRlbGV0ZV9ub2RlOwoKICAgIGlmICghc2VsZi0+ZmFjdG9yeSkgewogICAgICAgIC8qIGNvbnN0cnVjdG9yIGZhaWxlZCwganVzdCBnZXQgb3V0IG9mIGhlcmUgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogaXRlcmF0ZSBvdmVyIGFsbCBub2RlcyBhbmQgZGVhbGxvY2F0ZSB0aGVtICovCiAgICBub2RlID0gc2VsZi0+Zmlyc3Q7CiAgICB3aGlsZSAobm9kZSkgewogICAgICAgIGRlbGV0ZV9ub2RlID0gbm9kZTsKICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKICAgICAgICBQeV9ERUNSRUYoZGVsZXRlX25vZGUpOwogICAgfQoKICAgIGlmIChzZWxmLT5kZWNyZWZfZmFjdG9yeSkgewogICAgICAgIFB5X0RFQ1JFRihzZWxmLT5mYWN0b3J5KTsKICAgIH0KICAgIFB5X0RFQ1JFRihzZWxmLT5tYXBwaW5nKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9jYWNoZV9nZXQocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBQeU9iamVjdCoga2V5ID0gYXJnczsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CiAgICBweXNxbGl0ZV9Ob2RlKiBwdHI7CiAgICBQeU9iamVjdCogZGF0YTsKCiAgICBub2RlID0gKHB5c3FsaXRlX05vZGUqKVB5RGljdF9HZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSk7CiAgICBpZiAobm9kZSkgewogICAgICAgIC8qIGFuIGVudHJ5IGZvciB0aGlzIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2FjaGUgKi8KCiAgICAgICAgLyogaW5jcmVhc2UgdXNhZ2UgY291bnRlciBvZiB0aGUgbm9kZSBmb3VuZCAqLwogICAgICAgIGlmIChub2RlLT5jb3VudCA8IExPTkdfTUFYKSB7CiAgICAgICAgICAgIG5vZGUtPmNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAvKiBpZiBuZWNlc3NhcnksIHJlb3JkZXIgZW50cmllcyBpbiB0aGUgY2FjaGUgYnkgc3dhcHBpbmcgcG9zaXRpb25zICovCiAgICAgICAgaWYgKG5vZGUtPnByZXYgJiYgbm9kZS0+Y291bnQgPiBub2RlLT5wcmV2LT5jb3VudCkgewogICAgICAgICAgICBwdHIgPSBub2RlLT5wcmV2OwoKICAgICAgICAgICAgd2hpbGUgKHB0ci0+cHJldiAmJiBub2RlLT5jb3VudCA+IHB0ci0+cHJldi0+Y291bnQpIHsKICAgICAgICAgICAgICAgIHB0ciA9IHB0ci0+cHJldjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG5vZGUtPm5leHQpIHsKICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGUtPnByZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsKICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdHItPnByZXYpIHsKICAgICAgICAgICAgICAgIHB0ci0+cHJldi0+bmV4dCA9IG5vZGU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5vZGUtPm5leHQgPSBwdHI7CiAgICAgICAgICAgIG5vZGUtPnByZXYgPSBwdHItPnByZXY7CiAgICAgICAgICAgIGlmICghbm9kZS0+cHJldikgewogICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB0ci0+cHJldiA9IG5vZGU7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBrZXkgaW4gdGhlIGNhY2hlLCB5ZXQuIFdlJ2xsIGluc2VydCBhIG5ldwogICAgICAgICAqIGVudHJ5IGluIHRoZSBjYWNoZSwgYW5kIG1ha2Ugc3BhY2UgaWYgbmVjZXNzYXJ5IGJ5IHRocm93aW5nIHRoZQogICAgICAgICAqIGxlYXN0IHVzZWQgaXRlbSBvdXQgb2YgdGhlIGNhY2hlLiAqLwoKICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgewogICAgICAgICAgICBpZiAoc2VsZi0+bGFzdCkgewogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYtPmxhc3Q7CgogICAgICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPm1hcHBpbmcsIHNlbGYtPmxhc3QtPmtleSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZS0+cHJldjsKICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOwoKICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5mYWN0b3J5LCAiTyIsIGtleSk7CgogICAgICAgIGlmICghZGF0YSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIG5vZGUgPSBweXNxbGl0ZV9uZXdfbm9kZShrZXksIGRhdGEpOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgbm9kZS0+cHJldiA9IHNlbGYtPmxhc3Q7CgogICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKCiAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSwgKFB5T2JqZWN0Kilub2RlKSAhPSAwKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2VsZi0+bGFzdCkgewogICAgICAgICAgICBzZWxmLT5sYXN0LT5uZXh0ID0gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7CiAgICAgICAgfQogICAgICAgIHNlbGYtPmxhc3QgPSBub2RlOwogICAgfQoKICAgIFB5X0lOQ1JFRihub2RlLT5kYXRhKTsKICAgIHJldHVybiBub2RlLT5kYXRhOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZGlzcGxheShweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHB5c3FsaXRlX05vZGUqIHB0cjsKICAgIFB5T2JqZWN0KiBwcmV2a2V5OwogICAgUHlPYmplY3QqIG5leHRrZXk7CiAgICBQeU9iamVjdCogZm10X2FyZ3M7CiAgICBQeU9iamVjdCogdGVtcGxhdGU7CiAgICBQeU9iamVjdCogZGlzcGxheV9zdHI7CgogICAgcHRyID0gc2VsZi0+Zmlyc3Q7CgogICAgd2hpbGUgKHB0cikgewogICAgICAgIGlmIChwdHItPnByZXYpIHsKICAgICAgICAgICAgcHJldmtleSA9IHB0ci0+cHJldi0+a2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZrZXkgPSBQeV9Ob25lOwogICAgICAgIH0KICAgICAgICBQeV9JTkNSRUYocHJldmtleSk7CgogICAgICAgIGlmIChwdHItPm5leHQpIHsKICAgICAgICAgICAgbmV4dGtleSA9IHB0ci0+bmV4dC0+a2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5leHRrZXkgPSBQeV9Ob25lOwogICAgICAgIH0KICAgICAgICBQeV9JTkNSRUYobmV4dGtleSk7CgogICAgICAgIGZtdF9hcmdzID0gUHlfQnVpbGRWYWx1ZSgiT09PIiwgcHJldmtleSwgcHRyLT5rZXksIG5leHRrZXkpOwogICAgICAgIGlmICghZm10X2FyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiVzIDwtICVzIC0+JXNcbiIpOwogICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGZtdF9hcmdzKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGRpc3BsYXlfc3RyID0gUHlVbmljb2RlX0Zvcm1hdCh0ZW1wbGF0ZSwgZm10X2FyZ3MpOwogICAgICAgIFB5X0RFQ1JFRih0ZW1wbGF0ZSk7CiAgICAgICAgUHlfREVDUkVGKGZtdF9hcmdzKTsKICAgICAgICBpZiAoIWRpc3BsYXlfc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBQeU9iamVjdF9QcmludChkaXNwbGF5X3N0ciwgc3Rkb3V0LCBQeV9QUklOVF9SQVcpOwogICAgICAgIFB5X0RFQ1JFRihkaXNwbGF5X3N0cik7CgogICAgICAgIFB5X0RFQ1JFRihwcmV2a2V5KTsKICAgICAgICBQeV9ERUNSRUYobmV4dGtleSk7CgogICAgICAgIHB0ciA9IHB0ci0+bmV4dDsKICAgIH0KCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKICAgIHsiZ2V0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2NhY2hlX2dldCwgTUVUSF9PLAogICAgICAgIFB5RG9jX1NUUigiR2V0cyBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZSBvciBjYWxscyB0aGUgZmFjdG9yeSBmdW5jdGlvbiB0byBwcm9kdWNlIG9uZS4iKX0sCiAgICB7ImRpc3BsYXkiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY2FjaGVfZGlzcGxheSwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJGb3IgZGVidWdnaW5nIG9ubHkuIil9LAogICAge05VTEwsIE5VTEx9Cn07CgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfTm9kZVR5cGUgPSB7CiAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgICAgTU9EVUxFX05BTUUgIk5vZGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgICAgIHNpemVvZihweXNxbGl0ZV9Ob2RlKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgICAgKGRlc3RydWN0b3IpcHlzcWxpdGVfbm9kZV9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ2FjaGVUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuQ2FjaGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX2NhY2hlX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVzZXJ2ZWQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIGNhY2hlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX2NhY2hlX2luaXQsICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKZXh0ZXJuIGludCBweXNxbGl0ZV9jYWNoZV9zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBpbnQgcmM7CgogICAgcHlzcWxpdGVfTm9kZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CiAgICBweXNxbGl0ZV9DYWNoZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CgogICAgcmMgPSBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX05vZGVUeXBlKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICByZXR1cm4gcmM7CiAgICB9CgogICAgcmMgPSBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX0NhY2hlVHlwZSk7CiAgICByZXR1cm4gcmM7Cn0K