LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCiAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CgojaW5jbHVkZSAidHNfeGxpYi5oIgojaW5jbHVkZSAidHNfeHJlc291cmNlLmgiCiNpbmNsdWRlICJ0c194dXRpbC5oIgojaWZkZWYgSEFWRV9YS0IKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIngxMWRydi5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChkaW5wdXQpOwoKaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgTFBCWVRFIHBLZXlTdGF0ZVRhYmxlOwpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwpzdGF0aWMgaW50IGtjQ29udHJvbCwga2NBbHQsIGtjU2hpZnQsIGtjTnVtTG9jaywga2NDYXBzTG9jazsgLyoga2V5Y29kZXMgKi8KI2lmZGVmIEhBVkVfWEtCCnN0YXRpYyBpbnQgaXNfeGtiLCB4a2Jfb3Bjb2RlLCB4a2JfZXZlbnQsIHhrYl9lcnJvcjsKI2VuZGlmCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDgKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgVktfUSxWS19XLFZLX0UsVktfUixWS19ULFZLX1ksVktfVSxWS19JLFZLX08sVktfUCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfQSxWS19TLFZLX0QsVktfRixWS19HLFZLX0gsVktfSixWS19LLFZLX0wsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgIFZLX1osVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgIFZLX0EsVktfWixWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzYsVktfT0VNXzEsCiAgIFZLX1EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX00sVktfT0VNXzMsVktfT0VNXzUsCiAgIFZLX1csVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyogRklYTUU6IGFkZCBvdGhlciBsYXlvdXRzLCBzdWNoIGFzIERWT1JBSyBhbmQgR2VybWFuIFFXRVJUWiAqLwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgLWRlYnVnbXNnICtrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAobW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV3ZSBCb25uZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwovKiAoWEZyZWU4NiByZXBvcnRzIHRoZSA8PiBrZXkgZXZlbiBpZiBpdCdzIG5vdCBwaHlzaWNhbGx5IHRoZXJlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUtbTUFJTl9MRU5dWzRdID0KewogImAiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ0AiLCIjfiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgRXJpYyBQb3VlY2gpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMn4iLCJcIjMjIiwiJzR7IiwiKDVbIiwiLTZ8Iiwi6DciLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjpCIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBS7WtoYXLwdXIgRWdpbHNzb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIvbWXFwiLCItXyIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInP34iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwitF4iLCIrKmAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBXZWlnYW5kKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUWAIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiO0IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTbUiLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCK0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gTmF5bG9yKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxK3wiLCIyXCJAIiwiMyojIiwiNOciLCI1JSIsIjYmrCIsIjcvpiIsIjgooiIsIjkpIiwiMD0iLCInP7QiLCJeYH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/OhbIiwiqCFdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgeyIsIiSjfSIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIFN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBoaWxpcHBlIEZyb2lkZXZhdXgpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErfCIsIjJcIkAiLCIzKiMiLCI05yIsIjUlIiwiNiasIiwiNy+mIiwiOCiiIiwiOSkiLCIwPSIsIic/tCIsIl5gfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo/FsiLCKoIV0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIun2Iiwi4OR7IiwiJKN9IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgT3ZlIEvldmVuKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OT1tNQUlOX0xFTl1bNF0gPQp7CiAifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXGC0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRGFuaXNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgQmVydGhvIFN0dWx0aWVucykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwitGB8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBTd2VkaXNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGV0ZXIgQm9ydGFzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXKYiLCIxISIsIjJcIkAiLCIzI6MiLCI0JKciLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiJz8iLCKruyIsCiAicVEiLCAgIndXIiwiZUUiLCAgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIisqXFyoIiwiXFwnXFxgIiwKICJhQSIsICAic1MiLCJkRCIsICAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAi58ciLCAiuqoiLCAiXFx+XFxeIiwKICJ6WiIsICAieFgiLCJjQyIsICAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDsiLCAiLjoiLCAiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSG5IiwiMlwisiIsIjOjsyIsIjQkvCIsIjUlvSIsIjYmviIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIic/YCIsIuxefiIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/giLCJwUP4iLCLo6VsiLCIrKl0iLAogImFBIiwic1PfIiwiZETwIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8udAIiwi4LAjIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NtSIsIiw7IiwiLjq3IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIiIsIjEhIiwiMlwiQCIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIlwnYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIiLCJcIl5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIiLCIiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9rb2k4cltNQUlOX0xFTl1bNF0gPQp7CiAiKCkiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1OiIsIjYsIiwiNy4iLCI4OyIsIjk/IiwiMCUiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXHwiLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBW01BSU5fTEVOXVs0XSA9CnsKICJgfq29IiwiMSExISIsIjJAMlwiIiwiMyMzJyIsIjQkNCoiLCI1JTU6IiwiNl42LCIsIjcmNy4iLCI4Kjg7IiwiOSg5KCIsIjApMCkiLCItXy1fIiwiPSs9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfae3IiwKICJhQcbmIiwic1OmtiIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wipLQiLCJcXHxcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Lz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvc+kgTWFyY29zIEzzcGV6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqpcXCIsIjEhfCIsIjJcIkAiLCIztyMiLCI0JCIsIjUlIiwiNiasIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeWyIsIisqXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCInqHsiLCLnx30iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgWm9sdOFuIEtvduFjcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlsCIsIjYvsiIsIjc9YCIsIjgo/yIsIjkptCIsIvbWvSIsIvzcqCIsIvPTuCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSc0iLCJvT/giLCJwUCIsIvXV9yIsIvra1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpK7SIsImtLsyIsImxMoyIsIunJJCIsIuHB3yIsIvvbpCIsCiAieVk+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzsiLCIuOrciLCItXyoiLAogIu3NPCIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCK3IiwiMyNeIiwiNCSiIiwiNSWwIiwiNiayIiwiNy9gIiwiOCj/IiwiOSm0IiwiMD29IiwiJz+oIiwiKyq4IiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmp9yIsIvDQ1yIsCiAiYUEiLCJzUyIsImREIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIujIIiwi5sbfIiwivq6kIiwKICJ5WSIsInhYIiwiY0MiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTaciLCIsOyIsIi46IiwiLV8vIiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNlwiIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIidgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiO7BgJyIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwKSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvov9yIsIuQo1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi9FwiJCIsIqch3yIsIvIppCIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLCsIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz9cXCIsIqG/IiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XWAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE5lcmlqdXMgQmFsaftuYXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIigoIiwiKSkiLCItXyIsIv7eIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgIFZLX0EsVktfQixWS19DLFZLX0QsVktfRSxWS19GLFZLX0csVktfSCxWS19JLFZLX0osVktfSyxWS19MLFZLX00sVktfTixWS19PLFZLX1AsVktfUSxWS19SLFZLX1MsVktfVCxWS19VLFZLX1YsVktfVyxWS19YLFZLX1ksVktfWiwKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgVUlOVCBsYXlvdXRfY3A7IC8qIENvZGUgcGFnZSBmb3IgdGhpcyBsYXlvdXQgKi8KICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsIDI4NTkxLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogeyJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsIDIwODY2LCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgMjA4NjYsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsIDIwODY2LCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAyMDg2NiwgJm1haW5fa2V5X1VBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJJdGFsaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfSVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkyLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCIsIDI4NTkyLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9IUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNwZWNpZmljKSIsIDI4NTkyLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsIDkzMiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQiLCA5MzIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiU2xvdmFrIGtleWJvYXJkIGxheW91dCIsIDI4NTkyLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAyODU5MiwgJm1haW5fa2V5X1NLX3Byb2csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkxpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDMsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTksICZtYWluX2tleV9USywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJWTkMga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKCiB7TlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfdmtleVsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTAgKi8KICAgIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwgMCwgMCwgMCwgIC8qIEZGNjAgKi8KICAgIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCBWS19DQU5DRUwsIDAsIDAsIDAsIDAsICAgICAgIC8qIEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICBWS19FTkQsIDAsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfU0VQQVJBVE9SLCBWS19TVUJUUkFDVCwgVktfREVDSU1BTCwgVktfRElWSURFLAogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgVktfTlVNUEFENCwgVktfTlVNUEFENSwgVktfTlVNUEFENiwgVktfTlVNUEFENywKICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDksIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIFZLX0YxLCBWS19GMiwKICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYsIDAsIDAsICAgICAgIC8qIEZGQzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX01FTlUsCiAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAvKiBGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV9zY2FuWzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIDB4MEUsIDB4MEYsIDB4MDAsIC8qPyovIDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiwgICAgICAvKiBGRjUwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICAvKj8qLyAwLCAweDEzNywgLyo/Ki8gMCwgMHgxNTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIEZGNjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMzgsIDB4MTQ1LCAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExQywgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMHgwMCwgMHgwMCwgMHgzNywgMHg0RSwgLyo/Ki8gMCwgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgMHgzQiwgMHgzQywKICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZDOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAweDAwLCAweDJBLCAweDM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgMHgxMzgsIDB4MzgsIDB4MTM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE1MyAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bTsKCiAgICBUU1hMb29rdXBTdHJpbmcoZSwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChrZXlzeW0gPj0gMHhGRkFFKSAmJiAoa2V5c3ltIDw9IDB4RkZCOSkgJiYgKGtleXN5bSAhPSAweEZGQUYpIAoJJiYgKGUtPnN0YXRlICYgTnVtTG9ja01hc2spKSAKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0CiAqLwpzdGF0aWMgdm9pZCBzZW5kX2tleWJvYXJkX2lucHV0KCBXT1JEIHdWaywgV09SRCB3U2NhbiwgRFdPUkQgZHdGbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIGlucHV0LnR5cGUgICAgICAgICAgICAgPSBXSU5FX0lOVEVSTkFMX0lOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHdWazsKICAgIGlucHV0LnUua2kud1NjYW4gICAgICAgPSB3U2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBkd0ZsYWdzOwogICAgaW5wdXQudS5raS50aW1lICAgICAgICA9IHRpbWU7CiAgICBpbnB1dC51LmtpLmR3RXh0cmFJbmZvID0gMDsKICAgIFNlbmRJbnB1dCggMSwgJmlucHV0LCBzaXplb2YoaW5wdXQpICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgRFdPUkQgZXZlbnRfdGltZSApCnsKICBCT09MICogU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSk7CiAgRFdPUkQgdXAsIGRvd247CgogIGlmICgqU3RhdGUpIHsKICAgIC8qIFRoZSBJTlRFUk1FRElBUlkgc3RhdGUgbWVhbnMgOiBqdXN0IGFmdGVyIGEgJ3ByZXNzJyBldmVudCwgaWYgYSAncmVsZWFzZScgZXZlbnQgY29tZXMsCiAgICAgICBkb24ndCB0cmVhdCBpdC4gSXQncyBmcm9tIHRoZSBzYW1lIGtleSBwcmVzcy4gVGhlbiB0aGUgc3RhdGUgZ29lcyB0byBPTi4KICAgICAgIEFuZCBmcm9tIHRoZXJlLCBhICdyZWxlYXNlJyBldmVudCB3aWxsIHN3aXRjaCBvZmYgdGhlIHRvZ2dsZSBrZXkuICovCiAgICAqU3RhdGU9RkFMU0U7CiAgICBUUkFDRSgiSU5URVJNIDogZG9uXCd0IHRyZWF0IHJlbGVhc2Ugb2YgdG9nZ2xlIGtleS4gSW5wdXRLZXlTdGF0ZVRhYmxlWyUjeF0gPSAlI3hcbiIsdmtleSxwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgfSBlbHNlCiAgICB7CiAgICAgICAgZG93biA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCk7CiAgICAgICAgdXAgPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApIHwgS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCBwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MSApIC8qIGl0IHdhcyBPTiAqLwoJICB7CgkgICAgaWYgKEV2dHlwZSE9S2V5UHJlc3MpCgkgICAgICB7CgkJVFJBQ0UoIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICAgIHNlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGRvd24sIGV2ZW50X3RpbWUgKTsKCSAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUgKTsKCQkqU3RhdGU9RkFMU0U7CgkJcEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovIAoJICAgICAgfSAKCSAgfQoJZWxzZSAvKiBpdCB3YXMgT0ZGICovCgkgIGlmIChFdnR5cGU9PUtleVByZXNzKQoJICAgIHsKCSAgICAgIFRSQUNFKCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBkb3duLCBldmVudF90aW1lICk7CgkgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCB1cCwgZXZlbnRfdGltZSApOwoJICAgICAgKlN0YXRlPVRSVUU7IC8qIEdvZXMgdG8gaW50ZXJtZWRpYXJ5IHN0YXRlIGJlZm9yZSBnb2luZyB0byBPTiAqLwoJICAgICAgcEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9uLiAqLwoJICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZQogKgogKiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGZvciA8dmtleT4sIGRlcGVuZGluZyBvbiBrZXkgPHN0YXRlPiB1bmRlciBYCiAqCiAqLwppbmxpbmUgc3RhdGljIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBpbnQgdmtleSwgaW50IHN0YXRlLCBEV09SRCB0aW1lICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKHBLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsCiAgICAgICAgICAgICAgdmtleSwgcEtleVN0YXRlVGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCiAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgMCwgc3RhdGU/IDAgOiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKCiAgICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyICUjLjJ4IFxuIixwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleW1hcE5vdGlmeQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KSB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuCiAqLwp2b2lkIFgxMURSVl9LZXltYXBOb3RpZnkoIEhXTkQgaHduZCwgWEtleW1hcEV2ZW50ICpldmVudCApCnsKICAgIGludCBpLCBqLCBhbHQsIGNvbnRyb2wsIHNoaWZ0OwogICAgRFdPUkQgdGltZSA9IEdldEN1cnJlbnRUaW1lKCk7CgogICAgYWx0ID0gY29udHJvbCA9IHNoaWZ0ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogICAgewogICAgICAgIGlmICghZXZlbnQtPmtleV92ZWN0b3JbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShldmVudC0+a2V5X3ZlY3RvcltpXSAmICgxPDxqKSkpIGNvbnRpbnVlOwogICAgICAgICAgICBzd2l0Y2goa2V5YzJ2a2V5WyhpICogOCkgKyBqXSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19NRU5VOiAgICBhbHQgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19DT05UUk9MOiBjb250cm9sID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6ICAgc2hpZnQgPSAxOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19NRU5VLCBhbHQsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19DT05UUk9MLCBjb250cm9sLCB0aW1lICk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggVktfU0hJRlQsIHNoaWZ0LCB0aW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYS2V5RXZlbnQgKmV2ZW50ICkKewogICAgY2hhciBTdHJbMjRdOyAKICAgIEtleVN5bSBrZXlzeW07CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CgogICAgRFdPUkQgZXZlbnRfdGltZSA9IGV2ZW50LT50aW1lIC0gWDExRFJWX3NlcnZlcl9zdGFydHRpY2tzOwoKICAgIC8qIHRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIGRlYWQga2V5cyAqLwogICAgaWYgKChldmVudC0+a2V5Y29kZSA+PiA4KSA9PSAweDEwKQoJZXZlbnQtPmtleWNvZGU9KGV2ZW50LT5rZXljb2RlICYgMHhmZik7CgogICAgYXNjaWlfY2hhcnMgPSBUU1hMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sIE5VTEwpOwoKICAgIC8qIElnbm9yZSBzb21lIHVud2FudGVkIGV2ZW50cyAqLwogICAgaWYgKGtleXN5bSA9PSBYS19JU09fUHJldl9Hcm91cCB8fAoJa2V5c3ltID09IFhLX0lTT19OZXh0X0dyb3VwIHx8CglrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCiAgICB7CglUUkFDRSgiSWdub3JpbmcgJXMga2V5Ym9hcmQgZXZlbnRcbiIsIFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSkpOwoJcmV0dXJuOwogICAgfQoKICAgIFRSQUNFXyhrZXkpKCJzdGF0ZSA9ICVYXG4iLCBldmVudC0+c3RhdGUpOwoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGlzIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZWQgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggc2hvdWxkIGZvciBBbHRHciBzaG91bGQgCiAgICAgICBiZSAyIChldmVudC0+c3RhdGUgPSAweDIwMDApLiBJdCdzIHByb2JhYmx5IGJldHRlciB0byBub3QgYXNzdW1lIGEKICAgICAgIHByZWRlZmluZWQgZ3JvdXAgaW5kZXggYW5kIGZpbmQgaXQgZHluYW1pY2FsbHkKCiAgICAgICBSZWY6IFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBMaWJyYXJ5IHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTQuMS4xIGFuZCAxNy4xLjEpICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAweDYwMDA7CgogICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CiAgICBpZiAoVFJBQ0VfT04oa2V5KSl7CgljaGFyCSprc25hbWU7CgoJa3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLCAKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIFN0clswXSAmIDB4ZmYsIFN0cik7CiAgICB9CgogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoZXZlbnQpOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKICAgICAgICAgICAgICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKCiAgIGlmICh2a2V5KQogICB7CiAgICBzd2l0Y2ggKHZrZXkgJiAweGZmKQogICAgewogICAgY2FzZSBWS19OVU1MT0NLOiAgICAKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DQVBJVEFMOgogICAgICBUUkFDRSgiQ2FwcyBMb2NrIGV2ZW50LiAodHlwZSAlZCkuIFN0YXRlIGJlZm9yZSA6ICUjLjJ4XG4iLGV2ZW50LT50eXBlLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIEFkanVzdCB0aGUgTlVNTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKCSAgeyAKCSAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUuIFxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVByZXNzLCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVJlbGVhc2UsIGV2ZW50X3RpbWUgKTsKCSAgfQogICAgICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKHBLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBMb2NrTWFzaykpCgkgIHsKICAgICAgICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlQcmVzcywgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlSZWxlYXNlLCBldmVudF90aW1lICk7CgkgIH0KCS8qIE5vdCBOdW0gbm9yIENhcHMgOiBlbmQgb2YgaW50ZXJtZWRpYXJ5IHN0YXRlcyBmb3IgYm90aC4gKi8KCU51bVN0YXRlID0gRkFMU0U7CglDYXBzU3RhdGUgPSBGQUxTRTsKCgliU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwoJVFJBQ0VfKGtleSkoImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKCWR3RmxhZ3MgPSAwOwoJaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCiAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lICk7CiAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0luaXRLZXlib2FyZAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCAodm9pZCkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxOwogIGludCBzY29yZSwga2V5YywgaSwga2V5LCBwa2V5LCBvaywgc3ltczsKICBLZXlTeW0ga2V5c3ltOwogIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgdW5zaWduZWQgbWF4X3NlcSA9IDA7CiAgaW50IG1heF9zY29yZSA9IDAsIGlzbWF0Y2ggPSAwOwogIGNoYXIgY2tleVs0XSA9CiAgezAsIDAsIDAsIDB9OwoKICBzeW1zID0ga2V5c3ltc19wZXJfa2V5Y29kZTsKICBpZiAoc3ltcyA+IDQpIHsKICAgIFdBUk4oIiVkIGtleXN5bXMgcGVyIGtleWNvZGUgbm90IHN1cHBvcnRlZCwgc2V0IHRvIDRcbiIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewoJa2V5c3ltID0gVFNYS2V5Y29kZVRvS2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDApICYmIChrZXlzeW0gIT0gJyAnKSkKCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgllbHNlIHsKCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogICAgICBpZiAoY2tleVswXSkgewoJLyogc2VhcmNoIGZvciBhIG1hdGNoIGluIGxheW91dCB0YWJsZSAqLwoJLyogcmlnaHQgbm93LCB3ZSBqdXN0IGZpbmQgYW4gYWJzb2x1dGUgbWF0Y2ggZm9yIGRlZmluZWQgcG9zaXRpb25zICovCgkvKiAodW5kZWZpbmVkIHBvc2l0aW9ucyBhcmUgaWdub3JlZCwgc28gaWYgaXQncyBkZWZpbmVkIGFzICIzIyIgaW4gKi8KCS8qIHRoZSB0YWJsZSwgaXQncyBva2F5IHRoYXQgdGhlIFggc2VydmVyIGhhcyAiMyOjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewoJICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJWQsIGNoYXJhY3RlciAlY1xuIiwga2V5YywKCQkgY2tleVswXSk7CgkgIG1pc21hdGNoKys7CgkgIHNjb3JlIC09IHN5bXM7Cgl9CiAgICAgIH0KICAgIH0KICAgIFRSQUNFKCJtYXRjaGVzPSVkLCBtaXNtYXRjaGVzPSVkLCBzZXE9JWQsIHNjb3JlPSVkXG4iLAoJICAgbWF0Y2gsIG1pc21hdGNoLCBzZXEsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkgewogICAgRklYTUUoCgkgICAiWW91ciBrZXlib2FyZCBsYXlvdXQgd2FzIG5vdCBmb3VuZCFcbiIKCSAgICJVc2luZyBjbG9zZXN0IG1hdGNoIGluc3RlYWQgKCVzKSBmb3Igc2NhbmNvZGUgbWFwcGluZy5cbiIKCSAgICJQbGVhc2UgZGVmaW5lIHlvdXIgbGF5b3V0IGluIHdpbmRvd3MveDExZHJ2L2tleWJvYXJkLmMgYW5kIHN1Ym1pdCB0aGVtXG4iCgkgICAidG8gdXMgZm9yIGluY2x1c2lvbiBpbnRvIGZ1dHVyZSBXaW5lIHJlbGVhc2VzLlxuIgoJICAgIlNlZSB0aGUgV2luZSBVc2VyIEd1aWRlLCBjaGFwdGVyIFwiS2V5Ym9hcmRcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsCgkgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CiAgfQoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSW5pdEtleWJvYXJkIChYMTFEUlYuQCkKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggQllURSAqa2V5X3N0YXRlX3RhYmxlICkKewojaWZkZWYgSEFWRV9YS0IKICAgIGludCB4a2JfbWFqb3IgPSBYa2JNYWpvclZlcnNpb24sIHhrYl9taW5vciA9IFhrYk1pbm9yVmVyc2lvbjsKI2VuZGlmCiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5LCBPRU12a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKCiAgICBwS2V5U3RhdGVUYWJsZSA9IGtleV9zdGF0ZV90YWJsZTsKCiNpZmRlZiBIQVZFX1hLQgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBpc194a2IgPSBYa2JRdWVyeUV4dGVuc2lvbihkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhrYl9vcGNvZGUsICZ4a2JfZXZlbnQsICZ4a2JfZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGtiX21ham9yLCAmeGtiX21pbm9yKTsKICAgIGlmIChpc194a2IpIHsKICAgICAgICAvKiB3ZSBoYXZlIFhLQiwgYXBwcm94aW1hdGUgV2luZG93cyBiZWhhdmlvdXIgKi8KICAgICAgICBYa2JTZXREZXRlY3RhYmxlQXV0b1JlcGVhdChkaXNwbGF5LCBUcnVlLCBOVUxMKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiNlbmRpZgogICAgVFNYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFRTWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFRTWEZyZWUoa3NwKTsKICAgIG1tcCA9IFRTWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CiAgICAgICAgCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwogICAgICAgICAgICAgICAgCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBUU1hGcmVlTW9kaWZpZXJtYXAobW1wKTsKCiAgICAvKiBEZXRlY3QgdGhlIGtleWJvYXJkIGxheW91dCAqLwogICAgWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCgpOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5rZXk7CiAgICBzeW1zID0gKGtleXN5bXNfcGVyX2tleWNvZGUgPiA0KSA/IDQgOiBrZXlzeW1zX3Blcl9rZXljb2RlOwoKICAgIC8qIE5vdyBidWlsZCB0d28gY29udmVyc2lvbiBhcnJheXMgOgogICAgICoga2V5Y29kZSAtPiB2a2V5ICsgc2NhbmNvZGUgKyBleHRlbmRlZAogICAgICogdmtleSArIGV4dGVuZGVkIC0+IGtleWNvZGUgKi8KCiAgICBlMi5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUyLnN0YXRlID0gMDsKCiAgICBPRU12a2V5ID0gVktfT0VNXzc7IC8qIG5leHQgaXMgYXZhaWxhYmxlLiAgKi8KICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgVFNYTG9va3VwU3RyaW5nKCZlMiwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMCkgJiYgKGtleXN5bSE9JyAnKSkgewoJCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KCiAgICAgICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KCSAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFZLXzAgJiYga2V5c3ltIDw9IFZLXzkpCiAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKSkgewoJCSAgICB2a2V5ID0ga2V5c3ltOwoJCX0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFRTWExvb2t1cEtleXN5bSgmZTIsIGkpOwoJCXN3aXRjaCAoa2V5c3ltKQoJCXsKCQljYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8xOyBicmVhazsKCQljYXNlICcvJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8yOyBicmVhazsKCQljYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKCQljYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV80OyBicmVhazsKCQljYXNlICdcXCc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV81OyBicmVhazsKCQljYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV82OyBicmVhazsKCQljYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV83OyBicmVhazsKCQljYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9DT01NQTsgYnJlYWs7CgkJY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUEVSSU9EOyBicmVhazsKCQljYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9NSU5VUzsgYnJlYWs7CgkJY2FzZSAnKyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUExVUzsgYnJlYWs7CgkJfQoJICAgIH0KCiAgICAgICAgICAgIGlmICghdmtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogT3RoZXJzIGtleXM6IGxldCdzIGFzc2lnbiBPRU0gdmlydHVhbCBrZXkgY29kZXMgaW4gdGhlIGFsbG93ZWQgcmFuZ2UsCiAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIChbMHhiYSwweGMwXSwgWzB4ZGIsMHhlNF0sIDB4ZTYgKGdpdmVuIHVwKSBldCBbMHhlOSwweGY1XSkgKi8KICAgICAgICAgICAgICAgIHN3aXRjaCAoKytPRU12a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CgkJICAKICAgICAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIJKmtzbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFRTWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKCQkJICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEYoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIERQUklOVEYoIilcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgIH0gLyogZm9yICovCgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAlMDJ4ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgLyogTm93IHN0b3JlIG9uZSBrZXljb2RlIGZvciBlYWNoIG1vZGlmaWVyLiBVc2VkIHRvIHNpbXVsYXRlIGtleXByZXNzZXMuICovCiAgICBrY0NvbnRyb2wgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKICAgIGtjQWx0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0FsdF9MKTsKICAgIGlmICgha2NBbHQpIGtjQWx0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX01ldGFfTCk7CiAgICBrY1NoaWZ0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX1NoaWZ0X0wpOwogICAga2NOdW1Mb2NrID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX051bV9Mb2NrKTsKICAgIGtjQ2Fwc0xvY2sgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ2Fwc19Mb2NrKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX01hcHBpbmdOb3RpZnkKICovCnZvaWQgWDExRFJWX01hcHBpbmdOb3RpZnkoIFhNYXBwaW5nRXZlbnQgKmV2ZW50ICkKewogICAgVFNYUmVmcmVzaEtleWJvYXJkTWFwcGluZyhldmVudCk7CiAgICBYMTFEUlZfSW5pdEtleWJvYXJkKCBwS2V5U3RhdGVUYWJsZSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWa0tleVNjYW4gKFgxMURSVi5AKQogKi8KV09SRCBYMTFEUlZfVmtLZXlTY2FuKENIQVIgY0NoYXIpCnsKICAgICAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKCUtleUNvZGUga2V5Y29kZTsKCUtleVN5bSBrZXlzeW07ICAgIAkKCWludCBpLGluZGV4OwoJaW50IGhpZ2hieXRlPTA7CgoJLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwoJa2V5c3ltPSh1bnNpZ25lZCBjaGFyKSBjQ2hhcjsvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCglpZiAoa2V5c3ltPD0yNykga2V5c3ltKz0weEZGMDA7LypzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4qLwoJCglrZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwoJaWYgKCFrZXljb2RlKQoJeyAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwoJfQoKCVRSQUNFKCJWa0tleVNjYW4gJyVjJyglI2x4LCAlbHUpOiBnb3Qga2V5Y29kZSAlIy4yeFxuIiwKICAgICAgICAgICAgICBjQ2hhcixrZXlzeW0sa2V5c3ltLGtleWNvZGUpOwoJCglpZiAoa2V5Y29kZSkKCSAgewoJICAgIGZvciAoaW5kZXg9LTEsIGk9MDsgKGk8OCkgJiYgKGluZGV4PDApOyBpKyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KCSAgICAgIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSxrZXljb2RlLGkpPT1rZXlzeW0pIGluZGV4PWk7CgkgICAgc3dpdGNoIChpbmRleCkgewoJICAgIGNhc2UgLTEgOgoJICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIixrZXlzeW0pOyBicmVhazsKCSAgICBjYXNlIDAgOiBicmVhazsKCSAgICBjYXNlIDEgOiBoaWdoYnl0ZSA9IDB4MDEwMDsgYnJlYWs7CgkgICAgY2FzZSAyIDogaGlnaGJ5dGUgPSAweDA2MDA7IGJyZWFrOwoJICAgIGNhc2UgMyA6IGhpZ2hieXRlID0gMHgwNzAwOyBicmVhazsKCSAgICBkZWZhdWx0IDogRVJSKCJpbmRleCAlZCBmb3VuZCBieSBYS2V5Y29kZVRvS2V5c3ltLiBwbGVhc2UgcmVwb3J0ISBcbiIsaW5kZXgpOwoJICAgIH0KCSAgICAvKgoJICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAoJICAgICAgaW5kZXggOiAxICAgICBhZGRzIDB4MDEwMCAoc2hpZnQpCgkgICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQoJICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCgkgICAgICBpbmRleCA6IDMgICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCkKCSAgICAgKi8KCSAgfQoJVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCBrZXljMnZrZXlba2V5Y29kZV0raGlnaGJ5dGUpOwoJcmV0dXJuIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZTsgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5IChYMTFEUlYuQCkKICovClVJTlQgWDExRFJWX01hcFZpcnR1YWxLZXkoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CgojZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBUUkFDRSgicmV0dXJuaW5nIDB4JXguXG4iLHZhbHVlKTsgcmV0dXJuIHZhbHVlOyB9CgoJVFJBQ0UoIk1hcFZpcnR1YWxLZXkgd0NvZGU9MHgleCB3TWFwVHlwZT0lZCAuLi4gXG4iLCB3Q29kZSx3TWFwVHlwZSk7Cglzd2l0Y2god01hcFR5cGUpIHsKCQljYXNlIDA6CXsgLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJCQlyZXR1cm5NVksgKGtleWMyc2NhbltrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7IH0KCgkJY2FzZSAxOiB7IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KCQkJLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCgkJCQkJcmV0dXJuTVZLIChrZXljMnZrZXlba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyB2a2V5LWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMjogeyAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLwoJCQkvKiAod2FzIEZJWE1FKSA6IHdoYXQgZG9lcyB1bnNoaWZ0ZWQgbWVhbiA/ICdhJyBvciAnQScgPyAqLwoJCSAgICAgICAgLyogTXkgV2luZG93cyByZXR1cm5zICdBJy4gKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljOwoJCQljaGFyIHNbMl07CgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOyAvKiB1bnNoaWZ0ZWQgKi8KCgkJCWUua2V5Y29kZSA9IDA7CgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwogICAgICAgICAgCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISEgXG4iLCB3Q29kZSk7CgkJCSAgcmV0dXJuIDA7IC8qIHdoYXRldmVyICovCgkJCX0KCQkJVFJBQ0UoIkZvdW5kIGtleWNvZGUgJWQgKDB4JTJYKVxuIixlLmtleWNvZGUsZS5rZXljb2RlKTsKCgkJCWlmIChUU1hMb29rdXBTdHJpbmcoJmUsIHMsIDIsICZrZXlzeW0sIE5VTEwpKQoJCQkgIHJldHVybk1WSyAoKnMpOwoJCQkKCQkJVFJBQ0UoInJldHVybmluZyBubyBBTlNJLlxuIik7CgkJCXJldHVybiAwOwoJCQl9CgoJCWNhc2UgMzogICAvKiAqKk5UIG9ubHkqKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlIGJ1dCBkaXN0aW5ndWlzaCBiZXR3ZWVuICAqLwogICAgICAgICAgICAgIAkJICAvKiAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAgKi8KCQkgICAgICAgICAgRklYTUUoIiBzdHViIGZvciBOVFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCVdBUk4oIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwoJCQlyZXR1cm4gMDsJCgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UIG5TaXplKQp7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoJCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIC8qIEZJWE1FOiBzaG91bGQgdXNlIE1WSyB0eXBlIDMgKE5UIHZlcnNpb24gdGhhdCBkaXN0aW5ndWlzaGVzIHJpZ2h0IGFuZCBsZWZ0ICovCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5KHNjYW5Db2RlLCAxKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXkodmtleSwgMik7CiAgVFJBQ0UoInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0eCwgQU5TSSAweCUwNHhcbiIsIHNjYW5Db2RlLCB2a2V5LCBhbnNpKTsKCiAgLyogZmlyc3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSAicmVndWxhciIga2V5cyB3aGljaCBpcyB0aGUgVXBwZXIgY2FzZQogICAgIHZhbHVlIG9mIHRoZSBrZXljYXAgaW1wcmludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpZiAoICgoYW5zaSA+PSAweDIxKSAmJiAoYW5zaSA8PSAweDdlKSkgJiYKICAgICAgIChzY2FuQ29kZSAhPSAweDEzNykgJiYgICAvKiBQcnRTY24gICAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MTM1KSAmJiAgIC8qIG51bXBhZCAvICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgzNyApICYmICAgLyogbnVtcGFkICogKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRhICkgJiYgICAvKiBudW1wYWQgLSAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGUgKSApICAgIC8qIG51bXBhZCArICovCiAgICAgIHsKICAgICAgICBpZiAoKG5TaXplID49IDIpICYmIGxwQnVmZmVyKQoJewogICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXIoKGNoYXIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gCiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBmb3IgKGtleWk9bWluX2tleWNvZGU7IGtleWk8PW1heF9rZXljb2RlOyBrZXlpKyspCiAgICAgIGlmICgoa2V5YzJzY2FuW2tleWldKSA9PSBzY2FuQ29kZSkKICAgICAgICAgYnJlYWs7CiAgaWYgKGtleWkgPD0gbWF4X2tleWNvZGUpCiAgewogICAgICBrZXljID0gKEtleUNvZGUpIGtleWk7CiAgICAgIGtleXMgPSBUU1hLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSUwNHgga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgIHsKICAgICAgICAgIGxzdHJjcHluQShscEJ1ZmZlciwgbmFtZSwgblNpemUpOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgRklYTUUgZm9yIHVua25vd24ga2V5cyAgICovCgogIEZJWE1FKCIoJTA4bHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CSAKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlIChYMTFEUlYuQCkKICoKICogVGhlIFRvVW5pY29kZSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVCBYMTFEUlZfVG9Vbmljb2RlKFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsCgkJICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncykKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBCWVRFIGxwQ2hhclsyXTsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAgICB7CglUUkFDRSgiU2hpZnRNYXNrID0gJTA0eFxuIiwgU2hpZnRNYXNrKTsKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQogICAgewoJVFJBQ0UoIkxvY2tNYXNrID0gJTA0eFxuIiwgTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJDb250cm9sTWFzayA9ICUwNHhcbiIsIENvbnRyb2xNYXNrKTsKCWUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTnVtTG9ja01hc2sgPSAlMDR4XG4iLCBOdW1Mb2NrTWFzayk7CgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgfQoKICAgIC8qIFJlc3RvcmUgc2F2ZWQgQWx0R3Igc3RhdGUgKi8KICAgIFRSQUNFKCJBbHRHck1hc2sgPSAlMDR4XG4iLCBBbHRHck1hc2spOwogICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gJVhcbiIsCgkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwogICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKICAgICAgeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KICAgICAgICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHZpcnRLZXkpCiAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CiAgICAgICAgICAKICAgIGlmICh2aXJ0S2V5PT1WS19ERUNJTUFMKQogICAgICAgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICghZS5rZXljb2RlKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CglyZXR1cm4gdmlydEtleTsgLyogd2hhdGV2ZXIgKi8KICAgICAgfQogICAgZWxzZSBUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKICAgIHJldCA9IFRTWExvb2t1cFN0cmluZygmZSwgKExQVk9JRClscENoYXIsIDIsICZrZXlzeW0sIE5VTEwpOwogICAgaWYgKHJldCA9PSAwKQoJewoJQllURSBkZWFkX2NoYXI7CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKCSAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwoJICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY2hhcgkqa3NuYW1lOwoKCSAgICBrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlFUlIoIlBsZWFzZSByZXBvcnQ6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUpOwoJCUVSUigiKHZpcnRLZXk9JVgsc2NhbkNvZGU9JVgsa2V5Y29kZT0lWCxzdGF0ZT0lWClcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QgCiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqKGNoYXIqKWxwQ2hhciA9IDA7CiAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBXZSBoYXZlIGFub3RoZXIgc3BlY2lhbCBjYXNlIGZvciBkZWxldGUga2V5IChYS19EZWxldGUpIG9uIGFuCiAgICAgICAgIGV4dGVuZGVkIGtleWJvYXJkLiBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndCAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRGVsZXRlKQogICAgICAgIHsKICAgICAgICAgICAgKihjaGFyKilscENoYXIgPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICAqKGNoYXIqKWxwQ2hhciA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCBmcm9tIGNvZGUgcGFnZSAlZCB0byB1bmljb2RlXG4iLAoJCSooQllURSAqKWxwQ2hhciwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmxheW91dF9jcCk7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwLCAwLCAoTFBDU1RSKWxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKICAgIFRSQUNFXyhrZXkpKCJUb1VuaWNvZGUgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleCAlc1xuIiwKCQlyZXQsIGJ1ZlcgPyBidWZXWzBdIDogMCwgYnVmVyA/ICIiIDogIihubyBidWZmZXIpIik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgVFNYQmVsbCh0aHJlYWRfZGlzcGxheSgpLCAwKTsKfQo=