LyogR0xJQiAtIExpYnJhcnkgb2YgdXNlZnVsIHJvdXRpbmVzIGZvciBDIHByb2dyYW1taW5nCiAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQZXRlciBNYXR0aXMsIFNwZW5jZXIgS2ltYmFsbCBhbmQgSm9zaCBNYWNEb25hbGQKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICovCgovKgogKiBNb2RpZmllZCBieSB0aGUgR0xpYiBUZWFtIGFuZCBvdGhlcnMgMTk5Ny0yMDAwLiAgU2VlIHRoZSBBVVRIT1JTCiAqIGZpbGUgZm9yIGEgbGlzdCBvZiBwZW9wbGUgb24gdGhlIEdMaWIgVGVhbS4gIFNlZSB0aGUgQ2hhbmdlTG9nCiAqIGZpbGVzIGZvciBhIGxpc3Qgb2YgY2hhbmdlcy4gIFRoZXNlIGZpbGVzIGFyZSBkaXN0cmlidXRlZCB3aXRoCiAqIEdMaWIgYXQgZnRwOi8vZnRwLmd0ay5vcmcvcHViL2d0ay8uIAogKi8KCiN1bmRlZiBHX0RJU0FCTEVfQVNTRVJUCiN1bmRlZiBHX0xPR19ET01BSU4KCiNpbmNsdWRlIDxnbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0CnsKICBjaGFyICpmaWxlbmFtZTsKICBjaGFyICpob3N0bmFtZTsKICBjaGFyICpleHBlY3RlZF9yZXN1bHQ7CiAgR0NvbnZlcnRFcnJvciBleHBlY3RlZF9lcnJvcjsgLyogSWYgZmFpbGVkICovCn0gIFRvVXJpVGVzdDsKClRvVXJpVGVzdAp0b191cmlfdGVzdHNbXSA9IHsKICB7ICIvZXRjIiwgTlVMTCwgImZpbGU6Ly8vZXRjIn0sCiAgeyAiL2V0YyIsICIiLCAiZmlsZTovLy9ldGMifSwKICB7ICIvZXRjIiwgImxvY2FsaG9zdCIsICJmaWxlOi8vbG9jYWxob3N0L2V0YyJ9LAogIHsgIi9ldGMiLCAib3RoZXJob3N0IiwgImZpbGU6Ly9vdGhlcmhvc3QvZXRjIn0sCiNpZmRlZiBHX09TX1dJTjMyCiAgeyAiYzpcXHdpbmRvd3MiLCBOVUxMLCAiZmlsZTovLy9jOlxcd2luZG93cyJ9LCAvKiB0aGVzZSAzIHRlc3RzIGFsbW9zdCBjZXJ0YWlubHkgZmFpbCAqLwogIHsgImM6XFx3aW5kb3dzIiwgImxvY2FsaG9zdCIsICJmaWxlOi8vbG9jYWxob3N0L2M6XFx3aW5kb3dzIn0sCiAgeyAiYzpcXHdpbmRvd3MiLCAib3RoZXJob3N0IiwgImZpbGU6Ly9vdGhlcmhvc3QvYzpcXHdpbmRvd3MifSwKI2Vsc2UKICB7ICJjOlxcd2luZG93cyIsIE5VTEwsIE5VTEwsIEdfQ09OVkVSVF9FUlJPUl9OT1RfQUJTT0xVVEVfUEFUSH0sIC8qIGl0J3MgaW1wb3J0YW50IHRvIGdldCB0aGlzIGVycm9yIG9uIFVuaXggKi8KICB7ICJjOlxcd2luZG93cyIsICJsb2NhbGhvc3QiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgImM6XFx3aW5kb3dzIiwgIm90aGVyaG9zdCIsIE5VTEwsIEdfQ09OVkVSVF9FUlJPUl9OT1RfQUJTT0xVVEVfUEFUSH0sCiNlbmRpZgogIHsgImV0YyIsICJsb2NhbGhvc3QiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgIi9ldGMv9uTlIiwgTlVMTCwgTlVMTCwgR19DT05WRVJUX0VSUk9SX0lMTEVHQUxfU0VRVUVOQ0V9LAogIHsgIi9ldGMvw7bDpMOlIiwgTlVMTCwgImZpbGU6Ly8vZXRjLyVDMyVCNiVDMyVBNCVDMyVBNSJ9LAogIHsgIi9ldGMiLCAiw7bDpMOlIiwgImZpbGU6Ly8lQzMlQjYlQzMlQTQlQzMlQTUvZXRjIn0sCiAgeyAiL2V0YyIsICLl5PYiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfSUxMRUdBTF9TRVFVRU5DRX0sCiAgeyAiL2V0Yy9maWxlIHdpdGggIyUiLCBOVUxMLCAiZmlsZTovLy9ldGMvZmlsZSUyMHdpdGglMjAlMjMlMjUifSwKICB7ICIiLCBOVUxMLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgIiIsICIiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgIiIsICJsb2NhbGhvc3QiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgIiIsICJvdGhlcmhvc3QiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfTk9UX0FCU09MVVRFX1BBVEh9LAogIHsgIi8wMTIzNDU2Nzg5IiwgTlVMTCwgImZpbGU6Ly8vMDEyMzQ1Njc4OSJ9LAogIHsgIi9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsIE5VTEwsICJmaWxlOi8vL0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIn0sCiAgeyAiL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgTlVMTCwgImZpbGU6Ly8vYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoifSwKICB7ICIvLV8uIX4qJygpIiwgTlVMTCwgImZpbGU6Ly8vLV8uIX4qJygpIn0sCiAgeyAiL1wiIyU8PltcXF1eYHt8fVx4N0YiLCBOVUxMLCAiZmlsZTovLy8lMjIlMjMlMjUlM0MlM0UlNUIlNUMlNUQlNUUlNjAlN0IlN0MlN0QlN0YifSwKICB7ICIvO0ArJCwiLCBOVUxMLCAiZmlsZTovLy8lM0IlNDAlMkIlMjQlMkMifSwKICB7ICIvOiIsIE5VTEwsICJmaWxlOi8vLzoifSwgLyogbm90IGVzY2FwZWQgZXZlbiB0aG91Z2ggcmVzZXJ2ZWQgYXMgc2lkZSBlZmZlY3Qgb2YgRE9TIHN1cHBvcnQgLS0gaXMgdGhhdCByZWFsbHkgd2hhdCB3ZSB3YW50IG9uIFVuaXg/ICovCiAgeyAiLz8mPSIsIE5VTEwsICJmaWxlOi8vLz8mPSJ9LCAvKiB0aGVzZSBhcmUgbm90IGVzY2FwZWQgYW5kIG90aGVyIHJlc2VydmVkIGNoYXJhY3RlcnMgYXJlIC0tIGlzIHRoYXQgcmVhbGx5IHdoYXQgd2Ugd2FudD8gKi8KICB7ICIvIiwgIjAxMjM0NTY3ODkiLCAiZmlsZTovLzAxMjM0NTY3ODkvIn0sCiAgeyAiLyIsICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsICJmaWxlOi8vQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovIn0sCiAgeyAiLyIsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsICJmaWxlOi8vYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIn0sCiAgeyAiLyIsICItXy4hfionKCkiLCAiZmlsZTovLy1fLiF+KicoKS8ifSwKICB7ICIvIiwgIlwiIyU8PltcXF1eYHt8fVx4N0YiLCAiZmlsZTovLyUyMiUyMyUyNSUzQyUzRSU1QiU1QyU1RCU1RSU2MCU3QiU3QyU3RCU3Ri8ifSwKICB7ICIvIiwgIjs/Jj0rJCwiLCAiZmlsZTovLyUzQiUzRiUyNiUzRCUyQiUyNCUyQy8ifSwKICB7ICIvIiwgIi8iLCAiZmlsZTovLy8vIn0sIC8qIHNob3VsZCBiZSAiZmlsZTovLyUyRi8iIG9yIGFuIGVycm9yICovCiAgeyAiLyIsICJAOiIsICJmaWxlOi8vQDovIn0sIC8qIHRoZXNlIGFyZSBub3QgZXNjYXBlZCBhbmQgb3RoZXIgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhcmUgLS0gaXMgdGhhdCByZWFsbHkgd2hhdCB3ZSB3YW50PyAqLwogIHsgIi8iLCAiXHg4MFx4RkYiLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfSUxMRUdBTF9TRVFVRU5DRX0sCiAgeyAiLyIsICJceEMzXHg4MFx4QzNceEJGIiwgImZpbGU6Ly8lQzMlODAlQzMlQkYvIn0sCn07CgoKdHlwZWRlZiBzdHJ1Y3QKewogIGNoYXIgKnVyaTsKICBjaGFyICpleHBlY3RlZF9maWxlbmFtZTsKICBjaGFyICpleHBlY3RlZF9ob3N0bmFtZTsKICBHQ29udmVydEVycm9yIGV4cGVjdGVkX2Vycm9yOyAvKiBJZiBmYWlsZWQgKi8KfSAgRnJvbVVyaVRlc3Q7CgpGcm9tVXJpVGVzdApmcm9tX3VyaV90ZXN0c1tdID0gewogIHsgImZpbGU6Ly8vZXRjIiwgIi9ldGMifSwKICB7ICJmaWxlOi9ldGMiLCAiL2V0YyJ9LAogIHsgImZpbGU6Ly9sb2NhbGhvc3QvZXRjIiwgIi9ldGMiLCAibG9jYWxob3N0In0sCiAgeyAiZmlsZTovL2xvY2FsaG9zdC9ldGMvJTIzJTI1JTIwZmlsZSIsICIvZXRjLyMlIGZpbGUiLCAibG9jYWxob3N0In0sCiAgeyAiZmlsZTovL290aGVyaG9zdC9ldGMiLCAiL2V0YyIsICJvdGhlcmhvc3QifSwKICB7ICJmaWxlOi8vb3RoZXJob3N0L2V0Yy8lMjMlMjUlMjBmaWxlIiwgIi9ldGMvIyUgZmlsZSIsICJvdGhlcmhvc3QifSwKICB7ICJmaWxlOi8vJUMzJUI2JUMzJUE0JUMzJUE1L2V0YyIsICIvZXRjIiwgIsO2w6TDpSJ9LAogIHsgImZpbGU6Ly8vL2V0Yy8lQzMlQjYlQzMlQzMlQzMlQTUiLCBOVUxMLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfQkFEX1VSSX0sCiAgeyAiZmlsZTovL2xvY2FsaG9zdC/l5PYiLCBOVUxMLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfQkFEX1VSSX0sCiAgeyAiZmlsZTovL+Xk9i9ldGMiLCBOVUxMLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfQkFEX1VSSX0sCiAgeyAiZmlsZTovLy9zb21lL2ZpbGUjYmFkIiwgTlVMTCwgTlVMTCwgR19DT05WRVJUX0VSUk9SX0JBRF9VUkl9LAogIHsgImZpbGU6Ly9zb21lIiwgTlVMTCwgTlVMTCwgR19DT05WRVJUX0VSUk9SX0JBRF9VUkl9LAogIHsgIiIsIE5VTEwsIE5VTEwsIEdfQ09OVkVSVF9FUlJPUl9CQURfVVJJfSwKICB7ICJmaWxlOnRlc3QiLCBOVUxMLCBOVUxMLCBHX0NPTlZFUlRfRVJST1JfQkFEX1VSSX0sCiAgeyAiaHR0cDovL3d3dy55YWhvby5jb20vIiwgTlVMTCwgTlVMTCwgR19DT05WRVJUX0VSUk9SX0JBRF9VUkl9LAogIHsgImZpbGU6Ly8vL2V0YyIsICIvZXRjIn0sIC8qIHNob3VsZCBiZSAiLy9ldGMiIC0tIG1pc3Rha2UgaW4gY29kZSBmb3IgRE9TIHJlc3VsdHMgaW4gZHJvcHBlZCBzbGFzaCAqLwogIHsgImZpbGU6Ly8vLy9ldGMiLCAiLy9ldGMifSwgLyogc2hvdWxkIGJlICIvLy9ldGMiIC0tIG1pc3Rha2UgaW4gY29kZSBmb3IgRE9TIHJlc3VsdHMgaW4gZHJvcHBlZCBzbGFzaCAqLwogIHsgImZpbGU6Ly8vYzpcXGZvbyIsICIvYzpcXGZvbyJ9LCAvKiBzaG91bGQgYmUgImM6XFxmb28iIG9uIERPUyBwZXJoYXBzLCBidXQgdGhhdCB3b3VsZCBiZSBiYWQgZm9yIFVuaXggKi8KICB7ICJmaWxlOi8vL2M6L2ZvbyIsICIvYzovZm9vIn0sIC8qIHNob3VsZCBiZSAiYzovZm9vIiBvbiBET1MgcGVyaGFwcywgYnV0IHRoYXQgd291bGQgYmUgYmFkIGZvciBVbml4ICovCiAgeyAiZmlsZTovLy8vYzovZm9vIiwgIi9jOi9mb28ifSwgLyogc2hvdWxkIGJlICIvL2M6L2ZvbyIgb24gVW5peCAqLwogIHsgImZpbGU6Ly8wMTIzNDU2Nzg5LyIsICIvIiwgIjAxMjM0NTY3ODkifSwKICB7ICJmaWxlOi8vQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovIiwgIi8iLCAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoifSwKICB7ICJmaWxlOi8vYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIiwgIi8iLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoifSwKICB7ICJmaWxlOi8vLV8uIX4qJygpLyIsICIvIiwgIi1fLiF+KicoKSJ9LAogIHsgImZpbGU6Ly9cIjw+W1xcXV5ge3x9XHg3Ri8iLCAiLyIsICJcIjw+W1xcXV5ge3x9XHg3RiJ9LAogIHsgImZpbGU6Ly87PyY9KyQsLyIsICIvIiwgIjs/Jj0rJCwifSwKICB7ICJmaWxlOi8vJUMzJTgwJUMzJUJGLyIsICIvIiwgIlx4QzNceDgwXHhDM1x4QkYifSwKICB7ICJmaWxlOi8vQC8iLCAiLyIsICJAIn0sCiAgeyAiZmlsZTovLzovIiwgIi8iLCAiOiJ9LAogIHsgImZpbGU6Ly8jLyIsIE5VTEwsIE5VTEwsIEdfQ09OVkVSVF9FUlJPUl9CQURfVVJJfSwKICB7ICJmaWxlOi8vJTIzLyIsICIvIiwgIiMifSwgLyogaXMgaXQgZGFuZ2Vyb3VzIHRvIHJldHVybiBhIGhvc3RuYW1lIHdpdGggYSAiIyIgY2hhcmFjdGVyIGluIGl0PyAqLwogIHsgImZpbGU6Ly8lMkYvIiwgIi8iLCAiLyJ9LCAvKiBpcyBpdCBkYW5nZXJvdXMgdG8gcmV0dXJuIGEgaG9zdG5hbWUgd2l0aCBhICIvIiBjaGFyYWN0ZXIgaW4gaXQ/ICovCn07CgoKc3RhdGljIGdib29sZWFuIGFueV9mYWlsZWQgPSBGQUxTRTsKCnN0YXRpYyB2b2lkCnJ1bl90b191cmlfdGVzdHMgKHZvaWQpCnsKICBpbnQgaTsKICBnY2hhciAqcmVzOwogIEdFcnJvciAqZXJyb3I7CiAgCiAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodG9fdXJpX3Rlc3RzKTsgaSsrKQogICAgewogICAgICBlcnJvciA9IE5VTEw7CiAgICAgIHJlcyA9IGdfZmlsZW5hbWVfdG9fdXJpICh0b191cmlfdGVzdHNbaV0uZmlsZW5hbWUsCgkJCSAgICAgICB0b191cmlfdGVzdHNbaV0uaG9zdG5hbWUsCgkJCSAgICAgICAmZXJyb3IpOwoKICAgICAgaWYgKHRvX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9yZXN1bHQgPT0gTlVMTCkKCXsKCSAgaWYgKHJlcyAhPSBOVUxMKQoJICAgIHsKCSAgICAgIGdfcHJpbnQgKCJcbmdfZmlsZW5hbWVfdG9fdXJpKCkgdGVzdCAlZCBmYWlsZWQsIGV4cGVjdGVkIHRvIHJldHVybiBOVUxMLCBhY3R1YWwgcmVzdWx0OiAlc1xuIiwgaSwgcmVzKTsKCSAgICAgIGFueV9mYWlsZWQgPSBUUlVFOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIGlmIChlcnJvciA9PSBOVUxMKQoJCXsKCQkgIGdfcHJpbnQgKCJcbmdfZmlsZW5hbWVfdG9fdXJpKCkgdGVzdCAlZCBmYWlsZWQsIHJldHVybmVkIE5VTEwsIGJ1dCBkaWRuJ3Qgc2V0IGVycm9yXG4iLCBpKTsKCQkgIGFueV9mYWlsZWQgPSBUUlVFOwoJCX0KCSAgICAgIGVsc2UgaWYgKGVycm9yLT5kb21haW4gIT0gR19DT05WRVJUX0VSUk9SKQoJCXsKCQkgIGdfcHJpbnQgKCJcbmdfZmlsZW5hbWVfdG9fdXJpKCkgdGVzdCAlZCBmYWlsZWQsIHJldHVybmVkIE5VTEwsIHNldCBub24gR19DT05WRVJUX0VSUk9SIGVycm9yXG4iLCBpKTsKCQkgIGFueV9mYWlsZWQgPSBUUlVFOwoJCX0KCSAgICAgIGVsc2UgaWYgKGVycm9yLT5jb2RlICE9IHRvX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9lcnJvcikKCQl7CgkJICBnX3ByaW50ICgiXG5nX2ZpbGVuYW1lX3RvX3VyaSgpIHRlc3QgJWQgZmFpbGVkIGFzIGV4cGVjdGVkLCBidXQgc2V0IHdyb25nIGVycm9yY29kZSAlZCBpbnN0ZWFkIG9mIGV4cGVjdGVkICVkIFxuIiwKCQkJICAgaSwgZXJyb3ItPmNvZGUsIHRvX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9lcnJvcik7CgkJICBhbnlfZmFpbGVkID0gVFJVRTsKCQl9CgkgICAgfQoJfQogICAgICBlbHNlIGlmIChyZXMgPT0gTlVMTCB8fCBzdHJjbXAgKHJlcywgdG9fdXJpX3Rlc3RzW2ldLmV4cGVjdGVkX3Jlc3VsdCkgIT0gMCkKCXsKCSAgZ19wcmludCAoIlxuZ19maWxlbmFtZV90b191cmkoKSB0ZXN0ICVkIGZhaWxlZCwgZXhwZWN0ZWQgcmVzdWx0OiAlcywgYWN0dWFsIHJlc3VsdDogJXNcbiIsCgkJICAgaSwgdG9fdXJpX3Rlc3RzW2ldLmV4cGVjdGVkX3Jlc3VsdCwgKHJlcykgPyByZXMgOiAiTlVMTCIpOwoJICBpZiAoZXJyb3IpCgkgICAgZ19wcmludCAoIkVycm9yIG1lc3NhZ2U6ICVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CgkgIGFueV9mYWlsZWQgPSBUUlVFOwoJfQogICAgICAKICAgICAgLyogR2l2ZSBzb21lIG91dHB1dCAqLwogICAgICBnX3ByaW50ICgiLiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZApydW5fZnJvbV91cmlfdGVzdHMgKHZvaWQpCnsKICBpbnQgaTsKICBnY2hhciAqcmVzOwogIGdjaGFyICpob3N0bmFtZTsKICBHRXJyb3IgKmVycm9yOwogIAogIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGZyb21fdXJpX3Rlc3RzKTsgaSsrKQogICAgewogICAgICBlcnJvciA9IE5VTEw7CiAgICAgIHJlcyA9IGdfZmlsZW5hbWVfZnJvbV91cmkgKGZyb21fdXJpX3Rlc3RzW2ldLnVyaSwKCQkJCSAmaG9zdG5hbWUsCgkJCQkgJmVycm9yKTsKCiAgICAgIGlmIChmcm9tX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9maWxlbmFtZSA9PSBOVUxMKQoJewoJICBpZiAocmVzICE9IE5VTEwpCgkgICAgewoJICAgICAgZ19wcmludCAoIlxuZ19maWxlbmFtZV9mcm9tX3VyaSgpIHRlc3QgJWQgZmFpbGVkLCBleHBlY3RlZCB0byByZXR1cm4gTlVMTCwgYWN0dWFsIHJlc3VsdDogJXNcbiIsIGksIHJlcyk7CgkgICAgICBhbnlfZmFpbGVkID0gVFJVRTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBpZiAoZXJyb3IgPT0gTlVMTCkKCQl7CgkJICBnX3ByaW50ICgiXG5nX2ZpbGVuYW1lX2Zyb21fdXJpKCkgdGVzdCAlZCBmYWlsZWQsIHJldHVybmVkIE5VTEwsIGJ1dCBkaWRuJ3Qgc2V0IGVycm9yXG4iLCBpKTsKCQkgIGFueV9mYWlsZWQgPSBUUlVFOwoJCX0KCSAgICAgIGVsc2UgaWYgKGVycm9yLT5kb21haW4gIT0gR19DT05WRVJUX0VSUk9SKQoJCXsKCQkgIGdfcHJpbnQgKCJcbmdfZmlsZW5hbWVfZnJvbV91cmkoKSB0ZXN0ICVkIGZhaWxlZCwgcmV0dXJuZWQgTlVMTCwgc2V0IG5vbiBHX0NPTlZFUlRfRVJST1IgZXJyb3JcbiIsIGkpOwoJCSAgYW55X2ZhaWxlZCA9IFRSVUU7CgkJfQoJICAgICAgZWxzZSBpZiAoZXJyb3ItPmNvZGUgIT0gZnJvbV91cmlfdGVzdHNbaV0uZXhwZWN0ZWRfZXJyb3IpCgkJewoJCSAgZ19wcmludCAoIlxuZ19maWxlbmFtZV9mcm9tX3VyaSgpIHRlc3QgJWQgZmFpbGVkIGFzIGV4cGVjdGVkLCBidXQgc2V0IHdyb25nIGVycm9yY29kZSAlZCBpbnN0ZWFkIG9mIGV4cGVjdGVkICVkIFxuIiwKCQkJICAgaSwgZXJyb3ItPmNvZGUsIGZyb21fdXJpX3Rlc3RzW2ldLmV4cGVjdGVkX2Vycm9yKTsKCQkgIGFueV9mYWlsZWQgPSBUUlVFOwoJCX0KCSAgICB9Cgl9CiAgICAgIGVsc2UKCXsKCSAgaWYgKHJlcyA9PSBOVUxMIHx8IHN0cmNtcCAocmVzLCBmcm9tX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9maWxlbmFtZSkgIT0gMCkKCSAgICB7CgkgICAgICBnX3ByaW50ICgiXG5nX2ZpbGVuYW1lX2Zyb21fdXJpKCkgdGVzdCAlZCBmYWlsZWQsIGV4cGVjdGVkIHJlc3VsdDogJXMsIGFjdHVhbCByZXN1bHQ6ICVzXG4iLAoJCSAgICAgICBpLCBmcm9tX3VyaV90ZXN0c1tpXS5leHBlY3RlZF9maWxlbmFtZSwgKHJlcykgPyByZXMgOiAiTlVMTCIpOwoJICAgICAgYW55X2ZhaWxlZCA9IFRSVUU7CgkgICAgfQoKCSAgaWYgKGZyb21fdXJpX3Rlc3RzW2ldLmV4cGVjdGVkX2hvc3RuYW1lID09IE5VTEwpCgkgICAgewoJICAgICAgaWYgKGhvc3RuYW1lICE9IE5VTEwpCgkJewoJCSAgZ19wcmludCAoIlxuZ19maWxlbmFtZV9mcm9tX3VyaSgpIHRlc3QgJWQgZmFpbGVkLCBleHBlY3RlZCBubyBob3N0bmFtZSwgZ290OiAlc1xuIiwKCQkJICAgaSwgaG9zdG5hbWUpOwoJCSAgYW55X2ZhaWxlZCA9IFRSVUU7CgkJfQoJICAgIH0KCSAgZWxzZSBpZiAoaG9zdG5hbWUgPT0gTlVMTCB8fAoJCSAgIHN0cmNtcCAoaG9zdG5hbWUsIGZyb21fdXJpX3Rlc3RzW2ldLmV4cGVjdGVkX2hvc3RuYW1lKSAhPSAwKQoJICAgIHsKCSAgICAgIGdfcHJpbnQgKCJcbmdfZmlsZW5hbWVfZnJvbV91cmkoKSB0ZXN0ICVkIGZhaWxlZCwgZXhwZWN0ZWQgaG9zdG5hbWU6ICVzLCBhY3R1YWwgcmVzdWx0OiAlc1xuIiwKCQkgICAgICAgaSwgZnJvbV91cmlfdGVzdHNbaV0uZXhwZWN0ZWRfaG9zdG5hbWUsIChob3N0bmFtZSkgPyBob3N0bmFtZSA6ICJOVUxMIik7CgkgICAgICBhbnlfZmFpbGVkID0gVFJVRTsKCSAgICB9Cgl9CiAgICAgIAogICAgICAvKiBHaXZlIHNvbWUgb3V0cHV0ICovCiAgICAgIGdfcHJpbnQgKCIuIik7CiAgICB9CiAgZ19wcmludCAoIlxuIik7Cn0KCmludAptYWluIChpbnQgICBhcmdjLAogICAgICBjaGFyICphcmd2W10pCnsKICBydW5fdG9fdXJpX3Rlc3RzICgpOwogIHJ1bl9mcm9tX3VyaV90ZXN0cyAoKTsKCiAgcmV0dXJuIGFueV9mYWlsZWQgPyAxIDogMDsKfQo=