From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41261) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOlGz-0002lZ-Mt for qemu-devel@nongnu.org; Tue, 12 Dec 2017 09:11:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOlGr-0001Mf-U2 for qemu-devel@nongnu.org; Tue, 12 Dec 2017 09:11:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46038) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOlGr-0001LN-Kh for qemu-devel@nongnu.org; Tue, 12 Dec 2017 09:10:57 -0500 From: "Daniel P. Berrange" Date: Tue, 12 Dec 2017 14:10:41 +0000 Message-Id: <20171212141044.2582-2-berrange@redhat.com> In-Reply-To: <20171212141044.2582-1-berrange@redhat.com> References: <20171212141044.2582-1-berrange@redhat.com> Subject: [Qemu-devel] [PATCH v6 1/4] hw: convert virtio-input-hid device to keycodemapdb List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Paolo Bonzini , Stefano Stabellini , Anthony Perard , xen-devel@lists.xenproject.org, "Daniel P. Berrange" Replace the keymap_qcode table with automatically generated tables. Missing entries in keymap_qcode now fixed: Q_KEY_CODE_ASTERISK -> KEY_KPASTERISK Q_KEY_CODE_KP_MULTIPLY -> KEY_KPASTERISK Q_KEY_CODE_STOP -> KEY_STOP Q_KEY_CODE_AGAIN -> KEY_AGAIN Q_KEY_CODE_PROPS -> KEY_PROPS Q_KEY_CODE_UNDO -> KEY_UNDO Q_KEY_CODE_FRONT -> KEY_FRONT Q_KEY_CODE_COPY -> KEY_COPY Q_KEY_CODE_OPEN -> KEY_OPEN Q_KEY_CODE_PASTE -> KEY_PASTE Q_KEY_CODE_FIND -> KEY_FIND Q_KEY_CODE_CUT -> KEY_CUT Q_KEY_CODE_LF -> KEY_LINEFEED Q_KEY_CODE_HELP -> KEY_HELP Q_KEY_CODE_COMPOSE -> KEY_COMPOSE Q_KEY_CODE_RO -> KEY_RO Q_KEY_CODE_HIRAGANA -> KEY_HIRAGANA Q_KEY_CODE_HENKAN -> KEY_HENKAN Q_KEY_CODE_YEN -> KEY_YEN Q_KEY_CODE_KP_COMMA -> KEY_KPCOMMA Q_KEY_CODE_KP_EQUALS -> KEY_KPEQUAL Q_KEY_CODE_POWER -> KEY_POWER Q_KEY_CODE_SLEEP -> KEY_SLEEP Q_KEY_CODE_WAKE -> KEY_WAKEUP Q_KEY_CODE_AUDIONEXT -> KEY_NEXTSONG Q_KEY_CODE_AUDIOPREV -> KEY_PREVIOUSSONG Q_KEY_CODE_AUDIOSTOP -> KEY_STOPCD Q_KEY_CODE_AUDIOPLAY -> KEY_PLAYPAUSE Q_KEY_CODE_AUDIOMUTE -> KEY_MUTE Q_KEY_CODE_VOLUMEUP -> KEY_VOLUMEUP Q_KEY_CODE_VOLUMEDOWN -> KEY_VOLUMEDOWN Q_KEY_CODE_MEDIASELECT -> KEY_MEDIA Q_KEY_CODE_MAIL -> KEY_MAIL Q_KEY_CODE_CALCULATOR -> KEY_CALC Q_KEY_CODE_COMPUTER -> KEY_COMPUTER Q_KEY_CODE_AC_HOME -> KEY_HOMEPAGE Q_KEY_CODE_AC_BACK -> KEY_BACK Q_KEY_CODE_AC_FORWARD -> KEY_FORWARD Q_KEY_CODE_AC_REFRESH -> KEY_REFRESH Q_KEY_CODE_AC_BOOKMARKS -> KEY_BOOKMARKS NB, the virtio-input device reports a bitmask to the guest driver that has a bit set for each Linux keycode that the host is able to send to the guest. Thus by adding these extra key mappings we are technically changing the host<->guest ABI. This would also happen any time we defined new mappings for QEMU keycodes in future. When a keycode is removed from the list of possible keycodes that host can send to the guest, it means that the guest OS will think it is possible to receive a key that in pratice can never be generated, which is harmless. When a keycode is added to the list of possible keycodes that the host can send to the guest, it means that the guest OS can see an unexpected event. The Linux virtio_input.c driver code simply forwards this event to the input_event() method in the Linux input subsystem. This in turn calls input_handle_event(), which then calls input_get_disposition(). This method checks if the input event is present in the permitted keys bitmap, and if not returns INPUT_IGNORE_EVENT. Thus the unexpected event will get dropped, which is harmless. If the guest OS reboots, or otherwise re-initializes the virt-input device, it will read the new keycode bitmap. No matter how many keys are defined, the config space has a fixed 128 byte bitmap. There is, however, a size field defiend which says how many bytes in the bitmap are used. So the guest OS reads the size of the bitmap, and then it reads the data from bitmap upto the designated size. So if the guest OS re-initializes at precisely the time that QEMU is migrated across versions, in the worst case, it could conceivably read the old size field, but then get the newly updated bitmap. If a key were added this is harmless, since it simply means it may not process the newly added key. If a key were removed, then it could be readnig a byte from the bitmap that was not initialized. Fortunately QEMU always memsets() the entire bitmap to 0, prior to setting keybits. Thus the guest OS will simply read zeros, which is again harmless. Based on this analysis, it is believed that there is no need to preserve the virtio-input-hid keymaps across migration, as the host<->guest ABI change is harmless and self-resolving at time of guest reboot. NB, this behaviour should perhaps be formalized in the virtio-input spec to declare how guest OS drivers should be written to be robust in their handling of the potentially changable key bitmaps. Signed-off-by: Daniel P. Berrange --- Makefile | 1 + hw/input/virtio-input-hid.c | 136 +++----------------------------------------- include/ui/input.h | 3 + ui/input-keymap.c | 1 + 4 files changed, 14 insertions(+), 127 deletions(-) diff --git a/Makefile b/Makefile index ab0354c153..5aaff5fe1e 100644 --- a/Makefile +++ b/Makefile @@ -227,6 +227,7 @@ KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv KEYCODEMAP_FILES = \ ui/input-keymap-linux-to-qcode.c \ + ui/input-keymap-qcode-to-linux.c \ ui/input-keymap-qcode-to-qnum.c \ ui/input-keymap-qnum-to-qcode.c \ $(NULL) diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index e78faec0b1..bd89c3e6ae 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -22,126 +22,7 @@ /* ----------------------------------------------------------------- */ -static const unsigned int keymap_qcode[Q_KEY_CODE__MAX] = { - [Q_KEY_CODE_ESC] = KEY_ESC, - [Q_KEY_CODE_1] = KEY_1, - [Q_KEY_CODE_2] = KEY_2, - [Q_KEY_CODE_3] = KEY_3, - [Q_KEY_CODE_4] = KEY_4, - [Q_KEY_CODE_5] = KEY_5, - [Q_KEY_CODE_6] = KEY_6, - [Q_KEY_CODE_7] = KEY_7, - [Q_KEY_CODE_8] = KEY_8, - [Q_KEY_CODE_9] = KEY_9, - [Q_KEY_CODE_0] = KEY_0, - [Q_KEY_CODE_MINUS] = KEY_MINUS, - [Q_KEY_CODE_EQUAL] = KEY_EQUAL, - [Q_KEY_CODE_BACKSPACE] = KEY_BACKSPACE, - - [Q_KEY_CODE_TAB] = KEY_TAB, - [Q_KEY_CODE_Q] = KEY_Q, - [Q_KEY_CODE_W] = KEY_W, - [Q_KEY_CODE_E] = KEY_E, - [Q_KEY_CODE_R] = KEY_R, - [Q_KEY_CODE_T] = KEY_T, - [Q_KEY_CODE_Y] = KEY_Y, - [Q_KEY_CODE_U] = KEY_U, - [Q_KEY_CODE_I] = KEY_I, - [Q_KEY_CODE_O] = KEY_O, - [Q_KEY_CODE_P] = KEY_P, - [Q_KEY_CODE_BRACKET_LEFT] = KEY_LEFTBRACE, - [Q_KEY_CODE_BRACKET_RIGHT] = KEY_RIGHTBRACE, - [Q_KEY_CODE_RET] = KEY_ENTER, - - [Q_KEY_CODE_CTRL] = KEY_LEFTCTRL, - [Q_KEY_CODE_A] = KEY_A, - [Q_KEY_CODE_S] = KEY_S, - [Q_KEY_CODE_D] = KEY_D, - [Q_KEY_CODE_F] = KEY_F, - [Q_KEY_CODE_G] = KEY_G, - [Q_KEY_CODE_H] = KEY_H, - [Q_KEY_CODE_J] = KEY_J, - [Q_KEY_CODE_K] = KEY_K, - [Q_KEY_CODE_L] = KEY_L, - [Q_KEY_CODE_SEMICOLON] = KEY_SEMICOLON, - [Q_KEY_CODE_APOSTROPHE] = KEY_APOSTROPHE, - [Q_KEY_CODE_GRAVE_ACCENT] = KEY_GRAVE, - - [Q_KEY_CODE_SHIFT] = KEY_LEFTSHIFT, - [Q_KEY_CODE_BACKSLASH] = KEY_BACKSLASH, - [Q_KEY_CODE_LESS] = KEY_102ND, - [Q_KEY_CODE_Z] = KEY_Z, - [Q_KEY_CODE_X] = KEY_X, - [Q_KEY_CODE_C] = KEY_C, - [Q_KEY_CODE_V] = KEY_V, - [Q_KEY_CODE_B] = KEY_B, - [Q_KEY_CODE_N] = KEY_N, - [Q_KEY_CODE_M] = KEY_M, - [Q_KEY_CODE_COMMA] = KEY_COMMA, - [Q_KEY_CODE_DOT] = KEY_DOT, - [Q_KEY_CODE_SLASH] = KEY_SLASH, - [Q_KEY_CODE_SHIFT_R] = KEY_RIGHTSHIFT, - - [Q_KEY_CODE_ALT] = KEY_LEFTALT, - [Q_KEY_CODE_SPC] = KEY_SPACE, - [Q_KEY_CODE_CAPS_LOCK] = KEY_CAPSLOCK, - - [Q_KEY_CODE_F1] = KEY_F1, - [Q_KEY_CODE_F2] = KEY_F2, - [Q_KEY_CODE_F3] = KEY_F3, - [Q_KEY_CODE_F4] = KEY_F4, - [Q_KEY_CODE_F5] = KEY_F5, - [Q_KEY_CODE_F6] = KEY_F6, - [Q_KEY_CODE_F7] = KEY_F7, - [Q_KEY_CODE_F8] = KEY_F8, - [Q_KEY_CODE_F9] = KEY_F9, - [Q_KEY_CODE_F10] = KEY_F10, - [Q_KEY_CODE_NUM_LOCK] = KEY_NUMLOCK, - [Q_KEY_CODE_SCROLL_LOCK] = KEY_SCROLLLOCK, - - [Q_KEY_CODE_KP_0] = KEY_KP0, - [Q_KEY_CODE_KP_1] = KEY_KP1, - [Q_KEY_CODE_KP_2] = KEY_KP2, - [Q_KEY_CODE_KP_3] = KEY_KP3, - [Q_KEY_CODE_KP_4] = KEY_KP4, - [Q_KEY_CODE_KP_5] = KEY_KP5, - [Q_KEY_CODE_KP_6] = KEY_KP6, - [Q_KEY_CODE_KP_7] = KEY_KP7, - [Q_KEY_CODE_KP_8] = KEY_KP8, - [Q_KEY_CODE_KP_9] = KEY_KP9, - [Q_KEY_CODE_KP_SUBTRACT] = KEY_KPMINUS, - [Q_KEY_CODE_KP_ADD] = KEY_KPPLUS, - [Q_KEY_CODE_KP_DECIMAL] = KEY_KPDOT, - [Q_KEY_CODE_KP_ENTER] = KEY_KPENTER, - [Q_KEY_CODE_KP_DIVIDE] = KEY_KPSLASH, - [Q_KEY_CODE_KP_MULTIPLY] = KEY_KPASTERISK, - - [Q_KEY_CODE_F11] = KEY_F11, - [Q_KEY_CODE_F12] = KEY_F12, - - [Q_KEY_CODE_CTRL_R] = KEY_RIGHTCTRL, - [Q_KEY_CODE_SYSRQ] = KEY_SYSRQ, - [Q_KEY_CODE_PRINT] = KEY_SYSRQ, - [Q_KEY_CODE_PAUSE] = KEY_PAUSE, - [Q_KEY_CODE_ALT_R] = KEY_RIGHTALT, - - [Q_KEY_CODE_HOME] = KEY_HOME, - [Q_KEY_CODE_UP] = KEY_UP, - [Q_KEY_CODE_PGUP] = KEY_PAGEUP, - [Q_KEY_CODE_LEFT] = KEY_LEFT, - [Q_KEY_CODE_RIGHT] = KEY_RIGHT, - [Q_KEY_CODE_END] = KEY_END, - [Q_KEY_CODE_DOWN] = KEY_DOWN, - [Q_KEY_CODE_PGDN] = KEY_PAGEDOWN, - [Q_KEY_CODE_INSERT] = KEY_INSERT, - [Q_KEY_CODE_DELETE] = KEY_DELETE, - - [Q_KEY_CODE_META_L] = KEY_LEFTMETA, - [Q_KEY_CODE_META_R] = KEY_RIGHTMETA, - [Q_KEY_CODE_MENU] = KEY_MENU, -}; - -static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { +static const unsigned short keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_LEFT] = BTN_LEFT, [INPUT_BUTTON_RIGHT] = BTN_RIGHT, [INPUT_BUTTON_MIDDLE] = BTN_MIDDLE, @@ -149,12 +30,12 @@ static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_WHEEL_DOWN] = BTN_GEAR_DOWN, }; -static const unsigned int axismap_rel[INPUT_AXIS__MAX] = { +static const unsigned short axismap_rel[INPUT_AXIS__MAX] = { [INPUT_AXIS_X] = REL_X, [INPUT_AXIS_Y] = REL_Y, }; -static const unsigned int axismap_abs[INPUT_AXIS__MAX] = { +static const unsigned short axismap_abs[INPUT_AXIS__MAX] = { [INPUT_AXIS_X] = ABS_X, [INPUT_AXIS_Y] = ABS_Y, }; @@ -162,7 +43,7 @@ static const unsigned int axismap_abs[INPUT_AXIS__MAX] = { /* ----------------------------------------------------------------- */ static void virtio_input_key_config(VirtIOInput *vinput, - const unsigned int *keymap, + const unsigned short *keymap, size_t mapsize) { virtio_input_config keys; @@ -202,9 +83,10 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src, case INPUT_EVENT_KIND_KEY: key = evt->u.key.data; qcode = qemu_input_key_value_to_qcode(key->key); - if (qcode && keymap_qcode[qcode]) { + if (qcode < qemu_input_map_qcode_to_linux_len && + qemu_input_map_qcode_to_linux[qcode]) { event.type = cpu_to_le16(EV_KEY); - event.code = cpu_to_le16(keymap_qcode[qcode]); + event.code = cpu_to_le16(qemu_input_map_qcode_to_linux[qcode]); event.value = cpu_to_le32(key->down ? 1 : 0); virtio_input_send(vinput, &event); } else { @@ -395,8 +277,8 @@ static void virtio_keyboard_init(Object *obj) vhid->handler = &virtio_keyboard_handler; virtio_input_init_config(vinput, virtio_keyboard_config); - virtio_input_key_config(vinput, keymap_qcode, - ARRAY_SIZE(keymap_qcode)); + virtio_input_key_config(vinput, qemu_input_map_qcode_to_linux, + qemu_input_map_qcode_to_linux_len); } static const TypeInfo virtio_keyboard_info = { diff --git a/include/ui/input.h b/include/ui/input.h index f8cee43f65..6f56d868c7 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -71,6 +71,9 @@ void qemu_remove_mouse_mode_change_notifier(Notifier *notify); extern const guint qemu_input_map_linux_to_qcode_len; extern const guint16 qemu_input_map_linux_to_qcode[]; +extern const guint qemu_input_map_qcode_to_linux_len; +extern const guint16 qemu_input_map_qcode_to_linux[]; + extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 3a19a169f5..6e543d651f 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -6,6 +6,7 @@ #include "standard-headers/linux/input.h" #include "ui/input-keymap-linux-to-qcode.c" +#include "ui/input-keymap-qcode-to-linux.c" #include "ui/input-keymap-qcode-to-qnum.c" #include "ui/input-keymap-qnum-to-qcode.c" -- 2.14.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Daniel P. Berrange" Subject: [PATCH v6 1/4] hw: convert virtio-input-hid device to keycodemapdb Date: Tue, 12 Dec 2017 14:10:41 +0000 Message-ID: <20171212141044.2582-2-berrange@redhat.com> References: <20171212141044.2582-1-berrange@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eOlGx-0004Zp-NA for xen-devel@lists.xenproject.org; Tue, 12 Dec 2017 14:11:03 +0000 In-Reply-To: <20171212141044.2582-1-berrange@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: qemu-devel@nongnu.org Cc: Stefano Stabellini , "Daniel P. Berrange" , Gerd Hoffmann , xen-devel@lists.xenproject.org, Anthony Perard , Paolo Bonzini List-Id: xen-devel@lists.xenproject.org UmVwbGFjZSB0aGUga2V5bWFwX3Fjb2RlIHRhYmxlIHdpdGggYXV0b21hdGljYWxseSBnZW5lcmF0 ZWQKdGFibGVzLgoKTWlzc2luZyBlbnRyaWVzIGluIGtleW1hcF9xY29kZSBub3cgZml4ZWQ6Cgog IFFfS0VZX0NPREVfQVNURVJJU0sgLT4gS0VZX0tQQVNURVJJU0sKICBRX0tFWV9DT0RFX0tQX01V TFRJUExZIC0+IEtFWV9LUEFTVEVSSVNLCiAgUV9LRVlfQ09ERV9TVE9QIC0+IEtFWV9TVE9QCiAg UV9LRVlfQ09ERV9BR0FJTiAtPiBLRVlfQUdBSU4KICBRX0tFWV9DT0RFX1BST1BTIC0+IEtFWV9Q Uk9QUwogIFFfS0VZX0NPREVfVU5ETyAtPiBLRVlfVU5ETwogIFFfS0VZX0NPREVfRlJPTlQgLT4g S0VZX0ZST05UCiAgUV9LRVlfQ09ERV9DT1BZIC0+IEtFWV9DT1BZCiAgUV9LRVlfQ09ERV9PUEVO IC0+IEtFWV9PUEVOCiAgUV9LRVlfQ09ERV9QQVNURSAtPiBLRVlfUEFTVEUKICBRX0tFWV9DT0RF X0ZJTkQgLT4gS0VZX0ZJTkQKICBRX0tFWV9DT0RFX0NVVCAtPiBLRVlfQ1VUCiAgUV9LRVlfQ09E RV9MRiAtPiBLRVlfTElORUZFRUQKICBRX0tFWV9DT0RFX0hFTFAgLT4gS0VZX0hFTFAKICBRX0tF WV9DT0RFX0NPTVBPU0UgLT4gS0VZX0NPTVBPU0UKICBRX0tFWV9DT0RFX1JPIC0+IEtFWV9STwog IFFfS0VZX0NPREVfSElSQUdBTkEgLT4gS0VZX0hJUkFHQU5BCiAgUV9LRVlfQ09ERV9IRU5LQU4g LT4gS0VZX0hFTktBTgogIFFfS0VZX0NPREVfWUVOIC0+IEtFWV9ZRU4KICBRX0tFWV9DT0RFX0tQ X0NPTU1BIC0+IEtFWV9LUENPTU1BCiAgUV9LRVlfQ09ERV9LUF9FUVVBTFMgLT4gS0VZX0tQRVFV QUwKICBRX0tFWV9DT0RFX1BPV0VSIC0+IEtFWV9QT1dFUgogIFFfS0VZX0NPREVfU0xFRVAgLT4g S0VZX1NMRUVQCiAgUV9LRVlfQ09ERV9XQUtFIC0+IEtFWV9XQUtFVVAKICBRX0tFWV9DT0RFX0FV RElPTkVYVCAtPiBLRVlfTkVYVFNPTkcKICBRX0tFWV9DT0RFX0FVRElPUFJFViAtPiBLRVlfUFJF VklPVVNTT05HCiAgUV9LRVlfQ09ERV9BVURJT1NUT1AgLT4gS0VZX1NUT1BDRAogIFFfS0VZX0NP REVfQVVESU9QTEFZIC0+IEtFWV9QTEFZUEFVU0UKICBRX0tFWV9DT0RFX0FVRElPTVVURSAtPiBL RVlfTVVURQogIFFfS0VZX0NPREVfVk9MVU1FVVAgLT4gS0VZX1ZPTFVNRVVQCiAgUV9LRVlfQ09E RV9WT0xVTUVET1dOIC0+IEtFWV9WT0xVTUVET1dOCiAgUV9LRVlfQ09ERV9NRURJQVNFTEVDVCAt PiBLRVlfTUVESUEKICBRX0tFWV9DT0RFX01BSUwgLT4gS0VZX01BSUwKICBRX0tFWV9DT0RFX0NB TENVTEFUT1IgLT4gS0VZX0NBTEMKICBRX0tFWV9DT0RFX0NPTVBVVEVSIC0+IEtFWV9DT01QVVRF UgogIFFfS0VZX0NPREVfQUNfSE9NRSAtPiBLRVlfSE9NRVBBR0UKICBRX0tFWV9DT0RFX0FDX0JB Q0sgLT4gS0VZX0JBQ0sKICBRX0tFWV9DT0RFX0FDX0ZPUldBUkQgLT4gS0VZX0ZPUldBUkQKICBR X0tFWV9DT0RFX0FDX1JFRlJFU0ggLT4gS0VZX1JFRlJFU0gKICBRX0tFWV9DT0RFX0FDX0JPT0tN QVJLUyAtPiBLRVlfQk9PS01BUktTCgpOQiwgdGhlIHZpcnRpby1pbnB1dCBkZXZpY2UgcmVwb3J0 cyBhIGJpdG1hc2sgdG8gdGhlIGd1ZXN0IGRyaXZlciB0aGF0CmhhcyBhIGJpdCBzZXQgZm9yIGVh Y2ggTGludXgga2V5Y29kZSB0aGF0IHRoZSBob3N0IGlzIGFibGUgdG8gc2VuZCB0bwp0aGUgZ3Vl c3QuCgpUaHVzIGJ5IGFkZGluZyB0aGVzZSBleHRyYSBrZXkgbWFwcGluZ3Mgd2UgYXJlIHRlY2hu aWNhbGx5IGNoYW5naW5nIHRoZQpob3N0PC0+Z3Vlc3QgQUJJLiBUaGlzIHdvdWxkIGFsc28gaGFw cGVuIGFueSB0aW1lIHdlIGRlZmluZWQgbmV3IG1hcHBpbmdzCmZvciBRRU1VIGtleWNvZGVzIGlu IGZ1dHVyZS4KCldoZW4gYSBrZXljb2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwb3Nz aWJsZSBrZXljb2RlcyB0aGF0IGhvc3QgY2FuCnNlbmQgdG8gdGhlIGd1ZXN0LCBpdCBtZWFucyB0 aGF0IHRoZSBndWVzdCBPUyB3aWxsIHRoaW5rIGl0IGlzIHBvc3NpYmxlCnRvIHJlY2VpdmUgYSBr ZXkgdGhhdCBpbiBwcmF0aWNlIGNhbiBuZXZlciBiZSBnZW5lcmF0ZWQsIHdoaWNoIGlzIGhhcm1s ZXNzLgoKV2hlbiBhIGtleWNvZGUgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcG9zc2libGUga2V5 Y29kZXMgdGhhdCB0aGUgaG9zdCBjYW4Kc2VuZCB0byB0aGUgZ3Vlc3QsIGl0IG1lYW5zIHRoYXQg dGhlIGd1ZXN0IE9TIGNhbiBzZWUgYW4gdW5leHBlY3RlZCBldmVudC4KVGhlIExpbnV4IHZpcnRp b19pbnB1dC5jIGRyaXZlciBjb2RlIHNpbXBseSBmb3J3YXJkcyB0aGlzIGV2ZW50IHRvIHRoZQpp bnB1dF9ldmVudCgpIG1ldGhvZCBpbiB0aGUgTGludXggaW5wdXQgc3Vic3lzdGVtLiBUaGlzIGlu IHR1cm4gY2FsbHMKaW5wdXRfaGFuZGxlX2V2ZW50KCksIHdoaWNoIHRoZW4gY2FsbHMgaW5wdXRf Z2V0X2Rpc3Bvc2l0aW9uKCkuIFRoaXMgbWV0aG9kCmNoZWNrcyBpZiB0aGUgaW5wdXQgZXZlbnQg aXMgcHJlc2VudCBpbiB0aGUgcGVybWl0dGVkIGtleXMgYml0bWFwLCBhbmQgaWYKbm90IHJldHVy bnMgSU5QVVRfSUdOT1JFX0VWRU5ULiBUaHVzIHRoZSB1bmV4cGVjdGVkIGV2ZW50IHdpbGwgZ2V0 IGRyb3BwZWQsCndoaWNoIGlzIGhhcm1sZXNzLgoKSWYgdGhlIGd1ZXN0IE9TIHJlYm9vdHMsIG9y IG90aGVyd2lzZSByZS1pbml0aWFsaXplcyB0aGUgdmlydC1pbnB1dCBkZXZpY2UsCml0IHdpbGwg cmVhZCB0aGUgbmV3IGtleWNvZGUgYml0bWFwLiBObyBtYXR0ZXIgaG93IG1hbnkga2V5cyBhcmUg ZGVmaW5lZCwKdGhlIGNvbmZpZyBzcGFjZSBoYXMgYSBmaXhlZCAxMjggYnl0ZSBiaXRtYXAuIFRo ZXJlIGlzLCBob3dldmVyLCBhIHNpemUKZmllbGQgZGVmaWVuZCB3aGljaCBzYXlzIGhvdyBtYW55 IGJ5dGVzIGluIHRoZSBiaXRtYXAgYXJlIHVzZWQuIFNvIHRoZSBndWVzdApPUyByZWFkcyB0aGUg c2l6ZSBvZiB0aGUgYml0bWFwLCBhbmQgdGhlbiBpdCByZWFkcyB0aGUgZGF0YSBmcm9tIGJpdG1h cCB1cHRvCnRoZSBkZXNpZ25hdGVkIHNpemUuIFNvIGlmIHRoZSBndWVzdCBPUyByZS1pbml0aWFs aXplcyBhdCBwcmVjaXNlbHkgdGhlIHRpbWUKdGhhdCBRRU1VIGlzIG1pZ3JhdGVkIGFjcm9zcyB2 ZXJzaW9ucywgaW4gdGhlIHdvcnN0IGNhc2UsIGl0IGNvdWxkIGNvbmNlaXZhYmx5CnJlYWQgdGhl IG9sZCBzaXplIGZpZWxkLCBidXQgdGhlbiBnZXQgdGhlIG5ld2x5IHVwZGF0ZWQgYml0bWFwLiAg SWYgYSBrZXkgd2VyZQphZGRlZCB0aGlzIGlzIGhhcm1sZXNzLCBzaW5jZSBpdCBzaW1wbHkgbWVh bnMgaXQgbWF5IG5vdCBwcm9jZXNzIHRoZSBuZXdseQphZGRlZCBrZXkuIElmIGEga2V5IHdlcmUg cmVtb3ZlZCwgdGhlbiBpdCBjb3VsZCBiZSByZWFkbmlnIGEgYnl0ZSBmcm9tIHRoZQpiaXRtYXAg dGhhdCB3YXMgbm90IGluaXRpYWxpemVkLiBGb3J0dW5hdGVseSBRRU1VIGFsd2F5cyBtZW1zZXRz KCkgdGhlIGVudGlyZQpiaXRtYXAgdG8gMCwgcHJpb3IgdG8gc2V0dGluZyBrZXliaXRzLiBUaHVz IHRoZSBndWVzdCBPUyB3aWxsIHNpbXBseSByZWFkCnplcm9zLCB3aGljaCBpcyBhZ2FpbiBoYXJt bGVzcy4KCkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIGl0IGlzIGJlbGlldmVkIHRoYXQgdGhlcmUg aXMgbm8gbmVlZCB0byBwcmVzZXJ2ZSB0aGUKdmlydGlvLWlucHV0LWhpZCBrZXltYXBzIGFjcm9z cyBtaWdyYXRpb24sIGFzIHRoZSBob3N0PC0+Z3Vlc3QgQUJJIGNoYW5nZSBpcwpoYXJtbGVzcyBh bmQgc2VsZi1yZXNvbHZpbmcgYXQgdGltZSBvZiBndWVzdCByZWJvb3QuCgpOQiwgdGhpcyBiZWhh dmlvdXIgc2hvdWxkIHBlcmhhcHMgYmUgZm9ybWFsaXplZCBpbiB0aGUgdmlydGlvLWlucHV0IHNw ZWMKdG8gZGVjbGFyZSBob3cgZ3Vlc3QgT1MgZHJpdmVycyBzaG91bGQgYmUgd3JpdHRlbiB0byBi ZSByb2J1c3QgaW4gdGhlaXIKaGFuZGxpbmcgb2YgdGhlIHBvdGVudGlhbGx5IGNoYW5nYWJsZSBr ZXkgYml0bWFwcy4KClNpZ25lZC1vZmYtYnk6IERhbmllbCBQLiBCZXJyYW5nZSA8YmVycmFuZ2VA cmVkaGF0LmNvbT4KLS0tCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogaHcv aW5wdXQvdmlydGlvLWlucHV0LWhpZC5jIHwgMTM2ICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCiBpbmNsdWRlL3VpL2lucHV0LmggICAgICAgICAgfCAgIDMgKwog dWkvaW5wdXQta2V5bWFwLmMgICAgICAgICAgIHwgICAxICsKIDQgZmlsZXMgY2hhbmdlZCwgMTQg aW5zZXJ0aW9ucygrKSwgMTI3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIv TWFrZWZpbGUKaW5kZXggYWIwMzU0YzE1My4uNWFhZmY1ZmUxZSAxMDA2NDQKLS0tIGEvTWFrZWZp bGUKKysrIGIvTWFrZWZpbGUKQEAgLTIyNyw2ICsyMjcsNyBAQCBLRVlDT0RFTUFQX0NTViA9ICQo U1JDX1BBVEgpL3VpL2tleWNvZGVtYXBkYi9kYXRhL2tleW1hcHMuY3N2CiAKIEtFWUNPREVNQVBf RklMRVMgPSBcCiAJCSB1aS9pbnB1dC1rZXltYXAtbGludXgtdG8tcWNvZGUuYyBcCisJCSB1aS9p bnB1dC1rZXltYXAtcWNvZGUtdG8tbGludXguYyBcCiAJCSB1aS9pbnB1dC1rZXltYXAtcWNvZGUt dG8tcW51bS5jIFwKIAkJIHVpL2lucHV0LWtleW1hcC1xbnVtLXRvLXFjb2RlLmMgXAogCQkgJChO VUxMKQpkaWZmIC0tZ2l0IGEvaHcvaW5wdXQvdmlydGlvLWlucHV0LWhpZC5jIGIvaHcvaW5wdXQv dmlydGlvLWlucHV0LWhpZC5jCmluZGV4IGU3OGZhZWMwYjEuLmJkODljM2U2YWUgMTAwNjQ0Ci0t LSBhL2h3L2lucHV0L3ZpcnRpby1pbnB1dC1oaWQuYworKysgYi9ody9pbnB1dC92aXJ0aW8taW5w dXQtaGlkLmMKQEAgLTIyLDEyNiArMjIsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMg Y29uc3QgdW5zaWduZWQgaW50IGtleW1hcF9xY29kZVtRX0tFWV9DT0RFX19NQVhdID0gewotICAg IFtRX0tFWV9DT0RFX0VTQ10gICAgICAgICAgICAgICAgID0gS0VZX0VTQywKLSAgICBbUV9LRVlf Q09ERV8xXSAgICAgICAgICAgICAgICAgICA9IEtFWV8xLAotICAgIFtRX0tFWV9DT0RFXzJdICAg ICAgICAgICAgICAgICAgID0gS0VZXzIsCi0gICAgW1FfS0VZX0NPREVfM10gICAgICAgICAgICAg ICAgICAgPSBLRVlfMywKLSAgICBbUV9LRVlfQ09ERV80XSAgICAgICAgICAgICAgICAgICA9IEtF WV80LAotICAgIFtRX0tFWV9DT0RFXzVdICAgICAgICAgICAgICAgICAgID0gS0VZXzUsCi0gICAg W1FfS0VZX0NPREVfNl0gICAgICAgICAgICAgICAgICAgPSBLRVlfNiwKLSAgICBbUV9LRVlfQ09E RV83XSAgICAgICAgICAgICAgICAgICA9IEtFWV83LAotICAgIFtRX0tFWV9DT0RFXzhdICAgICAg ICAgICAgICAgICAgID0gS0VZXzgsCi0gICAgW1FfS0VZX0NPREVfOV0gICAgICAgICAgICAgICAg ICAgPSBLRVlfOSwKLSAgICBbUV9LRVlfQ09ERV8wXSAgICAgICAgICAgICAgICAgICA9IEtFWV8w LAotICAgIFtRX0tFWV9DT0RFX01JTlVTXSAgICAgICAgICAgICAgID0gS0VZX01JTlVTLAotICAg IFtRX0tFWV9DT0RFX0VRVUFMXSAgICAgICAgICAgICAgID0gS0VZX0VRVUFMLAotICAgIFtRX0tF WV9DT0RFX0JBQ0tTUEFDRV0gICAgICAgICAgID0gS0VZX0JBQ0tTUEFDRSwKLQotICAgIFtRX0tF WV9DT0RFX1RBQl0gICAgICAgICAgICAgICAgID0gS0VZX1RBQiwKLSAgICBbUV9LRVlfQ09ERV9R XSAgICAgICAgICAgICAgICAgICA9IEtFWV9RLAotICAgIFtRX0tFWV9DT0RFX1ddICAgICAgICAg ICAgICAgICAgID0gS0VZX1csCi0gICAgW1FfS0VZX0NPREVfRV0gICAgICAgICAgICAgICAgICAg PSBLRVlfRSwKLSAgICBbUV9LRVlfQ09ERV9SXSAgICAgICAgICAgICAgICAgICA9IEtFWV9SLAot ICAgIFtRX0tFWV9DT0RFX1RdICAgICAgICAgICAgICAgICAgID0gS0VZX1QsCi0gICAgW1FfS0VZ X0NPREVfWV0gICAgICAgICAgICAgICAgICAgPSBLRVlfWSwKLSAgICBbUV9LRVlfQ09ERV9VXSAg ICAgICAgICAgICAgICAgICA9IEtFWV9VLAotICAgIFtRX0tFWV9DT0RFX0ldICAgICAgICAgICAg ICAgICAgID0gS0VZX0ksCi0gICAgW1FfS0VZX0NPREVfT10gICAgICAgICAgICAgICAgICAgPSBL RVlfTywKLSAgICBbUV9LRVlfQ09ERV9QXSAgICAgICAgICAgICAgICAgICA9IEtFWV9QLAotICAg IFtRX0tFWV9DT0RFX0JSQUNLRVRfTEVGVF0gICAgICAgID0gS0VZX0xFRlRCUkFDRSwKLSAgICBb UV9LRVlfQ09ERV9CUkFDS0VUX1JJR0hUXSAgICAgICA9IEtFWV9SSUdIVEJSQUNFLAotICAgIFtR X0tFWV9DT0RFX1JFVF0gICAgICAgICAgICAgICAgID0gS0VZX0VOVEVSLAotCi0gICAgW1FfS0VZ X0NPREVfQ1RSTF0gICAgICAgICAgICAgICAgPSBLRVlfTEVGVENUUkwsCi0gICAgW1FfS0VZX0NP REVfQV0gICAgICAgICAgICAgICAgICAgPSBLRVlfQSwKLSAgICBbUV9LRVlfQ09ERV9TXSAgICAg ICAgICAgICAgICAgICA9IEtFWV9TLAotICAgIFtRX0tFWV9DT0RFX0RdICAgICAgICAgICAgICAg ICAgID0gS0VZX0QsCi0gICAgW1FfS0VZX0NPREVfRl0gICAgICAgICAgICAgICAgICAgPSBLRVlf RiwKLSAgICBbUV9LRVlfQ09ERV9HXSAgICAgICAgICAgICAgICAgICA9IEtFWV9HLAotICAgIFtR X0tFWV9DT0RFX0hdICAgICAgICAgICAgICAgICAgID0gS0VZX0gsCi0gICAgW1FfS0VZX0NPREVf Sl0gICAgICAgICAgICAgICAgICAgPSBLRVlfSiwKLSAgICBbUV9LRVlfQ09ERV9LXSAgICAgICAg ICAgICAgICAgICA9IEtFWV9LLAotICAgIFtRX0tFWV9DT0RFX0xdICAgICAgICAgICAgICAgICAg ID0gS0VZX0wsCi0gICAgW1FfS0VZX0NPREVfU0VNSUNPTE9OXSAgICAgICAgICAgPSBLRVlfU0VN SUNPTE9OLAotICAgIFtRX0tFWV9DT0RFX0FQT1NUUk9QSEVdICAgICAgICAgID0gS0VZX0FQT1NU Uk9QSEUsCi0gICAgW1FfS0VZX0NPREVfR1JBVkVfQUNDRU5UXSAgICAgICAgPSBLRVlfR1JBVkUs Ci0KLSAgICBbUV9LRVlfQ09ERV9TSElGVF0gICAgICAgICAgICAgICA9IEtFWV9MRUZUU0hJRlQs Ci0gICAgW1FfS0VZX0NPREVfQkFDS1NMQVNIXSAgICAgICAgICAgPSBLRVlfQkFDS1NMQVNILAot ICAgIFtRX0tFWV9DT0RFX0xFU1NdICAgICAgICAgICAgICAgID0gS0VZXzEwMk5ELAotICAgIFtR X0tFWV9DT0RFX1pdICAgICAgICAgICAgICAgICAgID0gS0VZX1osCi0gICAgW1FfS0VZX0NPREVf WF0gICAgICAgICAgICAgICAgICAgPSBLRVlfWCwKLSAgICBbUV9LRVlfQ09ERV9DXSAgICAgICAg ICAgICAgICAgICA9IEtFWV9DLAotICAgIFtRX0tFWV9DT0RFX1ZdICAgICAgICAgICAgICAgICAg ID0gS0VZX1YsCi0gICAgW1FfS0VZX0NPREVfQl0gICAgICAgICAgICAgICAgICAgPSBLRVlfQiwK LSAgICBbUV9LRVlfQ09ERV9OXSAgICAgICAgICAgICAgICAgICA9IEtFWV9OLAotICAgIFtRX0tF WV9DT0RFX01dICAgICAgICAgICAgICAgICAgID0gS0VZX00sCi0gICAgW1FfS0VZX0NPREVfQ09N TUFdICAgICAgICAgICAgICAgPSBLRVlfQ09NTUEsCi0gICAgW1FfS0VZX0NPREVfRE9UXSAgICAg ICAgICAgICAgICAgPSBLRVlfRE9ULAotICAgIFtRX0tFWV9DT0RFX1NMQVNIXSAgICAgICAgICAg ICAgID0gS0VZX1NMQVNILAotICAgIFtRX0tFWV9DT0RFX1NISUZUX1JdICAgICAgICAgICAgID0g S0VZX1JJR0hUU0hJRlQsCi0KLSAgICBbUV9LRVlfQ09ERV9BTFRdICAgICAgICAgICAgICAgICA9 IEtFWV9MRUZUQUxULAotICAgIFtRX0tFWV9DT0RFX1NQQ10gICAgICAgICAgICAgICAgID0gS0VZ X1NQQUNFLAotICAgIFtRX0tFWV9DT0RFX0NBUFNfTE9DS10gICAgICAgICAgID0gS0VZX0NBUFNM T0NLLAotCi0gICAgW1FfS0VZX0NPREVfRjFdICAgICAgICAgICAgICAgICAgPSBLRVlfRjEsCi0g ICAgW1FfS0VZX0NPREVfRjJdICAgICAgICAgICAgICAgICAgPSBLRVlfRjIsCi0gICAgW1FfS0VZ X0NPREVfRjNdICAgICAgICAgICAgICAgICAgPSBLRVlfRjMsCi0gICAgW1FfS0VZX0NPREVfRjRd ICAgICAgICAgICAgICAgICAgPSBLRVlfRjQsCi0gICAgW1FfS0VZX0NPREVfRjVdICAgICAgICAg ICAgICAgICAgPSBLRVlfRjUsCi0gICAgW1FfS0VZX0NPREVfRjZdICAgICAgICAgICAgICAgICAg PSBLRVlfRjYsCi0gICAgW1FfS0VZX0NPREVfRjddICAgICAgICAgICAgICAgICAgPSBLRVlfRjcs Ci0gICAgW1FfS0VZX0NPREVfRjhdICAgICAgICAgICAgICAgICAgPSBLRVlfRjgsCi0gICAgW1Ff S0VZX0NPREVfRjldICAgICAgICAgICAgICAgICAgPSBLRVlfRjksCi0gICAgW1FfS0VZX0NPREVf RjEwXSAgICAgICAgICAgICAgICAgPSBLRVlfRjEwLAotICAgIFtRX0tFWV9DT0RFX05VTV9MT0NL XSAgICAgICAgICAgID0gS0VZX05VTUxPQ0ssCi0gICAgW1FfS0VZX0NPREVfU0NST0xMX0xPQ0td ICAgICAgICAgPSBLRVlfU0NST0xMTE9DSywKLQotICAgIFtRX0tFWV9DT0RFX0tQXzBdICAgICAg ICAgICAgICAgID0gS0VZX0tQMCwKLSAgICBbUV9LRVlfQ09ERV9LUF8xXSAgICAgICAgICAgICAg ICA9IEtFWV9LUDEsCi0gICAgW1FfS0VZX0NPREVfS1BfMl0gICAgICAgICAgICAgICAgPSBLRVlf S1AyLAotICAgIFtRX0tFWV9DT0RFX0tQXzNdICAgICAgICAgICAgICAgID0gS0VZX0tQMywKLSAg ICBbUV9LRVlfQ09ERV9LUF80XSAgICAgICAgICAgICAgICA9IEtFWV9LUDQsCi0gICAgW1FfS0VZ X0NPREVfS1BfNV0gICAgICAgICAgICAgICAgPSBLRVlfS1A1LAotICAgIFtRX0tFWV9DT0RFX0tQ XzZdICAgICAgICAgICAgICAgID0gS0VZX0tQNiwKLSAgICBbUV9LRVlfQ09ERV9LUF83XSAgICAg ICAgICAgICAgICA9IEtFWV9LUDcsCi0gICAgW1FfS0VZX0NPREVfS1BfOF0gICAgICAgICAgICAg ICAgPSBLRVlfS1A4LAotICAgIFtRX0tFWV9DT0RFX0tQXzldICAgICAgICAgICAgICAgID0gS0VZ X0tQOSwKLSAgICBbUV9LRVlfQ09ERV9LUF9TVUJUUkFDVF0gICAgICAgICA9IEtFWV9LUE1JTlVT LAotICAgIFtRX0tFWV9DT0RFX0tQX0FERF0gICAgICAgICAgICAgID0gS0VZX0tQUExVUywKLSAg ICBbUV9LRVlfQ09ERV9LUF9ERUNJTUFMXSAgICAgICAgICA9IEtFWV9LUERPVCwKLSAgICBbUV9L RVlfQ09ERV9LUF9FTlRFUl0gICAgICAgICAgICA9IEtFWV9LUEVOVEVSLAotICAgIFtRX0tFWV9D T0RFX0tQX0RJVklERV0gICAgICAgICAgID0gS0VZX0tQU0xBU0gsCi0gICAgW1FfS0VZX0NPREVf S1BfTVVMVElQTFldICAgICAgICAgPSBLRVlfS1BBU1RFUklTSywKLQotICAgIFtRX0tFWV9DT0RF X0YxMV0gICAgICAgICAgICAgICAgID0gS0VZX0YxMSwKLSAgICBbUV9LRVlfQ09ERV9GMTJdICAg ICAgICAgICAgICAgICA9IEtFWV9GMTIsCi0KLSAgICBbUV9LRVlfQ09ERV9DVFJMX1JdICAgICAg ICAgICAgICA9IEtFWV9SSUdIVENUUkwsCi0gICAgW1FfS0VZX0NPREVfU1lTUlFdICAgICAgICAg ICAgICAgPSBLRVlfU1lTUlEsCi0gICAgW1FfS0VZX0NPREVfUFJJTlRdICAgICAgICAgICAgICAg PSBLRVlfU1lTUlEsCi0gICAgW1FfS0VZX0NPREVfUEFVU0VdICAgICAgICAgICAgICAgPSBLRVlf UEFVU0UsCi0gICAgW1FfS0VZX0NPREVfQUxUX1JdICAgICAgICAgICAgICAgPSBLRVlfUklHSFRB TFQsCi0KLSAgICBbUV9LRVlfQ09ERV9IT01FXSAgICAgICAgICAgICAgICA9IEtFWV9IT01FLAot ICAgIFtRX0tFWV9DT0RFX1VQXSAgICAgICAgICAgICAgICAgID0gS0VZX1VQLAotICAgIFtRX0tF WV9DT0RFX1BHVVBdICAgICAgICAgICAgICAgID0gS0VZX1BBR0VVUCwKLSAgICBbUV9LRVlfQ09E RV9MRUZUXSAgICAgICAgICAgICAgICA9IEtFWV9MRUZULAotICAgIFtRX0tFWV9DT0RFX1JJR0hU XSAgICAgICAgICAgICAgID0gS0VZX1JJR0hULAotICAgIFtRX0tFWV9DT0RFX0VORF0gICAgICAg ICAgICAgICAgID0gS0VZX0VORCwKLSAgICBbUV9LRVlfQ09ERV9ET1dOXSAgICAgICAgICAgICAg ICA9IEtFWV9ET1dOLAotICAgIFtRX0tFWV9DT0RFX1BHRE5dICAgICAgICAgICAgICAgID0gS0VZ X1BBR0VET1dOLAotICAgIFtRX0tFWV9DT0RFX0lOU0VSVF0gICAgICAgICAgICAgID0gS0VZX0lO U0VSVCwKLSAgICBbUV9LRVlfQ09ERV9ERUxFVEVdICAgICAgICAgICAgICA9IEtFWV9ERUxFVEUs Ci0KLSAgICBbUV9LRVlfQ09ERV9NRVRBX0xdICAgICAgICAgICAgICA9IEtFWV9MRUZUTUVUQSwK LSAgICBbUV9LRVlfQ09ERV9NRVRBX1JdICAgICAgICAgICAgICA9IEtFWV9SSUdIVE1FVEEsCi0g ICAgW1FfS0VZX0NPREVfTUVOVV0gICAgICAgICAgICAgICAgPSBLRVlfTUVOVSwKLX07Ci0KLXN0 YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga2V5bWFwX2J1dHRvbltJTlBVVF9CVVRUT05fX01BWF0g PSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQga2V5bWFwX2J1dHRvbltJTlBVVF9CVVRU T05fX01BWF0gPSB7CiAgICAgW0lOUFVUX0JVVFRPTl9MRUZUXSAgICAgICAgICAgICAgPSBCVE5f TEVGVCwKICAgICBbSU5QVVRfQlVUVE9OX1JJR0hUXSAgICAgICAgICAgICA9IEJUTl9SSUdIVCwK ICAgICBbSU5QVVRfQlVUVE9OX01JRERMRV0gICAgICAgICAgICA9IEJUTl9NSURETEUsCkBAIC0x NDksMTIgKzMwLDEyIEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga2V5bWFwX2J1dHRvbltJ TlBVVF9CVVRUT05fX01BWF0gPSB7CiAgICAgW0lOUFVUX0JVVFRPTl9XSEVFTF9ET1dOXSAgICAg ICAgPSBCVE5fR0VBUl9ET1dOLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBheGlz bWFwX3JlbFtJTlBVVF9BWElTX19NQVhdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0 IGF4aXNtYXBfcmVsW0lOUFVUX0FYSVNfX01BWF0gPSB7CiAgICAgW0lOUFVUX0FYSVNfWF0gICAg ICAgICAgICAgICAgICAgPSBSRUxfWCwKICAgICBbSU5QVVRfQVhJU19ZXSAgICAgICAgICAgICAg ICAgICA9IFJFTF9ZLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBheGlzbWFwX2Fi c1tJTlBVVF9BWElTX19NQVhdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGF4aXNt YXBfYWJzW0lOUFVUX0FYSVNfX01BWF0gPSB7CiAgICAgW0lOUFVUX0FYSVNfWF0gICAgICAgICAg ICAgICAgICAgPSBBQlNfWCwKICAgICBbSU5QVVRfQVhJU19ZXSAgICAgICAgICAgICAgICAgICA9 IEFCU19ZLAogfTsKQEAgLTE2Miw3ICs0Myw3IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQg YXhpc21hcF9hYnNbSU5QVVRfQVhJU19fTUFYXSA9IHsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRp YyB2b2lkIHZpcnRpb19pbnB1dF9rZXlfY29uZmlnKFZpcnRJT0lucHV0ICp2aW5wdXQsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmtleW1h cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNo b3J0ICprZXltYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qg bWFwc2l6ZSkKIHsKICAgICB2aXJ0aW9faW5wdXRfY29uZmlnIGtleXM7CkBAIC0yMDIsOSArODMs MTAgQEAgc3RhdGljIHZvaWQgdmlydGlvX2lucHV0X2hhbmRsZV9ldmVudChEZXZpY2VTdGF0ZSAq ZGV2LCBRZW11Q29uc29sZSAqc3JjLAogICAgIGNhc2UgSU5QVVRfRVZFTlRfS0lORF9LRVk6CiAg ICAgICAgIGtleSA9IGV2dC0+dS5rZXkuZGF0YTsKICAgICAgICAgcWNvZGUgPSBxZW11X2lucHV0 X2tleV92YWx1ZV90b19xY29kZShrZXktPmtleSk7Ci0gICAgICAgIGlmIChxY29kZSAmJiBrZXlt YXBfcWNvZGVbcWNvZGVdKSB7CisgICAgICAgIGlmIChxY29kZSA8IHFlbXVfaW5wdXRfbWFwX3Fj b2RlX3RvX2xpbnV4X2xlbiAmJgorICAgICAgICAgICAgcWVtdV9pbnB1dF9tYXBfcWNvZGVfdG9f bGludXhbcWNvZGVdKSB7CiAgICAgICAgICAgICBldmVudC50eXBlICA9IGNwdV90b19sZTE2KEVW X0tFWSk7Ci0gICAgICAgICAgICBldmVudC5jb2RlICA9IGNwdV90b19sZTE2KGtleW1hcF9xY29k ZVtxY29kZV0pOworICAgICAgICAgICAgZXZlbnQuY29kZSAgPSBjcHVfdG9fbGUxNihxZW11X2lu cHV0X21hcF9xY29kZV90b19saW51eFtxY29kZV0pOwogICAgICAgICAgICAgZXZlbnQudmFsdWUg PSBjcHVfdG9fbGUzMihrZXktPmRvd24gPyAxIDogMCk7CiAgICAgICAgICAgICB2aXJ0aW9faW5w dXRfc2VuZCh2aW5wdXQsICZldmVudCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zOTUsOCArMjc3 LDggQEAgc3RhdGljIHZvaWQgdmlydGlvX2tleWJvYXJkX2luaXQoT2JqZWN0ICpvYmopCiAKICAg ICB2aGlkLT5oYW5kbGVyID0gJnZpcnRpb19rZXlib2FyZF9oYW5kbGVyOwogICAgIHZpcnRpb19p bnB1dF9pbml0X2NvbmZpZyh2aW5wdXQsIHZpcnRpb19rZXlib2FyZF9jb25maWcpOwotICAgIHZp cnRpb19pbnB1dF9rZXlfY29uZmlnKHZpbnB1dCwga2V5bWFwX3Fjb2RlLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoa2V5bWFwX3Fjb2RlKSk7CisgICAgdmlydGlvX2lu cHV0X2tleV9jb25maWcodmlucHV0LCBxZW11X2lucHV0X21hcF9xY29kZV90b19saW51eCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2lucHV0X21hcF9xY29kZV90b19saW51eF9s ZW4pOwogfQogCiBzdGF0aWMgY29uc3QgVHlwZUluZm8gdmlydGlvX2tleWJvYXJkX2luZm8gPSB7 CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL2lucHV0LmggYi9pbmNsdWRlL3VpL2lucHV0LmgKaW5k ZXggZjhjZWU0M2Y2NS4uNmY1NmQ4NjhjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9pbnB1dC5o CisrKyBiL2luY2x1ZGUvdWkvaW5wdXQuaApAQCAtNzEsNiArNzEsOSBAQCB2b2lkIHFlbXVfcmVt b3ZlX21vdXNlX21vZGVfY2hhbmdlX25vdGlmaWVyKE5vdGlmaWVyICpub3RpZnkpOwogZXh0ZXJu IGNvbnN0IGd1aW50IHFlbXVfaW5wdXRfbWFwX2xpbnV4X3RvX3Fjb2RlX2xlbjsKIGV4dGVybiBj b25zdCBndWludDE2IHFlbXVfaW5wdXRfbWFwX2xpbnV4X3RvX3Fjb2RlW107CiAKK2V4dGVybiBj b25zdCBndWludCBxZW11X2lucHV0X21hcF9xY29kZV90b19saW51eF9sZW47CitleHRlcm4gY29u c3QgZ3VpbnQxNiBxZW11X2lucHV0X21hcF9xY29kZV90b19saW51eFtdOworCiBleHRlcm4gY29u c3QgZ3VpbnQgcWVtdV9pbnB1dF9tYXBfcWNvZGVfdG9fcW51bV9sZW47CiBleHRlcm4gY29uc3Qg Z3VpbnQxNiBxZW11X2lucHV0X21hcF9xY29kZV90b19xbnVtW107CiAKZGlmZiAtLWdpdCBhL3Vp L2lucHV0LWtleW1hcC5jIGIvdWkvaW5wdXQta2V5bWFwLmMKaW5kZXggM2ExOWExNjlmNS4uNmU1 NDNkNjUxZiAxMDA2NDQKLS0tIGEvdWkvaW5wdXQta2V5bWFwLmMKKysrIGIvdWkvaW5wdXQta2V5 bWFwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSAic3RhbmRhcmQtaGVhZGVycy9saW51eC9p bnB1dC5oIgogCiAjaW5jbHVkZSAidWkvaW5wdXQta2V5bWFwLWxpbnV4LXRvLXFjb2RlLmMiCisj aW5jbHVkZSAidWkvaW5wdXQta2V5bWFwLXFjb2RlLXRvLWxpbnV4LmMiCiAjaW5jbHVkZSAidWkv aW5wdXQta2V5bWFwLXFjb2RlLXRvLXFudW0uYyIKICNpbmNsdWRlICJ1aS9pbnB1dC1rZXltYXAt cW51bS10by1xY29kZS5jIgogCi0tIAoyLjE0LjMKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBs aXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4v bGlzdGluZm8veGVuLWRldmVs