[libvirt] [PATCH] vhost-user: add support reconnect for vhost-user ports

For vhost-user ports, Open vSwitch acts as the server and QEMU the client. When OVS crashed or restart, QEMU shoule be reconnect to OVS. Signed-off-by: ZhiPeng Lu <lu.zhipeng@zte.com.cn> --- v1->v2: - modify xml format --- --- docs/schemas/domaincommon.rng | 12 ++++++++++ src/conf/domain_conf.c | 26 ++++++++++++++++++++++ .../qemuxml2argv-net-vhostuser-multiq.args | 4 ++-- .../qemuxml2argv-net-vhostuser-multiq.xml | 8 +++++-- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 76852ab..bf015ca 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2388,6 +2388,18 @@ <value>client</value> </choice> </attribute> + <optional> + <element name="reconnect"> + <attribute name="enabled"> + <ref name="virYesNo"/> + </attribute> + <optional> + <attribute name="timeout"> + <ref name="unsignedInt"/> + </attribute> + </optional> + </element> + </optional> <empty/> </element> <ref name="interface-options"/> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cc5e79b..d121a9e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -83,6 +83,13 @@ struct _virDomainXMLOption { /* Private data for save image stored in snapshot XML */ virSaveCookieCallbacks saveCookie; }; +static int +virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def, + xmlNodePtr node, + xmlXPathContextPtr ctxt); +static void +virDomainChrSourceReconnectDefFormat(virBufferPtr buf, + virDomainChrSourceReconnectDefPtr def); #define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \ (VIR_DOMAIN_DEF_FORMAT_SECURE | \ @@ -10245,6 +10252,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, virNWFilterHashTablePtr filterparams = NULL; virDomainActualNetDefPtr actual = NULL; xmlNodePtr oldnode = ctxt->node; + virDomainChrSourceReconnectDef reconnect = {0}; int rv, val; if (VIR_ALLOC(def) < 0) @@ -10331,6 +10339,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, vhostuser_type = virXMLPropString(cur, "type"); vhostuser_path = virXMLPropString(cur, "path"); vhostuser_mode = virXMLPropString(cur, "mode"); + if (virDomainChrSourceReconnectDefParseXML(&reconnect, cur, ctxt) < 0) + goto error; } else if (!def->virtPortProfile && virXMLNodeNameEqual(cur, "virtualport")) { if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK) { @@ -10552,8 +10562,17 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, if (STREQ(vhostuser_mode, "server")) { def->data.vhostuser->data.nix.listen = true; + if (reconnect.enabled != VIR_TRISTATE_BOOL_ABSENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'reconnect' attribute unsupported " + "'server' mode for <interface type='vhostuser'>")); + goto error; + } } else if (STREQ(vhostuser_mode, "client")) { def->data.vhostuser->data.nix.listen = false; + def->data.vhostuser->data.nix.reconnect.enabled = reconnect.enabled; + def->data.vhostuser->data.nix.reconnect.timeout = reconnect.timeout; + reconnect.enabled = VIR_TRISTATE_BOOL_ABSENT; } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Wrong <source> 'mode' attribute " @@ -22984,6 +23003,13 @@ virDomainNetDefFormat(virBufferPtr buf, def->data.vhostuser->data.nix.listen ? "server" : "client"); sourceLines++; + if (def->data.vhostuser->data.nix.reconnect.enabled != VIR_TRISTATE_BOOL_ABSENT) { + virBufferAddLit(buf, ">\n"); + sourceLines++; + virBufferAdjustIndent(buf, 2); + virDomainChrSourceReconnectDefFormat(buf, &def->data.vhostuser->data.nix.reconnect); + virBufferAdjustIndent(buf, -2); + } } break; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args index b69ebd8..0b08f44 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args @@ -25,14 +25,14 @@ server,nowait \ -netdev vhost-user,chardev=charnet0,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:ee:96:6b,bus=pci.0,\ addr=0x3 \ --chardev socket,id=charnet1,path=/tmp/vhost1.sock \ +-chardev socket,id=charnet1,path=/tmp/vhost1.sock,reconnect=10 \ -netdev vhost-user,chardev=charnet1,id=hostnet1 \ -device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:ee:96:6c,bus=pci.0,\ addr=0x4 \ -netdev socket,listen=:2015,id=hostnet2 \ -device rtl8139,netdev=hostnet2,id=net2,mac=52:54:00:95:db:c0,bus=pci.0,\ addr=0x5 \ --chardev socket,id=charnet3,path=/tmp/vhost2.sock \ +-chardev socket,id=charnet3,path=/tmp/vhost2.sock,reconnect=0 \ -netdev vhost-user,chardev=charnet3,queues=4,id=hostnet3 \ -device virtio-net-pci,mq=on,vectors=10,netdev=hostnet3,id=net3,\ mac=52:54:00:ee:96:6d,bus=pci.0,addr=0x6 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml index d5c42fe..2fadb1c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml @@ -30,7 +30,9 @@ </interface> <interface type='vhostuser'> <mac address='52:54:00:ee:96:6c'/> - <source type='unix' path='/tmp/vhost1.sock' mode='client'/> + <source type='unix' path='/tmp/vhost1.sock' mode='client'> + <reconnect enabled='yes' timeout='10'/> + </source> <model type='virtio'/> </interface> <interface type='server'> @@ -40,7 +42,9 @@ </interface> <interface type='vhostuser'> <mac address='52:54:00:ee:96:6d'/> - <source type='unix' path='/tmp/vhost2.sock' mode='client'/> + <source type='unix' path='/tmp/vhost2.sock' mode='client'> + <reconnect enabled='no'/> + </source> <model type='virtio'/> <driver queues='4'/> </interface> -- 1.8.3.1

Re: [libvirt] [PATCH] vhost-user: add support reconnect for vhost-user ports
When sending a v2/v3/etc of a patch, use the "-v2" (or -v3, -v4, etc) option to git send-email so that the subject line shows up as "[PATCH v2]". On 09/21/2017 07:39 AM, ZhiPeng Lu wrote:
For vhost-user ports, Open vSwitch acts as the server and QEMU the client. When OVS crashed or restart, QEMU shoule be reconnect to OVS.
"When OVS crashes or restarts, the QEMU process should be reconnected to OVS"
Signed-off-by: ZhiPeng Lu <lu.zhipeng@zte.com.cn> --- v1->v2: - modify xml format ---
Looks like you added the above text to your commit log message. Instead, you can just add it in below the "---" line during git send-email, with the "--annotate" option.
--- docs/schemas/domaincommon.rng | 12 ++++++++++ src/conf/domain_conf.c | 26 ++++++++++++++++++++++ .../qemuxml2argv-net-vhostuser-multiq.args | 4 ++-- .../qemuxml2argv-net-vhostuser-multiq.xml | 8 +++++-- 4 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 76852ab..bf015ca 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2388,6 +2388,18 @@ <value>client</value> </choice> </attribute> + <optional> + <element name="reconnect"> + <attribute name="enabled"> + <ref name="virYesNo"/> + </attribute> + <optional> + <attribute name="timeout"> + <ref name="unsignedInt"/> + </attribute> + </optional> + </element> + </optional>
Rather than doing a copy-paste of this from qemucdevSrcDef, it would be more useful to *move* it to create a new definition for something called "reconnect": <define name="reconnect"> <element name="reconnect"> <attribute name="enabled"> <ref name="virYesNo"/> </attribute> <optional> <attribute name="timeout"> <ref name="unsignedInt"/> </attribute> </optional> </element> </define> then reference that where it's needed (both for interface source and qemucdevSrcDef): <optional> <ref name="reconnect"/> </optional>
<empty/> </element> <ref name="interface-options"/> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cc5e79b..d121a9e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -83,6 +83,13 @@ struct _virDomainXMLOption { /* Private data for save image stored in snapshot XML */ virSaveCookieCallbacks saveCookie; }; +static int +virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def, + xmlNodePtr node, + xmlXPathContextPtr ctxt); +static void +virDomainChrSourceReconnectDefFormat(virBufferPtr buf, + virDomainChrSourceReconnectDefPtr def);
Since these functions (and the struct) are no longer used just for chr source, their names should be made more generic - remove the "Chr" from them all (maybe replace it with "Device"?)
#define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \ (VIR_DOMAIN_DEF_FORMAT_SECURE | \ @@ -10245,6 +10252,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, virNWFilterHashTablePtr filterparams = NULL; virDomainActualNetDefPtr actual = NULL; xmlNodePtr oldnode = ctxt->node; + virDomainChrSourceReconnectDef reconnect = {0}; int rv, val;
if (VIR_ALLOC(def) < 0) @@ -10331,6 +10339,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, vhostuser_type = virXMLPropString(cur, "type"); vhostuser_path = virXMLPropString(cur, "path"); vhostuser_mode = virXMLPropString(cur, "mode"); + if (virDomainChrSourceReconnectDefParseXML(&reconnect, cur, ctxt) < 0) + goto error; } else if (!def->virtPortProfile && virXMLNodeNameEqual(cur, "virtualport")) { if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK) { @@ -10552,8 +10562,17 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
if (STREQ(vhostuser_mode, "server")) { def->data.vhostuser->data.nix.listen = true; + if (reconnect.enabled != VIR_TRISTATE_BOOL_ABSENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("'reconnect' attribute unsupported " + "'server' mode for <interface type='vhostuser'>")); + goto error; + }
Ugh. Having the reconnect info stored all the way down in a device-type-specific part of the object makes it *really* difficult to do proper validation (e.g. if someone adds a <reconnect> element to the <source> of a <hostdev>, it will be ignored, then silently disappear, rather than being reported as an error. Unfortunately we don't have a generic "source" sub-object that is a part of all device objects (similar to the virDomainDeviceInfo that is a part of every device no matter the type), so there isn't a real clear place to put it. It would be nice to be able to properly log an error when <reconnect> is used in an inappropriate place, though (admittedly, there are infinite things that might be added to the XML and be silently ignored, so it may be appropriate to "punt" in this case too.)
} else if (STREQ(vhostuser_mode, "client")) { def->data.vhostuser->data.nix.listen = false; + def->data.vhostuser->data.nix.reconnect.enabled = reconnect.enabled; + def->data.vhostuser->data.nix.reconnect.timeout = reconnect.timeout; + reconnect.enabled = VIR_TRISTATE_BOOL_ABSENT; } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Wrong <source> 'mode' attribute " @@ -22984,6 +23003,13 @@ virDomainNetDefFormat(virBufferPtr buf, def->data.vhostuser->data.nix.listen ? "server" : "client"); sourceLines++; + if (def->data.vhostuser->data.nix.reconnect.enabled != VIR_TRISTATE_BOOL_ABSENT) { + virBufferAddLit(buf, ">\n"); + sourceLines++; + virBufferAdjustIndent(buf, 2); + virDomainChrSourceReconnectDefFormat(buf, &def->data.vhostuser->data.nix.reconnect); + virBufferAdjustIndent(buf, -2); + } } break;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args index b69ebd8..0b08f44 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.args @@ -25,14 +25,14 @@ server,nowait \ -netdev vhost-user,chardev=charnet0,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:ee:96:6b,bus=pci.0,\ addr=0x3 \ --chardev socket,id=charnet1,path=/tmp/vhost1.sock \ +-chardev socket,id=charnet1,path=/tmp/vhost1.sock,reconnect=10 \ -netdev vhost-user,chardev=charnet1,id=hostnet1 \ -device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:ee:96:6c,bus=pci.0,\ addr=0x4 \ -netdev socket,listen=:2015,id=hostnet2 \ -device rtl8139,netdev=hostnet2,id=net2,mac=52:54:00:95:db:c0,bus=pci.0,\ addr=0x5 \ --chardev socket,id=charnet3,path=/tmp/vhost2.sock \ +-chardev socket,id=charnet3,path=/tmp/vhost2.sock,reconnect=0 \ -netdev vhost-user,chardev=charnet3,queues=4,id=hostnet3 \ -device virtio-net-pci,mq=on,vectors=10,netdev=hostnet3,id=net3,\ mac=52:54:00:ee:96:6d,bus=pci.0,addr=0x6 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml index d5c42fe..2fadb1c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-vhostuser-multiq.xml @@ -30,7 +30,9 @@ </interface> <interface type='vhostuser'> <mac address='52:54:00:ee:96:6c'/> - <source type='unix' path='/tmp/vhost1.sock' mode='client'/> + <source type='unix' path='/tmp/vhost1.sock' mode='client'> + <reconnect enabled='yes' timeout='10'/> + </source> <model type='virtio'/> </interface> <interface type='server'> @@ -40,7 +42,9 @@ </interface> <interface type='vhostuser'> <mac address='52:54:00:ee:96:6d'/> - <source type='unix' path='/tmp/vhost2.sock' mode='client'/> + <source type='unix' path='/tmp/vhost2.sock' mode='client'> + <reconnect enabled='no'/> + </source> <model type='virtio'/> <driver queues='4'/> </interface>

Pj4gICAgICAgICAgICAgICAgPGVtcHR5Lz4+PiAgICAgICAgICAgICAgPC9lbGVtZW50Pj4gPiAg ICAgICAgICAgICA8cmVmIG5hbWU9ImludGVyZmFjZS1vcHRpb25zIi8+Pj4gZGlmZiAtLWdpdCBh L3NyYy9jb25mL2RvbWFpbl9jb25mLmMgYi9zcmMvY29uZi9kb21haW5fY29uZi5jPj4gaW5kZXgg Y2M1ZTc5Yi4uZDEyMWE5ZSAxMDA2NDQ+PiAtLS0gYS9zcmMvY29uZi9kb21haW5fY29uZi5jPj4g KysrIGIvc3JjL2NvbmYvZG9tYWluX2NvbmYuYz4+IEBAIC04Myw2ICs4MywxMyBAQCBzdHJ1Y3Qg X3ZpckRvbWFpblhNTE9wdGlvbiB7Pj4gICAgICAvKiBQcml2YXRlIGRhdGEgZm9yIHNhdmUgaW1h Z2Ugc3RvcmVkIGluIHNuYXBzaG90IFhNTCAqLz4+ICAgICAgdmlyU2F2ZUNvb2tpZUNhbGxiYWNr cyBzYXZlQ29va2llPj4gIH0+PiArc3RhdGljIGludD4+ICt2aXJEb21haW5DaHJTb3VyY2VSZWNv bm5lY3REZWZQYXJzZVhNTCh2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3REZWZQdHIgZGVmLD4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIG5vZGUs Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFhQYXRoQ29udGV4 dFB0ciBjdHh0KT4+ICtzdGF0aWMgdm9pZD4+ICt2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3RE ZWZGb3JtYXQodmlyQnVmZmVyUHRyIGJ1Ziw+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHZpckRvbWFpbkNoclNvdXJjZVJlY29ubmVjdERlZlB0ciBkZWYpPlNpbmNlIHRo ZXNlIGZ1bmN0aW9ucyAoYW5kIHRoZSBzdHJ1Y3QpIGFyZSBubyBsb25nZXIgdXNlZCBqdXN0IGZv ciBjaHI+c291cmNlLCB0aGVpciBuYW1lcyBzaG91bGQgYmUgbWFkZSBtb3JlIGdlbmVyaWMgLSBy ZW1vdmUgdGhlICJDaHIiIGZyb20+dGhlbSBhbGwgKG1heWJlIHJlcGxhY2UgaXQgd2l0aCAiRGV2 aWNlIj8pDQoNCkluIGZhY3QsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdXNlZCB0byBjaGFy IGRldmljZSBvZiAgdmhvc3R1c2VyIGRldmljZXMuIA0KDQpDaGFuZ2luZyB0aGUgbmFtZSBtYXkg bm90IHJlZmxlY3QgdGhlIG1lYW5pbmcuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoN Cg0KDQoNCg0KDQrkuLrkuoborqnmgqjnmoRWUGxhdOiZmuaLn+acuuaVhemanOWSjGRvY2tlcuaV hemanOW+l+WIsOmrmOaViOeahOWkhOeQhu+8jOivt+S4iuaKpeaVhemanOWIsDogJFZQbGF05oqA 5pyv5pSv5oyB44CCDQoNCg0K6Iqm5b+X5pyLIGx1emhpcGVuZw0KDQoNCg0KDQoNCg0KSVTlvIDl j5Hlt6XnqIvluIggSVQgRGV2ZWxvcG1lbnQKRW5naW5lZXINCuaTjeS9nOezu+e7n+S6p+WTgemD qC/kuK3lv4PnoJTnqbbpmaIv57O757uf5Lqn5ZOBIE9TIFByb2R1Y3QgRGVwdC4vQ2VudHJhbCBS 77yGRCBJbnN0aXR1dGUvU3lzdGVtIFByb2R1Y3QNCg0KDQoNCg0KDQoNCg0KDQoNCuWbm+W3neec geaIkOmDveW4guWkqeW6nOWkp+mBk+S4reautTgwMOWPtw0KRTogbHUuemhpcGVuZ0B6dGUuY29t LmNuIA0Kd3d3Lnp0ZS5jb20uY24NCg0KDQoNCg0KDQoNCg0KDQoNCg0K5Y6f5aeL6YKu5Lu2DQoN Cg0KDQrlj5Hku7bkurrvvJogPGxhaW5lQGxhaW5lLm9yZz4NCuaUtuS7tuS6uu+8miA8bGlidmly LWxpc3RAcmVkaGF0LmNvbT4NCuaKhOmAgeS6uu+8muiKpuW/l+acizEwMTA4MjcyIDxtcHJpdm96 bkByZWRoYXQuY29tPiA8cGhyZGluYUByZWRoYXQuY29tPg0K5pelIOacnyDvvJoyMDE35bm0MDnm nIgyMuaXpSAwMTo0NQ0K5Li7IOmimCDvvJpSZTogW2xpYnZpcnRdIFtQQVRDSF0gdmhvc3QtdXNl cjogYWRkIHN1cHBvcnQgcmVjb25uZWN0IGZvcnZob3N0LXVzZXIgcG9ydHMNCg0KDQoNCg0KDQo+ IFJlOiBbbGlidmlydF0gW1BBVENIXSB2aG9zdC11c2VyOiBhZGQgc3VwcG9ydCByZWNvbm5lY3Qg Zm9yIHZob3N0LXVzZXINCnBvcnRzDQoNCldoZW4gc2VuZGluZyBhIHYyL3YzL2V0YyBvZiBhIHBh dGNoLCB1c2UgdGhlICItdjIiIChvciAtdjMsIC12NCwgZXRjKQ0Kb3B0aW9uIHRvIGdpdCBzZW5k LWVtYWlsIHNvIHRoYXQgdGhlIHN1YmplY3QgbGluZSBzaG93cyB1cCBhcyAiW1BBVENIIHYyXSIu DQoNCk9uIDA5LzIxLzIwMTcgMDc6MzkgQU0sIFpoaVBlbmcgTHUgd3JvdGU6DQo+IEZvciB2aG9z dC11c2VyIHBvcnRzLCBPcGVuIHZTd2l0Y2ggYWN0cyBhcyB0aGUgc2VydmVyIGFuZCBRRU1VIHRo ZSBjbGllbnQuDQo+IFdoZW4gT1ZTIGNyYXNoZWQgb3IgcmVzdGFydCwgUUVNVSBzaG91bGUgYmUg cmVjb25uZWN0IHRvIE9WUy4NCg0KDQoiV2hlbiBPVlMgY3Jhc2hlcyBvciByZXN0YXJ0cywgdGhl IFFFTVUgcHJvY2VzcyBzaG91bGQgYmUgcmVjb25uZWN0ZWQgdG8NCk9WUyINCg0KPg0KPiBTaWdu ZWQtb2ZmLWJ5OiBaaGlQZW5nIEx1IDxsdS56aGlwZW5nQHp0ZS5jb20uY24+DQo+IC0tLQ0KPiB2 MS0+djI6DQo+ICAtIG1vZGlmeSB4bWwgZm9ybWF0DQo+IC0tLQ0KDQpMb29rcyBsaWtlIHlvdSBh ZGRlZCB0aGUgYWJvdmUgdGV4dCB0byB5b3VyIGNvbW1pdCBsb2cgbWVzc2FnZS4gSW5zdGVhZCwN CnlvdSBjYW4ganVzdCBhZGQgaXQgaW4gYmVsb3cgdGhlICItLS0iIGxpbmUgZHVyaW5nIGdpdCBz ZW5kLWVtYWlsLCB3aXRoDQp0aGUgIi0tYW5ub3RhdGUiIG9wdGlvbi4NCg0KDQo+IC0tLQ0KPiAg ZG9jcy9zY2hlbWFzL2RvbWFpbmNvbW1vbi5ybmcgICAgICAgICAgICAgICAgICAgICAgfCAxMiAr KysrKysrKysrDQo+ICBzcmMvY29uZi9kb21haW5fY29uZi5jICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDI2ICsrKysrKysrKysrKysrKysrKysrKysNCj4gIC4uLi9xZW11eG1sMmFyZ3Yt bmV0LXZob3N0dXNlci1tdWx0aXEuYXJncyAgICAgICAgIHwgIDQgKystLQ0KPiAgLi4uL3FlbXV4 bWwyYXJndi1uZXQtdmhvc3R1c2VyLW11bHRpcS54bWwgICAgICAgICAgfCAgOCArKysrKy0tDQo+ ICA0IGZpbGVzIGNoYW5nZWQsIDQ2IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pDQo+DQo+ IGRpZmYgLS1naXQgYS9kb2NzL3NjaGVtYXMvZG9tYWluY29tbW9uLnJuZyBiL2RvY3Mvc2NoZW1h cy9kb21haW5jb21tb24ucm5nDQo+IGluZGV4IDc2ODUyYWIuLmJmMDE1Y2EgMTAwNjQ0DQo+IC0t LSBhL2RvY3Mvc2NoZW1hcy9kb21haW5jb21tb24ucm5nDQo+ICsrKyBiL2RvY3Mvc2NoZW1hcy9k b21haW5jb21tb24ucm5nDQo+IEBAIC0yMzg4LDYgKzIzODgsMTggQEANCj4gICAgICAgICAgICAg ICAgICAgIDx2YWx1ZT5jbGllbnQ8L3ZhbHVlPg0KPiAgICAgICAgICAgICAgICAgIDwvY2hvaWNl Pg0KPiAgICAgICAgICAgICAgICA8L2F0dHJpYnV0ZT4NCj4gKyAgICAgICAgICAgICAgPG9wdGlv bmFsPg0KPiArICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlY29ubmVjdCI+DQo+ICsg ICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiPg0KPiArICAgICAgICAg ICAgICAgICAgICA8cmVmIG5hbWU9InZpclllc05vIi8+DQo+ICsgICAgICAgICAgICAgICAgICA8 L2F0dHJpYnV0ZT4NCj4gKyAgICAgICAgICAgICAgICAgIDxvcHRpb25hbD4NCj4gKyAgICAgICAg ICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0Ij4NCj4gKyAgICAgICAgICAgICAg ICAgICAgICA8cmVmIG5hbWU9InVuc2lnbmVkSW50Ii8+DQo+ICsgICAgICAgICAgICAgICAgICAg IDwvYXR0cmlidXRlPg0KPiArICAgICAgICAgICAgICAgICAgPC9vcHRpb25hbD4NCj4gKyAgICAg ICAgICAgICAgIDwvZWxlbWVudD4NCj4gKyAgICAgICAgICAgICAgPC9vcHRpb25hbD4NCg0KUmF0 aGVyIHRoYW4gZG9pbmcgYSBjb3B5LXBhc3RlIG9mIHRoaXMgZnJvbSBxZW11Y2RldlNyY0RlZiwg aXQgd291bGQgYmUNCm1vcmUgdXNlZnVsIHRvICptb3ZlKiBpdCB0byBjcmVhdGUgYSBuZXcgZGVm aW5pdGlvbiBmb3Igc29tZXRoaW5nIGNhbGxlZA0KInJlY29ubmVjdCI6DQoNCiAgICAgICAgICAg ICAgPGRlZmluZSBuYW1lPSJyZWNvbm5lY3QiPg0KICAgICAgICAgICAgICAgIDxlbGVtZW50IG5h bWU9InJlY29ubmVjdCI+DQogICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJs ZWQiPg0KICAgICAgICAgICAgICAgICAgICA8cmVmIG5hbWU9InZpclllc05vIi8+DQogICAgICAg ICAgICAgICAgICA8L2F0dHJpYnV0ZT4NCiAgICAgICAgICAgICAgICAgIDxvcHRpb25hbD4NCiAg ICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0Ij4NCiAgICAgICAgICAg ICAgICAgICAgICA8cmVmIG5hbWU9InVuc2lnbmVkSW50Ii8+DQogICAgICAgICAgICAgICAgICAg IDwvYXR0cmlidXRlPg0KICAgICAgICAgICAgICAgICAgPC9vcHRpb25hbD4NCiAgICAgICAgICAg ICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICA8L2RlZmluZT4NCg0KdGhlbiByZWZlcmVuY2Ug dGhhdCB3aGVyZSBpdCdzIG5lZWRlZCAoYm90aCBmb3IgaW50ZXJmYWNlIHNvdXJjZSBhbmQgcWVt dWNkZXZTcmNEZWYpOg0KDQoNCiAgICAgICAgPG9wdGlvbmFsPg0KICAgICAgICAgIDxyZWYgbmFt ZT0icmVjb25uZWN0Ii8+DQogICAgICAgIDwvb3B0aW9uYWw+DQoNCj4gICAgICAgICAgICAgICAg PGVtcHR5Lz4NCj4gICAgICAgICAgICAgIDwvZWxlbWVudD4NCj4gICAgICAgICAgICAgIDxyZWYg bmFtZT0iaW50ZXJmYWNlLW9wdGlvbnMiLz4NCj4gZGlmZiAtLWdpdCBhL3NyYy9jb25mL2RvbWFp bl9jb25mLmMgYi9zcmMvY29uZi9kb21haW5fY29uZi5jDQo+IGluZGV4IGNjNWU3OWIuLmQxMjFh OWUgMTAwNjQ0DQo+IC0tLSBhL3NyYy9jb25mL2RvbWFpbl9jb25mLmMNCj4gKysrIGIvc3JjL2Nv bmYvZG9tYWluX2NvbmYuYw0KPiBAQCAtODMsNiArODMsMTMgQEAgc3RydWN0IF92aXJEb21haW5Y TUxPcHRpb24gew0KPiAgICAgIC8qIFByaXZhdGUgZGF0YSBmb3Igc2F2ZSBpbWFnZSBzdG9yZWQg aW4gc25hcHNob3QgWE1MICovDQo+ICAgICAgdmlyU2F2ZUNvb2tpZUNhbGxiYWNrcyBzYXZlQ29v a2llDQo+ICB9DQo+ICtzdGF0aWMgaW50DQo+ICt2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3RE ZWZQYXJzZVhNTCh2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3REZWZQdHIgZGVmLA0KPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlLA0KPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sWFBhdGhDb250ZXh0UHRy IGN0eHQpDQo+ICtzdGF0aWMgdm9pZA0KPiArdmlyRG9tYWluQ2hyU291cmNlUmVjb25uZWN0RGVm Rm9ybWF0KHZpckJ1ZmZlclB0ciBidWYsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmlyRG9tYWluQ2hyU291cmNlUmVjb25uZWN0RGVmUHRyIGRlZikNCg0KU2luY2Ug dGhlc2UgZnVuY3Rpb25zIChhbmQgdGhlIHN0cnVjdCkgYXJlIG5vIGxvbmdlciB1c2VkIGp1c3Qg Zm9yIGNocg0Kc291cmNlLCB0aGVpciBuYW1lcyBzaG91bGQgYmUgbWFkZSBtb3JlIGdlbmVyaWMg LSByZW1vdmUgdGhlICJDaHIiIGZyb20NCnRoZW0gYWxsIChtYXliZSByZXBsYWNlIGl0IHdpdGgg IkRldmljZSI/KQ0KDQo+ICANCj4gICNkZWZpbmUgVklSX0RPTUFJTl9ERUZfRk9STUFUX0NPTU1P Tl9GTEFHUyAgICAgICAgICAgICBcDQo+ICAgICAgKFZJUl9ET01BSU5fREVGX0ZPUk1BVF9TRUNV UkUgfCAgICAgICAgICAgICAgICAgICAgXA0KPiBAQCAtMTAyNDUsNiArMTAyNTIsNyBAQCB2aXJE b21haW5OZXREZWZQYXJzZVhNTCh2aXJEb21haW5YTUxPcHRpb25QdHIgeG1sb3B0LA0KPiAgICAg IHZpck5XRmlsdGVySGFzaFRhYmxlUHRyIGZpbHRlcnBhcmFtcyA9IE5VTEwNCj4gICAgICB2aXJE b21haW5BY3R1YWxOZXREZWZQdHIgYWN0dWFsID0gTlVMTA0KPiAgICAgIHhtbE5vZGVQdHIgb2xk bm9kZSA9IGN0eHQtPm5vZGUNCj4gKyAgICB2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3REZWYg cmVjb25uZWN0ID0gezB9DQo+ICAgICAgaW50IHJ2LCB2YWwNCj4gIA0KPiAgICAgIGlmIChWSVJf QUxMT0MoZGVmKSA8IDApDQo+IEBAIC0xMDMzMSw2ICsxMDMzOSw4IEBAIHZpckRvbWFpbk5ldERl ZlBhcnNlWE1MKHZpckRvbWFpblhNTE9wdGlvblB0ciB4bWxvcHQsDQo+ICAgICAgICAgICAgICAg ICAgdmhvc3R1c2VyX3R5cGUgPSB2aXJYTUxQcm9wU3RyaW5nKGN1ciwgInR5cGUiKQ0KPiAgICAg ICAgICAgICAgICAgIHZob3N0dXNlcl9wYXRoID0gdmlyWE1MUHJvcFN0cmluZyhjdXIsICJwYXRo IikNCj4gICAgICAgICAgICAgICAgICB2aG9zdHVzZXJfbW9kZSA9IHZpclhNTFByb3BTdHJpbmco Y3VyLCAibW9kZSIpDQo+ICsgICAgICAgICAgICAgICAgaWYgKHZpckRvbWFpbkNoclNvdXJjZVJl Y29ubmVjdERlZlBhcnNlWE1MKCZyZWNvbm5lY3QsIGN1ciwgY3R4dCkgPCAwKQ0KPiArICAgICAg ICAgICAgICAgICAgICBnb3RvIGVycm9yDQo+ICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWYt PnZpcnRQb3J0UHJvZmlsZQ0KPiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aXJYTUxOb2Rl TmFtZUVxdWFsKGN1ciwgInZpcnR1YWxwb3J0IikpIHsNCj4gICAgICAgICAgICAgICAgICBpZiAo ZGVmLT50eXBlID09IFZJUl9ET01BSU5fTkVUX1RZUEVfTkVUV09SSykgew0KPiBAQCAtMTA1NTIs OCArMTA1NjIsMTcgQEAgdmlyRG9tYWluTmV0RGVmUGFyc2VYTUwodmlyRG9tYWluWE1MT3B0aW9u UHRyIHhtbG9wdCwNCj4gIA0KPiAgICAgICAgICBpZiAoU1RSRVEodmhvc3R1c2VyX21vZGUsICJz ZXJ2ZXIiKSkgew0KPiAgICAgICAgICAgICAgZGVmLT5kYXRhLnZob3N0dXNlci0+ZGF0YS5uaXgu bGlzdGVuID0gdHJ1ZQ0KPiArICAgICAgICAgICAgaWYgKHJlY29ubmVjdC5lbmFibGVkICE9IFZJ Ul9UUklTVEFURV9CT09MX0FCU0VOVCkgew0KPiArICAgICAgICAgICAgICAgIHZpclJlcG9ydEVy cm9yKFZJUl9FUlJfQ09ORklHX1VOU1VQUE9SVEVELCAiJXMiLA0KPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF8oIidyZWNvbm5lY3QnIGF0dHJpYnV0ZSAgdW5zdXBwb3J0ZWQgIg0K PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidzZXJ2ZXInIG1vZGUgZm9yIDxp bnRlcmZhY2UgdHlwZT0ndmhvc3R1c2VyJz4iKSkNCj4gKyAgICAgICAgICAgICAgICBnb3RvIGVy cm9yDQo+ICsgICAgICAgICAgIH0NCg0KVWdoLiBIYXZpbmcgdGhlIHJlY29ubmVjdCBpbmZvIHN0 b3JlZCBhbGwgdGhlIHdheSBkb3duIGluIGENCmRldmljZS10eXBlLXNwZWNpZmljIHBhcnQgb2Yg dGhlIG9iamVjdCBtYWtlcyBpdCAqcmVhbGx5KiBkaWZmaWN1bHQgdG8NCmRvIHByb3BlciB2YWxp ZGF0aW9uIChlLmcuIGlmIHNvbWVvbmUgYWRkcyBhIDxyZWNvbm5lY3Q+IGVsZW1lbnQgdG8gdGhl DQo8c291cmNlPiBvZiBhIDxob3N0ZGV2PiwgaXQgd2lsbCBiZSBpZ25vcmVkLCB0aGVuIHNpbGVu dGx5IGRpc2FwcGVhciwNCnJhdGhlciB0aGFuIGJlaW5nIHJlcG9ydGVkIGFzIGFuIGVycm9yLiBV bmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgYQ0KZ2VuZXJpYyAic291cmNlIiBzdWItb2JqZWN0 IHRoYXQgaXMgYSBwYXJ0IG9mIGFsbCBkZXZpY2Ugb2JqZWN0cw0KKHNpbWlsYXIgdG8gdGhlIHZp ckRvbWFpbkRldmljZUluZm8gdGhhdCBpcyBhIHBhcnQgb2YgZXZlcnkgZGV2aWNlIG5vDQptYXR0 ZXIgdGhlIHR5cGUpLCBzbyB0aGVyZSBpc24ndCBhIHJlYWwgY2xlYXIgcGxhY2UgdG8gcHV0IGl0 LiBJdCB3b3VsZA0KYmUgbmljZSB0byBiZSBhYmxlIHRvIHByb3Blcmx5IGxvZyBhbiBlcnJvciB3 aGVuIDxyZWNvbm5lY3Q+IGlzIHVzZWQgaW4NCmFuIGluYXBwcm9wcmlhdGUgcGxhY2UsIHRob3Vn aCAoYWRtaXR0ZWRseSwgdGhlcmUgYXJlIGluZmluaXRlIHRoaW5ncw0KdGhhdCBtaWdodCBiZSBh ZGRlZCB0byB0aGUgWE1MIGFuZCBiZSBzaWxlbnRseSBpZ25vcmVkLCBzbyBpdCBtYXkgYmUNCmFw cHJvcHJpYXRlIHRvICJwdW50IiBpbiB0aGlzIGNhc2UgdG9vLikNCg0KDQo+ICAgICAgICAgIH0g ZWxzZSBpZiAoU1RSRVEodmhvc3R1c2VyX21vZGUsICJjbGllbnQiKSkgew0KPiAgICAgICAgICAg ICAgZGVmLT5kYXRhLnZob3N0dXNlci0+ZGF0YS5uaXgubGlzdGVuID0gZmFsc2UNCj4gKyAgICAg ICAgICAgIGRlZi0+ZGF0YS52aG9zdHVzZXItPmRhdGEubml4LnJlY29ubmVjdC5lbmFibGVkID0g cmVjb25uZWN0LmVuYWJsZWQNCj4gKyAgICAgICAgICAgIGRlZi0+ZGF0YS52aG9zdHVzZXItPmRh dGEubml4LnJlY29ubmVjdC50aW1lb3V0ID0gcmVjb25uZWN0LnRpbWVvdXQNCj4gKyAgICAgICAg ICAgIHJlY29ubmVjdC5lbmFibGVkID0gVklSX1RSSVNUQVRFX0JPT0xfQUJTRU5UDQo+ICAgICAg ICAgIH0gZWxzZSB7DQo+ICAgICAgICAgICAgICB2aXJSZXBvcnRFcnJvcihWSVJfRVJSX0NPTkZJ R19VTlNVUFBPUlRFRCwgIiVzIiwNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIldy b25nIDxzb3VyY2U+ICdtb2RlJyBhdHRyaWJ1dGUgIg0KPiBAQCAtMjI5ODQsNiArMjMwMDMsMTMg QEAgdmlyRG9tYWluTmV0RGVmRm9ybWF0KHZpckJ1ZmZlclB0ciBidWYsDQo+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5kYXRhLnZob3N0dXNlci0+ZGF0YS5uaXgubGlz dGVuID8NCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIiAgOiAi Y2xpZW50IikNCj4gICAgICAgICAgICAgICAgICBzb3VyY2VMaW5lcysrDQo+ICsgICAgICAgICAg ICAgICAgaWYgKGRlZi0+ZGF0YS52aG9zdHVzZXItPmRhdGEubml4LnJlY29ubmVjdC5lbmFibGVk ICE9IFZJUl9UUklTVEFURV9CT09MX0FCU0VOVCkgew0KPiArICAgICAgICAgICAgICAgICAgICB2 aXJCdWZmZXJBZGRMaXQoYnVmLCAiPlxuIikNCj4gKyAgICAgICAgICAgICAgICAgICAgc291cmNl TGluZXMrKw0KPiArICAgICAgICAgICAgICAgICAgICB2aXJCdWZmZXJBZGp1c3RJbmRlbnQoYnVm LCAyKQ0KPiArICAgICAgICAgICAgICAgICAgICB2aXJEb21haW5DaHJTb3VyY2VSZWNvbm5lY3RE ZWZGb3JtYXQoYnVmLCAmZGVmLT5kYXRhLnZob3N0dXNlci0+ZGF0YS5uaXgucmVjb25uZWN0KQ0K PiArICAgICAgICAgICAgICAgICAgICB2aXJCdWZmZXJBZGp1c3RJbmRlbnQoYnVmLCAtMikNCj4g KyAgICAgICAgICAgICAgICB9DQo+ICAgICAgICAgICAgICB9DQo+ICAgICAgICAgICAgICBicmVh aw0KPiAgDQo+IGRpZmYgLS1naXQgYS90ZXN0cy9xZW11eG1sMmFyZ3ZkYXRhL3FlbXV4bWwyYXJn di1uZXQtdmhvc3R1c2VyLW11bHRpcS5hcmdzIGIvdGVzdHMvcWVtdXhtbDJhcmd2ZGF0YS9xZW11 eG1sMmFyZ3YtbmV0LXZob3N0dXNlci1tdWx0aXEuYXJncw0KPiBpbmRleCBiNjllYmQ4Li4wYjA4 ZjQ0IDEwMDY0NA0KPiAtLS0gYS90ZXN0cy9xZW11eG1sMmFyZ3ZkYXRhL3FlbXV4bWwyYXJndi1u ZXQtdmhvc3R1c2VyLW11bHRpcS5hcmdzDQo+ICsrKyBiL3Rlc3RzL3FlbXV4bWwyYXJndmRhdGEv cWVtdXhtbDJhcmd2LW5ldC12aG9zdHVzZXItbXVsdGlxLmFyZ3MNCj4gQEAgLTI1LDE0ICsyNSwx NCBAQCBzZXJ2ZXIsbm93YWl0IFwNCj4gIC1uZXRkZXYgdmhvc3QtdXNlcixjaGFyZGV2PWNoYXJu ZXQwLGlkPWhvc3RuZXQwIFwNCj4gIC1kZXZpY2UgdmlydGlvLW5ldC1wY2ksbmV0ZGV2PWhvc3Ru ZXQwLGlkPW5ldDAsbWFjPTUyOjU0OjAwOmVlOjk2OjZiLGJ1cz1wY2kuMCxcDQo+ICBhZGRyPTB4 MyBcDQo+IC0tY2hhcmRldiBzb2NrZXQsaWQ9Y2hhcm5ldDEscGF0aD0vdG1wL3Zob3N0MS5zb2Nr IFwNCj4gKy1jaGFyZGV2IHNvY2tldCxpZD1jaGFybmV0MSxwYXRoPS90bXAvdmhvc3QxLnNvY2ss cmVjb25uZWN0PTEwIFwNCj4gIC1uZXRkZXYgdmhvc3QtdXNlcixjaGFyZGV2PWNoYXJuZXQxLGlk PWhvc3RuZXQxIFwNCj4gIC1kZXZpY2UgdmlydGlvLW5ldC1wY2ksbmV0ZGV2PWhvc3RuZXQxLGlk PW5ldDEsbWFjPTUyOjU0OjAwOmVlOjk2OjZjLGJ1cz1wY2kuMCxcDQo+ICBhZGRyPTB4NCBcDQo+ ICAtbmV0ZGV2IHNvY2tldCxsaXN0ZW49OjIwMTUsaWQ9aG9zdG5ldDIgXA0KPiAgLWRldmljZSBy dGw4MTM5LG5ldGRldj1ob3N0bmV0MixpZD1uZXQyLG1hYz01Mjo1NDowMDo5NTpkYjpjMCxidXM9 cGNpLjAsXA0KPiAgYWRkcj0weDUgXA0KPiAtLWNoYXJkZXYgc29ja2V0LGlkPWNoYXJuZXQzLHBh dGg9L3RtcC92aG9zdDIuc29jayBcDQo+ICstY2hhcmRldiBzb2NrZXQsaWQ9Y2hhcm5ldDMscGF0 aD0vdG1wL3Zob3N0Mi5zb2NrLHJlY29ubmVjdD0wIFwNCj4gIC1uZXRkZXYgdmhvc3QtdXNlcixj aGFyZGV2PWNoYXJuZXQzLHF1ZXVlcz00LGlkPWhvc3RuZXQzIFwNCj4gIC1kZXZpY2UgdmlydGlv LW5ldC1wY2ksbXE9b24sdmVjdG9ycz0xMCxuZXRkZXY9aG9zdG5ldDMsaWQ9bmV0MyxcDQo+ICBt YWM9NTI6NTQ6MDA6ZWU6OTY6NmQsYnVzPXBjaS4wLGFkZHI9MHg2DQo+IGRpZmYgLS1naXQgYS90 ZXN0cy9xZW11eG1sMmFyZ3ZkYXRhL3FlbXV4bWwyYXJndi1uZXQtdmhvc3R1c2VyLW11bHRpcS54 bWwgYi90ZXN0cy9xZW11eG1sMmFyZ3ZkYXRhL3FlbXV4bWwyYXJndi1uZXQtdmhvc3R1c2VyLW11 bHRpcS54bWwNCj4gaW5kZXggZDVjNDJmZS4uMmZhZGIxYyAxMDA2NDQNCj4gLS0tIGEvdGVzdHMv cWVtdXhtbDJhcmd2ZGF0YS9xZW11eG1sMmFyZ3YtbmV0LXZob3N0dXNlci1tdWx0aXEueG1sDQo+ ICsrKyBiL3Rlc3RzL3FlbXV4bWwyYXJndmRhdGEvcWVtdXhtbDJhcmd2LW5ldC12aG9zdHVzZXIt bXVsdGlxLnhtbA0KPiBAQCAtMzAsNyArMzAsOSBAQA0KPiAgICAgIDwvaW50ZXJmYWNlPg0KPiAg ICAgIDxpbnRlcmZhY2UgdHlwZT0ndmhvc3R1c2VyJz4NCj4gICAgICAgIDxtYWMgYWRkcmVzcz0n NTI6NTQ6MDA6ZWU6OTY6NmMnLz4NCj4gLSAgICAgIDxzb3VyY2UgdHlwZT0ndW5peCcgcGF0aD0n L3RtcC92aG9zdDEuc29jaycgbW9kZT0nY2xpZW50Jy8+DQo+ICsgICAgICA8c291cmNlIHR5cGU9 J3VuaXgnIHBhdGg9Jy90bXAvdmhvc3QxLnNvY2snIG1vZGU9J2NsaWVudCc+DQo+ICsgICAgICAg IDxyZWNvbm5lY3QgZW5hYmxlZD0neWVzJyB0aW1lb3V0PScxMCcvPg0KPiArICAgICAgPC9zb3Vy Y2U+DQo+ICAgICAgICA8bW9kZWwgdHlwZT0ndmlydGlvJy8+DQo+ICAgICAgPC9pbnRlcmZhY2U+ DQo+ICAgICAgPGludGVyZmFjZSB0eXBlPSdzZXJ2ZXInPg0KPiBAQCAtNDAsNyArNDIsOSBAQA0K PiAgICAgIDwvaW50ZXJmYWNlPg0KPiAgICAgIDxpbnRlcmZhY2UgdHlwZT0ndmhvc3R1c2VyJz4N Cj4gICAgICAgIDxtYWMgYWRkcmVzcz0nNTI6NTQ6MDA6ZWU6OTY6NmQnLz4NCj4gLSAgICAgIDxz b3VyY2UgdHlwZT0ndW5peCcgcGF0aD0nL3RtcC92aG9zdDIuc29jaycgbW9kZT0nY2xpZW50Jy8+ DQo+ICsgICAgICA8c291cmNlIHR5cGU9J3VuaXgnIHBhdGg9Jy90bXAvdmhvc3QyLnNvY2snIG1v ZGU9J2NsaWVudCc+DQo+ICsgICAgICAgIDxyZWNvbm5lY3QgZW5hYmxlZD0nbm8nLz4NCj4gKyAg ICAgIDwvc291cmNlPg0KPiAgICAgICAgPG1vZGVsIHR5cGU9J3ZpcnRpbycvPg0KPiAgICAgICAg PGRyaXZlciBxdWV1ZXM9JzQnLz4NCj4gICAgICA8L2ludGVyZmFjZT4=
participants (3)
-
Laine Stump
-
lu.zhipeng@zte.com.cn
-
ZhiPeng Lu