[Engine-devel] oVirt Workshop Europe 2012: Call For Participation
by workshop-pc@ovirt.org
=================================================================
oVirt Workshop Europe 2012: Call For Participation
November 7-9, 2012 - Hotel Fira Palace - Barcelona, Spain
(All submissions must be received before midnight Sep 14th, 2012)
=================================================================
The oVirt Project is an open virtualization project for anyone who cares
about Linux-based KVM virtualization. Providing a feature-rich server
virtualization management system with advanced capabilities for hosts
and guests, including high availability, live migration, storage
management, system scheduler, and more. By open we mean open source &
open governance, done right.
During this workshop you’ll learn about the technical background and
direction of the oVirt project. You’ll meet the developers, and have an
opportunity to see and dive into the code right away. The workshop is
open to all who want to use, get involved with, or learn about the
comprehensive open virtualization management platform, oVirt. The
sessions cover the technical projects details, governance, getting
involved, usage, and much more. If you have any interest in an Open
Virtualization Management platform, this workshop is for you!
We are excited to announce that this oVirt Workshop will be held in
conjunction with the KVM Forum.
http://events.linuxfoundation.org/events/kvm-forum/
The KVM Forum and oVirt Workshop are co-located with the Linux
Foundation's 2012 LinuxCon Europe in Barcelona, Spain.
oVirt Workshop attendees will be able to attend KVM Forum sessions and
are eligible to attend LinuxCon Europe for a discounted rate.
http://events.linuxfoundation.org/events/kvm-forum/register
We invite you to lead part of the discussion by submitting a speaking
proposal for oVirt Workshop 2012.
http://events.linuxfoundation.org/cfp
Suggested topics:
- community use case/stories
- roadmaps
- deep dives into features/areas
- deep dives into code/debugging/tuning
- integration and extensions
- components: engine, vdsm, node, sdk/cli, reports, mom, guest agent, etc.
- subjects: network, storage, vm life cycle, scheduling & sla, gluster, etc.
- packaging, installation and distributions
- community infrastructure and services
SUBMISSION REQUIREMENTS
Abstracts due: Sep 14th, 2012
Notification: Sep 28th, 2012
Please submit a short abstract (~150 words) describing your presentation
proposal. In your submission please note how long your talk will take.
Slots vary in length up to 45 minutes. Also include in your proposal
the proposal type -- one of:
- technical talk
- end-user talk
- birds of a feather (BOF) session
Submit your proposal here:
http://events.linuxfoundation.org/cfp
You will receive a notification whether or not your presentation proposal
was accepted by Sep 14th.
END-USER COLLABORATION
One of the big challenges as developers is to know what, where and how
people actually use our software. We will reserve a few slots for end
users talking about their deployment challenges and achievements.
If you are using oVirt in production you are encouraged submit a speaking
proposal. Simply mark it as an end-user collaboration proposal. As an
end user, this is a unique opportunity to get your input to developers.
BOF SESSION
We will reserve some slots in the evening after the main conference
tracks, for birds of a feather (BOF) sessions. These sessions will be
less formal than presentation tracks and targetted for people who would
like to discuss specific issues with other developers and/or users.
If you are interested in getting developers and/or uses together to
discuss a specific problem, please submit a BOF proposal.
LIGHTNING TALKS
In addition to submitted talks we will also have some room for lightning
talks. These are short (5 minute) discussions to highlight new work or
ideas that aren't complete enough to warrant a full presentation slot.
Lightning talk submissions and scheduling will be handled on-site at
oVirt Workshop.
HOTEL / TRAVEL
The oVirt Workshop Europe 2012 will be held in Barcelona, Spain at the
Hotel Fira Palace.
http://events.linuxfoundation.org/events/kvm-forum/hotel
Thank you for your interest in oVirt. We're looking forward to your
submissions and seeing you at the oVirt Workshop Europe 2012 in November!
Thanks,
your oVirt Workshop Europe 2012 Program Commitee
Please contact us with any questions or comments.
workshop-pc(a)ovirt.org
12 years, 3 months
[Engine-devel] Update on UI Plugins: PoC patch revision 4
by Vojtech Szocs
------=_Part_15477537_1702327251.1346339532819
Content-Type: multipart/alternative;
boundary="----=_Part_15477538_89478576.1346339532819"
------=_Part_15477538_89478576.1346339532819
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin'
var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin
// Note: all functions are optional, the plugin only defines functions for events it wants to handle
myPlugin.register({
UiInit: function() {
var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute
myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API
}
});
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet.
* LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page.
* READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization.
* INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [
{ name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } },
{ name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data . The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file) . Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code : you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Let me know what you think guys.
Cheers,
Vojtech
------=_Part_15477538_89478576.1346339532819
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0; }</style></head><body><=
div style=3D'font-family: times new roman,new york,times,serif; font-size: =
12pt; color: #000000'>Hello everyone,<br><br>as a follow-up to my last emai=
l on improving plugin API, here comes the latest revision of UI Plugins pro=
of-of-concept patch (please find it attached).<br><br>This patch is focused=
on improving JavaScript plugin API, along with important changes and impro=
vements made to plugin infrastructure (<em>PluginManager</em>). Let's walk =
through the changes step by step.<br><br><hr style=3D"width: 100%; height: =
2px;"><br><strong>Improved plugin API, taking some inspiration from jQuery<=
/strong><br style=3D"font-weight: bold;"><br>Following is a sample plugin c=
ode that uses new plugin API:<br><br><span style=3D"font-family: courier ne=
w,courier,monaco,monospace,sans-serif;">var myPlugin =3D pluginApi('myPlugi=
n'); // Obtain plugin API instance for 'myPlugin'</span><br style=3D"font-f=
amily: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"fon=
t-family: courier new,courier,monaco,monospace,sans-serif;">var myPluginCon=
fig =3D myPlugin.configObject(); // Obtain plugin-specific configuration</s=
pan><br style=3D"font-family: courier new,courier,monaco,monospace,sans-ser=
if;"><br style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans=
-serif;">// Register event handler functions to be invoked by WebAdmin</spa=
n><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif=
;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;">// Note: all functions are optional, the plugin only defines function=
s for events it wants to handle</span><br style=3D"font-family: courier new=
,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier =
new,courier,monaco,monospace,sans-serif;">myPlugin.register({</span><br sty=
le=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span =
style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&nb=
sp; UiInit: function() {</span><br style=3D"font-family: courier new,courie=
r,monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,cou=
rier,monaco,monospace,sans-serif;"> var testUrl =3D 'http=
://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration h=
as 'foo' attribute</span><br style=3D"font-family: courier new,courier,mona=
co,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,m=
onaco,monospace,sans-serif;"> myPlugin.ui.addMainTab('Cus=
tom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API=
</span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-=
serif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sa=
ns-serif;"> }</span><br style=3D"font-family: courier new,courier,mon=
aco,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,=
monaco,monospace,sans-serif;">});</span><br style=3D"font-family: courier n=
ew,courier,monaco,monospace,sans-serif;"><br style=3D"font-family: courier =
new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: couri=
er new,courier,monaco,monospace,sans-serif;">myPlugin.ready(); // Event han=
dler functions are registered, we are now ready to get initialized (UiInit)=
</span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-=
serif;"><br><hr style=3D"width: 100%; height: 2px;"><br><span style=3D"font=
-weight: bold;">UI plugin life-cycle, enforced by plugin infrastructure</sp=
an><br style=3D"font-weight: bold;"><br>The <span style=3D"font-style: ital=
ic;">PluginState</span> enumeration lists possible states of a plugin durin=
g its runtime:<br><ul><li><span style=3D"font-weight: bold;">DEFINED</span>=
: This is the initial state for all plugins. Plugin meta-data has been read=
by <span style=3D"font-style: italic;">PluginManager</span> and the corres=
ponding iframe element has been created for the plugin. Note that at this p=
oint, the iframe element is not attached to DOM yet.<br><br></li><li><span =
style=3D"font-weight: bold;">LOADING</span>: The iframe element for the plu=
gin has been attached to DOM, which causes <u>plugin host page</u> (previou=
sly known as plugin source page) to be fetched asynchronously in the backgr=
ound. We are now waiting for plugin to report in as ready. In practice, due=
to JavaScript runtime being single-threaded, WebAdmin startup logic will c=
ontinue to execute until the JavaScript runtime is "idle" (browser event lo=
op returns), and at this point JavaScript plugin code gets invoked through =
the plugin host page.<br><br></li><li><span style=3D"font-weight: bold;">RE=
ADY</span>: The plugin has indicated that it is ready for use. We assume th=
e plugin has already registered its event handler object (object containing=
various event handler functions to be called by WebAdmin) at this point. W=
e can now proceed with plugin initialization.<br><br></li><li><span style=
=3D"font-weight: bold;">INITIALIZED</span>: The plugin has been initialized=
by calling <span style=3D"font-style: italic;">UiInit</span> function on i=
ts event handler object. We can now call other event handler functions, the=
plugin is now initialized and in use.</li></ul><p><span style=3D"font-styl=
e: italic; text-decoration: underline;">Note on plugin initialization:</spa=
n> the <span style=3D"font-style: italic;">UiInit</span> function will be c=
alled just once during the lifetime of the plugin, after the plugin reports=
in as ready AND WebAdmin enters the state that allows plugins to be invoke=
d (entering main section for logged-in users), and before other event handl=
er functions are invoked by the plugin infrastructure.</p><p><br></p><hr st=
yle=3D"width: 100%; height: 2px;"><br><p style=3D"font-weight: bold;">Plugi=
n meta-data is now passed to client using different format</p><p><br></p><p=
>Previously, plugin meta-data was embedded into WebAdmin host page as a sim=
ple JavaScript object, like so:</p><p><br></p><p style=3D"font-family: cour=
ier new,courier,monaco,monospace,sans-serif;">var pluginDefinitions =3D { m=
yPlugin: "<URL>", anotherPlugin: "<URL>" }<br></p><p><br></p><p=
>Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript =
array, like so:<br></p><p><br></p><p style=3D"font-family: courier new,cour=
ier,monaco,monospace,sans-serif;">var pluginDefinitions =3D [</p><p style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"> {=
name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever=
" } },</p><p style=3D"font-family: courier new,courier,monaco,monospace,san=
s-serif;"> { name: "anotherPlugin", url: "<URL>" }<br></p><p st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">];</p=
><p><br></p><p>As you can see, <span style=3D"font-style: italic;">pluginDe=
finitions</span> is now an array of JavaScript objects, with each object re=
presenting plugin meta-data. The "name" and "url" attributes are mandatory =
(we need to check them when loading plugin descriptors). "config" is the pl=
ugin configuration (JSON) object, obtained by merging default plugin config=
uration (defined in plugin descriptor) with custom plugin configuration (de=
fined in external plugin configuration file). Note that the "config" attrib=
ute is optional.<br></p><p><br></p><p>In terms of Java classes, <span style=
=3D"font-style: italic;">pluginDefinitions</span> is mapped to <span style=
=3D"font-style: italic;">PluginDefinitions</span> overlay type, and each me=
ta-data object within the array is mapped to <span style=3D"font-style: ita=
lic;">PluginMetaData</span> overlay type.<br></p><p><br></p><hr style=3D"wi=
dth: 100%; height: 2px;"><br><p><span style=3D"font-style: italic; text-dec=
oration: underline;">Note on using assert statements in client code:</span>=
you might notice that I'm using a lot of assert statements in <span style=
=3D"font-style: italic;">Plugin</span> class. This is to ensure consistency=
and guard against corrupted state during development. In GWT, assert state=
ments work in a different way than in standard Java VM. When debugging GWT =
application using Development Mode, assert statements are checked and throw=
assertion errors during runtime (they are displayed in Development Mode co=
nsole). However, when compiling GWT application to JavaScript (Production M=
ode), assert statements are removed by GWT compiler, so they don't affect t=
he application running in Production Mode.<br></p><p><br></p><p>Let me know=
what you think guys.<br></p><p><br></p><p>Cheers,</p><p>Vojtech</p><p><br>=
</p><p></p></div></body></html>
------=_Part_15477538_89478576.1346339532819--
------=_Part_15477537_1702327251.1346339532819
Content-Type: text/x-patch; name=WIP-UI-Plugins-PoC-revision-4.patch
Content-Disposition: attachment; filename=WIP-UI-Plugins-PoC-revision-4.patch
Content-Transfer-Encoding: base64
RnJvbSBlYjQ3NzlkYTZjODUxMmIwNjA3Mzk5ZTg4MzAwMWQxYmUwMzA1OGI4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0
ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog
VUkgUGx1Z2lucyBQb0MsIHJldmlzaW9uIDQKCkNoYW5nZS1JZDogSWJiZjc2NTlmMDIzZDg5Mjlm
YjBhODMwMzA2MTg1MWJiN2VlNTU1YmMKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6
b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2Vy
dmxldC5qYXZhICAgICAgfCAgICAxICsKIC4uLi9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VT
ZXJ2bGV0LmphdmEgICAgICAgIHwgIDEwNiArKysrKysrCiAuLi4vc2VydmVyL2d3dC9XZWJhZG1p
bkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhICB8ICAgIDggKy0KIC4uLi9lbmdpbmUvdWkvd2Vi
YWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5qYXZhICAgIHwgICAgMiArLQogLi4uL292aXJ0L2Vu
Z2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgfCAgIDMwICsrCiAuLi4vb3Zp
cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSAgICB8ICAgNjcgKysrKysK
IC4uLi91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2YSAgICAgIHwgICAy
NCArKwogLi4uL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIuamF2YSAgICAg
fCAgIDE5ICsrCiAuLi4vZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NYW5hZ2VyLmph
dmEgICB8ICAyOTEgKysrKysrKysrKysrKysrKysrKysKIC4uLi9lbmdpbmUvdWkvd2ViYWRtaW4v
cGx1Z2luL1BsdWdpbk1ldGFEYXRhLmphdmEgIHwgICAzNiArKysKIC4uLi9lbmdpbmUvdWkvd2Vi
YWRtaW4vcGx1Z2luL1BsdWdpblN0YXRlLmphdmEgICAgIHwgICAzMyArKysKIC4uLi91aS93ZWJh
ZG1pbi9wbHVnaW4vUGx1Z2luVWlGdW5jdGlvbnMuamF2YSAgICAgIHwgICAyNiArKwogLi4uL21h
aW4vcHJlc2VudGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEgICAgICAgfCAgIDE3ICstCiAu
Li4vbWFpbi9wcmVzZW50ZXIvTWFpblRhYlBhbmVsUHJlc2VudGVyLmphdmEgICAgICB8ICAgMTAg
KwogLi4uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEgfCAg
IDQzICsrKwogLi4uL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIuamF2YSAgICAg
ICAgfCAgIDQ3ICsrKysKIC4uLi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5
LmphdmEgICAgIHwgICA0NSArKysKIC4uLi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0b21Qcm94
eUZhY3RvcnkuamF2YSAgIHwgICAzNCArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90YWIvTWFp
blRhYkN1c3RvbVZpZXcuamF2YSAgIHwgICAzMiArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90
YWIvTWFpblRhYkN1c3RvbVZpZXcudWkueG1sIHwgICAxMCArCiAuLi4vd2ViYWRtaW4vc3JjL21h
aW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCAgICAgICB8ICAgMTAgKwogMjEgZmlsZXMgY2hhbmdl
ZCwgODg3IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg
ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmly
dC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5q
YXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p
bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1BsdWdpbk1v
ZHVsZS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93
ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2lu
L1BsdWdpbi5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1
Z2luL1BsdWdpbkRlZmluaXRpb25zLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRXZlbnRIYW5kbGVyLmphdmEKIGNyZWF0ZSBtb2RlIDEw
MDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3Jn
L292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWFuYWdlci5qYXZhCiBjcmVh
dGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp
bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1ldGFEYXRh
LmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFk
bWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1
Z2luU3RhdGUuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVs
ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs
dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQv
d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv
dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNl
bnRlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93
ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv
bi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmphdmEK
IGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny
Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJl
c2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZy
b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0
b21Qcm94eUZhY3RvcnkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk
bWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy5qYXZhCiBjcmVhdGUg
bW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q
YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01h
aW5UYWJDdXN0b21WaWV3LnVpLnhtbAoKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v
ZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5k
L3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv
ZnJvbnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKaW5kZXgg
ZjE5NzM5YS4uNjg1ZTY4NSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9m
cm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVy
L2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv
bnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKQEAgLTQ2LDYg
KzQ2LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEd3dER5bmFtaWNIb3N0UGFnZVNlcnZsZXQg
ZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZs
ZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJ
T0V4Y2VwdGlvbiB7CiAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdy
aXRlcigpOwogICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFy
c2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJD
YWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAog
CiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPiIpOyAv
LyROT04tTkxTLTEkCiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjxtZXRhIGh0dHAtZXF1aXY9XCJj
b250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+Iik7IC8v
JE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRl
bmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3Qv
UGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
ZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZl
ci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4xNTlmYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv
bnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEs
MTA2IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dDsK
KworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJl
ZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRT
dHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0
U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0
IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRp
bC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0
Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0
UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsK
KworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBh
Y2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFJlbmRlcnMgdGhlIEhU
TUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFz
cyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHBy
aXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHJp
dmF0ZSBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBsdWdpblNvdXJjZVBh
Z2VTZXJ2bGV0LmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRv
R2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3Bv
bnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWFkIHBsdWdpbiBuYW1lIGFz
IEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgICAgU3RyaW5nIHBsdWdpbk5hbWUgPSByZXF1
ZXN0LmdldFBhcmFtZXRlcigicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgaWYgKHBs
dWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNaXNzaW5nIHBs
dWdpbiBuYW1lIHJlcXVlc3QgcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAg
IHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvY2F0ZSBwbHVn
aW4gY29kZSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAvLyBUT0RPIGhhcmQtY29kZWQg
cGx1Z2luIGxvY2F0aW9uCisgICAgICAgIEZpbGUgcGx1Z2luQ29kZUxvY2F0aW9uID0gbmV3IEZp
bGUoIi9ob21lL3Zzem9jcy9Eb3dubG9hZHMiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBGaWxl
IHBsdWdpbkNvZGVGaWxlID0gbmV3IEZpbGUocGx1Z2luQ29kZUxvY2F0aW9uLCBwbHVnaW5OYW1l
ICsgIi5qcyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGlmICghcGx1Z2luQ29kZUZpbGUuaXNG
aWxlKCkgfHwgIXBsdWdpbkNvZGVGaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgbG9nZ2Vy
LmVycm9yKCJDYW5ub3QgcmVhZCBwbHVnaW4gY29kZTogIiArIHBsdWdpbkNvZGVGaWxlLmdldEFi
c29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVy
cm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gc2ltdWxhdGUgcGx1Z2luIGRlcGVuZGVu
Y2llcworICAgICAgICBMaXN0PFN0cmluZz4gcGx1Z2luRGVwZW5kZW5jeUxpc3QgPQorICAgICAg
ICAgICAgICAgIEFycmF5cy5hc0xpc3QoImh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4
L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5taW4uanMiKTsgLy8kTk9OLU5MUy0xJAorCisgICAg
ICAgIC8vIFJlbmRlciBIVE1MIHNvdXJjZSBwYWdlIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgcmVz
cG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOyAvLyROT04t
TkxTLTEkCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1j
YWNoZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICBSZWFkZXIgaW4g
PSBudWxsOworICAgICAgICBXcml0ZXIgb3V0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAg
ICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5l
dyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luQ29kZUZpbGUpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt
MSQKKyAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFt
V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt
MSQKKworICAgICAgICAgICAgcmVuZGVyUGx1Z2luU291cmNlUGFnZShpbiwgcGx1Z2luRGVwZW5k
ZW5jeUxpc3QsIG91dCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBmaW5h
bGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW4u
Y2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVu
ZGVyUGx1Z2luU291cmNlUGFnZShSZWFkZXIgcGx1Z2luQ29kZUlucHV0LCBMaXN0PFN0cmluZz4g
cGx1Z2luRGVwZW5kZW5jeUxpc3QsIFdyaXRlciBvdXRwdXQpCisgICAgICAgICAgICB0aHJvd3Mg
SU9FeGNlcHRpb24geworICAgICAgICBvdXRwdXQud3JpdGUoIjwhRE9DVFlQRSBodG1sPjxodG1s
PjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPG1ldGEgaHR0
cC1lcXVpdj1cImNvbnRlbnQtdHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRG
LThcIj4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGZvciAoU3RyaW5nIGRlcGVuZGVuY3kg
OiBwbHVnaW5EZXBlbmRlbmN5TGlzdCkgeworICAgICAgICAgICAgb3V0cHV0LndyaXRlKCI8c2Ny
aXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCIiKTsgLy8kTk9OLU5MUy0xJAorICAg
ICAgICAgICAgb3V0cHV0LndyaXRlKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgb3V0cHV0Lndy
aXRlKCJcIj48L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisKKyAgICAgICAg
b3V0cHV0LndyaXRlKCI8L2hlYWQ+PGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgb3V0
cHV0LndyaXRlKCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsgLy8kTk9OLU5M
Uy0xJAorICAgICAgICBvdXRwdXQud3JpdGUoIihmdW5jdGlvbiggcGx1Z2luQXBpICkgeyIpOyAv
LyROT04tTkxTLTEkCisKKyAgICAgICAgY29weUNoYXJzKHBsdWdpbkNvZGVJbnB1dCwgb3V0cHV0
KTsKKworICAgICAgICBvdXRwdXQud3JpdGUoIn0pICggcGFyZW50LnBsdWdpbkFwaSApOyIpOyAv
LyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPC9zY3JpcHQ+Iik7IC8vJE5PTi1O
TFMtMSQKKyAgICAgICAgb3V0cHV0LndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOyAvLyROT04tTkxT
LTEkCisgICAgfQorCisgICAgdm9pZCBjb3B5Q2hhcnMoUmVhZGVyIGluLCBXcml0ZXIgb3V0KSB0
aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbNCAq
IDEwMjRdOyAvLyBVc2UgNCBrQiBidWZmZXIKKyAgICAgICAgaW50IG51bVJlYWQgPSAwOworCisg
ICAgICAgIHdoaWxlICgobnVtUmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3Ro
KSkgPiAwKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBudW1SZWFkKTsKKyAg
ICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2Vy
dmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv
ZnJvbnRlbmQvc2VydmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCmlu
ZGV4IDQyOGRjYzUuLjY4M2NiNjggMTAwNjQ0Ci0tLSBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs
ZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3Nl
cnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YQorKysgYi9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu
ZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hvc3RpbmdTZXJ2bGV0Lmph
dmEKQEAgLTMwLDE4ICszMCwyMiBAQCBwdWJsaWMgY2xhc3MgV2ViYWRtaW5EeW5hbWljSG9zdGlu
Z1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0IHsKICAgICAgICAgc3Vw
ZXIud3JpdGVBZGRpdGlvbmFsSnNEYXRhKHJlcXVlc3QsIHdyaXRlcik7CiAKICAgICAgICAgSW50
ZWdlciBhcHBsaWNhdGlvbk1vZGUgPSBnZXRBcHBsaWNhdGlvbk1vZGUocmVxdWVzdCk7Ci0KICAg
ICAgICAgaWYgKGFwcGxpY2F0aW9uTW9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBNYXA8U3Ry
aW5nLCBTdHJpbmc+IGFwcE1vZGVEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7
CiAgICAgICAgICAgICBhcHBNb2RlRGF0YS5wdXQoInZhbHVlIiwgU3RyaW5nLnZhbHVlT2YoYXBw
bGljYXRpb25Nb2RlKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIHdyaXRlSnNPYmplY3Qo
d3JpdGVyLCAiYXBwbGljYXRpb25Nb2RlIiwgYXBwTW9kZURhdGEpOyAvLyROT04tTkxTLTEkCiAg
ICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHBsdWdpbkRlZmluaXRpb25zID0gbmV3
IFN0cmluZ0J1aWxkZXIoIiB2YXIgcGx1Z2luRGVmaW5pdGlvbnMgPSBbICIpOyAvLyROT04tTkxT
LTEkCisgICAgICAgIHBsdWdpbkRlZmluaXRpb25zLmFwcGVuZCgieyBuYW1lOiBcIm15UGx1Z2lu
XCIsIHVybDogXCIvd2ViYWRtaW4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFnZT9wbHVnaW49bXlQ
bHVnaW5cIiwgY29uZmlnOiB7IFwiZm9vXCI6IDEgfSB9Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAg
ICAgcGx1Z2luRGVmaW5pdGlvbnMuYXBwZW5kKCIgXTsgIik7IC8vJE5PTi1OTFMtMSQKKyAgICAg
ICAgd3JpdGVyLmFwcGVuZChwbHVnaW5EZWZpbml0aW9ucy50b1N0cmluZygpKTsKICAgICB9CiAK
ICAgICBwcml2YXRlIEludGVnZXIgZ2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVz
dCByZXF1ZXN0KSB7CiAgICAgICAgIHJldHVybiAoSW50ZWdlcikgcnVuUHVibGljUXVlcnkoVmRj
UXVlcnlUeXBlLkdldENvbmZpZ3VyYXRpb25WYWx1ZSwKICAgICAgICAgICAgICAgICBuZXcgR2V0
Q29uZmlndXJhdGlvblZhbHVlUGFyYW1ldGVycyhDb25maWd1cmF0aW9uVmFsdWVzLkFwcGxpY2F0
aW9uTW9kZSwKLSAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENvbmZpZ3VyYXRpb25WZXJz
aW9uKSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENv
bmZpZ3VyYXRpb25WZXJzaW9uKSwgcmVxdWVzdCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0
L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEgYi9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEKaW5kZXggZDI3MmMyYi4uYmFiZGRm
MSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp
bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5q
YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9DbGllbnRHaW5qZWN0b3IuamF2YQpA
QCAtOSw3ICs5LDcgQEAgaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LmFubm90YXRp
b25zLkRlZmF1bHRHYXRla2VlcGVyOwogLyoqCiAgKiBDbGllbnQtc2lkZSBpbmplY3RvciBjb25m
aWd1cmF0aW9uIHVzZWQgdG8gYm9vdHN0cmFwIEdJTi4KICAqLwotQEdpbk1vZHVsZXMoeyBTeXN0
ZW1Nb2R1bGUuY2xhc3MsIFByZXNlbnRlck1vZHVsZS5jbGFzcywgVWlDb21tb25Nb2R1bGUuY2xh
c3MgfSkKK0BHaW5Nb2R1bGVzKHsgU3lzdGVtTW9kdWxlLmNsYXNzLCBQcmVzZW50ZXJNb2R1bGUu
Y2xhc3MsIFVpQ29tbW9uTW9kdWxlLmNsYXNzLCBQbHVnaW5Nb2R1bGUuY2xhc3MgfSkKIHB1Ymxp
YyBpbnRlcmZhY2UgQ2xpZW50R2luamVjdG9yIGV4dGVuZHMgQmFzZUNsaWVudEdpbmplY3Rvciwg
TWFuYWdlZENvbXBvbmVudHMgewogCiAgICAgQERlZmF1bHRHYXRla2VlcGVyCmRpZmYgLS1naXQg
YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292
aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgYi9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMzU4NDRjMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk
bWluL2dpbi9QbHVnaW5Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5v
dmlydC5lbmdpbmUudWkud2ViYWRtaW4uZ2luOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51
aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5vdmlydC5l
bmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0
LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luVWlGdW5jdGlvbnM7CitpbXBvcnQgb3Jn
Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLnRhYi5NYWlu
VGFiQ3VzdG9tUHJlc2VudGVyOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4u
c2VjdGlvbi5tYWluLnByZXNlbnRlci50YWIuTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsKK2lt
cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRhYi5N
YWluVGFiQ3VzdG9tVmlldzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmluamVjdC5jbGllbnQu
QWJzdHJhY3RHaW5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwor
CisvKioKKyAqIEdJTiBtb2R1bGUgY29udGFpbmluZyBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFz
dHJ1Y3R1cmUgYmluZGluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Nb2R1bGUgZXh0ZW5k
cyBBYnN0cmFjdEdpbk1vZHVsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9p
ZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoUGx1Z2luTWFuYWdlci5jbGFzcykuYXNFYWdl
clNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpbkV2ZW50SGFuZGxlci5jbGFzcykuYXNF
YWdlclNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpblVpRnVuY3Rpb25zLmNsYXNzKS5p
bihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIC8vIEJpbmQgTWFpblRhYkN1c3RvbVZpZXcg
dG8gaXRzIHZpZXcgaW50ZXJmYWNlIGFzIG5vbi1zaW5nbGV0b24sIHdpdGhvdXQgcHJlc2VudGVy
IGJpbmRpbmcKKyAgICAgICAgLy8gKE1haW5UYWJDdXN0b21QcmVzZW50ZXIgaXMgY3JlYXRlZCBt
YW51YWxseSBkdXJpbmcgcnVudGltZSBieSBNYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIp
CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVmLmNsYXNzKS50byhN
YWluVGFiQ3VzdG9tVmlldy5jbGFzcyk7CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByb3h5
RmFjdG9yeS5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdp
dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv
b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSBiL2Zyb250ZW5kL3dl
YmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Vp
L3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi41NjI0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k
dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v
cGx1Z2luL1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVu
Z2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNs
aWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQu
SUZyYW1lRWxlbWVudDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgVUkgcGx1Z2luLCBjb250YWlu
aW5nIG1ldGEtZGF0YSBhcyB3ZWxsIGFzIHJ1bnRpbWUgc3RhdGUuCisgKi8KK3B1YmxpYyBjbGFz
cyBQbHVnaW4geworCisgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NZXRhRGF0YSBtZXRhRGF0YTsK
KyAgICBwcml2YXRlIFBsdWdpblN0YXRlIHN0YXRlOworCisgICAgLy8gVGhlIGlmcmFtZSBlbGVt
ZW50IHVzZWQgdG8gbG9hZCB0aGUgcGx1Z2luIGhvc3QgcGFnZQorICAgIHByaXZhdGUgZmluYWwg
SUZyYW1lRWxlbWVudCBpZnJhbWU7CisKKyAgICAvLyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcGx1
Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zCisgICAgcHJpdmF0ZSBKYXZhU2NyaXB0T2JqZWN0
IGV2ZW50SGFuZGxlck9iamVjdDsKKworICAgIHB1YmxpYyBQbHVnaW4oUGx1Z2luTWV0YURhdGEg
bWV0YURhdGEsIElGcmFtZUVsZW1lbnQgaWZyYW1lKSB7CisgICAgICAgIGFzc2VydCBtZXRhRGF0
YSAhPSBudWxsIDogIlBsdWdpbiBtZXRhLWRhdGEgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxT
LTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUgIT0gbnVsbCA6ICJQbHVnaW4gaWZyYW1lIGVsZW1l
bnQgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxTLTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUu
Z2V0UGFyZW50RWxlbWVudCgpID09IG51bGwgOiAiUGx1Z2luIGlmcmFtZSBlbGVtZW50IG11c3Qg
YmUgZGV0YWNoZWQgZnJvbSBET00iOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRoaXMubWV0YURh
dGEgPSBtZXRhRGF0YTsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IFBsdWdpblN0YXRlLkRFRklORUQ7
CisgICAgICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQbHVn
aW5NZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFEYXRhOworICAg
IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0ZShQbHVnaW5TdGF0ZSBzdGF0ZSkgewor
ICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBzdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMg
dm9pZCBtYXJrQXNMb2FkaW5nKCkgeworICAgICAgICBhc3NlcnQgc3RhdGUgPT0gUGx1Z2luU3Rh
dGUuREVGSU5FRCA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEk
CisgICAgICAgIGFzc2VydCBpZnJhbWUuZ2V0UGFyZW50RWxlbWVudCgpICE9IG51bGwgOiAiUGx1
Z2luIGlmcmFtZSBlbGVtZW50IG11c3QgYmUgYXR0YWNoZWQgdG8gRE9NIjsgLy8kTk9OLU5MUy0x
JAorICAgICAgICBzdGF0ZSA9IFBsdWdpblN0YXRlLkxPQURJTkc7CisgICAgfQorCisgICAgcHVi
bGljIHZvaWQgbWFya0FzUmVhZHkoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5T
dGF0ZS5MT0FESU5HIDogIlVuZXhwZWN0ZWQgc3RhdGUgdHJhbnNpdGlvbiI7IC8vJE5PTi1OTFMt
MSQKKyAgICAgICAgYXNzZXJ0IGV2ZW50SGFuZGxlck9iamVjdCAhPSBudWxsIDogIkV2ZW50IGhh
bmRsZXIgb2JqZWN0IG11c3QgYmUgYXNzaWduZWQiOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN0
YXRlID0gUGx1Z2luU3RhdGUuUkVBRFk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFya0Fz
SW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5TdGF0ZS5SRUFE
WSA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEkCisgICAgICAg
IHN0YXRlID0gUGx1Z2luU3RhdGUuSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgcHVibGljIElG
cmFtZUVsZW1lbnQgZ2V0SUZyYW1lRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGlmcmFtZTsK
KyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVNjcmlwdE9iamVjdCBnZXRFdmVudEhhbmRsZXJPYmpl
Y3QoKSB7CisgICAgICAgIHJldHVybiBldmVudEhhbmRsZXJPYmplY3Q7CisgICAgfQorCisgICAg
cHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyT2JqZWN0KEphdmFTY3JpcHRPYmplY3QgZXZlbnRI
YW5kbGVyT2JqZWN0KSB7CisgICAgICAgIGFzc2VydCBldmVudEhhbmRsZXJPYmplY3QgIT0gbnVs
bCA6ICJFdmVudCBoYW5kbGVyIG9iamVjdCBjYW5ub3QgYmUgbnVsbCI7IC8vJE5PTi1OTFMtMSQK
KyAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJPYmplY3QgPSBldmVudEhhbmRsZXJPYmplY3Q7Cisg
ICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWlu
L3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2lu
RGVmaW5pdGlvbnMuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3Jj
L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZp
bml0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzhkOTgK
LS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny
Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVm
aW5pdGlvbnMuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUu
dWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQu
SmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0Fy
cmF5OworCisvKioKKyAqIE92ZXJsYXkgdHlwZSBmb3Ige0Bjb2RlIHBsdWdpbkRlZmluaXRpb25z
fSBnbG9iYWwgSlMgb2JqZWN0LgorICogPHA+CisgKiBTZXJ2ZXMgYXMge0BsaW5rIFBsdWdpbk1l
dGFEYXRhfSBhZ2dyZWdhdGUgb2JqZWN0ICh1c2luZyBuYXRpdmUgYXJyYXkgcmVwcmVzZW50YXRp
b24pLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luRGVmaW5pdGlvbnMgZXh0ZW5kcyBK
YXZhU2NyaXB0T2JqZWN0IHsKKworICAgIHByb3RlY3RlZCBQbHVnaW5EZWZpbml0aW9ucygpIHsK
KyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBQbHVnaW5EZWZpbml0aW9ucyBpbnN0
YW5jZSgpIC8qLXsKKyAgICAgICAgcmV0dXJuICR3bmQucGx1Z2luRGVmaW5pdGlvbnM7CisgICAg
fS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgSnNBcnJheTxQbHVnaW5NZXRhRGF0YT4gZ2V0TWV0
YURhdGFBcnJheSgpICAvKi17CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0tKi87CisKK30K
ZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v
amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRs
ZXIuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIu
amF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVmYzc1Ci0tLSAvZGV2
L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q
YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxl
ci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh
ZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRC
dXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEhhbmRsZXMg
V2ViQWRtaW4gYXBwbGljYXRpb24gZXZlbnRzIChleHRlbnNpb24gcG9pbnRzKSB0byBiZSBjb25z
dW1lZCBieSBVSSBwbHVnaW5zLgorICogPHA+CisgKiBTaG91bGQgYmUgYm91bmQgYXMgR0lOIGVh
Z2VyIHNpbmdsZXRvbiwgY3JlYXRlZCBlYXJseSBvbiBkdXJpbmcgYXBwbGljYXRpb24gc3RhcnR1
cC4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkV2ZW50SGFuZGxlciB7CisKKyAgICBASW5qZWN0
CisgICAgcHVibGljIFBsdWdpbkV2ZW50SGFuZGxlcihFdmVudEJ1cyBldmVudEJ1cywgUGx1Z2lu
TWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIC8vIFRPRE8gY2FsbCBFdmVudEJ1cy5hZGRIYW5k
bGVyIGZvciBlYWNoIGV4dGVuc2lvbiBwb2ludCAoZXZlbnQpLAorICAgICAgICAvLyB3aXRoIHRo
ZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIHVzaW5nIFBsdWdpbk1hbmFnZXIgdG8gY2FsbCBwbHVn
aW5zCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dl
YmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4v
UGx1Z2luTWFuYWdlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9z
cmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1h
bmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIzZTM0Ci0t
LSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv
bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1hbmFn
ZXIuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndl
YmFkbWluLnBsdWdpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGph
dmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGls
LmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2
YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5
OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRG9jdW1lbnQ7CitpbXBvcnQgY29t
Lmdvb2dsZS5nd3QuZG9tLmNsaWVudC5JRnJhbWVFbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUu
Z3d0LmRvbS5jbGllbnQuU3R5bGUuQm9yZGVyU3R5bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu
ZG9tLmNsaWVudC5TdHlsZS5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xp
ZW50LlN0eWxlLlVuaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioK
KyAqIFRoZSBtYWluIGNvbXBvbmVudCBvZiBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1
cmUuCisgKiA8cD4KKyAqIFNob3VsZCBiZSBib3VuZCBhcyBHSU4gZWFnZXIgc2luZ2xldG9uLCBj
cmVhdGVkIGVhcmx5IG9uIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLgorICovCitwdWJsaWMg
Y2xhc3MgUGx1Z2luTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIg
bG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQbHVnaW5NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7
CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1lcyB0byBjb3JyZXNwb25kaW5nIG9iamVjdCByZXBy
ZXNlbnRhdGlvbnMKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBsdWdpbj4gcGx1Z2lu
cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luPigpOworCisgICAgLy8gQ29udHJvbHMgcGx1
Z2luIGludm9jYXRpb24sIGFsbG93aW5nIFdlYkFkbWluIHRvIGNhbGwgcGx1Z2lucyBvbmx5IGlu
IGEgc3BlY2lmaWMgY29udGV4dAorICAgIHByaXZhdGUgYm9vbGVhbiBjYW5JbnZva2VQbHVnaW5z
ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFBsdWdpblVpRnVuY3Rpb25zIHVpRnVuY3Rp
b25zOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5NYW5hZ2VyKFBsdWdpblVpRnVu
Y3Rpb25zIHVpRnVuY3Rpb25zKSB7CisgICAgICAgIHRoaXMudWlGdW5jdGlvbnMgPSB1aUZ1bmN0
aW9uczsKKyAgICAgICAgZXhwb3NlUGx1Z2luQXBpKCk7CisgICAgICAgIGRlZmluZUFuZExvYWRQ
bHVnaW5zKCk7CisgICAgfQorCisgICAgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luTmFt
ZSkgeworICAgICAgICByZXR1cm4gcGx1Z2lucy5nZXQocGx1Z2luTmFtZSk7CisgICAgfQorCisg
ICAgQ29sbGVjdGlvbjxQbHVnaW4+IGdldFBsdWdpbnMoKSB7CisgICAgICAgIHJldHVybiBwbHVn
aW5zLnZhbHVlcygpOworICAgIH0KKworICAgIHZvaWQgYWRkUGx1Z2luKFN0cmluZyBwbHVnaW5O
YW1lLCBQbHVnaW4gcGx1Z2luKSB7CisgICAgICAgIHBsdWdpbnMucHV0KHBsdWdpbk5hbWUsIHBs
dWdpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyBhbGwgcGx1Z2lucyB0aGF0
IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3QgcGFnZSBhbmQgbG9hZHMg
dGhlbSBhcyBuZWNlc3NhcnkuCisgICAgICovCisgICAgdm9pZCBkZWZpbmVBbmRMb2FkUGx1Z2lu
cygpIHsKKyAgICAgICAgUGx1Z2luRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBQbHVnaW5EZWZp
bml0aW9ucy5pbnN0YW5jZSgpOworCisgICAgICAgIGlmIChkZWZpbml0aW9ucyAhPSBudWxsKSB7
CisgICAgICAgICAgICBKc0FycmF5PFBsdWdpbk1ldGFEYXRhPiBtZXRhRGF0YUFycmF5ID0gZGVm
aW5pdGlvbnMuZ2V0TWV0YURhdGFBcnJheSgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IG1ldGFEYXRhQXJyYXkubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFBs
dWdpbk1ldGFEYXRhIHBsdWdpbk1ldGFEYXRhID0gbWV0YURhdGFBcnJheS5nZXQoaSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAocGx1Z2luTWV0YURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAg
ICAgICAgICBkZWZpbmVBbmRMb2FkUGx1Z2luKHBsdWdpbk1ldGFEYXRhKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAg
KiBEZWZpbmVzIGEgcGx1Z2luIGZyb20gdGhlIGdpdmVuIG1ldGEtZGF0YSBhbmQgbG9hZHMgaXQg
YXMgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHZvaWQgZGVmaW5lQW5kTG9hZFBsdWdpbihQbHVn
aW5NZXRhRGF0YSBwbHVnaW5NZXRhRGF0YSkgeworICAgICAgICBTdHJpbmcgcGx1Z2luTmFtZSA9
IHBsdWdpbk1ldGFEYXRhLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBsdWdpbkhvc3RQYWdl
VXJsID0gcGx1Z2luTWV0YURhdGEuZ2V0SG9zdFBhZ2VVcmwoKTsKKworICAgICAgICBpZiAoZ2V0
UGx1Z2luKHBsdWdpbk5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5n
KCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCIpOyAvLyROT04t
TkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIENyZWF0ZSBhbiBpZnJhbWUgZWxlbWVudCB1c2VkIHRvIGxvYWQgdGhlIHBsdWdp
biBob3N0IHBhZ2UKKyAgICAgICAgSUZyYW1lRWxlbWVudCBpZnJhbWUgPSBEb2N1bWVudC5nZXQo
KS5jcmVhdGVJRnJhbWVFbGVtZW50KCk7CisgICAgICAgIGlmcmFtZS5zZXRTcmMocGx1Z2luSG9z
dFBhZ2VVcmwpOworICAgICAgICBpZnJhbWUuc2V0RnJhbWVCb3JkZXIoMCk7CisgICAgICAgIGlm
cmFtZS5nZXRTdHlsZSgpLnNldFBvc2l0aW9uKFBvc2l0aW9uLkFCU09MVVRFKTsKKyAgICAgICAg
aWZyYW1lLmdldFN0eWxlKCkuc2V0V2lkdGgoMCwgVW5pdC5QVCk7CisgICAgICAgIGlmcmFtZS5n
ZXRTdHlsZSgpLnNldEhlaWdodCgwLCBVbml0LlBUKTsKKyAgICAgICAgaWZyYW1lLmdldFN0eWxl
KCkuc2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUuTk9ORSk7CisKKyAgICAgICAgUGx1Z2luIHBs
dWdpbiA9IG5ldyBQbHVnaW4ocGx1Z2luTWV0YURhdGEsIGlmcmFtZSk7CisgICAgICAgIGFkZFBs
dWdpbihwbHVnaW5OYW1lLCBwbHVnaW4pOworICAgICAgICBsb2dnZXIuaW5mbygiUGx1Z2luICIg
KyBwbHVnaW5OYW1lICsgIiBpcyBkZWZpbmVkIHRvIGJlIGxvYWRlZCBmcm9tIFVSTCAiICsgcGx1
Z2luSG9zdFBhZ2VVcmwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICAv
LyBUT0RPIGludHJvZHVjZSBzb21lICdsb2FkT25TdGFydHVwJyBhdHRyaWJ1dGUgaW4gZnV0dXJl
CisgICAgICAgIGxvYWRQbHVnaW4ocGx1Z2luKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBM
b2FkcyB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGF0dGFjaGluZyB0aGUgY29ycmVzcG9uZGluZyBpZnJh
bWUgZWxlbWVudCB0byBET00uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z2luKFBsdWdpbiBw
bHVnaW4pIHsKKyAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuREVGSU5F
RCkpIHsKKyAgICAgICAgICAgIERvY3VtZW50LmdldCgpLmdldEJvZHkoKS5hcHBlbmRDaGlsZChw
bHVnaW4uZ2V0SUZyYW1lRWxlbWVudCgpKTsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNMb2Fk
aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBX
ZWJBZG1pbiBlbnRlcnMgdGhlIHN0YXRlIHRoYXQgYWxsb3dzIHBsdWdpbnMgdG8gYmUgaW52b2tl
ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVQbHVnaW5JbnZvY2F0aW9uKCkgewor
ICAgICAgICBjYW5JbnZva2VQbHVnaW5zID0gdHJ1ZTsKKworICAgICAgICAvLyBUcnkgdG8gaW5p
dGlhbGl6ZSBhbGwgcGx1Z2lucyB3aGljaCBhcmUgY3VycmVudGx5IHJlYWR5CisgICAgICAgIGZv
ciAoUGx1Z2luIHBsdWdpbiA6IGdldFBsdWdpbnMoKSkgeworICAgICAgICAgICAgaWYgKHBsdWdp
bi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuUkVBRFkpKSB7CisgICAgICAgICAgICAgICAgaW5pdFBs
dWdpbihwbHVnaW4uZ2V0TWV0YURhdGEoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gV2ViQWRtaW4gbGVh
dmVzIHRoZSBzdGF0ZSB0aGF0IGFsbG93cyBwbHVnaW5zIHRvIGJlIGludm9rZWQuCisgICAgICov
CisgICAgcHVibGljIHZvaWQgZGlzYWJsZVBsdWdpbkludm9jYXRpb24oKSB7CisgICAgICAgIGNh
bkludm9rZVBsdWdpbnMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2Vz
IGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24gYWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJl
bnRseSBpbml0aWFsaXplZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIGNvbnRleHRP
YmplY3R9IHJlcHJlc2VudHMgdGhlIGxvY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9u
IGNhbGwsIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsCisgICAgICogY29udGV4dC1zZW5zaXRpdmUg
aW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5IChjYW4gYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKi8K
KyAgICBwdWJsaWMgdm9pZCBpbnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFT
Y3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgeworICAgICAgICBpZiAoY2FuSW52b2tlUGx1Z2lu
cykgeworICAgICAgICAgICAgZm9yIChQbHVnaW4gcGx1Z2luIDogZ2V0UGx1Z2lucygpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTEla
RUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZVBsdWdpbihwbHVnaW4uZ2V0RXZlbnRI
YW5kbGVyT2JqZWN0KCksIGZ1bmN0aW9uTmFtZSwgY29udGV4dE9iamVjdCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAg
ICogSW52b2tlcyBhbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBvYmplY3Qu
CisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbnZva2VQbHVnaW4oSmF2YVNjcmlw
dE9iamVjdCBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QsIFN0cmluZyBmdW5jdGlvbk5hbWUsIEph
dmFTY3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgLyoteworICAgICAgICB2YXIgaGFuZGxlckZ1
bmN0aW9uID0gcGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0W2Z1bmN0aW9uTmFtZV07CisKKyAgICAg
ICAgaWYgKHR5cGVvZiBoYW5kbGVyRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAg
ICAgIGlmIChjb250ZXh0T2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVy
RnVuY3Rpb24oY29udGV4dE9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIGhhbmRsZXJGdW5jdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fS0qLzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gcGx1Z2lu
IGludm9jYXRpb24gaXMgZW5hYmxlZCBhbmQgdGhlIGdpdmVuIHBsdWdpbiBoYXMgYmVlbiBpbml0
aWFsaXplZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGNhbkRvUGx1Z2luQWN0aW9uKFN0cmluZyBw
bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt
ZSk7CisgICAgICAgIHJldHVybiBjYW5JbnZva2VQbHVnaW5zICYmIHBsdWdpbiAhPSBudWxsICYm
IHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTElaRUQpOworICAgIH0KKworICAg
IC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBoYW5kbGVyIG9iamVjdCAob2JqZWN0IGNv
bnRhaW5pbmcgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zKSBmb3IgdGhlIGdpdmVuIHBs
dWdpbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0
KFN0cmluZyBwbHVnaW5OYW1lLCBKYXZhU2NyaXB0T2JqZWN0IHBsdWdpbkV2ZW50SGFuZGxlck9i
amVjdCkgeworICAgICAgICBQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbk5hbWUpOwor
CisgICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3Qg
IT0gbnVsbCkgeworICAgICAgICAgICAgcGx1Z2luLnNldEV2ZW50SGFuZGxlck9iamVjdChwbHVn
aW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlBsdWdpbiAi
ICsgcGx1Z2luTmFtZSArICIgaGFzIHJlZ2lzdGVyZWQgdGhlIGV2ZW50IGhhbmRsZXIgb2JqZWN0
Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICB9CisgICAgfQorCisgICAg
LyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIHBsdWdpbiBpcyByZWFkeSBmb3Ig
dXNlLgorICAgICAqLworICAgIHZvaWQgcGx1Z2luUmVhZHkoU3RyaW5nIHBsdWdpbk5hbWUpIHsK
KyAgICAgICAgUGx1Z2luIHBsdWdpbiA9IGdldFBsdWdpbihwbHVnaW5OYW1lKTsKKworICAgICAg
ICBpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0ZS5MT0FE
SU5HKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSA9
PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlBsdWdpbiAiICsgcGx1
Z2luTmFtZSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVwb3J0
cyBpbiBhcyByZWFkeSwgYnV0IGhhcyBubyBldmVudCBoYW5kbGVyIG9iamVjdCBhc3NpZ25lZCIp
OyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBwbHVnaW4ubWFya0FzUmVhZHkoKTsKKyAgICAgICAgICAgIGxvZ2dlci5p
bmZvKCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIHJlcG9ydHMgaW4gYXMgcmVhZHkiKTsgLy8k
Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICBpbml0UGx1Z2luKHBsdWdpbk5h
bWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gaW5p
dGlhbGl6ZSB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGNhbGxpbmcgVWlJbml0IGV2ZW50IGhhbmRsZXIg
ZnVuY3Rpb24gb24gdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQKKyAgICAgKiBoYW5kbGVyIG9iamVj
dC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgVWlJbml0IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVk
IGp1c3Qgb25jZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGEgcGx1Z2luLiBNb3JlIHByZWNpc2Vs
eSwgVWlJbml0IGZ1bmN0aW9uCisgICAgICogd2lsbCBiZSBjYWxsZWQ6CisgICAgICogPHVsPgor
ICAgICAqIDxsaT5hZnRlciB0aGUgcGx1Z2luIHJlcG9ydHMgaW4gYXMgcmVhZHkgYW5kIFdlYkFk
bWluIGVudGVycyB0aGUgc3RhdGUgdGhhdCBhbGxvd3MgcGx1Z2lucyB0byBiZSBpbnZva2VkCisg
ICAgICogPGxpPmJlZm9yZSBhbnkgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYXJlIGlu
dm9rZWQgYnkgdGhlIHBsdWdpbiBpbmZyYXN0cnVjdHVyZQorICAgICAqIDwvdWw+CisgICAgICov
CisgICAgdm9pZCBpbml0UGx1Z2luKFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdp
biBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFtZSk7CisKKyAgICAgICAgaWYgKGNhbkludm9r
ZVBsdWdpbnMgJiYgcGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0
ZS5SRUFEWSkpIHsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNJbml0aWFsaXplZCgpOworICAg
ICAgICAgICAgaW52b2tlUGx1Z2luKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSwgIlVp
SW5pdCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiUGx1
Z2luICIgKyBwbHVnaW5OYW1lICsgIiBpcyBpbml0aWFsaXplZCBhbmQgaW4gdXNlIG5vdyIpOyAv
LyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgor
ICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0
aGUgZ2l2ZW4gcGx1Z2luLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBvYmplY3QgZXhpc3Rz
LgorICAgICAqLworICAgIEphdmFTY3JpcHRPYmplY3QgZ2V0Q29uZmlnT2JqZWN0KFN0cmluZyBw
bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt
ZSk7CisgICAgICAgIHJldHVybiBwbHVnaW4gIT0gbnVsbCA/IHBsdWdpbi5nZXRNZXRhRGF0YSgp
LmdldENvbmZpZ09iamVjdCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2
b2lkIGV4cG9zZVBsdWdpbkFwaSgpIC8qLXsKKyAgICAgICAgdmFyIGN0eCA9IHRoaXM7CisgICAg
ICAgIHZhciB1aUZ1bmN0aW9ucyA9IGN0eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5w
bHVnaW4uUGx1Z2luTWFuYWdlcjo6dWlGdW5jdGlvbnM7CisKKyAgICAgICAgdmFyIGNhbkRvUGx1
Z2luQWN0aW9uID0gZnVuY3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGN0
eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luTWFuYWdlcjo6Y2Fu
RG9QbHVnaW5BY3Rpb24oTGphdmEvbGFuZy9TdHJpbmc7KShwbHVnaW5OYW1lKTsKKyAgICAgICAg
fTsKKworICAgICAgICAvLyBEZWZpbmUgcGx1Z2luQXBpIGZ1bmN0aW9uIHVzZWQgdG8gY29uc3Ry
dWN0IHNwZWNpZmljIFBsdWdpbiBBUEkgaW5zdGFuY2VzCisgICAgICAgIHZhciBwbHVnaW5BcGkg
PSBmdW5jdGlvbihwbHVnaW5OYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IHBsdWdpbkFw
aS5mbi5pbml0KHBsdWdpbk5hbWUpOworICAgICAgICB9OworCisgICAgICAgIC8vIERlZmluZSBw
bHVnaW5BcGkuZm4gYXMgYW4gYWxpYXMgdG8gcGx1Z2luQXBpIHByb3RvdHlwZQorICAgICAgICBw
bHVnaW5BcGkuZm4gPSBwbHVnaW5BcGkucHJvdG90eXBlID0geworCisgICAgICAgICAgICBwbHVn
aW5OYW1lOiBudWxsLCAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBmdW5jdGlvbgorCisg
ICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICAgICAgICAgICAgaW5pdDogZnVu
Y3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTmFtZSA9IHBs
dWdpbk5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy51aS5vd25lciA9IHRoaXM7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBS
ZWdpc3RlcnMgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBsYXRlciBpbnZvY2F0
aW9uCisgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2luRXZlbnRIYW5kbGVyT2Jq
ZWN0KSB7CisgICAgICAgICAgICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu
LnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpyZWdpc3RlclBsdWdpbkV2ZW50SGFuZGxlck9iamVjdChM
amF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9nd3QvY29yZS9jbGllbnQvSmF2YVNjcmlwdE9i
amVjdDspKHRoaXMucGx1Z2luTmFtZSxwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAg
ICAgICAgfSwKKworICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHBsdWdpbiBpcyBy
ZWFkeSBmb3IgdXNlCisgICAgICAgICAgICByZWFkeTogZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5h
Z2VyOjpwbHVnaW5SZWFkeShMamF2YS9sYW5nL1N0cmluZzspKHRoaXMucGx1Z2luTmFtZSk7Cisg
ICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9u
IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbgorICAgICAgICAgICAgY29uZmlnT2Jq
ZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LkBvcmcub3ZpcnQu
ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpnZXRDb25maWdPYmplY3Qo
TGphdmEvbGFuZy9TdHJpbmc7KSh0aGlzLnBsdWdpbk5hbWUpOworICAgICAgICAgICAgfSwKKwor
ICAgICAgICAgICAgLy8gTmFtZXNwYWNlIGZvciBpbnZva2luZyBQbHVnaW5VaUZ1bmN0aW9ucwor
ICAgICAgICAgICAgdWk6IHsKKworICAgICAgICAgICAgICAgIGFkZE1haW5UYWI6IGZ1bmN0aW9u
KGxhYmVsLCBoaXN0b3J5VG9rZW4sIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGNhbkRvUGx1Z2luQWN0aW9uKHRoaXMub3duZXIucGx1Z2luTmFtZSkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHVpRnVuY3Rpb25zLkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu
LnBsdWdpbi5QbHVnaW5VaUZ1bmN0aW9uczo6YWRkTWFpblRhYihMamF2YS9sYW5nL1N0cmluZztM
amF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspKGxhYmVsLGhpc3RvcnlUb2tlbixj
b250ZW50VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICAgICAgLy8gR2l2ZSBpbml0IGZ1bmN0
aW9uIHRoZSBwbHVnaW5BcGkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCisgICAg
ICAgIHBsdWdpbkFwaS5mbi5pbml0LnByb3RvdHlwZSA9IHBsdWdpbkFwaS5mbjsKKworICAgICAg
ICAvLyBFeHBvc2UgcGx1Z2luQXBpIGZ1bmN0aW9uIGFzIGEgZ2xvYmFsIG9iamVjdAorICAgICAg
ICAkd25kLnBsdWdpbkFwaSA9IHBsdWdpbkFwaTsKKyAgICB9LSovOworCit9CmRpZmYgLS1naXQg
YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292
aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YSBiL2Zyb250
ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5n
aW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjMxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu
ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDM2IEBA
CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQg
Y29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKKworLyoqCisgKiBD
b250YWlucyBtZXRhLWRhdGEgZGVzY3JpYmluZyBhIFVJIHBsdWdpbi4KKyAqIDxwPgorICogV2Ug
ZXhwZWN0IHRoZSBtZXRhLWRhdGEgdG8gYmUgcmVhZCBkdXJpbmcgV2ViQWRtaW4gc3RhcnR1cCBh
cyBwYXJ0IG9mIHtAbGluayBQbHVnaW5EZWZpbml0aW9uc30uCisgKi8KK3B1YmxpYyBmaW5hbCBj
bGFzcyBQbHVnaW5NZXRhRGF0YSBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworCisgICAgcHJv
dGVjdGVkIFBsdWdpbk1ldGFEYXRhKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmFt
ZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBsdWdpbiAobWFuZGF0b3J5KS4KKyAgICAg
Ki8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXROYW1lKCkgIC8qLXsKKyAgICAgICAgcmV0
dXJuIHRoaXMubmFtZTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogVVJMIG9mIHBsdWdp
biBob3N0IHBhZ2UgdGhhdCBpbnZva2VzIHRoZSBwbHVnaW4gY29kZSAobWFuZGF0b3J5KS4KKyAg
ICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXRIb3N0UGFnZVVybCgpIC8qLXsKKyAg
ICAgICAgcmV0dXJuIHRoaXMudXJsOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBDb25m
aWd1cmF0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbiAob3B0aW9uYWwpLgor
ICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgSmF2YVNjcmlwdE9iamVjdCBnZXRDb25maWdPYmpl
Y3QoKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKKyAgICB9LSovOworCit9CmRp
ZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2ph
dmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YSBi
L2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3Zp
cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5TdGF0ZS5qYXZhCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzZiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9u
dGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu
Z2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YQpAQCAtMCwwICsxLDMzIEBA
CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCisvKioKKyAq
IEVudW1lcmF0ZXMgcG9zc2libGUgc3RhdGVzIGR1cmluZyB0aGUgcnVudGltZSBvZiBhIFVJIHBs
dWdpbi4KKyAqLworcHVibGljIGVudW0gUGx1Z2luU3RhdGUgeworCisgICAgLyoqCisgICAgICog
VGhlIHBsdWdpbiBoYXMgYmVlbiBkZWZpbmVkIHRocm91Z2ggaXRzIG1ldGEtZGF0YSBhbmQgdGhl
IGNvcnJlc3BvbmRpbmcgaWZyYW1lIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKiA8
cD4KKyAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIGZvciBhbGwgcGx1Z2lucy4KKyAg
ICAgKi8KKyAgICBERUZJTkVELAorCisgICAgLyoqCisgICAgICogVGhlIGlmcmFtZSBlbGVtZW50
IGhhcyBiZWVuIGF0dGFjaGVkIHRvIERPTSwgd2l0aCBwbHVnaW4gaG9zdCBwYWdlIGJlaW5nIGZl
dGNoZWQgYXN5bmNocm9ub3VzbHkgaW4gdGhlCisgICAgICogYmFja2dyb3VuZC4gV2UgYXJlIG5v
dyB3YWl0aW5nIGZvciB0aGUgcGx1Z2luIHRvIHJlcG9ydCBpbiBhcyByZWFkeS4KKyAgICAgKi8K
KyAgICBMT0FESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgaW5kaWNhdGVk
IHRoYXQgaXQgaXMgcmVhZHkgZm9yIHVzZS4gV2UgZXhwZWN0IHRoZSBldmVudCBoYW5kbGVyIG9i
amVjdCAob2JqZWN0IGNvbnRhaW5pbmcgcGx1Z2luCisgICAgICogZXZlbnQgaGFuZGxlciBmdW5j
dGlvbnMpIHRvIGJlIHJlZ2lzdGVyZWQgYXQgdGhpcyBwb2ludC4gV2UgY2FuIG5vdyBwcm9jZWVk
IHdpdGggcGx1Z2luIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIFJFQURZLAorCisgICAg
LyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBjYWxsaW5nIFVp
SW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLiBXZSBjYW4gbm93IGNhbGwgb3RoZXIgZXZlbnQg
aGFuZGxlcgorICAgICAqIGZ1bmN0aW9ucyAodGhlIHBsdWdpbiBpcyBpbiB1c2UpLgorICAgICAq
LworICAgIElOSVRJQUxJWkVECisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v
ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu
L3BsdWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1
Z2luL1BsdWdpblVpRnVuY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uZGE1NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs
ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs
dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2Ugb3Jn
Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5n
aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiLk1haW5UYWJDdXN0b21Q
cm94eUZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKKy8qKgor
ICogQ29udGFpbnMgVUkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGV4cG9zZWQgdG8gVUkgcGx1Z2lu
cy4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpblVpRnVuY3Rpb25zIHsKKworICAgIHByaXZhdGUg
ZmluYWwgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeSBtYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5
OworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5VaUZ1bmN0aW9ucyhNYWluVGFiQ3Vz
dG9tUHJveHlGYWN0b3J5IG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkpIHsKKyAgICAgICAgdGhp
cy5tYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5ID0gbWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsK
KyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG5ldyBtYWluIHRhYiB0aGF0IHNob3dzIGNv
bnRlbnRzIG9mIHRoZSBnaXZlbiBVUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFp
blRhYihTdHJpbmcgbGFiZWwsIFN0cmluZyBoaXN0b3J5VG9rZW4sIFN0cmluZyBjb250ZW50VXJs
KSB7CisgICAgICAgIG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkuY3JlYXRlKGxhYmVsLCBoaXN0
b3J5VG9rZW4sIGNvbnRlbnRVcmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQv
d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv
dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2VjdGlvblByZXNlbnRlci5q
YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y
Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2Vj
dGlvblByZXNlbnRlci5qYXZhCmluZGV4IDcxOGQ4ZmMuLjE1Yjg4N2MgMTAwNjQ0Ci0tLSBhL2Zy
b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFpblNlY3Rpb25QcmVz
ZW50ZXIuamF2YQorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9t
YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2Vu
dGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEKQEAgLTEsNSArMSw3IEBACiBwYWNrYWdlIG9y
Zy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlcjsKIAoraW1w
b3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CisK
IGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7CiBpbXBvcnQgY29t
Lmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkd3dEV2ZW50LlR5cGU7CiBpbXBvcnQgY29tLmdvb2ds
ZS5pbmplY3QuSW5qZWN0OwpAQCAtMjgsMTEgKzMwLDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluU2Vj
dGlvblByZXNlbnRlciBleHRlbmRzIFByZXNlbnRlcjxNYWluU2VjdGlvblByZXNlbnRlci5WaWV3
RGVmCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlPFJldmVhbENvbnRlbnRIYW5kbGVyPD8+
PiBUWVBFX1NldE1haW5Db250ZW50ID0gbmV3IFR5cGU8UmV2ZWFsQ29udGVudEhhbmRsZXI8Pz4+
KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIEhlYWRlclByZXNlbnRlcldpZGdldCBoZWFkZXI7Cisg
ICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXI7CiAKICAgICBASW5q
ZWN0Ci0gICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW
aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy
KSB7CisgICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW
aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy
LCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXIpIHsKICAgICAgICAgc3VwZXIoZXZlbnRCdXMs
IHZpZXcsIHByb3h5KTsKICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIHRo
aXMucGx1Z2luTWFuYWdlciA9IHBsdWdpbk1hbmFnZXI7CiAgICAgICAgIGdldFZpZXcoKS5zZXRV
aUhhbmRsZXJzKGhlYWRlcik7CiAgICAgfQogCkBAIC00Niw2ICs1MCwxNyBAQCBwdWJsaWMgY2xh
c3MgTWFpblNlY3Rpb25QcmVzZW50ZXIgZXh0ZW5kcyBQcmVzZW50ZXI8TWFpblNlY3Rpb25QcmVz
ZW50ZXIuVmlld0RlZgogICAgICAgICBzdXBlci5vblJldmVhbCgpOwogCiAgICAgICAgIHNldElu
U2xvdChUWVBFX1NldEhlYWRlciwgaGVhZGVyKTsKKworICAgICAgICAvLyBFbmFibGUgcGx1Z2lu
IGludm9jYXRpb24gd2l0aGluIHRoZSBzY29wZSBvZiBtYWluIHNlY3Rpb24KKyAgICAgICAgcGx1
Z2luTWFuYWdlci5lbmFibGVQbHVnaW5JbnZvY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJy
aWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25IaWRlKCkgeworICAgICAgICBzdXBlci5vbkhpZGUo
KTsKKworICAgICAgICAvLyBEaXNhYmxlIHBsdWdpbiBpbnZvY2F0aW9uIG91dHNpZGUgdGhlIHNj
b3BlIG9mIG1haW4gc2VjdGlvbgorICAgICAgICBwbHVnaW5NYW5hZ2VyLmRpc2FibGVQbHVnaW5J
bnZvY2F0aW9uKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9t
b2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1p
bi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5qYXZhIGIvZnJv
bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluVGFiUGFuZWxQcmVz
ZW50ZXIuamF2YQppbmRleCBhYzA0MDAxLi42MTEyZDM4IDEwMDY0NAotLS0gYS9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5q
YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFp
blRhYlBhbmVsUHJlc2VudGVyLmphdmEKQEAgLTUsNiArNSw3IEBAIGltcG9ydCBvcmcub3ZpcnQu
ZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0SGVhZGxlc3NUYWJQYW5lbC5UYWJX
aWRnZXRICiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkV2ZW50QnVzOwogaW1w
b3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudC5UeXBlOwogaW1wb3J0IGNv
bS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVu
dC5SZXF1ZXN0VGFic0V2ZW50OwogaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LlJl
cXVlc3RUYWJzSGFuZGxlcjsKIGltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJD
b250YWluZXJQcmVzZW50ZXI7CiBpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVGFi
VmlldzsKQEAgLTQ1LDQgKzQ2LDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluVGFiUGFuZWxQcmVzZW50
ZXIgZXh0ZW5kcyBUYWJDb250YWluZXJQcmVzZW50ZXI8TWFpblRhYlBhbmVsUHJlCiAgICAgICAg
IFJldmVhbENvbnRlbnRFdmVudC5maXJlKHRoaXMsIE1haW5Db250ZW50UHJlc2VudGVyLlRZUEVf
U2V0TWFpblRhYlBhbmVsQ29udGVudCwgdGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisg
ICAgcHJvdGVjdGVkIHZvaWQgb25SZXZlYWwoKSB7CisgICAgICAgIHN1cGVyLm9uUmV2ZWFsKCk7
CisKKyAgICAgICAgLy8gUmVmcmVzaCB0YWJzIGVhY2ggdGltZSB0aGlzIHRhYiBjb250YWluZXIg
aXMgcmV2ZWFsZWQKKyAgICAgICAgZ2V0VmlldygpLnJlbW92ZVRhYnMoKTsKKyAgICAgICAgUmVx
dWVzdFRhYnNFdmVudC5maXJlKHRoaXMsIFRZUEVfUmVxdWVzdFRhYnMsIHRoaXMpOworICAgIH0K
KwogfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv
bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNl
bnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt
aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZh
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOWMyZjUKLS0tIC9kZXYvbnVs
bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEv
b3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9N
YWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBvcmcu
b3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitp
bXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy
Lk1haW5UYWJQYW5lbFByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNo
YXJlZC5FdmVudEJ1czsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5QcmVzZW50
ZXI7CitpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVmlldzsKK2ltcG9ydCBjb20u
Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5SZXZlYWxDb250ZW50RXZlbnQ7CitpbXBvcnQg
Y29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5UGxhY2U7CisK
K3B1YmxpYyBjbGFzcyBNYWluVGFiQ3VzdG9tUHJlc2VudGVyIGV4dGVuZHMgUHJlc2VudGVyPE1h
aW5UYWJDdXN0b21QcmVzZW50ZXIuVmlld0RlZiwgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94
eURlZj4geworCisgICAgLy8gTm8gbmVlZCBmb3IgQFByb3h5Q29kZVNwbGl0LCB3ZSB3aWxsIHBy
b3ZpZGUgb3VyIG93biBwcm94eSBpbXBsZW1lbnRhdGlvbgorICAgIHB1YmxpYyBpbnRlcmZhY2Ug
UHJveHlEZWYgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlQbGFjZTxNYWluVGFiQ3VzdG9tUHJlc2Vu
dGVyPiB7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBWaWV3RGVmIGV4dGVuZHMgVmll
dyB7CisKKyAgICAgICAgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpOworCisgICAgfQor
CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFVybDsKKworICAgIC8vIE5vIG5lZWQg
Zm9yIEBJbmplY3QsIHRoaXMgcHJlc2VudGVyIHdpbGwgYmUgY3JlYXRlZCBtYW51YWxseSBieSBN
YWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVBy
ZXNlbnRlcihFdmVudEJ1cyBldmVudEJ1cywgVmlld0RlZiB2aWV3LCBQcm94eURlZiBwcm94eSwg
U3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgc3VwZXIoZXZlbnRCdXMsIHZpZXcsIHByb3h5
KTsKKyAgICAgICAgdGhpcy5jb250ZW50VXJsID0gY29udGVudFVybDsKKyAgICB9CisKKyAgICBA
T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXZlYWxJblBhcmVudCgpIHsKKyAgICAgICAg
UmV2ZWFsQ29udGVudEV2ZW50LmZpcmUodGhpcywgTWFpblRhYlBhbmVsUHJlc2VudGVyLlRZUEVf
U2V0VGFiQ29udGVudCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVj
dGVkIHZvaWQgb25CaW5kKCkgeworICAgICAgICBzdXBlci5vbkJpbmQoKTsKKworICAgICAgICBn
ZXRWaWV3KCkuc2V0Q29udGVudFVybChjb250ZW50VXJsKTsKKyAgICB9CisKK30KZGlmZiAtLWdp
dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv
b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5U
YWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2Vj
dGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmph
dmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwYmU1NAotLS0gL2Rldi9u
dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFi
L01haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3Bh
Y2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy
LnRhYjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEJ1czsKK2lt
cG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu
UHJvdmlkZXI7CisKKy8qKgorICogUHJvdmlkZXIgb2Yge0BsaW5rIE1haW5UYWJDdXN0b21QcmVz
ZW50ZXJ9IGluc3RhbmNlcyAobm9uLXNpbmdsZXRvbikuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWlu
VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxNYWluVGFiQ3Vz
dG9tUHJlc2VudGVyPiB7CisKKyAgICBwcml2YXRlIE1haW5UYWJDdXN0b21QcmVzZW50ZXIgcHJl
c2VudGVyOworICAgIHByaXZhdGUgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94
eTsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlci5W
aWV3RGVmPiB2aWV3UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEJ1cyBldmVudEJ1
czsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRVcmw7CisKKyAgICBASW5qZWN0CisgICAg
cHVibGljIE1haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlcihQcm92aWRlcjxNYWluVGFiQ3Vz
dG9tUHJlc2VudGVyLlZpZXdEZWY+IHZpZXdQcm92aWRlciwgRXZlbnRCdXMgZXZlbnRCdXMpIHsK
KyAgICAgICAgdGhpcy52aWV3UHJvdmlkZXIgPSB2aWV3UHJvdmlkZXI7CisgICAgICAgIHRoaXMu
ZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMg
TWFpblRhYkN1c3RvbVByZXNlbnRlciBnZXQoKSB7CisgICAgICAgIGFzc2VydCBwcm94eSAhPSBu
dWxsIDogIllvdSBtdXN0IGNhbGwgc2V0UHJveHkgZmlyc3QiOyAvLyROT04tTkxTLTEkCisKKyAg
ICAgICAgaWYgKHByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW5k
IGJpbmQgdGhlIHByZXNlbnRlcgorICAgICAgICAgICAgcHJlc2VudGVyID0gbmV3IE1haW5UYWJD
dXN0b21QcmVzZW50ZXIoZXZlbnRCdXMsIHZpZXdQcm92aWRlci5nZXQoKSwgcHJveHksIGNvbnRl
bnRVcmwpOworICAgICAgICAgICAgcHJlc2VudGVyLmJpbmQoKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHJldHVybiBwcmVzZW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJveHko
TWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94eSkgeworICAgICAgICB0aGlzLnBy
b3h5ID0gcHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFVybChTdHJp
bmcgY29udGVudFVybCkgeworICAgICAgICB0aGlzLmNvbnRlbnRVcmwgPSBjb250ZW50VXJsOwor
ICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p
bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWlu
L3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1p
bi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJh
ZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYzMjhjCi0tLSAvZGV2L251bGwK
KysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y
Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp
blRhYkN1c3RvbVByb3h5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcub3ZpcnQu
ZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQg
b3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworaW1wb3J0
IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5NYWlu
VGFiUGFuZWxQcmVzZW50ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQu
RXZlbnRCdXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29t
Lmd3dHBsYXRmb3JtLmNvbW1vbi5jbGllbnQuU3RhbmRhcmRQcm92aWRlcjsKK2ltcG9ydCBjb20u
Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJEYXRhQmFzaWM7CitpbXBvcnQgY29tLmd3dHBsYXRm
b3JtLm12cC5jbGllbnQucHJveHkuUGxhY2VNYW5hZ2VyOworaW1wb3J0IGNvbS5nd3RwbGF0Zm9y
bS5tdnAuY2xpZW50LnByb3h5LlBsYWNlV2l0aEdhdGVrZWVwZXI7CitpbXBvcnQgY29tLmd3dHBs
YXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5SW1wbDsKK2ltcG9ydCBjb20u
Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5UYWJDb250ZW50UHJveHlQbGFjZUltcGw7CisK
Ky8qKgorICogQ3VzdG9tIHtAbGluayBNYWluVGFiQ3VzdG9tUHJlc2VudGVyfSBwcm94eSBpbXBs
ZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eSBleHRlbmRz
IFRhYkNvbnRlbnRQcm94eVBsYWNlSW1wbDxNYWluVGFiQ3VzdG9tUHJlc2VudGVyPiBpbXBsZW1l
bnRzIE1haW5UYWJDdXN0b21QcmVzZW50ZXIuUHJveHlEZWYgeworCisgICAgcHVibGljIHN0YXRp
YyBjbGFzcyBXcmFwcGVkUHJveHkgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlJbXBsPE1haW5UYWJD
dXN0b21QcmVzZW50ZXI+IHsKKworICAgICAgICBwdWJsaWMgV3JhcHBlZFByb3h5KFBsYWNlTWFu
YWdlciBwbGFjZU1hbmFnZXIsIEV2ZW50QnVzIGV2ZW50QnVzLAorICAgICAgICAgICAgICAgIFBy
b3ZpZGVyPE1haW5UYWJDdXN0b21QcmVzZW50ZXI+IHByZXNlbnRlclByb3ZpZGVyLAorICAgICAg
ICAgICAgICAgIFN0cmluZyBsYWJlbCwgZmxvYXQgcHJpb3JpdHksIFN0cmluZyBoaXN0b3J5VG9r
ZW4pIHsKKyAgICAgICAgICAgIGJpbmQocGxhY2VNYW5hZ2VyLCBldmVudEJ1cyk7CisgICAgICAg
ICAgICByZXF1ZXN0VGFic0V2ZW50VHlwZSA9IE1haW5UYWJQYW5lbFByZXNlbnRlci5UWVBFX1Jl
cXVlc3RUYWJzOworICAgICAgICAgICAgdGFiRGF0YSA9IG5ldyBUYWJEYXRhQmFzaWMobGFiZWws
IHByaW9yaXR5KTsKKyAgICAgICAgICAgIHRhcmdldEhpc3RvcnlUb2tlbiA9IGhpc3RvcnlUb2tl
bjsKKyAgICAgICAgICAgIGFkZFJlcXVlc3RUYWJzSGFuZGxlcigpOworICAgICAgICAgICAgcHJl
c2VudGVyID0gbmV3IFN0YW5kYXJkUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlcj4ocHJl
c2VudGVyUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgTWFpblRh
YkN1c3RvbVByb3h5KENsaWVudEdpbmplY3RvciBnaW5qZWN0b3IsCisgICAgICAgICAgICBNYWlu
VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgcHJlc2VudGVyUHJvdmlkZXIsCisgICAgICAgICAg
ICBTdHJpbmcgbGFiZWwsIGZsb2F0IHByaW9yaXR5LCBTdHJpbmcgaGlzdG9yeVRva2VuKSB7Cisg
ICAgICAgIGJpbmQoZ2luamVjdG9yLmdldFBsYWNlTWFuYWdlcigpLCBnaW5qZWN0b3IuZ2V0RXZl
bnRCdXMoKSk7CisgICAgICAgIHByb3h5ID0gbmV3IFdyYXBwZWRQcm94eShnaW5qZWN0b3IuZ2V0
UGxhY2VNYW5hZ2VyKCksIGdpbmplY3Rvci5nZXRFdmVudEJ1cygpLAorICAgICAgICAgICAgICAg
IHByZXNlbnRlclByb3ZpZGVyLCBsYWJlbCwgcHJpb3JpdHksIGhpc3RvcnlUb2tlbik7CisgICAg
ICAgIHBsYWNlID0gbmV3IFBsYWNlV2l0aEdhdGVrZWVwZXIoaGlzdG9yeVRva2VuLCBnaW5qZWN0
b3IuZ2V0RGVmYXVsdEdhdGVrZWVwZXIoKSk7CisgICAgICAgIHByZXNlbnRlclByb3ZpZGVyLnNl
dFByb3h5KHRoaXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt
aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeS5q
YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y
Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp
blRhYkN1c3RvbVByb3h5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmYxNjdjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1
bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9z
ZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5LmphdmEK
QEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNl
Y3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53
ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu
SW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCisvKioKKyAqIENy
ZWF0ZXMgYW5kIGJpbmRzIHtAbGluayBNYWluVGFiQ3VzdG9tUHJveHl9IGluc3RhbmNlcy4KKyAq
LworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkgeworCisgICAgcHJpdmF0
ZSBmaW5hbCBDbGllbnRHaW5qZWN0b3IgZ2luamVjdG9yOworICAgIHByaXZhdGUgZmluYWwgUHJv
dmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyPiBwcm92aWRlcjsKKworICAgIEBJ
bmplY3QKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeShDbGllbnRHaW5qZWN0
b3IgZ2luamVjdG9yLAorICAgICAgICAgICAgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRl
clByb3ZpZGVyPiBwcm92aWRlcikgeworICAgICAgICB0aGlzLmdpbmplY3RvciA9IGdpbmplY3Rv
cjsKKyAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgIH0KKworICAgIHB1Ymxp
YyBNYWluVGFiQ3VzdG9tUHJveHkgY3JlYXRlKFN0cmluZyBsYWJlbCwgU3RyaW5nIGhpc3RvcnlU
b2tlbiwgU3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgTWFpblRhYkN1c3RvbVByZXNlbnRl
clByb3ZpZGVyIHByZXNlbnRlclByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0KCk7CisgICAgICAgIHBy
ZXNlbnRlclByb3ZpZGVyLnNldENvbnRlbnRVcmwoY29udGVudFVybCk7CisKKyAgICAgICAgLy8g
Q3JlYXRlIGFuZCBiaW5kIHRoZSBwcm94eSBpbnN0YW5jZQorICAgICAgICBNYWluVGFiQ3VzdG9t
UHJveHkgcHJveHkgPSBuZXcgTWFpblRhYkN1c3RvbVByb3h5KAorICAgICAgICAgICAgICAgIGdp
bmplY3RvciwgcHJlc2VudGVyUHJvdmlkZXIsIGxhYmVsLCBGbG9hdC5NQVhfVkFMVUUsIGhpc3Rv
cnlUb2tlbik7CisKKyAgICAgICAgcmV0dXJuIHByb3h5OworICAgIH0KKworfQpkaWZmIC0tZ2l0
IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9v
dmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0
b21WaWV3LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWlu
L2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vdmlldy90YWIv
TWFpblRhYkN1c3RvbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5jOGU5NjgzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93
ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv
bi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LmphdmEKQEAgLTAsMCArMSwzMiBAQAor
cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRh
YjsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJzdHJhY3RWaWV3
OworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNl
bnRlci50YWIuTWFpblRhYkN1c3RvbVByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0
LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQu
VWlCaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7
CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7CitpbXBv
cnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OworaW1wb3J0IGNvbS5nb29n
bGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21WaWV3IGV4dGVu
ZHMgQWJzdHJhY3RWaWV3IGltcGxlbWVudHMgTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVm
IHsKKworICAgIGludGVyZmFjZSBWaWV3VWlCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxXaWRnZXQs
IE1haW5UYWJDdXN0b21WaWV3PiB7CisgICAgICAgIFZpZXdVaUJpbmRlciB1aUJpbmRlciA9IEdX
VC5jcmVhdGUoVmlld1VpQmluZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVWlGaWVsZAorICAg
IElubGluZUxhYmVsIHVybExhYmVsOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBNYWluVGFi
Q3VzdG9tVmlldygpIHsKKyAgICAgICAgaW5pdFdpZGdldChWaWV3VWlCaW5kZXIudWlCaW5kZXIu
Y3JlYXRlQW5kQmluZFVpKHRoaXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJs
aWMgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdXJsTGFiZWwuc2V0
VGV4dCh1cmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9k
dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v
c2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LnVpLnhtbCBiL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l
L3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy51aS54
bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMWJlMgotLS0gL2Rldi9u
dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWlu
VGFiQ3VzdG9tVmlldy51aS54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4w
IiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSB1aTpVaUJpbmRlciBTWVNURU0gImh0dHA6
Ly9kbC5nb29nbGUuY29tL2d3dC9EVEQveGh0bWwuZW50Ij4KKzx1aTpVaUJpbmRlciB4bWxuczp1
aT0idXJuOnVpOmNvbS5nb29nbGUuZ3d0LnVpYmluZGVyIiB4bWxuczpnPSJ1cm46aW1wb3J0OmNv
bS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpIj4KKworCTxnOkhUTUxQYW5lbD4KKwkJVE9ETyBk
aXNwbGF5IHRoaXMgVVJMOgorCQk8ZzpJbmxpbmVMYWJlbCB1aTpmaWVsZD0idXJsTGFiZWwiIC8+
CisJPC9nOkhUTUxQYW5lbD4KKworPC91aTpVaUJpbmRlcj4KZGlmZiAtLWdpdCBhL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnht
bCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dF
Qi1JTkYvd2ViLnhtbAppbmRleCA1MzlkM2Q4Li5kYmY5M2EyIDEwMDY0NAotLS0gYS9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54
bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJh
cHAvV0VCLUlORi93ZWIueG1sCkBAIC0yMyw2ICsyMywxNiBAQAogCQk8dXJsLXBhdHRlcm4+L3dl
YmFkbWluL1dlYkFkbWluLmh0bWw8L3VybC1wYXR0ZXJuPgogCTwvc2VydmxldC1tYXBwaW5nPgog
CisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UGx1Z2luU291cmNlUGFnZTwvc2VydmxldC1u
YW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3ZpcnQuZW5naW5lLnVpLmZyb250ZW5kLnNlcnZl
ci5nd3QuUGx1Z2luU291cmNlUGFnZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0
PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdl
PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFn
ZTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKIAk8IS0tIERlZmF1bHQgcGFn
ZSB0byBzZXJ2ZSAtLT4KIAk8d2VsY29tZS1maWxlLWxpc3Q+CiAJCTx3ZWxjb21lLWZpbGU+aW5k
ZXguaHRtbDwvd2VsY29tZS1maWxlPgotLSAKMS43LjQuNAoK
------=_Part_15477537_1702327251.1346339532819--
12 years, 3 months
[Engine-devel] network subnet
by Livnat Peer
Hi All,
Today when a user wants to define a network subnet mask, he does it when
he attaches the network to a host NIC.
I was wondering if there is a reason not to define the network subnet on
the logical network entity (Data center level).
Thanks, Livnat
12 years, 3 months
Re: [Engine-devel] UI Plugins configuration
by Vojtech Szocs
------=_Part_12944838_269192103.1345724057851
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hi Chris,
thanks for taking the time to make this patch, these are some excellent ideas! (CC'ing engine-devel so that we can discuss this with other guys as well)
First of all, I really like the way you designed plugin source page URLs (going through PluginSourcePageServlet ), e.g. "/webadmin/webadmin/plugin/<pluginName>/<pluginSourcePage>.html", plus the concept of "path" JSON attribute.
WebadminDynamicHostingServlet loads and caches all plugin definitions ( *.json files), and directly embeds them into WebAdmin host page as pluginDefinitions JavaScript object. I'm assuming that pluginDefinitions object will now look like this:
var pluginDefinitions = {
"test": {
"name": "test",
"version": "1.0",
"url": "/webadmin/webadmin/plugin/test/foo.html",
"path": "/tmp",
"config": {"a":1, "b":2, "c":3}
}
}
Originally, the pluginDefinitions object looked like this:
var pluginDefinitions = {
"test": "/webadmin/webadmin/plugin/test/foo.html" // Simple pluginName -> pluginSourcePageUrl mappings
}
This is because PluginManager (WebAdmin) only needs pluginName ("name") and pluginSourcePageUrl ("url") during startup, when creating plugin iframe. But this can be changed :)
Plugin "version" makes sense, plus the plugin configuration object ("config") can be useful directly on the client. Let me explain:
Originally, plugin configuration was supposed to be passed to actual plugin code (through immediately-invoked-function-expression, or IIFE), just like this:
(function (pluginApi, pluginConfig) { // JavaScript IIFE
// ... actual plugin code ...
})(
parent.pluginApi, /* reference to global pluginApi object */
{"a":1, "b":2, "c":3} /* embedded plugin configuration as JavaScript object */
);
The whole purpose of PluginSourcePageServlet was to "wrap" actual plugin code into HTML, so that users don't need to write HTML pages for their plugins manually. PluginSourcePageServlet would handle any plugin dependencies (placed into HTML head), with actual plugin code being wrapped into IIFE, as shown above. Plugin configuration was meant to be stored in a separate file, e.g. <pluginName>-config.json , so that users could change the default plugin configuration to suit their needs.
Inspired by your patch, rather than reading/embedding plugin configuration when serving plugin HTML page ( PluginSourcePageServlet ), it's even better to have the plugin configuration embedded directly into WebAdmin host page, along with introducing new pluginApi function to retrieve the plugin configuration object.
Based on this, I suggest following modifications to the original concept:
- modify original pluginDefinitions structure, from pluginName -> pluginSourcePageUrl , to pluginName -> pluginDefObject
- pluginDefObject is basically a subset of physical plugin definition ( test.json , see below), suitable for use on the client
- add following attributes to pluginDefObject : version , url , config
* note #1: name is not needed, since it's already the key of pluginName -> pluginDefObject mapping
* note #2: path is not needed on the client (more on this below)
- introduce pluginApi.config(pluginName) function for plugins to retrieve their configuration object, and remove pluginConfig parameter from main IIFE (as shown above)
[a] Physical plugin definition file (JSON) might be located at oVirt "DataDir", e.g. /usr/share/ovirt-engine/ui-plugins/test.json , for example:
{
"name": "test",
"version": "1.0",
"url": "/webadmin/webadmin/plugin/test/start.html",
"path": "/tmp",
"config": "test-config.json"
}
[b] Plugin configuration file (JSON) might be located at oVirt "ConfigDir", e.g. /etc/ovirt-engine/ui-plugins/test-config.json , for example:
{
"a":1, "b":2, "c":3
}
[c] Finally, plugin static resources (plugin source page, actual plugin code, plugin dependencies, CSS/images, etc.) would be located at /tmp (as shown in [a]), for example:
/tmp/start.html -> plugin source page, used to load actual plugin code
/tmp/test.js -> actual plugin code
/tmp/deps/jquery-min.js -> simulate 3rd party plugin dependency
For example:
"/webadmin/webadmin/plugin/test/start.html" will be mapped to /tmp/start.html
"/webadmin/webadmin/plugin/test/deps/jquery-min.js" will be mapped to /tmp/deps/jquery-min.js
This approach has some pros and cons:
(+) plugin static resources can be served through PluginSourcePageServlet (pretty much like oVirt documentation resources, served through oVirt Engine root war's FileServlet )
(+) plugin author has complete control over plugin source page
(-) plugin author actually needs to write plugin source page
Overall, I think this approach is better than the previous one (where PluginSourcePageServlet took care of rendering plugin source page, but sacrificed some flexibility).
By the way, here's what would happen behind the scenes:
1. user requests WebAdmin host page, WebadminDynamicHostingServlet loads and caches all plugin definitions [a] + plugin configurations [b] and constructs/embeds appropriate pluginDefinitions JavaScript object
2. during WebAdmin startup, PluginManager registers the plugin (name/version/url/config), and creates/attaches the iframe to fetch plugin source page ansynchronously
3. PluginSourcePageServlet handles plugin source page request, resolves the correct path [c] and just streams the file content back to client
> 1. The plugin configuration files should probably have an "enabled" field and an "apiVersion" field that should be examined to determine whether or not to use the plugin.
Sounds good, we can implement these later on :)
> 2. I suspect the way I've modified PluginSourcePage makes it vulnerable to directory climbing attacks.
Yes, but we can defend against these, restricting access only to plugin's "path" and its sub-directories.
> 3. Is /usr/share/ovirt-engine the right place for the plugin config files?
I suppose you mean plugin definition files [a], cannot tell for sure, but we can change this anytime :)
Chris, please let me know what you think, and again - many thanks for sending the patch!
Regards,
Vojtech
----- Original Message -----
From: "Chris Frantz" <Chris.Frantz(a)hp.com>
To: vszocs(a)redhat.com
Sent: Wednesday, August 22, 2012 7:56:45 PM
Subject: UI Plugins configuration
Vojtech,
I decided to work on making the plugin patch a bit more configurable, following some of the ideas expressed by Itamar and others in the meeting yesterday. The attached patch is a simple first-attempt.
Plugin configurations are stored in /usr/share/ovirt-engine/ui-plugins/*.json.
Example:
{
"name": "test",
"version": "1.0",
"url": "/webadmin/webadmin/plugin/test/foo.html",
"path": "/tmp",
"config": {"a":1, "b":2, "c": 3}
}
The engine reads all of the *.json files in that directory to build the list of known plugins and gives that list to the webadmin.
When webadmin loads a plugin, it requests the URL given in the plugin config file. The "plugin" URL is mapped to PluginSourcePage, which will translate the first part of the path ("test") into whatever path is stored in pluginConfig ("/tmp") in this case, and then serve the static file (e.g. "/tmp/foo.html").
I didn't use the renderPluginSourcePage() method in favor of just serving a static file, but I have no strong opinion on the matter. However, a plugin may want to store static resources at "path" and have the engine serve those resources. By just serving files through PluginSourcePage, we don't need any other servlets to provide those resources.
There is still a bit of work to do:
1. The plugin configuration files should probably have an "enabled" field and an "apiVersion" field that should be examined to determine whether or not to use the plugin.
2. I suspect the way I've modified PluginSourcePage makes it vulnerable to directory climbing attacks.
3. Is /usr/share/ovirt-engine the right place for the plugin config files?
Let me know what you think,
--Chris
------=_Part_12944838_269192103.1345724057851
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0; }</style></head><body><=
div style=3D'font-family: times new roman,new york,times,serif; font-size: =
12pt; color: #000000'>Hi Chris,<br><br>thanks for taking the time to make t=
his patch, these are some excellent ideas! (CC'ing engine-devel so that we =
can discuss this with other guys as well)<br><br>First of all, I really lik=
e the way you designed plugin source page URLs (going through <em>PluginSou=
rcePageServlet</em>), e.g. "/webadmin/webadmin/plugin/<pluginName>/&l=
t;pluginSourcePage>.html", plus the concept of "path" JSON attribute.<br=
><br><span style=3D"font-style: italic;">WebadminDynamicHostingServlet</spa=
n> loads and caches all plugin definitions (<span style=3D"font-style: ital=
ic;">*.json</span> files), and directly embeds them into WebAdmin host page=
as <span style=3D"font-style: italic;">pluginDefinitions</span> JavaScript=
object. I'm assuming that <span style=3D"font-style: italic;">pluginDefini=
tions</span> object will now look like this:<br><br><span style=3D"font-fam=
ily: courier new,courier,monaco,monospace,sans-serif;">var pluginDefinition=
s =3D {</span><br style=3D"font-family: courier new,courier,monaco,monospac=
e,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,monos=
pace,sans-serif;"> "test": {</span><br style=3D"font-family: cou=
rier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: =
courier new,courier,monaco,monospace,sans-serif;"> "name"=
: "test",</span><br style=3D"font-family: courier new,courier,monaco,monosp=
ace,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,mon=
ospace,sans-serif;"> "version": "1.0",</span><br style=3D=
"font-family: courier new,courier,monaco,monospace,sans-serif;"><span style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"> &n=
bsp; "url": "/webadmin/webadmin/plugin/test/foo.html",</span><br styl=
e=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span s=
tyle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&nbs=
p; "path": "/tmp",</span><br style=3D"font-family: courier new,=
courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier n=
ew,courier,monaco,monospace,sans-serif;"> "config": {"a":=
1, "b":2, "c":3}</span><br style=3D"font-family: courier new,courier,monaco=
,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,mon=
aco,monospace,sans-serif;"> }</span><br style=3D"font-family: co=
urier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family:=
courier new,courier,monaco,monospace,sans-serif;">}</span><br><br>Original=
ly, the <span style=3D"font-style: italic;">pluginDefinitions</span> object=
looked like this:<br><br style=3D"font-family: courier new,courier,monaco,=
monospace,sans-serif;"><span style=3D"font-family: courier new,courier,mona=
co,monospace,sans-serif;">var pluginDefinitions =3D {</span><br style=3D"fo=
nt-family: courier new,courier,monaco,monospace,sans-serif;"><span style=3D=
"font-family: courier new,courier,monaco,monospace,sans-serif;">  =
;"test": "/webadmin/webadmin/plugin/test/foo.html" // Simple pluginName -&g=
t; pluginSourcePageUrl mappings</span><br style=3D"font-family: courier new=
,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier =
new,courier,monaco,monospace,sans-serif;">}</span><br><br>This is because P=
luginManager (WebAdmin) only needs <span style=3D"font-style: italic;">plug=
inName</span> ("name") and <span style=3D"font-style: italic;">pluginSource=
PageUrl</span> ("url") during startup, when creating plugin iframe. But thi=
s can be changed :)<br><br>Plugin "version" makes sense, plus the plugin co=
nfiguration object ("config") can be useful directly on the client. Let me =
explain:<br><br>Originally, plugin configuration was supposed to be passed =
to actual plugin code (through immediately-invoked-function-expression, or =
IIFE), just like this:<br><br style=3D"font-family: courier new,courier,mon=
aco,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,=
monaco,monospace,sans-serif;">(function (pluginApi, pluginConfig) { // Java=
Script IIFE</span><br style=3D"font-family: courier new,courier,monaco,mono=
space,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,m=
onospace,sans-serif;"> // ... actual plugin code ...</span><br s=
tyle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><spa=
n style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">}=
)(</span><br style=3D"font-family: courier new,courier,monaco,monospace,san=
s-serif;"><span style=3D"font-family: courier new,courier,monaco,monospace,=
sans-serif;"> parent.pluginApi, /* reference to global pluginApi=
object */</span><br style=3D"font-family: courier new,courier,monaco,monos=
pace,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,mo=
nospace,sans-serif;"> {"a":1, "b":2, "c":3} /* embedded plugin c=
onfiguration as JavaScript object */</span><br style=3D"font-family: courie=
r new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: cou=
rier new,courier,monaco,monospace,sans-serif;">);</span><br><br>The whole p=
urpose of <span style=3D"font-style: italic;">PluginSourcePageServlet</span=
> was to "wrap" actual plugin code into HTML, so that users don't need to w=
rite HTML pages for their plugins manually. <span style=3D"font-style: ital=
ic;">PluginSourcePageServlet</span> would handle any plugin dependencies (p=
laced into HTML head), with actual plugin code being wrapped into IIFE, as =
shown above. Plugin configuration was meant to be stored in a separate file=
, e.g. <span style=3D"font-style: italic;"><pluginName>-config.json</=
span>, so that users could change the default plugin configuration to suit =
their needs.<br><br>Inspired by your patch, rather than reading/embedding p=
lugin configuration when serving plugin HTML page (<span style=3D"font-styl=
e: italic;">PluginSourcePageServlet</span>), it's even better to have the p=
lugin configuration embedded directly into WebAdmin host page, along with i=
ntroducing new <span style=3D"font-style: italic;">pluginApi</span> functio=
n to retrieve the plugin configuration object.<br><br>Based on this, I sugg=
est following modifications to the original concept:<br><br>- modify origin=
al <span style=3D"font-style: italic;">pluginDefinitions</span> structure, =
from <span style=3D"font-style: italic;">pluginName -> pluginSourcePageU=
rl</span>, to <span style=3D"font-style: italic;">pluginName -> pluginDe=
fObject</span><br>- <span style=3D"font-style: italic;">pluginDefObject</sp=
an> is basically a subset of physical plugin definition (<span style=3D"fon=
t-style: italic;">test.json</span>, see below), suitable for use on the cli=
ent<br>- add following attributes to <span style=3D"font-style: italic;">pl=
uginDefObject</span>: <span style=3D"font-style: italic;">version</span>, <=
span style=3D"font-style: italic;">url</span>, <span style=3D"font-style: i=
talic;">config</span><br> * note #1: <span style=3D"font-style: =
italic;">name</span> is not needed, since it's already the key of <span sty=
le=3D"font-style: italic;">pluginName -> pluginDefObject</span> mapping<=
br> * note #2: <span style=3D"font-style: italic;">path</span> i=
s not needed on the client (more on this below)<br>- introduce <span style=
=3D"font-style: italic;">pluginApi.config(pluginName)</span> function for p=
lugins to retrieve their configuration object, and remove <span style=3D"fo=
nt-style: italic;">pluginConfig</span> parameter from main IIFE (as shown a=
bove)<br><br>[a] Physical plugin definition file (JSON) might be located at=
oVirt "DataDir", e.g. <span style=3D"font-style: italic;">/usr/share/ovirt=
-engine/ui-plugins/test.json</span>, for example:<br><br style=3D"font-fami=
ly: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-f=
amily: courier new,courier,monaco,monospace,sans-serif;">{</span><br style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"> =
; "name": "test",</span><br style=3D"font-family: courier new,courier,=
monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,couri=
er,monaco,monospace,sans-serif;"> "version": "1.0",</span><br st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span=
style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&n=
bsp; "url": "/webadmin/webadmin/plugin/test/start.html",</span><br sty=
le=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span =
style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&nb=
sp; "path": "/tmp",</span><br style=3D"font-family: courier new,courie=
r,monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,cou=
rier,monaco,monospace,sans-serif;"> "config": "test-config.json"=
</span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-=
serif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sa=
ns-serif;">}</span><br><br>[b] Plugin configuration file (JSON) might be lo=
cated at oVirt "ConfigDir", e.g. <span style=3D"font-style: italic;">/etc/o=
virt-engine/ui-plugins/test-config.json</span>, for example:<br><br style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">{</sp=
an><br style=3D"font-family: courier new,courier,monaco,monospace,sans-seri=
f;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-s=
erif;"> "a":1, "b":2, "c":3</span><br style=3D"font-family: cour=
ier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: c=
ourier new,courier,monaco,monospace,sans-serif;">}</span><br><br>[c] Finall=
y, plugin static resources (plugin source page, actual plugin code, plugin =
dependencies, CSS/images, etc.) would be located at <span style=3D"font-sty=
le: italic;">/tmp</span> (as shown in [a]), for example:<br><br style=3D"fo=
nt-family: courier new,courier,monaco,monospace,sans-serif;"><span style=3D=
"font-family: courier new,courier,monaco,monospace,sans-serif;">/tmp/start.=
html -> plugin source page, used to load actual plugin code</span><br st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span=
style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">/t=
mp/test.js -> actual plugin code</span><br style=3D"font-family: courier=
new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: cour=
ier new,courier,monaco,monospace,sans-serif;">/tmp/deps/jquery-min.js ->=
simulate 3rd party plugin dependency</span><br><br>For example:<br>"/webad=
min/webadmin/plugin/test/start.html" will be mapped to <span style=3D"font-=
style: italic;">/tmp/start.html</span><br>"/webadmin/webadmin/plugin/test/d=
eps/jquery-min.js" will be mapped to <span style=3D"font-style: italic;">/t=
mp/deps/jquery-min.js</span><br><br>This approach has some pros and cons:<b=
r>(+) plugin static resources can be served through <span style=3D"font-sty=
le: italic;">PluginSourcePageServlet</span> (pretty much like oVirt documen=
tation resources, served through oVirt Engine root war's <span style=3D"fon=
t-style: italic;">FileServlet</span>)<br>(+) plugin author has complete con=
trol over plugin source page<br>(-) plugin author actually needs to write p=
lugin source page<br><br>Overall, I think this approach is better than the =
previous one (where <span style=3D"font-style: italic;">PluginSourcePageSer=
vlet</span> took care of rendering plugin source page, but sacrificed some =
flexibility).<br><br>By the way, here's what would happen behind the scenes=
:<br><ol><li>user requests WebAdmin host page, <span style=3D"font-style: i=
talic;">WebadminDynamicHostingServlet</span> loads and caches all plugin de=
finitions [a] + plugin configurations [b] and constructs/embeds appropriate=
<span style=3D"font-style: italic;">pluginDefinitions</span> JavaScript ob=
ject<br><br></li><li>during WebAdmin startup, <span style=3D"font-style: it=
alic;">PluginManager</span> registers the plugin (name/version/url/config),=
and creates/attaches the iframe to fetch plugin source page ansynchronousl=
y<br><br></li><li><span style=3D"font-style: italic;">PluginSourcePageServl=
et</span> handles plugin source page request, resolves the correct path [c]=
and just streams the file content back to client<br><br></li></ol>> 1. =
The plugin configuration files should probably have an "enabled"=20
field and an "apiVersion" field that should be examined to determine=20
whether or not to use the plugin.<br><br>Sounds good, we can implement thes=
e later on :)<br><br>> 2. I suspect the way I've modified PluginSo=
urcePage makes it vulnerable to directory climbing attacks.<br><br>Yes, but=
we can defend against these, restricting access only to plugin's "path" an=
d its sub-directories.<br><br>> 3. Is /usr/share/ovirt-engine the =
right place for the plugin config files?<br><br>I suppose you mean plugin d=
efinition files [a], cannot tell for sure, but we can change this anytime :=
)<br><br><br>Chris, please let me know what you think, and again - many tha=
nks for sending the patch!<br><br><br>Regards,<br>Vojtech<br><br><br><hr id=
=3D"zwchr"><br>From: "Chris Frantz" <Chris.Frantz(a)hp.com><br>To: vszo=
cs(a)redhat.com<br>Sent: Wednesday, August 22, 2012 7:56:45 PM<br>Subject: UI=
Plugins configuration<br><br>Vojtech,<br><br>I decided to work on making t=
he plugin patch a bit more configurable, following some of the ideas expres=
sed by Itamar and others in the meeting yesterday. The attached patch=
is a simple first-attempt.<br><br>Plugin configurations are stored in /usr=
/share/ovirt-engine/ui-plugins/*.json.<br><br>Example:<br>{<br> =
"name": "test",<br> &n=
bsp; "version": "1.0",<br> &n=
bsp; "url": "/webadmin/webadmin/plugin/test/foo.html",<br>=
"path": "/tmp",<br> &n=
bsp; "config": {"a":1, "b":2, "c": 3}<br=
>}<br><br>The engine reads all of the *.json files in that directory to bui=
ld the list of known plugins and gives that list to the webadmin.<br><br>Wh=
en webadmin loads a plugin, it requests the URL given in the plugin config =
file. The "plugin" URL is mapped to PluginSourcePage, which will tran=
slate the first part of the path ("test") into whatever path is stored in p=
luginConfig ("/tmp") in this case, and then serve the static file (e.g. "/t=
mp/foo.html").<br><br>I didn't use the renderPluginSourcePage() method in f=
avor of just serving a static file, but I have no strong opinion on the mat=
ter. However, a plugin may want to store static resources at "path" a=
nd have the engine serve those resources. By just serving files throu=
gh PluginSourcePage, we don't need any other servlets to provide those reso=
urces.<br><br>There is still a bit of work to do:<br><br>1. The plugi=
n configuration files should probably have an "enabled" field and an "apiVe=
rsion" field that should be examined to determine whether or not to use the=
plugin.<br><br>2. I suspect the way I've modified PluginSourcePage m=
akes it vulnerable to directory climbing attacks.<br><br>3. Is /usr/s=
hare/ovirt-engine the right place for the plugin config files?<br><br>Let m=
e know what you think,<br>--Chris<br><br></div></body></html>
------=_Part_12944838_269192103.1345724057851--
12 years, 3 months
[Engine-devel] Gluster IPTable configuration
by Selvasundaram
This is a multi-part message in MIME format.
--------------030709000903050400090401
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Hi,
I want to add gluster specific IPTable configuration in addition to the
ovirt IPTable configuration (if it is gluster node).
There are two approaches,
1. Having one more gluster specific IP table config in db and merge
with ovirt IPTable config (merging NOT appending)
[I have the patch engine: Gluster specific firewall
configurations <http://gerrit.ovirt.org/#/c/7244/> #7244]
2. Having two different IP Table config (ovirt and ovirt+gluster)
and use either one.
Please provide your suggestions or improvements on this.
--
Regards
Selvasundaram
--------------030709000903050400090401
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hi,<br>
<br>
I want to add gluster specific IPTable configuration in addition to
the ovirt IPTable configuration (if it is gluster node). <br>
There are two approaches, <br>
1. Having one more gluster specific IP table config in db and
merge with ovirt IPTable config (merging NOT appending)<br>
[I have the patch <a
href="http://gerrit.ovirt.org/#/c/7244/"
class="gwt-InlineHyperlink">engine: Gluster specific firewall
configurations</a> #7244]<br>
2. Having two different IP Table config (ovirt and ovirt+gluster)
and use either one.<br>
<br>
Please provide your suggestions or improvements on this. <br>
<br>
--<br>
Regards<br>
Selvasundaram<br>
<br>
<br>
</body>
</html>
--------------030709000903050400090401--
12 years, 4 months
[Engine-devel] JUnit tests in 'bll' project
by Shireesh Anjal
Hi,
When I do a full build of oVirt engine (mvn clean install
-Pgwtdev,gwt-admin,dep,enable-dao-tests), it seems that the JUnit tests
in project 'bll' are not executed. Is this done intentionally? If yes,
is there a simple way to execute them using mvn ?
Thanks,
Shireesh
12 years, 4 months
[Engine-devel] storagedomain status via API
by Ryan Harper
Should all created storage domains have 'status' in the API? Below, I've got one active NFS data domain, and a second ISO domain defined, but not activated. the <status> element is only available for the the ISO domain.
I'd really like a way to enumerate the storage domains, and check whether a domain is OK or not.
via python shell ovirt-sdk:
>>> iso = api.storagedomains.get(name='isos-20120614')
>>> iso.name
'isos-20120614'
>>> iso.status.state
'unattached'
>>> sd = api.storagedomains.get(name='images-cluster1')
>>> sd.name
'images-cluster1'
>>> sd.status.state
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'state'
Refrence XML via https://enginehost/api/storagedomains/
<storage_domains>
<storage_domain href="/api/storagedomains/73c7f296-6dac-4bc3-95c1-f0d88a1db7ad" id="73c7f296-6dac-4bc3-95c1-f0d88a1db7ad">
<name>images-cluster1</name>
<link href="/api/storagedomains/73c7f296-6dac-4bc3-95c1-f0d88a1db7ad/permissions" rel="permissions"/>
<type>data</type>
<master>true</master>
<storage>
<type>nfs</type>
<address>ichigo-dom209.phx.austin.ibm.com</address>
<path>/images-cluster1</path>
</storage>
<available>6442450944</available>
<used>39728447488</used>
<committed>0</committed>
<storage_format>v1</storage_format>
</storage_domain>
<storage_domain href="/api/storagedomains/723c254e-7585-4c33-b8d1-cb88a2245d7d" id="723c254e-7585-4c33-b8d1-cb88a2245d7d">
<name>isos-20120614</name>
<link href="/api/storagedomains/723c254e-7585-4c33-b8d1-cb88a2245d7d/permissions" rel="permissions"/>
<link href="/api/storagedomains/723c254e-7585-4c33-b8d1-cb88a2245d7d/files" rel="files"/>
<type>iso</type>
<status>
<state>unattached</state>
</status>
<master>false</master>
<storage>
<type>nfs</type>
<address>ichigo-dom209.phx.austin.ibm.com</address>
<path>/iso-cluster1</path>
</storage>
<available>6442450944</available>
<used>39728447488</used>
<committed>0</committed>
<storage_format>v1</storage_format>
</storage_domain>
</storage_domains>
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
ryanh(a)us.ibm.com
12 years, 4 months
[Engine-devel] Update on UI Plugins: Improved plugin API
by Vojtech Szocs
------=_Part_14447953_781921536.1346149049848
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hi guys,
I was thinking about improving JavaScript plugin API so that each time a plugin calls WebAdmin, the plugin name will be part of the call. This way, PluginManager (WebAdmin) can validate the call before doing any further actions, e.g. "plugin invocation must be allowed && plugin must be initialized". In other words, this is just to ensure consistent behavior for "plugin -> WebAdmin" calls.
Here's a draft of new JavaScript API in action: http://jsfiddle.net/tHk5n/ (see the code below the comment saying "ACTUAL TEST CODE")
(I took my inspiration from jQuery source code, even though I don't fully understand JavaScript prototype OOP concept, seems a bit weird to me.)
For comparison, here's some plugin code that uses current plugin API:
// Register our plugin object (containing event handler functions) into pluginApi.plugins
pluginApi.plugins['myPlugin'] = {
UiInit: function() {
pluginApi.ui.addMainTab('Custom Tab', 'custom-tab', 'http://www.example.com/');
}
};
// Tell WebAdmin that we are ready, we need the plugin name to identify this plugin
pluginApi.ready('myPlugin');
And here's an equivalent plugin code that uses new plugin API:
// Plugin API instance for our plugin
var myPlugin = pluginApi('myPlugin');
// Register our plugin object (containing event handler functions) into myPlugin
myPlugin.register({
UiInit: function() {
myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', 'http://www.example.com/');
}
});
// Tell WebAdmin that we are ready , plugin name is already part of myPlugin
myPlugin.ready();
// Note: the above line is equivalent to: pluginApi('myPlugin').ready() ;
Let me know what you think.
Cheers,
Vojtech
------=_Part_14447953_781921536.1346149049848
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0; }</style></head><body><=
div style=3D'font-family: times new roman,new york,times,serif; font-size: =
12pt; color: #000000'>Hi guys,<br><br>I was thinking about improving JavaSc=
ript plugin API so that each time a plugin calls WebAdmin, the plugin name =
will be part of the call. This way, <em>PluginManager</em> (WebAdmin) can v=
alidate the call before doing any further actions, e.g. "plugin invocation =
must be allowed && plugin must be initialized". In other words, thi=
s is just to ensure consistent behavior for "plugin -> WebAdmin" calls.<=
br><br>Here's a draft of new JavaScript API in action: http://jsfiddle.net/=
tHk5n/ (see the code below the comment saying "ACTUAL TEST CODE")<br>(I too=
k my inspiration from jQuery source code, even though I don't fully underst=
and JavaScript prototype OOP concept, seems a bit weird to me.)<br><br><hr =
style=3D"width: 100%; height: 2px;"><br>For comparison, here's some plugin =
code that uses current plugin API:<br><br><span style=3D"font-family: couri=
er new,courier,monaco,monospace,sans-serif;">// Register our plugin object =
(containing event handler functions) into pluginApi.plugins</span><br style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">plugi=
nApi.plugins['myPlugin'] =3D {</span><br style=3D"font-family: courier new,=
courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier n=
ew,courier,monaco,monospace,sans-serif;"> UiInit: function() {</=
span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans=
-serif;"> pluginApi.ui.addMainTab('Custom Tab', 'custom-t=
ab', 'http://www.example.com/');</span><br style=3D"font-family: courier ne=
w,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier=
new,courier,monaco,monospace,sans-serif;"> }</span><br style=3D=
"font-family: courier new,courier,monaco,monospace,sans-serif;"><span style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">};</span=
><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;=
"><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif=
;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;">// Tell WebAdmin that we are ready, we need the plugin name to identi=
fy this plugin</span><br style=3D"font-family: courier new,courier,monaco,m=
onospace,sans-serif;"><span style=3D"font-family: courier new,courier,monac=
o,monospace,sans-serif;">pluginApi.ready('myPlugin');</span><br style=3D"fo=
nt-family: courier new,courier,monaco,monospace,sans-serif;"><br><hr style=
=3D"width: 100%; height: 2px;"><br>And here's an equivalent plugin code tha=
t uses new plugin API:<br><br><span style=3D"font-family: courier new,couri=
er,monaco,monospace,sans-serif;">// Plugin API instance for our plugin</spa=
n><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif=
;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;">var myPlugin =3D pluginApi('myPlugin');</span><br style=3D"font-famil=
y: courier new,courier,monaco,monospace,sans-serif;"><br style=3D"font-fami=
ly: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-f=
amily: courier new,courier,monaco,monospace,sans-serif;">// Register our pl=
ugin object (containing event handler functions) into myPlugin</span><br st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span=
style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">my=
Plugin.register({</span><br style=3D"font-family: courier new,courier,monac=
o,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,mo=
naco,monospace,sans-serif;"> UiInit: function() {</span><br styl=
e=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span s=
tyle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&nbs=
p; myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', 'http://w=
ww.example.com/');</span><br style=3D"font-family: courier new,courier,mona=
co,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,m=
onaco,monospace,sans-serif;"> }</span><br style=3D"font-family: =
courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-famil=
y: courier new,courier,monaco,monospace,sans-serif;">});</span><br style=3D=
"font-family: courier new,courier,monaco,monospace,sans-serif;"><br style=
=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span st=
yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">// Te=
ll WebAdmin that we are ready, plugin name is already part of myPlugin</spa=
n><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif=
;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se=
rif;">myPlugin.ready();</span><br style=3D"font-family: courier new,courier=
,monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,cour=
ier,monaco,monospace,sans-serif;">// Note: the above line is equivalent to:=
pluginApi('myPlugin').ready();</span><br style=3D"font-family: courier new=
,courier,monaco,monospace,sans-serif;"><br><hr style=3D"width: 100%; height=
: 2px;"><br>Let me know what you think.<br><br>Cheers,<br>Vojtech<br><br></=
div></body></html>
------=_Part_14447953_781921536.1346149049848--
12 years, 4 months
[Engine-devel] Default ports are 8700 and 8701 now
by Juan Hernandez
Hello,
Change http://gerrit.ovirt.org/6348 has been merged, so next time you
run "mvn -Psetup ..." with the updated code you will need to use 8700
instead of 8080. Let me know if you find any issue related to this change.
Regards,
Juan Hernandez
--
Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta
3ºD, 28016 Madrid, Spain
Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.
12 years, 4 months