LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CgojaW5jbHVkZSAidHNfeGxpYi5oIgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1hLQgojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIngxMWRydi5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoa2V5Ym9hcmQpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXkpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkaW5wdXQpOwoKaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgTFBCWVRFIHBLZXlTdGF0ZVRhYmxlOwpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwpzdGF0aWMgaW50IGtjQ29udHJvbCwga2NBbHQsIGtjU2hpZnQsIGtjTnVtTG9jaywga2NDYXBzTG9jazsgLyoga2V5Y29kZXMgKi8KI2lmZGVmIEhBVkVfWEtCCnN0YXRpYyBpbnQgaXNfeGtiLCB4a2Jfb3Bjb2RlLCB4a2JfZXZlbnQsIHhrYl9lcnJvcjsKI2VuZGlmCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgIFZLX1EsVktfVyxWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX0EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICBWS19aLFZLX1gsVktfQyxWS19WLFZLX0IsVktfTixWS19NLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICBWS19RLFZLX1csVktfRSxWS19SLFZLX1QsVktfWSxWS19VLFZLX0ksVktfTyxWS19QLFZLX09FTV80LFZLX09FTV82LAogICBWS19BLFZLX1MsVktfRCxWS19GLFZLX0csVktfSCxWS19KLFZLX0ssVktfTCxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsVktfWixWS19YLFZLX0MsVktfVixWS19CLFZLX04sVktfTSxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgIFZLX0EsVktfWixWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzYsVktfT0VNXzEsCiAgIFZLX1EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX00sVktfT0VNXzMsVktfT0VNXzUsCiAgIFZLX1csVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV80LFZLX09FTV82LAogICBWS19PRU1fNyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19QLFZLX1ksVktfRixWS19HLFZLX0MsVktfUixWS19MLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICBWS19BLFZLX08sVktfRSxWS19VLFZLX0ksVktfRCxWS19ILFZLX1QsVktfTixWS19TLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsVktfUSxWS19KLFZLX0ssVktfWCxWS19CLFZLX00sVktfVyxWS19WLFZLX1osCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKiBGSVhNRTogYWRkIG90aGVyIGxheW91dHMsIHN1Y2ggYXMgR2VybWFuIFFXRVJUWiAqLwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgLWRlYnVnbXNnICtrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIlx4ZmNceGRjIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGY2XHhkNiIsIlx4ZTRceGM0IiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBFcmljIFBvdWVjaCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyfiIsIlwiMyMiLCInNHsiLCIoNVsiLCItNnwiLCLoNyIsIl84XFwiLCLnOV6xIiwi4DBAIiwiKbBdIiwiPSt9IiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKOkIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JSIsIiq1IiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCIhpyIsCiAiPD4iCn07CgovKioqIEljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFLta2hhcvB1ciBFZ2lsc3NvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVNbTUFJTl9MRU5dWzRdID0KewogIrAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi9tZcXCIsIi1fIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/fiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0XiIsIisqYCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46Iiwi/t4iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgVWxyaWNoIFdlaWdhbmQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwisiIsIjOnsyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCInYCIsCiAicVFAIiwid1ciLCJlRYAiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiI7QiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NtSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX25vZGVhZFtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIrQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIDEwNSBLZXlzIChjb250cmlidXRlZCBieSBNYXR0aGlhcyBGZWNobmVyKSovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX25vZGVhZF8xMDVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCKyIiwiM6ezIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIidgIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICI8PnwiLCJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCn07CgovKioqIFN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIE5heWxvcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0dbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSt8IiwiMlwiQCIsIjMqIyIsIjTnIiwiNSUiLCI2JqwiLCI3L6YiLCI4KKIiLCI5KSIsIjA9IiwiJz+0IiwiXmB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoWyIsIqghXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9ukiLCLk4HsiLCIko30iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQaGlsaXBwZSBGcm9pZGV2YXV4KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRltNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxK3wiLCIyXCJAIiwiMyojIiwiNOciLCI1JSIsIjYmrCIsIjcvpiIsIjgooiIsIjkpIiwiMD0iLCInP7QiLCJeYH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PxbIiwiqCFdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLp9iIsIuDkeyIsIiSjfSIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEJlcnRobyBTdHVsdGllbnMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIrRgfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBldGVyIEJvcnRhcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/XFwiLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgTWV0c21hIHpvbWJpODJAaG90LmVlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FVFtNQUlOX0xFTl1bNF0gPQp7CiAiIH4iLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwi9dWnIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyq9IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApvCIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIrioXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzp+IiwiYGB7IiwiPD59IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnLSIsIi4iLCLpySIsCiAiq7uwIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFymIiwiMSEiLCIyXCJAIiwiMyOjIiwiNCSnIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIic/Iiwiq7siLAogInFRIiwgICJ3VyIsImVFIiwgICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICIrKlxcqCIsIlxcJ1xcYCIsCiAiYUEiLCAgInNTIiwiZEQiLCAgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIufHIiwgIrqqIiwgIlxcflxcXiIsCiAieloiLCAgInhYIiwiY0MiLCAgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw7IiwgIi46IiwgIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhuSIsIjJcIrIiLCIzo7MiLCI0JLwiLCI1Jb0iLCI2Jr4iLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCInP2AiLCLsXn4iLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0/4IiwicFD+Iiwi6OlbIiwiKypdIiwKICJhQSIsInNT3yIsImRE8CIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvLnQCIsIuCwIyIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTbUiLCIsOyIsIi46tyIsIi1fIiwKICI8PnwiCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICIiLCIxISIsIjJcIkAiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/XFwiLCJcJ2AiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiIiwiXCJefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiIiwiIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTcGFuaXNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSm9z6SBNYXJjb3MgTPNwZXopICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qlxcIiwiMSF8IiwiMlwiQCIsIjO3IyIsIjQkfiIsIjUlIiwiNiasIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeWyIsIisqXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qHsiLCLnx30iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgWm9sdOFuIEtvduFjcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlsCIsIjYvsiIsIjc9YCIsIjgo/yIsIjkptCIsIvbWvSIsIvzcqCIsIvPTuCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSc0iLCJvT/giLCJwUCIsIvXV9yIsIvra1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpK7SIsImtLsyIsImxMoyIsIunJJCIsIuHB3yIsIvvbpCIsCiAieVk+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzsiLCIuOrciLCItXyoiLAogIu3NPCIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgYnkgUm9rIE1hbmRlbGpjIDxyb2subWFuZGVsamNAZ2ltYi5vcmc+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCK3IiwiMyNeIiwiNCSiIiwiNSWwIiwiNiayIiwiNy9gIiwiOCj/IiwiOSm0IiwiMD29IiwiJz+oIiwiKyq4IiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmp9yIsIvDQ1yIsCiAiYUEiLCJzUyIsImREIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIujIIiwi5sbfIiwivq6kIiwKICJ5WSIsInhYIiwiY0MiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTaciLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwityIsIjMjXiIsIjQkoiIsIjUlsCIsIjYmsiIsIjcvYCIsIjgo/yIsIjkptCIsIjA9vSIsIic/qCIsIisquCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qfciLCLw0NciLAogImFBIiwic1MiLCJkRCIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCLoyCIsIubG3yIsIr6upCIsCiAieVkiLCJ4WCIsImNDIiwidlZAIiwiYkJ7Iiwibk59IiwibU2nIiwiLDsiLCIuOiIsIi1fLyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfcGM5OHgxW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXmAiLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQH4iLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgR29tZXMgRmVybmFuZGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjaoIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrRgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCB3aXRoIDxBTFQgR1I+IChjb250cmlidXRlZCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyX2FsdF9ncltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSE5IiwiMkAyIiwiMyMzIiwiNCQjIiwiNSVcIiIsIjYoLCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiNGAiLCJbeyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsImdHIiwifl4iLCJdfToiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8wIiwKICJcXHwiCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiOzAiLCIrMSIsIrUyIiwiuTMiLCLoNCIsIrs1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwiJ3YiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCLkKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9FwiIiwipyEiLCLyKSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjeikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjel9xd2VydHkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaX3F3ZXJ0eVtNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIFNsb3ZhayBhbmQgQ3plY2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19kdWFsKGNzX3NrX3VjdykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLX3Byb2dbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUeTEIiwid1fszCIsImVF6ckiLCJyUvjYIiwidFS7qyIsInlZ/d0iLCJ1VfnZIiwiaUntzSIsIm9P89MiLCJwUPbWIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTuakiLCJkRO/PIiwiZkbryyIsImdH4MAiLCJoSPraIiwiakr83CIsImtL9NQiLCJsTLWlIiwiOzoiLCInXCIiLCJcXHwiLAogInpavq4iLCJ4WKQiLCJjQ+jIIiwidlbnxyIsImJCIiwibk7y0iIsIm1N5cUiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShjc19xd2VydHkpIGluIHhrYnNlbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1NbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpML0pIiwiPSUiLCIiLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i9beyIsIikoXX0iLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIvlcIiQiLCKnId8iLCKoJyIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEdhYnJpZWwgT3JsYW5kbyBHYXJjaWEpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xBW01BSU5fTEVOXVs0XSA9CnsKICJ8sKwiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInP1xcIiwiv6EiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrSoIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dYCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgTmVyaWp1cyBCYWxp+25hcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTFRfQltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIx4MAiLCIy6MgiLCIz5sYiLCI068siLCI14cEiLCI28NAiLCI3+NgiLCI4+9siLCI5pSgiLCIwtCkiLCItXyIsIj3+3iIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIElzcmFlbGkga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMW01BSU5fTEVOXVs0XSA9CnsKICJgfjsiLCIxITEiLCIyQDIiLCIzIzMiLCI0JDQiLCI1JTUiLCI2XjYiLCI3JjciLCI4KjgiLCI5KDkiLCIwKTAiLCItXy0iLCI9Kz0iLAogInFRLyIsIndXJyIsImVF9yIsInJS+CIsInRU4CIsInlZ6CIsInVV5SIsImlJ7yIsIm9P7SIsInBQ9CIsIlt7WyIsIl19XSIsCiAiYUH5Iiwic1PjIiwiZETiIiwiZkbrIiwiZ0fyIiwiaEjpIiwiakrnIiwia0vsIiwibEzqIiwiOzrzIiwiXCdcIiwiLCJcXHxcXCIsCiAielrmIiwieFjxIiwiY0PhIiwidlbkIiwiYkLwIiwibk7uIiwibU32IiwiLDz6IiwiLj71IiwiLz8uIgp9OwoKLyoqKiBHcmVlayBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEtyaXRvbiBLeXJpbWlzIDxreXJpbWlzQGN0aS5ncj4pCiAgR3JlZWsgY2hhcmFjdGVycyBmb3IgIndXIiBhbmQgInNTIiBhcmUgb21pdHRlZCB0byBub3QgcHJvZHVjZSBhIG1pc21hdGNoCiAgbWVzc2FnZSBzaW5jZSB0aGV5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgaW4gZ3IgYW5kIGVsIFhGcmVlODYgbGF5b3V0cy4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRUxbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUTs6Iiwid1ciLCJlReXFIiwiclLx0SIsInRU9NQiLCJ5WfXVIiwidVXoyCIsImlJ6ckiLCJvT+/PIiwicFDw0CIsIlt7IiwiXX0iLAogImFB4cEiLCJzUyIsImRE5MQiLCJmRvbWIiwiZ0fjwyIsImhI58ciLCJqSu7OIiwia0vqyiIsImxM68siLCI7OrSoIiwiJ1wiIiwiXFx8IiwKICJ6WubGIiwieFj31yIsImND+NgiLCJ2VvnZIiwiYkLiwiIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgVktfMSxWS18yLFZLXzMsVktfNCxWS181LFZLXzYsVktfNyxWS184LFZLXzksVktfMCxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgIFZLX0EsVktfQixWS19DLFZLX0QsVktfRSxWS19GLFZLX0csVktfSCxWS19JLFZLX0osVktfSyxWS19MLFZLX00sVktfTixWS19PLFZLX1AsVktfUSxWS19SLFZLX1MsVktfVCxWS19VLFZLX1YsVktfVyxWS19YLFZLX1ksVktfWiwKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgVUlOVCBsYXlvdXRfY3A7IC8qIENvZGUgcGFnZSBmb3IgdGhpcyBsYXlvdXQgKi8KICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfZHZvcmFrLCAmbWFpbl9rZXlfc2Nhbl9kdm9yYWssICZtYWluX2tleV92a2V5X2R2b3Jha30sCiB7IkJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9ERSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgMjg2MDUsICZtYWluX2tleV9ERV9ub2RlYWQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCBmb3IgbG9naXRlY2ggZGVza3RvcCBwcm8iLCAyODYwNSwgJm1haW5fa2V5X0RFX2xvZ2l0ZWNoLCAgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIDEwNSIsIDI4NjA1LCAmbWFpbl9rZXlfREVfbm9kZWFkXzEwNSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9TRywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTd2VkaXNoIGtleWJvYXJkIGxheW91dCIsIDI4NjA1LCAmbWFpbl9rZXlfU0UsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9FVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg2MDUsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogeyJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NjA1LCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsIDI4NjA1LCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAyODYwNSwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgQUxUIEdSIiwgMjg1OTEsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsiVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfaW50bCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsIDI4NjA1LCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQiLCAxMjUxLCAmbWFpbl9rZXlfQkdfYmRzLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAxMjUxLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAxMjUxLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAyMDg2NiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsIDIwODY2LCAmbWFpbl9rZXlfUlVfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAyMDg2NiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIiwgMjA4NjYsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsIDI4NjA1LCAmbWFpbl9rZXlfRVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAyODYwNSwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQiLCAyODYwNSwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7Ikh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X0hVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkyLCAmbWFpbl9rZXlfSFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAyODU5MiwgJm1haW5fa2V5X0hSX2plbGx5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQiLCA5MzIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgOTMyLCAmbWFpbl9rZXlfSkFfcGM5OHgxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlNsb3ZhayBhbmQgQ3plY2gga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgMjg1OTIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkN6ZWNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkyLCAmbWFpbl9rZXlfQ1MsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgMjg1OTIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5IiwgMjg1OTIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9MQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsIDI4NjAzLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJUdXJraXNoIGtleWJvYXJkIGxheW91dCIsIDI4NTk5LCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSXNyYWVsaSBrZXlib2FyZCBsYXlvdXQiLCAyODU5OCwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlZOQyBrZXlib2FyZCBsYXlvdXQiLCAyODYwNSwgJm1haW5fa2V5X3ZuYywgJm1haW5fa2V5X3NjYW5fdm5jLCAmbWFpbl9rZXlfdmtleV92bmN9LAogeyJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAyODU5NywgJm1haW5fa2V5X0VMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgoge05VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAwLCAwLCBWS19FU0NBUEUsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjUwICovCiAgICBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsIDAsIDAsIDAsICAvKiBGRjYwICovCiAgICBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAvKiBGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgVktfRU5ELCAwLCBWS19JTlNFUlQsIFZLX0RFTEVURSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwKICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDQsIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5LCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICBWS19GMSwgVktfRjIsCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2LCAwLCAwLCAgICAgICAvKiBGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAwLCBWS19TSElGVCwgVktfU0hJRlQsIFZLX0NPTlRST0wsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkUwICovCiAgICBWS19DT05UUk9MLCBWS19DQVBJVEFMLCAwLCBWS19NRU5VLAogICAgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgLyogRkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfc2NhblsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICAweDBFLCAweDBGLCAweDAwLCAvKj8qLyAwLCAweDAwLCAweDFDLCAweDAwLCAweDAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICAweDE0NywgMHgxNEIsIDB4MTQ4LCAweDE0RCwgMHgxNTAsIDB4MTQ5LCAweDE1MSwgMHgxNEYsICAgICAgLyogRkY1MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgLyo/Ki8gMCwgMHgxMzcsIC8qPyovIDAsIDB4MTUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzgsIDB4MTQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiBGRjY4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTM4LCAweDE0NSwgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDcsIDB4NEIsIDB4NDgsICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICAweDRELCAweDUwLCAweDQ5LCAweDUxLCAweDRGLCAweDRDLCAweDUyLCAweDUzLCAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MzcsIDB4NEUsIC8qPyovIDAsIDB4NEEsIDB4NTMsIDB4MTM1LCAgICAgICAgICAvKiBGRkE4ICovCiAgICAweDUyLCAweDRGLCAweDUwLCAweDUxLCAweDRCLCAweDRDLCAweDRELCAweDQ3LCAgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgMHg0OCwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIDB4M0IsIDB4M0MsCiAgICAweDNELCAweDNFLCAweDNGLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAgICAgICAgICAgICAgLyogRkZDMCAqLwogICAgMHg1NywgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMHgwMCwgMHgyQSwgMHgzNiwgMHgxRCwgMHgxMUQsIDB4M0EsIDB4MDAsIDB4MzgsICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIDB4MTM4LCAweDM4LCAweDEzOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAvKiBGRkU4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNTMgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwovKiB4MTEgbG9jayBtdXN0IGJlIGhlbGQgKi8Kc3RhdGljIFdPUkQgRVZFTlRfZXZlbnRfdG9fdmtleSggWElDIHhpYywgWEtleUV2ZW50ICplKQp7CiAgICBLZXlTeW0ga2V5c3ltOwoKICAgIGlmICh4aWMpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGtleXN5bSA+PSAweEZGQUUpICYmIChrZXlzeW0gPD0gMHhGRkI5KSAmJiAoa2V5c3ltICE9IDB4RkZBRikKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0CiAqLwpzdGF0aWMgdm9pZCBzZW5kX2tleWJvYXJkX2lucHV0KCBXT1JEIHdWaywgV09SRCB3U2NhbiwgRFdPUkQgZHdGbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIGlucHV0LnR5cGUgICAgICAgICAgICAgPSBXSU5FX0lOVEVSTkFMX0lOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHdWazsKICAgIGlucHV0LnUua2kud1NjYW4gICAgICAgPSB3U2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBkd0ZsYWdzOwogICAgaW5wdXQudS5raS50aW1lICAgICAgICA9IHRpbWU7CiAgICBpbnB1dC51LmtpLmR3RXh0cmFJbmZvID0gMDsKICAgIFNlbmRJbnB1dCggMSwgJmlucHV0LCBzaXplb2YoaW5wdXQpICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgRFdPUkQgZXZlbnRfdGltZSApCnsKICBCT09MICogU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSk7CiAgRFdPUkQgdXAsIGRvd247CgogIGlmICgqU3RhdGUpIHsKICAgIC8qIFRoZSBJTlRFUk1FRElBUlkgc3RhdGUgbWVhbnMgOiBqdXN0IGFmdGVyIGEgJ3ByZXNzJyBldmVudCwgaWYgYSAncmVsZWFzZScgZXZlbnQgY29tZXMsCiAgICAgICBkb24ndCB0cmVhdCBpdC4gSXQncyBmcm9tIHRoZSBzYW1lIGtleSBwcmVzcy4gVGhlbiB0aGUgc3RhdGUgZ29lcyB0byBPTi4KICAgICAgIEFuZCBmcm9tIHRoZXJlLCBhICdyZWxlYXNlJyBldmVudCB3aWxsIHN3aXRjaCBvZmYgdGhlIHRvZ2dsZSBrZXkuICovCiAgICAqU3RhdGU9RkFMU0U7CiAgICBUUkFDRSgiSU5URVJNIDogZG9uXCd0IHRyZWF0IHJlbGVhc2Ugb2YgdG9nZ2xlIGtleS4gSW5wdXRLZXlTdGF0ZVRhYmxlWyUjeF0gPSAlI3hcbiIsdmtleSxwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgfSBlbHNlCiAgICB7CiAgICAgICAgZG93biA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCk7CiAgICAgICAgdXAgPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApIHwgS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCBwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MSApIC8qIGl0IHdhcyBPTiAqLwoJICB7CgkgICAgaWYgKEV2dHlwZSE9S2V5UHJlc3MpCgkgICAgICB7CgkJVFJBQ0UoIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICAgIHNlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGRvd24sIGV2ZW50X3RpbWUgKTsKCSAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUgKTsKCQkqU3RhdGU9RkFMU0U7CgkJcEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovCgkgICAgICB9CgkgIH0KCWVsc2UgLyogaXQgd2FzIE9GRiAqLwoJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKCSAgICB7CgkgICAgICBUUkFDRSgiT0ZGICsgS2V5cHJlc3MgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZG93biwgZXZlbnRfdGltZSApOwoJICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUgKTsKCSAgICAgICpTdGF0ZT1UUlVFOyAvKiBHb2VzIHRvIGludGVybWVkaWFyeSBzdGF0ZSBiZWZvcmUgZ29pbmcgdG8gT04gKi8KCSAgICAgIHBLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvbi4gKi8KCSAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8KaW5saW5lIHN0YXRpYyB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggaW50IHZrZXksIGludCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgdmtleSwgcEtleVN0YXRlVGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCiAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgMCwgc3RhdGU/IDAgOiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKCiAgICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5bWFwTm90aWZ5CiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZC4KICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4KICovCnZvaWQgWDExRFJWX0tleW1hcE5vdGlmeSggSFdORCBod25kLCBYS2V5bWFwRXZlbnQgKmV2ZW50ICkKewogICAgaW50IGksIGosIGFsdCwgY29udHJvbCwgc2hpZnQ7CiAgICBEV09SRCB0aW1lID0gR2V0Q3VycmVudFRpbWUoKTsKCiAgICBhbHQgPSBjb250cm9sID0gc2hpZnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCFldmVudC0+a2V5X3ZlY3RvcltpXSkgY29udGludWU7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghKGV2ZW50LT5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSkgY29udGludWU7CiAgICAgICAgICAgIHN3aXRjaChrZXljMnZrZXlbKGkgKiA4KSArIGpdICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX01FTlU6ICAgIGFsdCA9IDE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IGNvbnRyb2wgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19TSElGVDogICBzaGlmdCA9IDE7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX01FTlUsIGFsdCwgdGltZSApOwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX0NPTlRST0wsIGNvbnRyb2wsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19TSElGVCwgc2hpZnQsIHRpbWUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhLZXlFdmVudCAqZXZlbnQgKQp7CiAgICBjaGFyIFN0clsyNF07CiAgICBLZXlTeW0ga2V5c3ltOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgaW50IGFzY2lpX2NoYXJzOwogICAgWElDIHhpYyA9IFgxMURSVl9nZXRfaWMoIGh3bmQgKTsKICAgIERXT1JEIGV2ZW50X3RpbWUgPSBldmVudC0+dGltZSAtIFgxMURSVl9zZXJ2ZXJfc3RhcnR0aWNrczsKCiAgICAvKiB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciBkZWFkIGtleXMgKi8KICAgIGlmICgoZXZlbnQtPmtleWNvZGUgPj4gOCkgPT0gMHgxMCkKCWV2ZW50LT5rZXljb2RlPShldmVudC0+a2V5Y29kZSAmIDB4ZmYpOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgaWYgKHhpYykKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCBOVUxMKTsKICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgic3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKCiAgICAvKiBJZiBYS0IgZXh0ZW5zaW9ucyBhcmUgdXNlZCwgdGhlIHN0YXRlIG1hc2sgZm9yIEFsdEdyIHdpbGwgdXNlIHRoZSBncm91cAogICAgICAgaW5kZXggaW5zdGVhZCBvZiB0aGUgbW9kaWZpZXIgbWFzay4gVGhlIGdyb3VwIGluZGV4IGlzIHNldCBpbiBiaXRzCiAgICAgICAxMy0xNCBvZiB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIFhLZXlFdmVudCBzdHJ1Y3R1cmUuIFNvIGlmIEFsdEdyIGlzCiAgICAgICBwcmVzc2VkLCBsb29rIGlmIHRoZSBncm91cCBpbmRleCBpcyBkaWZmZXJlbnQgdGhhbiAwLiBGcm9tIFhLQgogICAgICAgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb24sIHRoZSBncm91cCBpbmRleCBmb3IgQWx0R3Igc2hvdWxkIGJlIDIKICAgICAgIChldmVudC0+c3RhdGUgPSAweDIwMDApLiBJdCdzIHByb2JhYmx5IGJldHRlciB0byBub3QgYXNzdW1lIGEKICAgICAgIHByZWRlZmluZWQgZ3JvdXAgaW5kZXggYW5kIGZpbmQgaXQgZHluYW1pY2FsbHkKCiAgICAgICBSZWY6IFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBMaWJyYXJ5IHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTQuMS4xIGFuZCAxNy4xLjEpICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAweDYwMDA7CgogICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CiAgICBpZiAoVFJBQ0VfT04oa2V5KSl7CgljaGFyCSprc25hbWU7CgoJa3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKICAgIH0KCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KHhpYyxldmVudCk7CiAgICAvKiBYIHJldHVybnMga2V5Y29kZSAwIGZvciBjb21wb3NlZCBjaGFyYWN0ZXJzICovCiAgICBpZiAoIXZrZXkgJiYgYXNjaWlfY2hhcnMpIHZrZXkgPSBWS19OT05BTUU7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKICAgICAgICAgICAgICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKCiAgIGlmICh2a2V5KQogICB7CiAgICBzd2l0Y2ggKHZrZXkgJiAweGZmKQogICAgewogICAgY2FzZSBWS19OVU1MT0NLOgogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgZXZlbnQtPnR5cGUsIGV2ZW50X3RpbWUgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX0NBUElUQUw6CiAgICAgIFRSQUNFKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnQtPnR5cGUsIGV2ZW50X3RpbWUgKTsKICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyIDogJSMuMnhcbiIscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCglpZiAoIShwS2V5U3RhdGVUYWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQoJICB7CgkgICAgVFJBQ0UoIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVByZXNzLCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVJlbGVhc2UsIGV2ZW50X3RpbWUgKTsKCSAgfQogICAgICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKHBLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBMb2NrTWFzaykpCgkgIHsKICAgICAgICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlQcmVzcywgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlSZWxlYXNlLCBldmVudF90aW1lICk7CgkgIH0KCS8qIE5vdCBOdW0gbm9yIENhcHMgOiBlbmQgb2YgaW50ZXJtZWRpYXJ5IHN0YXRlcyBmb3IgYm90aC4gKi8KCU51bVN0YXRlID0gRkFMU0U7CglDYXBzU3RhdGUgPSBGQUxTRTsKCgliU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwoJVFJBQ0VfKGtleSkoImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKCWR3RmxhZ3MgPSAwOwoJaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCiAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lICk7CiAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0luaXRLZXlib2FyZAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKiBYMTEgbG9jayBtdXN0IGJlIGhlbGQuCiAqLwpzdGF0aWMgdm9pZApYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0ICh2b2lkKQp7CiAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgdW5zaWduZWQgY3VycmVudCwgbWF0Y2gsIG1pc21hdGNoLCBzZXE7CiAgaW50IHNjb3JlLCBrZXljLCBpLCBrZXksIHBrZXksIG9rLCBzeW1zOwogIEtleVN5bSBrZXlzeW07CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzRdID0KICB7MCwgMCwgMCwgMH07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CiAgZm9yIChjdXJyZW50ID0gMDsgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQ7IGN1cnJlbnQrKykgewogICAgVFJBQ0UoIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50KTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgLyogZ2V0IGRhdGEgZm9yIGtleWNvZGUgZnJvbSBYIHNlcnZlciAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltczsgaSsrKSB7CglrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCFpc194a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICVsZFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNrZXlbMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlbaV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKCSAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXljb2RlICVkLCBjaGFyYWN0ZXIgJWMgKCUwMngsICUwMngsICUwMngsICUwMngpXG4iLCBrZXljLCBja2V5WzBdLCBja2V5WzBdLCBja2V5WzFdLCBja2V5WzJdLCBja2V5WzNdKTsKCSAgbWlzbWF0Y2grKzsKCSAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKSB7CiAgICBGSVhNRSgKCSAgICJZb3VyIGtleWJvYXJkIGxheW91dCB3YXMgbm90IGZvdW5kIVxuIgoJICAgIlVzaW5nIGNsb3Nlc3QgbWF0Y2ggaW5zdGVhZCAoJXMpIGZvciBzY2FuY29kZSBtYXBwaW5nLlxuIgoJICAgIlBsZWFzZSBkZWZpbmUgeW91ciBsYXlvdXQgaW4gd2luZG93cy94MTFkcnYva2V5Ym9hcmQuYyBhbmQgc3VibWl0IHRoZW1cbiIKCSAgICJ0byB1cyBmb3IgaW5jbHVzaW9uIGludG8gZnV0dXJlIFdpbmUgcmVsZWFzZXMuXG4iCgkgICAiU2VlIHRoZSBXaW5lIFVzZXIgR3VpZGUsIGNoYXB0ZXIgXCJLZXlib2FyZFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwKCSAgIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKICB9CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJbml0S2V5Ym9hcmQgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBCWVRFICprZXlfc3RhdGVfdGFibGUgKQp7CiNpZmRlZiBIQVZFX1hLQgogICAgaW50IHhrYl9tYWpvciA9IFhrYk1ham9yVmVyc2lvbiwgeGtiX21pbm9yID0gWGtiTWlub3JWZXJzaW9uOwojZW5kaWYKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgS2V5U3ltICprc3A7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXksIE9FTXZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwoKICAgIHBLZXlTdGF0ZVRhYmxlID0ga2V5X3N0YXRlX3RhYmxlOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwojaWZkZWYgSEFWRV9YS0IKICAgIGlzX3hrYiA9IFhrYlF1ZXJ5RXh0ZW5zaW9uKGRpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGtiX29wY29kZSwgJnhrYl9ldmVudCwgJnhrYl9lcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4a2JfbWFqb3IsICZ4a2JfbWlub3IpOwogICAgaWYgKGlzX3hrYikgewogICAgICAgIC8qIHdlIGhhdmUgWEtCLCBhcHByb3hpbWF0ZSBXaW5kb3dzIGJlaGF2aW91ciAqLwogICAgICAgIFhrYlNldERldGVjdGFibGVBdXRvUmVwZWF0KGRpc3BsYXksIFRydWUsIE5VTEwpOwogICAgfQojZW5kaWYKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFhGcmVlKGtzcCk7CgogICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CgogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwoKICAgIE9FTXZrZXkgPSBWS19PRU1fNzsgLyogbmV4dCBpcyBhdmFpbGFibGUuICAqLwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBYTG9va3VwU3RyaW5nKCZlMiwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIH0KCQl9IGVsc2UgewoJCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCQl9CgkgICAgICB9CgkgICAgICAvKiBmaW5kIGtleSB3aXRoIGxvbmdlc3QgbWF0Y2ggc3RyZWFrICovCgkgICAgICBmb3IgKGtleW49MDsga2V5bjxNQUlOX0xFTjsga2V5bisrKSB7CgkJZm9yIChvaz0oKmxrZXkpW2tleW5dW2k9MF07IG9rJiYoaTw0KTsgaSsrKQoJCSAgaWYgKCgqbGtleSlba2V5bl1baV0gJiYgKCpsa2V5KVtrZXluXVtpXSE9Y2tleVtpXSkgb2s9MDsKCQlpZiAob2t8fChpPm1heGxlbikpIHsKCQkgIG1heGxlbj1pOyBtYXh2YWw9a2V5bjsKCQl9CgkJaWYgKG9rKSBicmVhazsKCSAgICAgIH0KCSAgICAgIGlmIChtYXh2YWw+PTApIHsKCQkvKiBnb3QgaXQgKi8KCQljb25zdCBXT1JEICgqbHNjYW4pW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5zY2FuOwoJCWNvbnN0IFdPUkQgKCpsdmtleSlbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnZrZXk7CgkJc2NhbiA9ICgqbHNjYW4pW21heHZhbF07CgkJdmtleSA9ICgqbHZrZXkpW21heHZhbF07CgkgICAgICB9CgkgICAgfQoKICAgICAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwoJICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFZLXzAgJiYga2V5c3ltIDw9IFZLXzkpCiAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKSkgewoJCSAgICB2a2V5ID0ga2V5c3ltOwoJCX0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKCQlzd2l0Y2ggKGtleXN5bSkKCQl7CgkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CgkJY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMjsgYnJlYWs7CgkJY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMzsgYnJlYWs7CgkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CgkJY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNTsgYnJlYWs7CgkJY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNjsgYnJlYWs7CgkJY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CgkJY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fQ09NTUE7IGJyZWFrOwoJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CgkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOwoJCWNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BMVVM7IGJyZWFrOwoJCX0KCSAgICB9CgogICAgICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCsrT0VNdmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBXQVJOKCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OwoKICAgICAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIJKmtzbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQoJCQkgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICB9IC8qIGZvciAqLwoKICAgIC8qIElmIHNvbWUga2V5cyBzdGlsbCBsYWNrIHNjYW5jb2RlcywgYXNzaWduIHNvbWUgYXJiaXRyYXJ5IG9uZXMgdG8gdGhlbSBub3cgKi8KICAgIGZvciAoc2NhbiA9IDB4NjAsIGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdJiYha2V5YzJzY2FuW2tleWNdKSB7CgljaGFyICprc25hbWU7CglrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAlMDJ4ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgLyogTm93IHN0b3JlIG9uZSBrZXljb2RlIGZvciBlYWNoIG1vZGlmaWVyLiBVc2VkIHRvIHNpbXVsYXRlIGtleXByZXNzZXMuICovCiAgICBrY0NvbnRyb2wgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CiAgICBrY0FsdCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQWx0X0wpOwogICAgaWYgKCFrY0FsdCkga2NBbHQgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX01ldGFfTCk7CiAgICBrY1NoaWZ0ID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19TaGlmdF9MKTsKICAgIGtjTnVtTG9jayA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfTnVtX0xvY2spOwogICAga2NDYXBzTG9jayA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ2Fwc19Mb2NrKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBYTWFwcGluZ0V2ZW50ICpldmVudCApCnsKICAgIFRTWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoZXZlbnQpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggcEtleVN0YXRlVGFibGUgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuIChYMTFEUlYuQCkKICovCldPUkQgWDExRFJWX1ZrS2V5U2NhbihDSEFSIGNDaGFyKQp7CiAgICAgICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CglLZXlDb2RlIGtleWNvZGU7CglLZXlTeW0ga2V5c3ltOwoJaW50IGksaW5kZXg7CglpbnQgaGlnaGJ5dGU9MDsKCgkvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCglrZXlzeW09KHVuc2lnbmVkIGNoYXIpIGNDaGFyOy8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KCWlmIChrZXlzeW08PTI3KSBrZXlzeW0rPTB4RkYwMDsvKnNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiovCgoJa2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KCWlmICgha2V5Y29kZSkKCXsgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCgkgIGtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKCX0KCglUUkFDRSgiJyVjJyglI2x4LCAlbHUpOiBnb3Qga2V5Y29kZSAlIy4yeFxuIiwKICAgICAgICAgICAgICBjQ2hhcixrZXlzeW0sa2V5c3ltLGtleWNvZGUpOwoKCWlmIChrZXljb2RlKQoJICB7CgkgICAgZm9yIChpbmRleD0tMSwgaT0wOyAoaTw4KSAmJiAoaW5kZXg8MCk7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwoJICAgICAgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LGtleWNvZGUsaSk9PWtleXN5bSkgaW5kZXg9aTsKCSAgICBzd2l0Y2ggKGluZGV4KSB7CgkgICAgY2FzZSAtMSA6CgkgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLGtleXN5bSk7IGJyZWFrOwoJICAgIGNhc2UgMCA6IGJyZWFrOwoJICAgIGNhc2UgMSA6IGhpZ2hieXRlID0gMHgwMTAwOyBicmVhazsKCSAgICBjYXNlIDIgOiBoaWdoYnl0ZSA9IDB4MDYwMDsgYnJlYWs7CgkgICAgY2FzZSAzIDogaGlnaGJ5dGUgPSAweDA3MDA7IGJyZWFrOwoJICAgIGRlZmF1bHQgOiBFUlIoImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CgkgICAgfQoJICAgIC8qCgkgICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCgkgICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCgkgICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKCSAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQoJICAgICAqLwoJICB9CglUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZSk7CglyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlOyAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXkgKFgxMURSVi5AKQogKi8KVUlOVCBYMTFEUlZfTWFwVmlydHVhbEtleShVSU5UIHdDb2RlLCBVSU5UIHdNYXBUeXBlKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKCiNkZWZpbmUgcmV0dXJuTVZLKHZhbHVlKSB7IFRSQUNFKCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0KCglUUkFDRSgid0NvZGU9MHgleCB3TWFwVHlwZT0lZCAuLi5cbiIsIHdDb2RlLHdNYXBUeXBlKTsKCXN3aXRjaCh3TWFwVHlwZSkgewoJCWNhc2UgMDoJeyAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkJCXJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gc2Nhbi1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDE6IHsgLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwoJCQkvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkKCQkJCQlyZXR1cm5NVksgKGtleWMydmtleVtrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7IH0KCgkJY2FzZSAyOiB7IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWM7CgkJCWNoYXIgc1syXTsKCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKCgkJCWUuc3RhdGUgPSBMb2NrTWFzazsKCQkJLyogTG9ja01hc2sgc2hvdWxkIGJlaGF2ZSBleGFjdGx5IGxpa2UgY2FwcyBsb2NrIC0gdXBlcmNhc2UKCQkJICogdGhlIGxldHRlciBrZXlzIGFuZCB0aGF0cyBhYm91dCBpdC4gKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoKCQkJZS5rZXljb2RlID0gMDsKCQkJLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQoJCQl7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwoJCQkgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCSAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCgkJCSAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KCQkJCWlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHdDb2RlLVZLX05VTVBBRDArWEtfS1BfMCk7CgoJCQlpZiAod0NvZGU9PVZLX0RFQ0lNQUwpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKCQkJaWYgKCFlLmtleWNvZGUpCgkJCXsKCQkJICBXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgoJCQlpZiAoWExvb2t1cFN0cmluZygmZSwgcywgMiwgJmtleXN5bSwgTlVMTCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5NVksgKCpzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCQkJVFJBQ0UoInJldHVybmluZyBubyBBTlNJLlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkJCXJldHVybiAwOwoJCQl9CgoJCWNhc2UgMzogICAvKiAqKk5UIG9ubHkqKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlIGJ1dCBkaXN0aW5ndWlzaCBiZXR3ZWVuICAqLwogICAgICAgICAgICAgIAkJICAvKiAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAgKi8KCQkgICAgICAgICAgRklYTUUoIiBzdHViIGZvciBOVFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCVdBUk4oIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwoJCQlyZXR1cm4gMDsKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleU5hbWVUZXh0IChYMTFEUlYuQCkKICovCklOVCBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQgblNpemUpCnsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIGludCBrZXlpOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgogIHNjYW5Db2RlID0gbFBhcmFtID4+IDE2OwogIHNjYW5Db2RlICY9IDB4MWZmOyAgLyoga2VlcCAiZXh0ZW5kZWQta2V5IiBmbGFnIHdpdGggY29kZSAqLwoKICAvKiBGSVhNRTogc2hvdWxkIHVzZSBNVksgdHlwZSAzIChOVCB2ZXJzaW9uIHRoYXQgZGlzdGluZ3Vpc2hlcyByaWdodCBhbmQgbGVmdCAqLwogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleShzY2FuQ29kZSwgMSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5KHZrZXksIDIpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyKChjaGFyKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBmb3IgKGtleWk9bWluX2tleWNvZGU7IGtleWk8PW1heF9rZXljb2RlOyBrZXlpKyspCiAgICAgIGlmICgoa2V5YzJzY2FuW2tleWldKSA9PSBzY2FuQ29kZSkKICAgICAgICAgYnJlYWs7CiAgaWYgKGtleWkgPD0gbWF4X2tleWNvZGUpCiAgewogICAgICBrZXljID0gKEtleUNvZGUpIGtleWk7CiAgICAgIGtleXMgPSBUU1hLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSUwNHgga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgIHsKICAgICAgICAgIGxzdHJjcHluQShscEJ1ZmZlciwgbmFtZSwgblNpemUpOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgRklYTUUgZm9yIHVua25vd24ga2V5cyAgICovCgogIEZJWE1FKCIoJTA4bHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CgkgICAgY2FzZSBYS19kZWFkX3ZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAndic7CgkgICAgY2FzZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3MnOwoqLwoJICAgIH0KCVRSQUNFKCJubyBjaGFyYWN0ZXIgZm9yIGRlYWQga2V5c3ltIDB4JTA4bHhcbiIsa2V5c3ltKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRvVW5pY29kZSAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgWDExRFJWX1RvVW5pY29kZShVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIExQQllURSBscEtleVN0YXRlLAoJCSAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgWEtleUV2ZW50IGU7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBscENoYXJbMl07CiAgICBIV05EIGZvY3VzOwogICAgWElDIHhpYzsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlLmtleWNvZGUgPSAwOwogICAgZS5zdGF0ZSA9IDA7CiAgICBlLnR5cGUgPSBLZXlQcmVzczsKCiAgICBmb2N1cyA9IEdldEZvY3VzKCk7CiAgICBpZiAoZm9jdXMpIGZvY3VzID0gR2V0QW5jZXN0b3IoIGZvY3VzLCBHQV9ST09UICk7CiAgICBpZiAoIWZvY3VzKSBmb2N1cyA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgZS53aW5kb3cgPSBYMTFEUlZfZ2V0X3dob2xlX3dpbmRvdyggZm9jdXMgKTsKICAgIHhpYyA9IFgxMURSVl9nZXRfaWMoIGZvY3VzICk7CgogICAgaWYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJTaGlmdE1hc2sgPSAlMDR4XG4iLCBTaGlmdE1hc2spOwoJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTG9ja01hc2sgPSAlMDR4XG4iLCBMb2NrTWFzayk7CgllLnN0YXRlIHw9IExvY2tNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQogICAgewoJVFJBQ0UoIkNvbnRyb2xNYXNrID0gJTA0eFxuIiwgQ29udHJvbE1hc2spOwoJZS5zdGF0ZSB8PSBDb250cm9sTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJOdW1Mb2NrTWFzayA9ICUwNHhcbiIsIE51bUxvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTnVtTG9ja01hc2s7CiAgICB9CgogICAgLyogUmVzdG9yZSBzYXZlZCBBbHRHciBzdGF0ZSAqLwogICAgVFJBQ0UoIkFsdEdyTWFzayA9ICUwNHhcbiIsIEFsdEdyTWFzayk7CiAgICBlLnN0YXRlIHw9IEFsdEdyTWFzazsKCiAgICBUUkFDRV8oa2V5KSgiKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgaWYgKHhpYykKICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgbHBDaGFyLCAyLCAma2V5c3ltLCBOVUxMKTsKICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIDIsICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBpZiAocmV0ID09IDApCgl7CglCWVRFIGRlYWRfY2hhcjsKCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQoJICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sYXlvdXRfY3AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CgkgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjaGFyCSprc25hbWU7CgoJICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCUVSUigiUGxlYXNlIHJlcG9ydDogbm8gY2hhciBmb3Iga2V5c3ltICUwNGxYICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJRVJSKCIodmlydEtleT0lWCxzY2FuQ29kZT0lWCxrZXljb2RlPSVYLHN0YXRlPSVYKVxuIiwKICAgICAgICAgICAgICAgICAgICB2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgIT0gMCAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGUuc3RhdGUgJiBOdW1Mb2NrTWFzaykgIC8qIE51bUxvY2sgaXMgb2ZmICovCiAgICAgICAgICAgICYmIChlLnN0YXRlICYgU2hpZnRNYXNrKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCiAgICAgICAgICAgICYmIChrZXlzeW0+PVhLX0tQXzApICYmIChrZXlzeW08PVhLX0tQXzkpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QKICAgICAgICAgICBDVFJMICsgbnVtYmVyIG9yIENUUkwgKyBzeW1ib2wgKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCBmcm9tIGNvZGUgcGFnZSAlZCB0byB1bmljb2RlXG4iLAoJCSooQllURSAqKWxwQ2hhciwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmxheW91dF9jcCk7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwLCAwLCBscENoYXIsIHJldCwgYnVmVywgYnVmV19zaXplKTsKCX0KICAgIH0KCiAgICBUUkFDRV8oa2V5KSgiVG9Vbmljb2RlIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXggJXNcbiIsCgkJcmV0LCBidWZXID8gYnVmV1swXSA6IDAsIGJ1ZlcgPyAiIiA6ICIobm8gYnVmZmVyKSIpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgWDExRFJWX0JlZXAodm9pZCkKewogIFRTWEJlbGwodGhyZWFkX2Rpc3BsYXkoKSwgMCk7Cn0K