LyoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKICogTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCiAqIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwogKgogKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKICogSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgogKiBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICogVGhlIE9yaWdpbmFsIENvZGUgaXMgTVBFRzRJUC4KICoKICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIENpc2NvIFN5c3RlbXMgSW5jLgogKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IENpc2NvIFN5c3RlbXMgSW5jLiBhcmUKICogQ29weXJpZ2h0IChDKSBDaXNjbyBTeXN0ZW1zIEluYy4gMjAwNC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIENvbnRyaWJ1dG9yKHMpOgogKiAgICAgIEJpbGwgTWF5IChmcm9tIG90aGVycyB3b3JrKS4KICovCgojaW5jbHVkZSAic3JjL2ltcGwuaCIKCm5hbWVzcGFjZSBtcDR2MiB7IG5hbWVzcGFjZSBpbXBsIHsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCk1QNFN0YW5kYXJkQXRvbTo6TVA0U3RhbmRhcmRBdG9tIChNUDRGaWxlICZmaWxlLCBjb25zdCBjaGFyICp0eXBlKSA6IE1QNEF0b20oZmlsZSwgdHlwZSkKewogICAgLyoKICAgICAqIFRoaXMgaXMgYSBiaWcgaWYgZWxzZSBsb29wLiAgTWFrZSBzdXJlIHRoYXQgeW91IGRvbid0IGJyZWFrIGl0CiAgICAgKiB3aGVuIGFkZGluZyBuZXcgYXRvbXMsIG9yIHlvdSB3aWxsIHNldCB0aGUgdW5rbm93biB0eXBlIGZsYWcKICAgICAqCiAgICAgKiBUcnkgdG8ga2VlcCBpdCBpbiBhbHBoYWJldGljYWwgb3JkZXIgLSBpdCBzaG91bGQgb25seSBiZSBjYWxsZWQKICAgICAqIDEgdGltZSBwZXIgYXRvbSwgc28gaXQncyBub3QgdGhhdCB1cmdlbnQuCiAgICAgKi8KICAgIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJiaXRyIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLyogMCAqLwogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJhdmdCaXRyYXRlIikpOwoKICAgICAgICBBZGRQcm9wZXJ0eSggLyogMSAqLwogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJtYXhCaXRyYXRlIikpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiYnRydCIpKSB7CiAgICAgICAgQWRkUHJvcGVydHkoIG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eSgqdGhpcywgImJ1ZmZlclNpemVEQiIpKTsgLyogMCAqLwogICAgICAgIEFkZFByb3BlcnR5KCBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJhdmdCaXRyYXRlIikpOyAgIC8qIDEgKi8KICAgICAgICBBZGRQcm9wZXJ0eSggbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAibWF4Qml0cmF0ZSIpKTsgICAvKiAyICovCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoImJ1cmwiKSkgewogICAgICAgIEFkZFByb3BlcnR5KCBuZXcgTVA0U3RyaW5nUHJvcGVydHkoKnRoaXMsICJiYXNlX3VybCIpKTsKICAgICAgICAvKgogICAgICAgICAqIGM/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiY282NCIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CgogICAgICAgIE1QNEludGVnZXIzMlByb3BlcnR5KiBwQ291bnQgPQogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJlbnRyeUNvdW50Iik7CiAgICAgICAgQWRkUHJvcGVydHkocENvdW50KTsKCiAgICAgICAgTVA0VGFibGVQcm9wZXJ0eSogcFRhYmxlID0gbmV3IE1QNFRhYmxlUHJvcGVydHkoKnRoaXMsICJlbnRyaWVzIiwgcENvdW50KTsKICAgICAgICBBZGRQcm9wZXJ0eShwVGFibGUpOwoKICAgICAgICBwVGFibGUtPkFkZFByb3BlcnR5KAogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjY0UHJvcGVydHkoKnRoaXMsICJjaHVua09mZnNldCIpKTsKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiY3R0cyIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CgogICAgICAgIE1QNEludGVnZXIzMlByb3BlcnR5KiBwQ291bnQgPQogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJlbnRyeUNvdW50Iik7CiAgICAgICAgQWRkUHJvcGVydHkocENvdW50KTsKCiAgICAgICAgTVA0VGFibGVQcm9wZXJ0eSogcFRhYmxlID0gbmV3IE1QNFRhYmxlUHJvcGVydHkoKnRoaXMsICJlbnRyaWVzIiwgcENvdW50KTsKICAgICAgICBBZGRQcm9wZXJ0eShwVGFibGUpOwoKICAgICAgICBwVGFibGUtPkFkZFByb3BlcnR5KG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eShwVGFibGUtPkdldFBhcmVudEF0b20oKSwgInNhbXBsZUNvdW50IikpOwogICAgICAgIHBUYWJsZS0+QWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KHBUYWJsZS0+R2V0UGFyZW50QXRvbSgpLCAic2FtcGxlT2Zmc2V0IikpOwogICAgICAgIC8qCiAgICAgICAgICogZD8/PwogICAgICAgICAqLwogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJkaW5mIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImRyZWYiLCBSZXF1aXJlZCwgT25seU9uZSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJkaW1tIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gYnl0ZXMgb2YgaW1tZWRpYXRlIGRhdGEKICAgICAgICAgICAgbmV3IE1QNEludGVnZXI2NFByb3BlcnR5KCp0aGlzLCAiYnl0ZXMiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJkbWF4IikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gbWF4IHBhY2tldCBkdXJhdGlvbgogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJtaWxsaVNlY3MiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJkbWVkIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gYnl0ZXMgc2VudCBmcm9tIG1lZGlhIGRhdGEKICAgICAgICAgICAgbmV3IE1QNEludGVnZXI2NFByb3BlcnR5KCp0aGlzLCAiYnl0ZXMiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJkcmVwIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gYnl0ZXMgb2YgcmVwZWF0ZWQgZGF0YQogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjY0UHJvcGVydHkoKnRoaXMsICJieXRlcyIpKTsKICAgICAgICAvKgogICAgICAgICAqIGU/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiZWR0cyIpKSB7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJlbHN0IiwgUmVxdWlyZWQsIE9ubHlPbmUpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiZXNkcyIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CiAgICAgICAgQWRkUHJvcGVydHkoCiAgICAgICAgICAgIG5ldyBNUDREZXNjcmlwdG9yUHJvcGVydHkoKnRoaXMsIE5VTEwsIE1QNEVTRGVzY3JUYWcsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQsIE9ubHlPbmUpKTsKICAgICAgICAvKgogICAgICAgICAqIGY/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiZnJtYSIpKSB7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDAgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiZGF0YS1mb3JtYXQiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBnPz8/CiAgICAgICAgICovCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoImdtaGQiKSkgewogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiZ21pbiIsIFJlcXVpcmVkLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInRtY2QiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0ZXh0IiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJobWhkIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsKCiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIxNlByb3BlcnR5KCp0aGlzLCAibWF4UGR1U2l6ZSIpKTsKICAgICAgICBBZGRQcm9wZXJ0eShuZXcgTVA0SW50ZWdlcjE2UHJvcGVydHkoKnRoaXMsICJhdmdQZHVTaXplIikpOwogICAgICAgIEFkZFByb3BlcnR5KG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eSgqdGhpcywgIm1heEJpdFJhdGUiKSk7CiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiYXZnQml0UmF0ZSIpKTsKICAgICAgICBBZGRQcm9wZXJ0eShuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJzbGlkaW5nQXZnQml0UmF0ZSIpKTsKICAgICAgICAvKgogICAgICAgICAqIGk/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiaUtNUyIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7IC8qIDAsIDEgKi8KICAgICAgICBNUDRTdHJpbmdQcm9wZXJ0eSogcFByb3AgPSBuZXcgTVA0U3RyaW5nUHJvcGVydHkoKnRoaXMsICJrbXNfVVJJIik7CiAgICAgICAgQWRkUHJvcGVydHkocFByb3ApOyAvKiAyICovCgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJpU0ZNIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsgLyogMCwgMSAqLwogICAgICAgIEFkZFByb3BlcnR5KCAvKiAyICovCiAgICAgICAgICAgIG5ldyBNUDRCaXRmaWVsZFByb3BlcnR5KCp0aGlzLCAic2VsZWN0aXZlLWVuY3J5cHRpb24iLCAxKSk7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDMgKi8KICAgICAgICAgICAgbmV3IE1QNEJpdGZpZWxkUHJvcGVydHkoKnRoaXMsICJyZXNlcnZlZCIsIDcpKTsKICAgICAgICBBZGRQcm9wZXJ0eSggLyogNCAqLwogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjhQcm9wZXJ0eSgqdGhpcywgImtleS1pbmRpY2F0b3ItbGVuZ3RoIikpOwogICAgICAgIEFkZFByb3BlcnR5KCAvKiA1ICovCiAgICAgICAgICAgIG5ldyBNUDRJbnRlZ2VyOFByb3BlcnR5KCp0aGlzLCAiSVYtbGVuZ3RoIikpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiaWxzdCIpKSB7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJcMjUxbmFtIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBuYW1lICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJcMjUxQVJUIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBhcnRpc3QgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTF3cnQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHdyaXRlciAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiXDI1MWFsYiIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogYWxidW0gKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTFkYXkiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGRhdGUgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTF0b28iLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHRvb2wgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTFjbXQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGNvbW1lbnQgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTFnZW4iLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGN1c3RvbSBnZW5yZSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHJrbiIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogdHJhY2tudW1iZXIgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImRpc2siLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGRpc2tudW1iZXIgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImducmUiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGdlbnJlIChJRDN2MSBpbmRleCArIDEpICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJjcGlsIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBjb21waWxhdGlvbiAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidG1wbyIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogQlBNICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJjb3ZyIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBjb3ZlciBhcnQgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImFBUlQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIGFsYnVtIGFydGlzdCAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiLS0tLSIsIE9wdGlvbmFsLCBNYW55KTsgLyogLS0tLSBmcmVlIGZvcm0gKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInBnYXAiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHBhcnQgb2YgZ2FwbGVzcyBhbGJ1bSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHZzaCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogVFYgc2hvdyAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHZzbiIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogVFYgc2Vhc29uICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0dmVuIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBUViBlcGlzb2RlIG51bWJlciAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHZubiIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogVFYgbmV0d29yayBuYW1lICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0dmVzIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBUViBlcHNpZG9lICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJkZXNjIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBkZXNjcmlwdGlvbiAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgibGRlcyIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogbG9uZyBkZXNjcmlwdGlvbiAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgic29hbCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogc29ydCBhbGJ1bSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgic29hciIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogc29ydCBhcnRpc3QgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInNvYWEiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHNvcnQgYWxidW0gYXJ0aXN0ICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJzb25tIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBzb3J0IG5hbWUgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInNvY28iLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHNvcnQgY29tcG9zZXIgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInNvc24iLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIHNvcnQgc2hvdyAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaGR2ZCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogSEQgdmlkZW8gKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIqllbmMiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIEVuY29kZWQgYnkgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInBjc3QiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIFBvZGNhc3QgZmxhZyAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgia2V5dyIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogS2V5d29yZHMgKGZvciBwb2RjYXN0cz8pICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJjYXRnIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBDYXRlZ29yeSAoZm9yIHBvZGNhc3RzPykgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInB1cmwiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIFBvZGNhc3QgVVJMICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJlZ2lkIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBQb2RjYXN0IGVwaXNvZGUgZ2xvYmFsIHVuaXF1ZSBJRCAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgicnRuZyIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogQ29udGVudCBSYXRpbmcgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oInN0aWsiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIE1lZGlhVHlwZSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiXDI1MWdycCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogR3JvdXBpbmcgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oIlwyNTFseXIiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIEx5cmljcyAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiY3BydCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogQ29weXJpZ2h0ICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJhcElEIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBpVHVuZXMgQWNjb3VudCAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiYWtJRCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogaVR1bmVzIEFjY291bnQgVHlwZSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgic2ZJRCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogaVR1bmVzIENvdW50cnkgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImNuSUQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIENvbnRlbnQgSUQgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImF0SUQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIEFydGlzdCBJRCAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgicGxJRCIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogUGxheWxpc3QgSUQgKi8KICAgICAgICBFeHBlY3RDaGlsZEF0b20oImdlSUQiLCBPcHRpb25hbCwgT25seU9uZSk7IC8qIEdlbnJlIElEICovCiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJjbUlEIiwgT3B0aW9uYWwsIE9ubHlPbmUpOyAvKiBDb21wb3NlciBJRCAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgieGlkICIsIE9wdGlvbmFsLCBPbmx5T25lKTsgLyogWElEICovCgogICAgfSAgZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiaW1pZiIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNERlc2NyaXB0b3JQcm9wZXJ0eSgqdGhpcywgImlwbXBfZGVzYyIsIE1QNElQTVBEZXNjclRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNElQTVBEZXNjclRhZywgUmVxdWlyZWQsIE1hbnkpKTsKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgiaW9kcyIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CiAgICAgICAgQWRkUHJvcGVydHkoCiAgICAgICAgICAgIG5ldyBNUDREZXNjcmlwdG9yUHJvcGVydHkoKnRoaXMsIE5VTEwsIE1QNEZpbGVJT0Rlc2NyVGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNEZpbGVPRGVzY3JUYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQsIE9ubHlPbmUpKTsKICAgICAgICAvKgogICAgICAgICAqIG0/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgibWF4ciIpKSB7CiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiZ3JhbnVsYXJpdHkiKSk7CiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiYnl0ZXMiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJtZGlhIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oIm1kaGQiLCBSZXF1aXJlZCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJoZGxyIiwgUmVxdWlyZWQsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgibWluZiIsIFJlcXVpcmVkLCBPbmx5T25lKTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoIm1ldGEiKSkgeyAvLyBpVHVuZXMKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsgLyogMCwgMSAqLwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaGRsciIsIFJlcXVpcmVkLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImlsc3QiLCBSZXF1aXJlZCwgT25seU9uZSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJtZmhkIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsgICAvKiAwLCAxICovCiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDIgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAic2VxdWVuY2VOdW1iZXIiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJtaW5mIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInZtaGQiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJzbWhkIiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaG1oZCIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oIm5taGQiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJnbWhkIiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiZGluZiIsIFJlcXVpcmVkLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInN0YmwiLCBSZXF1aXJlZCwgT25seU9uZSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJtb29mIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oIm1maGQiLCBSZXF1aXJlZCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0cmFmIiwgT3B0aW9uYWwsIE1hbnkpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgibW9vdiIpKSB7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJtdmhkIiwgUmVxdWlyZWQsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaW9kcyIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInRyYWsiLCBSZXF1aXJlZCwgTWFueSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ1ZHRhIiwgT3B0aW9uYWwsIE1hbnkpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgibXZleCIsIE9wdGlvbmFsLCBPbmx5T25lKTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoIm12ZXgiKSkgewogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHJleCIsIFJlcXVpcmVkLCBNYW55KTsKCiAgICAgICAgLyoKICAgICAgICAgKiBuPz8/CiAgICAgICAgICovCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoIm5taGQiKSkgewogICAgICAgIEFkZFZlcnNpb25BbmRGbGFncygpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgibnVtcCIpKSB7CiAgICAgICAgQWRkUHJvcGVydHkoIC8vIHBhY2tldHMgc2VudAogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjY0UHJvcGVydHkoKnRoaXMsICJwYWNrZXRzIikpOwogICAgICAgIC8qCiAgICAgICAgICAqIG8/Pz8KICAgICAgICAgICovCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoIm9ka20iKSkgewogICAgICAgIEFkZFZlcnNpb25BbmRGbGFncygpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgib2hkciIsIFJlcXVpcmVkLCBPbmx5T25lKTsKICAgICAgICAvKgogICAgICAgICAqIHA/Pz8KICAgICAgICAgKi8KICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgicGF5dCIpKSB7CiAgICAgICAgQWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAicGF5bG9hZE51bWJlciIpKTsKICAgICAgICBBZGRQcm9wZXJ0eShuZXcgTVA0U3RyaW5nUHJvcGVydHkoKnRoaXMsICJydHBNYXAiLCBDb3VudGVkKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJwaW5mIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImZybWEiLCBSZXF1aXJlZCwgT25seU9uZSk7CiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInBtYXgiKSkgewogICAgICAgIEFkZFByb3BlcnR5KCAvLyBtYXggcGFja2V0IHNpemUKICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiYnl0ZXMiKSk7CiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInNjaGkiKSkgewogICAgICAgIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgY2hpbGQgYXRvbXMgb3IgdGFibGUgb2YgYm94ZXMKICAgICAgICAvLyBnZXQgY2xhcmlmaWNhdGlvbiBvbiBzcGVjIDkuMS4yLjUKICAgICAgICBFeHBlY3RDaGlsZEF0b20oIm9ka20iLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJpS01TIiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaVNGTSIsIE9wdGlvbmFsLCBPbmx5T25lKTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInNjaG0iKSkgewogICAgICAgIEFkZFZlcnNpb25BbmRGbGFncygpOyAvKiAwLCAxICovCiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDIgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAic2NoZW1lX3R5cGUiKSk7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDMgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAic2NoZW1lX3ZlcnNpb24iKSk7CiAgICAgICAgLy8gYnJvd3NlciBVUkkgaWYgZmxhZ3Mgc2V0LCBUT0RPCgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJzaW5mIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImZybWEiLCBSZXF1aXJlZCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJpbWlmIiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgic2NobSIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInNjaGkiLCBPcHRpb25hbCwgT25seU9uZSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJzbWhkIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsKICAgICAgICBBZGRSZXNlcnZlZCgqdGhpcywgInJlc2VydmVkIiwgNCk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJzbnJvIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eShuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJvZmZzZXQiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJzdGNvIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsKCiAgICAgICAgTVA0SW50ZWdlcjMyUHJvcGVydHkqIHBDb3VudCA9IG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eSgqdGhpcywgImVudHJ5Q291bnQiKTsKICAgICAgICBBZGRQcm9wZXJ0eShwQ291bnQpOwoKICAgICAgICBNUDRUYWJsZVByb3BlcnR5KiBwVGFibGUgPSBuZXcgTVA0VGFibGVQcm9wZXJ0eSgqdGhpcywgImVudHJpZXMiLCBwQ291bnQpOwogICAgICAgIEFkZFByb3BlcnR5KHBUYWJsZSk7CgogICAgICAgIHBUYWJsZS0+QWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KHBUYWJsZS0+R2V0UGFyZW50QXRvbSgpLCAiY2h1bmtPZmZzZXQiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJzdHNoIikpIHsKICAgICAgICBBZGRWZXJzaW9uQW5kRmxhZ3MoKTsKCiAgICAgICAgTVA0SW50ZWdlcjMyUHJvcGVydHkqIHBDb3VudCA9IG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eSgqdGhpcywgImVudHJ5Q291bnQiKTsKICAgICAgICBBZGRQcm9wZXJ0eShwQ291bnQpOwoKICAgICAgICBNUDRUYWJsZVByb3BlcnR5KiBwVGFibGUgPSBuZXcgTVA0VGFibGVQcm9wZXJ0eSgqdGhpcywgImVudHJpZXMiLCBwQ291bnQpOwogICAgICAgIEFkZFByb3BlcnR5KHBUYWJsZSk7CgogICAgICAgIHBUYWJsZS0+QWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KHBUYWJsZS0+R2V0UGFyZW50QXRvbSgpLCAic2hhZG93ZWRTYW1wbGVOdW1iZXIiKSk7CiAgICAgICAgcFRhYmxlLT5BZGRQcm9wZXJ0eShuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkocFRhYmxlLT5HZXRQYXJlbnRBdG9tKCksICJzeW5jU2FtcGxlTnVtYmVyIikpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgic3RzcyIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7CgogICAgICAgIE1QNEludGVnZXIzMlByb3BlcnR5KiBwQ291bnQgPSBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJlbnRyeUNvdW50Iik7CiAgICAgICAgQWRkUHJvcGVydHkocENvdW50KTsKCiAgICAgICAgTVA0VGFibGVQcm9wZXJ0eSogcFRhYmxlID0gbmV3IE1QNFRhYmxlUHJvcGVydHkoKnRoaXMsICJlbnRyaWVzIiwgcENvdW50KTsKICAgICAgICBBZGRQcm9wZXJ0eShwVGFibGUpOwoKICAgICAgICBwVGFibGUtPkFkZFByb3BlcnR5KG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eShwVGFibGUtPkdldFBhcmVudEF0b20oKSwgInNhbXBsZU51bWJlciIpKTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInN0dHMiKSkgewogICAgICAgIEFkZFZlcnNpb25BbmRGbGFncygpOwogICAgICAgIE1QNEludGVnZXIzMlByb3BlcnR5KiBwQ291bnQgPSBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJlbnRyeUNvdW50Iik7CiAgICAgICAgQWRkUHJvcGVydHkocENvdW50KTsKCiAgICAgICAgTVA0VGFibGVQcm9wZXJ0eSogcFRhYmxlID0gbmV3IE1QNFRhYmxlUHJvcGVydHkoKnRoaXMsICJlbnRyaWVzIiwgcENvdW50KTsKICAgICAgICBBZGRQcm9wZXJ0eShwVGFibGUpOwoKICAgICAgICBwVGFibGUtPkFkZFByb3BlcnR5KG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eShwVGFibGUtPkdldFBhcmVudEF0b20oKSwgInNhbXBsZUNvdW50IikpOwogICAgICAgIHBUYWJsZS0+QWRkUHJvcGVydHkobmV3IE1QNEludGVnZXIzMlByb3BlcnR5KHBUYWJsZS0+R2V0UGFyZW50QXRvbSgpLCAic2FtcGxlRGVsdGEiKSk7CiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInRpbXMiKSkgewogICAgICAgIEFkZFByb3BlcnR5KAogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJ0aW1lU2NhbGUiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJ0bWluIikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gbWluIHJlbGF0aXZlIHhtaXQgdGltZQogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJtaWxsaVNlY3MiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJ0bWF4IikpIHsKICAgICAgICBBZGRQcm9wZXJ0eSggLy8gbWF4IHJlbGF0aXZlIHhtaXQgdGltZQogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJtaWxsaVNlY3MiKSk7CgogICAgfSBlbHNlIGlmIChBVE9NSUQodHlwZSkgPT0gQVRPTUlEKCJ0cmFmIikpIHsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oInRmaGQiLCBSZXF1aXJlZCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0cnVuIiwgT3B0aW9uYWwsIE1hbnkpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgidHJhayIpKSB7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJ0a2hkIiwgUmVxdWlyZWQsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidHJlZiIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImVkdHMiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJtZGlhIiwgUmVxdWlyZWQsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgidWR0YSIsIE9wdGlvbmFsLCBNYW55KTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInRyZWYiKSkgewogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiY2hhcCIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oImRwbmQiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJoaW50IiwgT3B0aW9uYWwsIE9ubHlPbmUpOwogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiaXBpciIsIE9wdGlvbmFsLCBPbmx5T25lKTsKICAgICAgICBFeHBlY3RDaGlsZEF0b20oIm1wb2QiLCBPcHRpb25hbCwgT25seU9uZSk7CiAgICAgICAgRXhwZWN0Q2hpbGRBdG9tKCJzeW5jIiwgT3B0aW9uYWwsIE9ubHlPbmUpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgidHJleCIpKSB7CiAgICAgICAgQWRkVmVyc2lvbkFuZEZsYWdzKCk7ICAgLyogMCwgMSAqLwogICAgICAgIEFkZFByb3BlcnR5KCAvKiAyICovCiAgICAgICAgICAgIG5ldyBNUDRJbnRlZ2VyMzJQcm9wZXJ0eSgqdGhpcywgInRyYWNrSWQiKSk7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDMgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiZGVmYXVsdFNhbXBsZURlc3JpcHRpb25JbmRleCIpKTsKICAgICAgICBBZGRQcm9wZXJ0eSggLyogNCAqLwogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJkZWZhdWx0U2FtcGxlRHVyYXRpb24iKSk7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDUgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiZGVmYXVsdFNhbXBsZVNpemUiKSk7CiAgICAgICAgQWRkUHJvcGVydHkoIC8qIDYgKi8KICAgICAgICAgICAgbmV3IE1QNEludGVnZXIzMlByb3BlcnR5KCp0aGlzLCAiZGVmYXVsdFNhbXBsZUZsYWdzIikpOwoKICAgIH0gZWxzZSBpZiAoQVRPTUlEKHR5cGUpID09IEFUT01JRCgidHJweSIpIHx8CiAgICAgICAgICAgICAgIEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInRweWwiKSkgewogICAgICAgIEFkZFByb3BlcnR5KCAvLyBieXRlcyBzZW50IGluY2x1ZGluZyBSVFAgaGVhZGVycwogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjY0UHJvcGVydHkoKnRoaXMsICJieXRlcyIpKTsKCiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoInRzcm8iKSkgewogICAgICAgIEFkZFByb3BlcnR5KAogICAgICAgICAgICBuZXcgTVA0SW50ZWdlcjMyUHJvcGVydHkoKnRoaXMsICJvZmZzZXQiKSk7CiAgICB9IGVsc2UgaWYgKEFUT01JRCh0eXBlKSA9PSBBVE9NSUQoIndhdmUiKSkgewogICAgICAgIEV4cGVjdENoaWxkQXRvbSgiZXNkcyIsIFJlcXVpcmVkLCBPbmx5T25lKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBkZWZhdWx0IC0gdW5rbm93biB0eXBlCiAgICAgICAgICovCiAgICAgICAgU2V0VW5rbm93blR5cGUodHJ1ZSk7CiAgICB9Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCn19IC8vIG5hbWVzcGFjZSBtcDR2Mjo6aW1wbAo=