[Devel] Proposing Yedidyah Bar David as oVirt Hosted Engine Setup maintainer
by Sandro Bonazzola
Hi,
I would like to propose Yedidyah Bar David as oVirt Hosted Engine Setup co-maintainer.
Yedidyah contributed to oVirt Hosted Engine Setup since early design phase and contributed dozens of patches.
Your response would be appreciated.
Thanks in advance.
--
Sandro Bonazzola
Better technology. Faster innovation. Powered by community collaboration.
See how it works at redhat.com
9 years, 11 months
[QE] Hardening Guide
by Sandro Bonazzola
Hi,
while I was working on Bug 1097022 - ovirt-engine-setup: weak default passwords for PostgreSQL database users
I was wondering where to write hardening tips described in comment #18.
It looks like we don't have any page on oVirt wiki about hardening.
Anyone interested in contributing to such page?
I guess it can be created as http://www.ovirt.org/OVirt_Hardening_Guide
Thoughts?
--
Sandro Bonazzola
Better technology. Faster innovation. Powered by community collaboration.
See how it works at redhat.com
10 years, 5 months
Update on UI column sort infra issues
by Vojtech Szocs
Hi guys,
just a quick update on issues related to UI column sort infra.
The client-side sorting fix [1] is now merged in master branch.
The server-side sorting fix [2] is pending review.
Also note that Lior merged a patch [3] which greatly simplifies
code when making text-based columns *client-side* sortable, for
example:
TextColumnWithTooltip<SomeEntity> nameColumn = ...
instead of this:
// for text-based columns, need to provide separate Comparator
// that (typically) uses LexoNumericComparator for comparison
nameColumn.makeSortable(someEntityPropertyComparator);
you can do this:
// uses LexoNumericComparator to compare column's text values
nameColumn.makeSortable();
--
[1] http://gerrit.ovirt.org/#/c/28392/ ... where items would
disappear from grid when activating client-side column sorting
[2] http://gerrit.ovirt.org/#/c/28557/ ... where triggering
server-side sorting on a given column might corrupt the actual
search query dispatched by the model
[3] http://gerrit.ovirt.org/#/c/28670/
--
Regards,
Vojtech
10 years, 5 months
oVirt.js GWT wrapper prototype
by Vojtech Szocs
------=_Part_26595393_401944553.1403609366320
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hello everyone,
following the announcement of oVirt.js prototype, I've developed a sample
GWT wrapper that provides Java API to oVirt.js for all GWT applications.
Please find the GWT wrapper patch attached. It bundles oVirt.js & Lo-Dash
libraries via GWT module (SdkGwtWrapper) providing Java-like API based on
oVirt.js.
In order for WebAdmin to use oVirt.js GWT wrapper, all we have to do is
add following into WebAdmin.gwt.xml (GWT module descriptor):
<inherits name="org.ovirt.engine.sdk.gwt.SdkGwtWrapper" />
and add following into pom.xml (Maven project descriptor):
<dependency>
<groupId>${engine.groupId}</groupId>
<artifactId>ovirt-js-gwt-wrapper</artifactId>
<version>${engine.version}</version>
<scope>provided</scope>
</dependency>
and that's it.
The Java API takes inspiration from oVirt.js API. For example, to add
new DataCenter:
// Create data object template, 'name' and 'local' are required.
DataCenterTemplate dcTemplate = DataCenterTemplate.create(
"test-dc", // name
false // local
);
// Set optional parameters such as 'description', if necessary.
dcTemplate.setDescription("my-desc");
// Obtain DataCenter resource collection.
ResourceCollection<DataCenter> dcColl = Sdk.get().api().getDataCenters();
// Add new DataCenter by running 'add' operation on 'dcColl'.
dcColl.add(dcTemplate).success(new SuccessCallback<DataCenter>() {
@Override
public void onSuccess(DataCenter dc) {
Window.alert("Added: " + dc.getName());
}
}).run();
The concept of resource, resource collection and operation is the same
as presented in oVirt.js.
dc.setName("test-dc-updated");
dc.setDescription("test")
dc.update().run(); // we could register 'success' callback here
You can see the full example by looking at SdkGwtWrapperTest class,
located in WebAdmin codebase (org.ovirt.engine.ui.webadmin.sdk_test).
Note that 'DataCenter' and 'DataCenterTemplate' will probably be
auto-generated from oVirt Engine REST API definition (XSD/RSDL).
As mentioned in my previous email, oVirt.js GWT wrapper ("overlay")
can be initially part of ovirt-engine repo, while oVirt.js project
deserves (in my opinion) a separate repo on its own.
Regards,
Vojtech
------=_Part_26595393_401944553.1403609366320
Content-Type: text/x-patch; name=oVirt.js-GWT-wrapper-prototype.patch
Content-Disposition: attachment;
filename=oVirt.js-GWT-wrapper-prototype.patch
Content-Transfer-Encoding: base64
RnJvbSAxNDViMTAwNzYwODlhODlkYWVlM2M3NzI4ZjBkMDFjMmQzZmNmYjBjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0
ZTogTW9uLCAyMyBKdW4gMjAxNCAxMTowMToxNiArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIHdlYmFk
bWluOiBvVmlydC5qcyBHV1Qgd3JhcHBlciBwcm90b3R5cGUKCkNoYW5nZS1JZDogSTM4ZDc2MjMy
YjFiMmMxYTIzNzk2YjA4NjFhYjZiMDhiNDZlZDg4YjAKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBT
em9jcyA8dnN6b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdy
YXBwZXIvLmdpdGlnbm9yZSAgICAgICAgfCAgICAzICsKIC4uLi93ZWJhZG1pbi9tb2R1bGVzL292
aXJ0LWpzLWd3dC13cmFwcGVyL3BvbS54bWwgIHwgICA2NSArCiAuLi4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3Nkay9nd3QvY2xpZW50L1Nkay5qYXZhICB8ICAgMTkgKwogLi4uL3Nkay9nd3QvY2xp
ZW50L1Nka0d3dFdyYXBwZXJDbGllbnRCdW5kbGUuamF2YSAgfCAgIDE0ICsKIC4uLi9zZGsvZ3d0
L2NsaWVudC9TZGtHd3RXcmFwcGVyRW50cnlQb2ludC5qYXZhICAgIHwgICAzMiArCiAuLi4vb3Jn
L292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvQXBpLmphdmEgICB8ICAgMTUgKwogLi4u
L292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvT3BlcmF0aW9uLmphdmEgfCAgIDMyICsK
IC4uLi9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlLmphdmEgIHwgICA0
OCArCiAuLi4vc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhICAgICB8
ICAgNTYgKwogLi4uL2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvU3VjY2Vzc0NhbGxiYWNrLmph
dmEgfCAgIDEyICsKIC4uLi9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIuamF2
YSAgICAgIHwgICAyNyArCiAuLi4vZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXJUZW1w
bGF0ZS5qYXZhICB8ICAgMjUgKwogLi4uL3Nkay9nd3QvY2xpZW50L2dvb2RpZXMvSXRlcmFibGVK
c0FycmF5LmphdmEgICAgfCAgIDU1ICsKIC4uLi9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0pzT2Jq
ZWN0T3ZlcmxheS5qYXZhICAgIHwgICA0MiArCiAuLi4vb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0
L1Nka0d3dFdyYXBwZXIuZ3d0LnhtbCB8ICAgMTMgKwogLi4uL2VuZ2luZS9zZGsvZ3d0L2NsaWVu
dC9yZXNvdXJjZXMvbG9kYXNoLmpzICAgICAgfCA2Nzg1ICsrKysrKysrKysrKysrKysrKysrCiAu
Li4vb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9vdmlydC5qcyB8ICA0NDUg
KysKIGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvcG9tLnhtbCAgICAgICAgICAgICAgICAgIHwg
ICAgMSArCiBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3BvbS54bWwgICAgICAg
ICB8ICAgIDYgKwogLi4uL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vQ2xpZW50TW9kdWxl
LmphdmEgfCAgICAzICsKIC4uLi91aS93ZWJhZG1pbi9zZGtfdGVzdC9TZGtHd3RXcmFwcGVyVGVz
dC5qYXZhICAgIHwgICA4MSArCiAuLi4vb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9XZWJB
ZG1pbi5nd3QueG1sICB8ICAgIDIgKwogMjIgZmlsZXMgY2hhbmdlZCwgNzc4MSBpbnNlcnRpb25z
KCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1q
cy1nd3Qtd3JhcHBlci8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9wb20ueG1sCiBjcmVhdGUgbW9kZSAx
MDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMv
bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrLmphdmEKIGNyZWF0
ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFw
cGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RX
cmFwcGVyQ2xpZW50QnVuZGxlLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJh
ZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0
L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RXcmFwcGVyRW50cnlQb2ludC5qYXZhCiBjcmVh
dGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3Jh
cHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL0Fw
aS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmly
dC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9j
bGllbnQvYXBpL09wZXJhdGlvbi5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2Vi
YWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmly
dC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlLmphdmEKIGNyZWF0ZSBtb2RlIDEw
MDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t
YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2VDb2xs
ZWN0aW9uLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv
Z3d0L2NsaWVudC9hcGkvU3VjY2Vzc0NhbGxiYWNrLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBm
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph
dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIu
amF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt
anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp
ZW50L2FwaS9lbnRpdHkvRGF0YUNlbnRlclRlbXBsYXRlLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0
NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu
L2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNB
cnJheS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9v
dmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3
dC9jbGllbnQvZ29vZGllcy9Kc09iamVjdE92ZXJsYXkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0
IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4v
cmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9TZGtHd3RXcmFwcGVyLmd3dC54bWwK
IGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3
dC13cmFwcGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp
ZW50L3Jlc291cmNlcy9sb2Rhc2guanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJh
ZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcv
b3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9vdmlydC5qcwogY3JlYXRlIG1v
ZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2
YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Nka190ZXN0L1Nka0d3dFdyYXBwZXJUZXN0
LmphdmEKCmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3
dC13cmFwcGVyLy5naXRpZ25vcmUgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpz
LWd3dC13cmFwcGVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMDczYzlmYQotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
b3ZpcnQtanMtZ3d0LXdyYXBwZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKy90YXJnZXQK
Ky90YXJnZXQKKy90YXJnZXQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
b3ZpcnQtanMtZ3d0LXdyYXBwZXIvcG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
b3ZpcnQtanMtZ3d0LXdyYXBwZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5jMWJkMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k
dWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1s
IHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3Jn
L1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1p
bnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3Jn
L1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4K
KyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAg
ICAgICAgPGdyb3VwSWQ+b3JnLm92aXJ0LmVuZ2luZS51aTwvZ3JvdXBJZD4KKyAgICAgICAgPGFy
dGlmYWN0SWQ+d2ViYWRtaW4tbW9kdWxlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+
My41LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+
b3ZpcnQtanMtZ3d0LXdyYXBwZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3Bh
Y2thZ2luZz4KKyAgICA8bmFtZT5vVmlydC5qcyB3cmFwcGVyIGZvciBHV1Q8L25hbWU+CisgICAg
PGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJ
ZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC11
c2VyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNp
ZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291
cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJl
Y3Rvcnk+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgor
ICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAg
ICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kiov
Ki5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAg
ICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+Cisg
ICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1
cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1w
bHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAg
ICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+
cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxz
PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlc291cmNlczwvZ29hbD4KKyAg
ICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhl
Y3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1
Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcu
YXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0
SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZl
cnNpb24+Mi45PC92ZXJzaW9uPiA8IS0tIFRPRE8gZGVmaW5lIHZlcnNpb24gaW4gcm9vdCBwb20u
eG1sIC0tPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAg
ICAgICA8ZW5jb2Rpbmc+JHtwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nfTwvZW5jb2Rpbmc+
CisgICAgICAgICAgICAgICAgICAgIDxsb2NhbGU+ZW48L2xvY2FsZT4KKyAgICAgICAgICAgICAg
ICAgICAgPGxpbmtzb3VyY2U+dHJ1ZTwvbGlua3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAg
PHZhbGlkYXRlTGlua3M+dHJ1ZTwvdmFsaWRhdGVMaW5rcz4KKyAgICAgICAgICAgICAgICA8L2Nv
bmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAg
ICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2Fn
ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAg
PC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAg
ICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lu
cz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv
Z3d0L2NsaWVudC9TZGsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4z
ZWE1NmVjCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmly
dC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9j
bGllbnQvU2RrLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5l
LnNkay5nd3QuY2xpZW50OworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVu
dC5hcGkuQXBpOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29vZGll
cy5Kc09iamVjdE92ZXJsYXk7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZGsgZXh0ZW5kcyBKc09i
amVjdE92ZXJsYXkgeworCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU2RrIGdldCgpIC8qLXsK
KyAgICAgICAgcmV0dXJuICR3bmQub3ZpcnQ7CisgICAgfS0qLzsKKworICAgIHByb3RlY3RlZCBT
ZGsoKSB7CisgICAgfQorCisgICAgcHVibGljIEFwaSBhcGkoKSB7CisgICAgICAgIHJldHVybiBn
ZXRPYmplY3QoImFwaSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0V3JhcHBlckNsaWVudEJ1bmRsZS5qYXZhIGIvZnJv
bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZh
L29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0V3JhcHBlckNsaWVudEJ1bmRs
ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTIzM2UKLS0tIC9k
ZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFw
cGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9TZGtHd3RX
cmFwcGVyQ2xpZW50QnVuZGxlLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcub3Zp
cnQuZW5naW5lLnNkay5nd3QuY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3Vy
Y2VzLmNsaWVudC5DbGllbnRCdW5kbGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3VyY2Vz
LmNsaWVudC5UZXh0UmVzb3VyY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2RrR3d0V3JhcHBlckNs
aWVudEJ1bmRsZSBleHRlbmRzIENsaWVudEJ1bmRsZSB7CisKKyAgICBAU291cmNlKCJyZXNvdXJj
ZXMvbG9kYXNoLmpzIikKKyAgICBUZXh0UmVzb3VyY2UgbG9EYXNoSnMoKTsKKworICAgIEBTb3Vy
Y2UoInJlc291cmNlcy9vdmlydC5qcyIpCisgICAgVGV4dFJlc291cmNlIG9WaXJ0SnMoKTsKKwor
fQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3Jh
cHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvU2RrR3d0
V3JhcHBlckVudHJ5UG9pbnQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt
anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp
ZW50L1Nka0d3dFdyYXBwZXJFbnRyeVBvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZDU0OTQwYwotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5n
aW5lL3Nkay9nd3QvY2xpZW50L1Nka0d3dFdyYXBwZXJFbnRyeVBvaW50LmphdmEKQEAgLTAsMCAr
MSwzMiBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50OworCitpbXBv
cnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuRW50cnlQb2ludDsKK2ltcG9ydCBjb20uZ29v
Z2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGll
bnQuU2NyaXB0SW5qZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBTZGtHd3RXcmFwcGVyRW50cnlQb2lu
dCBpbXBsZW1lbnRzIEVudHJ5UG9pbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Rr
R3d0V3JhcHBlckNsaWVudEJ1bmRsZSBSRVNPVVJDRVMgPSBHV1QuY3JlYXRlKFNka0d3dFdyYXBw
ZXJDbGllbnRCdW5kbGUuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQg
b25Nb2R1bGVMb2FkKCkgeworICAgICAgICBpZiAoIWlzRGVmaW5lZCgiXyIpKSB7CisgICAgICAg
ICAgICBpbmplY3RTY3JpcHRGcm9tU3RyaW5nKFJFU09VUkNFUy5sb0Rhc2hKcygpLmdldFRleHQo
KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRGVmaW5lZCgib3ZpcnQiKSkgeworICAg
ICAgICAgICAgaW5qZWN0U2NyaXB0RnJvbVN0cmluZyhSRVNPVVJDRVMub1ZpcnRKcygpLmdldFRl
eHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0U2NyaXB0
RnJvbVN0cmluZyhTdHJpbmcgc2NyaXB0Qm9keSkgeworICAgICAgICBTY3JpcHRJbmplY3Rvci5m
cm9tU3RyaW5nKHNjcmlwdEJvZHkpCisgICAgICAgICAgICAgICAgLnNldFdpbmRvdyhTY3JpcHRJ
bmplY3Rvci5UT1BfV0lORE9XKQorICAgICAgICAgICAgICAgIC5pbmplY3QoKTsKKyAgICB9CisK
KyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzRGVmaW5lZChTdHJpbmcgZ2xvYmFsKSAvKi17
CisgICAgICAgIHJldHVybiB0eXBlb2YgJHduZFtnbG9iYWxdICE9PSAndW5kZWZpbmVkJzsKKyAg
ICB9LSovOworCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0
LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2Ns
aWVudC9hcGkvQXBpLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3
dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h
cGkvQXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNjM0NQot
LS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0
LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2Fw
aS9BcGkuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2Rr
Lmd3dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVu
dC5hcGkuZW50aXR5LkRhdGFDZW50ZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0
LmNsaWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworcHVibGljIGZpbmFsIGNsYXNzIEFw
aSBleHRlbmRzIEpzT2JqZWN0T3ZlcmxheSB7CisKKyAgICBwcm90ZWN0ZWQgQXBpKCkgeworICAg
IH0KKworICAgIHB1YmxpYyBSZXNvdXJjZUNvbGxlY3Rpb248RGF0YUNlbnRlcj4gZ2V0RGF0YUNl
bnRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRPYmplY3QoImRhdGFjZW50ZXJzIik7CisgICAg
fQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3
dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h
cGkvT3BlcmF0aW9uLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3
dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9h
cGkvT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIx
NmNjMQotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt
anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xp
ZW50L2FwaS9PcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy5vdmly
dC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5z
ZGsuZ3d0LmNsaWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworaW1wb3J0IGNvbS5nb29n
bGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKKy8qKgorICogQHBhcmFtIDxU
PiBPcGVyYXRpb24gcmVzdWx0IHR5cGUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPcGVyYXRp
b248VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IGV4dGVuZHMgSnNPYmplY3RPdmVybGF5IHsK
KworICAgIHByb3RlY3RlZCBPcGVyYXRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICog
UmVnaXN0ZXIgb3BlcmF0aW9uIHN1Y2Nlc3MgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGlj
IG5hdGl2ZSBPcGVyYXRpb248VD4gc3VjY2VzcyhTdWNjZXNzQ2FsbGJhY2s8VD4gY2FsbGJhY2sp
IC8qLXsKKyAgICAgICAgdGhpcy5zdWNjZXNzKGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAg
ICAgIGNhbGxiYWNrLkBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50LmFwaS5TdWNjZXNz
Q2FsbGJhY2s6Om9uU3VjY2VzcyhMY29tL2dvb2dsZS9nd3QvY29yZS9jbGllbnQvSmF2YVNjcmlw
dE9iamVjdDspKHJlc3VsdCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LSovOworCisgICAgLyoqCisgICAgICogUnVuIHRoZSBvcGVyYXRpb24sIHNlbmRpbmcgSFRU
UCByZXF1ZXN0IHRvIHJlbW90ZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSB2
b2lkIHJ1bigpIC8qLXsKKyAgICAgICAgdGhpcy5ydW4oKTsKKyAgICB9LSovOworCit9CmRpZmYg
LS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3Ny
Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2Uu
amF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3Jj
L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2FwaS9SZXNvdXJjZS5q
YXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDBiMjUKLS0tIC9kZXYv
bnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVy
L3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3Vy
Y2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3
dC5jbGllbnQuYXBpOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5n
b29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworLyoqCisgKiBAcGFyYW0gPFI+IFR5cGUgb2YgcmVz
b3VyY2UsIHJlcXVpcmVkIGZvciBwcm9wZXIgbWV0aG9kIHNpZ25hdHVyZXMuCisgKi8KK3B1Ymxp
YyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZTxSIGV4dGVuZHMgUmVzb3VyY2U8Uj4+IGV4dGVuZHMg
SnNPYmplY3RPdmVybGF5IHsKKworICAgIHByb3RlY3RlZCBSZXNvdXJjZSgpIHsKKyAgICB9CisK
KyAgICAvKioKKyAgICAgKiBBY2Nlc3MgcmVzb3VyY2UgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJs
aWMgZmluYWwgbmF0aXZlIEpzT2JqZWN0T3ZlcmxheSBkYXRhKCkgLyoteworICAgICAgICByZXR1
cm4gdGhpcy5kYXRhKCk7CisgICAgfS0qLzsKKworICAgIC8qKgorICAgICAqIFJldHVybiBvcGVy
YXRpb24gdG8gdXBkYXRlIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFs
IG5hdGl2ZSBPcGVyYXRpb248Uj4gdXBkYXRlKEpzT2JqZWN0T3ZlcmxheSBvcHRpb25zKSAvKi17
CisgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShvcHRpb25zIHx8IHt9KTsKKyAgICB9LSovOwor
CisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0byB1cGRhdGUgdGhpcyByZXNvdXJj
ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT3BlcmF0aW9uPFI+IHVwZGF0ZSgpIHsKKyAg
ICAgICAgcmV0dXJuIHVwZGF0ZShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1
cm4gb3BlcmF0aW9uIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHB1Ymxp
YyBmaW5hbCBuYXRpdmUgT3BlcmF0aW9uPEpzT2JqZWN0T3ZlcmxheT4gZGVsZXRlKEpzT2JqZWN0
T3ZlcmxheSBvcHRpb25zKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzWydkZWxldGUnXShvcHRp
b25zIHx8IHt9KTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlv
biB0byBkZWxldGUgdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT3Bl
cmF0aW9uPEpzT2JqZWN0T3ZlcmxheT4gZGVsZXRlKCkgeworICAgICAgICByZXR1cm4gZGVsZXRl
KG51bGwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2Rr
L2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhIGIvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjUwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph
dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvUmVzb3VyY2VDb2xsZWN0aW9u
LmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3Qu
Y2xpZW50LmFwaTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29v
ZGllcy5JdGVyYWJsZUpzQXJyYXk7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNs
aWVudC5nb29kaWVzLkpzT2JqZWN0T3ZlcmxheTsKKworLyoqCisgKiBAcGFyYW0gPFI+IFR5cGUg
b2YgYXNzb2NpYXRlZCByZXNvdXJjZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNl
Q29sbGVjdGlvbjxSIGV4dGVuZHMgUmVzb3VyY2U8Uj4+IGV4dGVuZHMgSnNPYmplY3RPdmVybGF5
IHsKKworICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAg
LyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0byByZXRyaWV2ZSByZXNvdXJjZSBieSBJRC4K
KyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIE9wZXJhdGlvbjxSPiBnZXQoU3RyaW5nIGlkLCBK
c09iamVjdE92ZXJsYXkgb3B0aW9ucykgLyoteworICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQs
IG9wdGlvbnMgfHwge30pOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3Bl
cmF0aW9uIHRvIHJldHJpZXZlIHJlc291cmNlIGJ5IElELgorICAgICAqLworICAgIHB1YmxpYyBP
cGVyYXRpb248Uj4gZ2V0KFN0cmluZyBpZCkgeworICAgICAgICByZXR1cm4gZ2V0KGlkLCBudWxs
KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3BlcmF0aW9uIHRvIGxpc3QgcmVz
b3VyY2VzIGdyb3VwZWQgYnkgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAg
IHB1YmxpYyBuYXRpdmUgT3BlcmF0aW9uPEl0ZXJhYmxlSnNBcnJheTxSPj4gbGlzdChKc09iamVj
dE92ZXJsYXkgb3B0aW9ucykgLyoteworICAgICAgICByZXR1cm4gdGhpcy5saXN0KG9wdGlvbnMg
fHwge30pOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb3BlcmF0aW9uIHRv
IGxpc3QgcmVzb3VyY2VzIGdyb3VwZWQgYnkgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAg
ICAqLworICAgIHB1YmxpYyBPcGVyYXRpb248SXRlcmFibGVKc0FycmF5PFI+PiBsaXN0KCkgewor
ICAgICAgICByZXR1cm4gbGlzdChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1
cm4gb3BlcmF0aW9uIHRvIGFkZCByZXNvdXJjZSByZXByZXNlbnRlZCBieSAnZGF0YScgb2JqZWN0
IHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZl
IE9wZXJhdGlvbjxSPiBhZGQoSnNPYmplY3RPdmVybGF5IGRhdGEsIEpzT2JqZWN0T3ZlcmxheSBv
cHRpb25zKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzLmFkZChkYXRhIHx8IHt9LCBvcHRpb25z
IHx8IHt9KTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG9wZXJhdGlvbiB0
byBhZGQgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgJ2RhdGEnIG9iamVjdCB0byB0aGlzIHJlc291
cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIE9wZXJhdGlvbjxSPiBhZGQoSnNP
YmplY3RPdmVybGF5IGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGFkZChkYXRhLCBudWxsKTsKKyAg
ICB9CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMt
Z3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50
L2FwaS9TdWNjZXNzQ2FsbGJhY2suamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3Zp
cnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3Qv
Y2xpZW50L2FwaS9TdWNjZXNzQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5mYjI3YzllCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdp
bmUvc2RrL2d3dC9jbGllbnQvYXBpL1N1Y2Nlc3NDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsMTIg
QEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5hcGk7CisKK2ltcG9y
dCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworCisvKioKKyAq
IEBwYXJhbSA8VD4gT3BlcmF0aW9uIHJlc3VsdCB0eXBlLgorICovCitwdWJsaWMgaW50ZXJmYWNl
IFN1Y2Nlc3NDYWxsYmFjazxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4geworCisgICAgdm9p
ZCBvblN1Y2Nlc3MoVCByZXN1bHQpOworCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1p
bi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu
Z2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFDZW50ZXIuamF2YSBiL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcv
b3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2FwaS9lbnRpdHkvRGF0YUNlbnRlci5qYXZhCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWU5NDQKLS0tIC9kZXYvbnVsbAor
KysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t
YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFD
ZW50ZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2Rr
Lmd3dC5jbGllbnQuYXBpLmVudGl0eTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3
dC5jbGllbnQuYXBpLlJlc291cmNlOworCisvLyBUT0RPIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF1
dG8tZ2VuZXJhdGVkCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YUNlbnRlciBleHRlbmRzIFJlc291
cmNlPERhdGFDZW50ZXI+IHsKKworICAgIHByb3RlY3RlZCBEYXRhQ2VudGVyKCkgeworICAgIH0K
KworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEoKS5n
ZXRTdHJpbmcoIm5hbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmlu
ZyBuYW1lKSB7CisgICAgICAgIGRhdGEoKS5zZXRTdHJpbmcoIm5hbWUiLCBuYW1lKTsKKyAgICB9
CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4g
ZGF0YSgpLmdldFN0cmluZygiZGVzY3JpcHRpb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9p
ZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgZGF0YSgpLnNl
dFN0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorCit9CmRpZmYgLS1n
aXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9t
YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9hcGkvZW50aXR5L0RhdGFD
ZW50ZXJUZW1wbGF0ZS5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9vdmlydC1qcy1n
d3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQv
YXBpL2VudGl0eS9EYXRhQ2VudGVyVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi42NWQxMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy9vdmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l
bmdpbmUvc2RrL2d3dC9jbGllbnQvYXBpL2VudGl0eS9EYXRhQ2VudGVyVGVtcGxhdGUuamF2YQpA
QCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQu
YXBpLmVudGl0eTsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUuc2RrLmd3dC5jbGllbnQuZ29v
ZGllcy5Kc09iamVjdE92ZXJsYXk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVu
dC5KYXZhU2NyaXB0T2JqZWN0OworCisvL1RPRE8gdGhpcyBjbGFzcyBzaG91bGQgYmUgYXV0by1n
ZW5lcmF0ZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQ2VudGVyVGVtcGxhdGUgZXh0ZW5kcyBK
c09iamVjdE92ZXJsYXkgeworCisgICAgcHJvdGVjdGVkIERhdGFDZW50ZXJUZW1wbGF0ZSgpIHsK
KyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERhdGFDZW50ZXJUZW1wbGF0ZSBjcmVhdGUoU3Ry
aW5nIG5hbWUsIEJvb2xlYW4gbG9jYWwpIHsKKyAgICAgICAgRGF0YUNlbnRlclRlbXBsYXRlIG9i
aiA9IEphdmFTY3JpcHRPYmplY3QuY3JlYXRlT2JqZWN0KCkuY2FzdCgpOworICAgICAgICBvYmou
c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7CisgICAgICAgIG9iai5zZXRCb29sZWFuKCJsb2NhbCIs
IGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YUNl
bnRlclRlbXBsYXRlIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAg
ICBzZXRTdHJpbmcoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm4g
dGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
b3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9n
d3QvY2xpZW50L2dvb2RpZXMvSXRlcmFibGVKc0FycmF5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1p
bi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu
Z2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNBcnJheS5qYXZhCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTE3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2ph
dmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29kaWVzL0l0ZXJhYmxlSnNBcnJh
eS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0
LmNsaWVudC5nb29kaWVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGph
dmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu
Y29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3Jl
LmNsaWVudC5Kc0FycmF5OworCisvKioKKyAqIEBwYXJhbSA8VD4gVHlwZSBvZiBvYmplY3QgY29u
dGFpbmVkIGluIHRoZSBhcnJheS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEl0ZXJhYmxlSnNB
cnJheTxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gZXh0ZW5kcyBKc0FycmF5PFQ+IGltcGxl
bWVudHMgSXRlcmFibGU8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnNBcnJheUl0
ZXJhdG9yPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+
IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEpzQXJyYXk8VD4gYXJyYXk7CisKKyAgICAgICAg
cHJpdmF0ZSBpbnQgaW5kZXg7CisgICAgICAgIHByaXZhdGUgaW50IGxhc3RJbmRleDsKKworICAg
ICAgICBwcml2YXRlIEpzQXJyYXlJdGVyYXRvcihKc0FycmF5PFQ+IGFycmF5KSB7CisgICAgICAg
ICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDsKKyAg
ICAgICAgICAgIHRoaXMubGFzdEluZGV4ID0gYXJyYXkubGVuZ3RoKCk7CisgICAgICAgIH0KKwor
ICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAg
ICAgICAgICAgIHJldHVybiBpbmRleCA8IGxhc3RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAg
IEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFo
YXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2Vw
dGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFycmF5LmdldChpbmRl
eCsrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9p
ZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25F
eGNlcHRpb24oInJlbW92ZSgpIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0K
KworICAgIH0KKworICAgIHByb3RlY3RlZCBJdGVyYWJsZUpzQXJyYXkoKSB7CisgICAgfQorCisg
ICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworICAgICAg
ICByZXR1cm4gbmV3IEpzQXJyYXlJdGVyYXRvcjxUPih0aGlzKTsKKyAgICB9CisKK30KZGlmZiAt
LWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3Jj
L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L2dvb2RpZXMvSnNPYmpl
Y3RPdmVybGF5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13
cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsvZ3d0L2NsaWVudC9nb29k
aWVzL0pzT2JqZWN0T3ZlcmxheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmQxMWE0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS9zZGsv
Z3d0L2NsaWVudC9nb29kaWVzL0pzT2JqZWN0T3ZlcmxheS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAK
K3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5nb29kaWVzOworCitpbXBv
cnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKKworcHVibGlj
IGFic3RyYWN0IGNsYXNzIEpzT2JqZWN0T3ZlcmxheSBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Qg
eworCisgICAgcHJvdGVjdGVkIEpzT2JqZWN0T3ZlcmxheSgpIHsKKyAgICB9CisKKyAgICBwdWJs
aWMgZmluYWwgbmF0aXZlIDxUIGV4dGVuZHMgSnNPYmplY3RPdmVybGF5PiBUIGdldE9iamVjdChT
dHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgfS0qLzsKKwor
ICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSAvKi17
CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXldID09PSAnc3RyaW5nJyA/IHRoaXNba2V5
XSA6IG51bGw7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgRG91YmxlIGdl
dERvdWJsZShTdHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXld
ID09PSAnbnVtYmVyJyA/IEBqYXZhLmxhbmcuRG91YmxlOjp2YWx1ZU9mKEQpKHRoaXNba2V5XSkg
OiBudWxsOworICAgIH0tKi87CisKKyAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEJvb2xlYW4gZ2V0
Qm9vbGVhbihTdHJpbmcga2V5KSAvKi17CisgICAgICAgIHJldHVybiB0eXBlb2YgdGhpc1trZXld
ID09PSAnYm9vbGVhbicgPyBAamF2YS5sYW5nLkJvb2xlYW46OnZhbHVlT2YoWikodGhpc1trZXld
KSA6IG51bGw7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRP
YmplY3QoU3RyaW5nIGtleSwgSmF2YVNjcmlwdE9iamVjdCB2YWx1ZSkgLyoteworICAgICAgICB0
aGlzW2tleV0gPSB2YWx1ZTsKKyAgICB9LSovOworCisgICAgcHVibGljIGZpbmFsIG5hdGl2ZSB2
b2lkIHNldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIC8qLXsKKyAgICAgICAgdGhp
c1trZXldID0gdmFsdWU7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9p
ZCBzZXROdW1iZXIoU3RyaW5nIGtleSwgRG91YmxlIHZhbHVlKSAvKi17CisgICAgICAgIHRoaXNb
a2V5XSA9IHZhbHVlLkBqYXZhLmxhbmcuRG91YmxlOjpkb3VibGVWYWx1ZSgpKCk7CisgICAgfS0q
LzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgdm9pZCBzZXRCb29sZWFuKFN0cmluZyBrZXks
IEJvb2xlYW4gdmFsdWUpIC8qLXsKKyAgICAgICAgdGhpc1trZXldID0gdmFsdWUuQGphdmEubGFu
Zy5Cb29sZWFuOjpib29sZWFuVmFsdWUoKSgpOworICAgIH0tKi87CisKK30KZGlmZiAtLWdpdCBh
L2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4v
cmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9TZGtHd3RXcmFwcGVyLmd3dC54bWwg
Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu
L3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvU2RrR3d0V3JhcHBlci5nd3QueG1s
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDY4MmIKLS0tIC9kZXYvbnVs
bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3Ny
Yy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvU2RrR3d0V3JhcHBlci5n
d3QueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVU
Ri04Ij8+Cis8IURPQ1RZUEUgbW9kdWxlIFBVQkxJQyAiLS8vR29vZ2xlIEluYy4vL0RURCBHb29n
bGUgV2ViIFRvb2xraXQgMi41LjEvL0VOIgorICAgICJodHRwOi8vZ29vZ2xlLXdlYi10b29sa2l0
Lmdvb2dsZWNvZGUuY29tL3N2bi90YWdzLzIuNS4xL2Rpc3Ryby1zb3VyY2UvY29yZS9zcmMvZ3d0
LW1vZHVsZS5kdGQiPgorPG1vZHVsZT4KKworICAgIDxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xl
Lmd3dC5jb3JlLkNvcmUiIC8+CisgICAgPGluaGVyaXRzIG5hbWU9ImNvbS5nb29nbGUuZ3d0LnJl
c291cmNlcy5SZXNvdXJjZXMiIC8+CisKKyAgICA8c291cmNlIHBhdGg9ImNsaWVudCIgLz4KKwor
ICAgIDxlbnRyeS1wb2ludCBjbGFzcz0ib3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5T
ZGtHd3RXcmFwcGVyRW50cnlQb2ludCIgLz4KKworPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9mcm9u
dGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWluL3Jlc291
cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9sb2Rhc2guanMg
Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL292aXJ0LWpzLWd3dC13cmFwcGVyL3NyYy9tYWlu
L3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Nkay9nd3QvY2xpZW50L3Jlc291cmNlcy9sb2Rh
c2guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1M2U1YQotLS0gL2Rl
di9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBw
ZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvcmVz
b3VyY2VzL2xvZGFzaC5qcwpAQCAtMCwwICsxLDY3ODUgQEAKKy8qKgorICogQGxpY2Vuc2UKKyAq
IExvLURhc2ggMi40LjEgKEN1c3RvbSBCdWlsZCkgPGh0dHA6Ly9sb2Rhc2guY29tLz4KKyAqIEJ1
aWxkOiBgbG9kYXNoIG1vZGVybiAtbyAuL2Rpc3QvbG9kYXNoLmpzYAorICogQ29weXJpZ2h0IDIw
MTItMjAxMyBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz4K
KyAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS41LjIgPGh0dHA6Ly91bmRlcnNjb3JlanMub3Jn
L0xJQ0VOU0U+CisgKiBDb3B5cmlnaHQgMjAwOS0yMDEzIEplcmVteSBBc2hrZW5hcywgRG9jdW1l
bnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCisgKiBBdmFpbGFi
bGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHA6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CisgKi8KKzso
ZnVuY3Rpb24oKSB7CisKKyAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVm
aW5lZGAgaW4gcHJlIEVTNSBlbnZpcm9ubWVudHMgKi8KKyAgdmFyIHVuZGVmaW5lZDsKKworICAv
KiogVXNlZCB0byBwb29sIGFycmF5cyBhbmQgb2JqZWN0cyB1c2VkIGludGVybmFsbHkgKi8KKyAg
dmFyIGFycmF5UG9vbCA9IFtdLAorICAgICAgb2JqZWN0UG9vbCA9IFtdOworCisgIC8qKiBVc2Vk
IHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgKi8KKyAgdmFyIGlkQ291bnRlciA9IDA7CisKKyAgLyoq
IFVzZWQgdG8gcHJlZml4IGtleXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggYF9fcHJvdG9fX2AgYW5k
IHByb3BlcnRpZXMgb24gYE9iamVjdC5wcm90b3R5cGVgICovCisgIHZhciBrZXlQcmVmaXggPSAr
bmV3IERhdGUgKyAnJzsKKworICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB3aGVuIG9wdGltaXphdGlv
bnMgYXJlIGVuYWJsZWQgZm9yIGxhcmdlIGFycmF5cyAqLworICB2YXIgbGFyZ2VBcnJheVNpemUg
PSA3NTsKKworICAvKiogVXNlZCBhcyB0aGUgbWF4IHNpemUgb2YgdGhlIGBhcnJheVBvb2xgIGFu
ZCBgb2JqZWN0UG9vbGAgKi8KKyAgdmFyIG1heFBvb2xTaXplID0gNDA7CisKKyAgLyoqIFVzZWQg
dG8gZGV0ZWN0IGFuZCB0ZXN0IHdoaXRlc3BhY2UgKi8KKyAgdmFyIHdoaXRlc3BhY2UgPSAoCisg
ICAgLy8gd2hpdGVzcGFjZQorICAgICcgXHRceDBCXGZceEEwXHVmZWZmJyArCisKKyAgICAvLyBs
aW5lIHRlcm1pbmF0b3JzCisgICAgJ1xuXHJcdTIwMjhcdTIwMjknICsKKworICAgIC8vIHVuaWNv
ZGUgY2F0ZWdvcnkgIlpzIiBzcGFjZSBzZXBhcmF0b3JzCisgICAgJ1x1MTY4MFx1MTgwZVx1MjAw
MFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1
MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMCcKKyAgKTsKKworICAvKiogVXNlZCB0byBtYXRjaCBlbXB0
eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlICovCisgIHZhciBy
ZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cYl9fcCBcKz0gJyc7L2csCisgICAgICByZUVtcHR5U3Ry
aW5nTWlkZGxlID0gL1xiKF9fcCBcKz0pICcnIFwrL2csCisgICAgICByZUVtcHR5U3RyaW5nVHJh
aWxpbmcgPSAvKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nOworCisgIC8qKgorICAgKiBV
c2VkIHRvIG1hdGNoIEVTNiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzCisgICAqIGh0dHA6Ly9wZW9wbGUu
bW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWxpdGVyYWxzLXN0cmlu
Zy1saXRlcmFscworICAgKi8KKyAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cJFx7KFteXFx9XSooPzpc
XC5bXlxcfV0qKSopXH0vZzsKKworICAvKiogVXNlZCB0byBtYXRjaCByZWdleHAgZmxhZ3MgZnJv
bSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMgKi8KKyAgdmFyIHJlRmxhZ3MgPSAvXHcqJC87
CisKKyAgLyoqIFVzZWQgdG8gZGV0ZWN0ZWQgbmFtZWQgZnVuY3Rpb25zICovCisgIHZhciByZUZ1
bmNOYW1lID0gL15ccypmdW5jdGlvblsgXG5cclx0XStcdy87CisKKyAgLyoqIFVzZWQgdG8gbWF0
Y2ggImludGVycG9sYXRlIiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzICovCisgIHZhciByZUludGVycG9s
YXRlID0gLzwlPShbXHNcU10rPyklPi9nOworCisgIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcg
d2hpdGVzcGFjZSBhbmQgemVyb3MgdG8gYmUgcmVtb3ZlZCAqLworICB2YXIgcmVMZWFkaW5nU3Bh
Y2VzQW5kWmVyb3MgPSBSZWdFeHAoJ15bJyArIHdoaXRlc3BhY2UgKyAnXSowKyg/PS4kKScpOwor
CisgIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1p
dGVycyAqLworICB2YXIgcmVOb01hdGNoID0gLygkXikvOworCisgIC8qKiBVc2VkIHRvIGRldGVj
dCBmdW5jdGlvbnMgY29udGFpbmluZyBhIGB0aGlzYCByZWZlcmVuY2UgKi8KKyAgdmFyIHJlVGhp
cyA9IC9cYnRoaXNcYi87CisKKyAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3Rl
cnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzICovCisgIHZhciByZVVuZXNjYXBlZFN0cmlu
ZyA9IC9bJ1xuXHJcdFx1MjAyOFx1MjAyOVxcXS9nOworCisgIC8qKiBVc2VkIHRvIGFzc2lnbiBk
ZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcyAqLworICB2YXIgY29udGV4dFByb3Bz
ID0gWworICAgICdBcnJheScsICdCb29sZWFuJywgJ0RhdGUnLCAnRnVuY3Rpb24nLCAnTWF0aCcs
ICdOdW1iZXInLCAnT2JqZWN0JywKKyAgICAnUmVnRXhwJywgJ1N0cmluZycsICdfJywgJ2F0dGFj
aEV2ZW50JywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdpc05hTicsCisgICAgJ3BhcnNl
SW50JywgJ3NldFRpbWVvdXQnCisgIF07CisKKyAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBz
b3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeSAqLworICB2YXIgdGVtcGxhdGVDb3VudGVyID0g
MDsKKworICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHNob3J0Y3V0cyAqLworICB2YXIg
YXJnc0NsYXNzID0gJ1tvYmplY3QgQXJndW1lbnRzXScsCisgICAgICBhcnJheUNsYXNzID0gJ1tv
YmplY3QgQXJyYXldJywKKyAgICAgIGJvb2xDbGFzcyA9ICdbb2JqZWN0IEJvb2xlYW5dJywKKyAg
ICAgIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJywKKyAgICAgIGZ1bmNDbGFzcyA9ICdbb2Jq
ZWN0IEZ1bmN0aW9uXScsCisgICAgICBudW1iZXJDbGFzcyA9ICdbb2JqZWN0IE51bWJlcl0nLAor
ICAgICAgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJywKKyAgICAgIHJlZ2V4cENsYXNz
ID0gJ1tvYmplY3QgUmVnRXhwXScsCisgICAgICBzdHJpbmdDbGFzcyA9ICdbb2JqZWN0IFN0cmlu
Z10nOworCisgIC8qKiBVc2VkIHRvIGlkZW50aWZ5IG9iamVjdCBjbGFzc2lmaWNhdGlvbnMgdGhh
dCBgXy5jbG9uZWAgc3VwcG9ydHMgKi8KKyAgdmFyIGNsb25lYWJsZUNsYXNzZXMgPSB7fTsKKyAg
Y2xvbmVhYmxlQ2xhc3Nlc1tmdW5jQ2xhc3NdID0gZmFsc2U7CisgIGNsb25lYWJsZUNsYXNzZXNb
YXJnc0NsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbYXJyYXlDbGFzc10gPQorICBjbG9uZWFibGVD
bGFzc2VzW2Jvb2xDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW2RhdGVDbGFzc10gPQorICBjbG9u
ZWFibGVDbGFzc2VzW251bWJlckNsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbb2JqZWN0Q2xhc3Nd
ID0KKyAgY2xvbmVhYmxlQ2xhc3Nlc1tyZWdleHBDbGFzc10gPSBjbG9uZWFibGVDbGFzc2VzW3N0
cmluZ0NsYXNzXSA9IHRydWU7CisKKyAgLyoqIFVzZWQgYXMgYW4gaW50ZXJuYWwgYF8uZGVib3Vu
Y2VgIG9wdGlvbnMgb2JqZWN0ICovCisgIHZhciBkZWJvdW5jZU9wdGlvbnMgPSB7CisgICAgJ2xl
YWRpbmcnOiBmYWxzZSwKKyAgICAnbWF4V2FpdCc6IDAsCisgICAgJ3RyYWlsaW5nJzogZmFsc2UK
KyAgfTsKKworICAvKiogVXNlZCBhcyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYF9fYmlu
ZERhdGFfX2AgKi8KKyAgdmFyIGRlc2NyaXB0b3IgPSB7CisgICAgJ2NvbmZpZ3VyYWJsZSc6IGZh
bHNlLAorICAgICdlbnVtZXJhYmxlJzogZmFsc2UsCisgICAgJ3ZhbHVlJzogbnVsbCwKKyAgICAn
d3JpdGFibGUnOiBmYWxzZQorICB9OworCisgIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1
ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIE9iamVjdCAqLworICB2YXIgb2JqZWN0VHlwZXMg
PSB7CisgICAgJ2Jvb2xlYW4nOiBmYWxzZSwKKyAgICAnZnVuY3Rpb24nOiB0cnVlLAorICAgICdv
YmplY3QnOiB0cnVlLAorICAgICdudW1iZXInOiBmYWxzZSwKKyAgICAnc3RyaW5nJzogZmFsc2Us
CisgICAgJ3VuZGVmaW5lZCc6IGZhbHNlCisgIH07CisKKyAgLyoqIFVzZWQgdG8gZXNjYXBlIGNo
YXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMgKi8KKyAg
dmFyIHN0cmluZ0VzY2FwZXMgPSB7CisgICAgJ1xcJzogJ1xcJywKKyAgICAiJyI6ICInIiwKKyAg
ICAnXG4nOiAnbicsCisgICAgJ1xyJzogJ3InLAorICAgICdcdCc6ICd0JywKKyAgICAnXHUyMDI4
JzogJ3UyMDI4JywKKyAgICAnXHUyMDI5JzogJ3UyMDI5JworICB9OworCisgIC8qKiBVc2VkIGFz
IGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0ICovCisgIHZhciByb290ID0gKG9iamVj
dFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdykgfHwgdGhpczsKKworICAvKiogRGV0ZWN0
IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgICovCisgIHZhciBmcmVlRXhwb3J0cyA9IG9iamVjdFR5
cGVzW3R5cGVvZiBleHBvcnRzXSAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4
cG9ydHM7CisKKyAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgICovCisgIHZhciBm
cmVlTW9kdWxlID0gb2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1
bGUubm9kZVR5cGUgJiYgbW9kdWxlOworCisgIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9u
SlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AgKi8KKyAgdmFyIG1vZHVsZUV4cG9ydHMgPSBm
cmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHMgJiYgZnJlZUV4
cG9ydHM7CisKKyAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5q
cyBvciBCcm93c2VyaWZpZWQgY29kZSBhbmQgdXNlIGl0IGFzIGByb290YCAqLworICB2YXIgZnJl
ZUdsb2JhbCA9IG9iamVjdFR5cGVzW3R5cGVvZiBnbG9iYWxdICYmIGdsb2JhbDsKKyAgaWYgKGZy
ZWVHbG9iYWwgJiYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9i
YWwud2luZG93ID09PSBmcmVlR2xvYmFsKSkgeworICAgIHJvb3QgPSBmcmVlR2xvYmFsOworICB9
CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyoqCisgICAqIFRoZSBiYXNlIGltcGxl
bWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYmluYXJ5IHNlYXJj
aGVzCisgICAqIG9yIGBmcm9tSW5kZXhgIGNvbnN0cmFpbnRzLgorICAgKgorICAgKiBAcHJpdmF0
ZQorICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgKiBA
cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0ge251
bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAqIEByZXR1
cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAt
MWAuCisgICAqLworICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRl
eCkgeworICAgIHZhciBpbmRleCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLAorICAgICAgICBsZW5n
dGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICB3aGlsZSAoKytpbmRleCA8IGxl
bmd0aCkgeworICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHsKKyAgICAgICAgcmV0
dXJuIGluZGV4OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKioK
KyAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgYF8uY29udGFpbnNgIGZvciBjYWNoZSBvYmplY3Rz
IHRoYXQgbWltaWNzIHRoZSByZXR1cm4KKyAgICogc2lnbmF0dXJlIG9mIGBfLmluZGV4T2ZgIGJ5
IHJldHVybmluZyBgMGAgaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCBlbHNlIGAtMWAuCisgICAqCisg
ICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgb2JqZWN0
IHRvIGluc3BlY3QuCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBm
b3IuCisgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYDBgIGlmIGB2YWx1ZWAgaXMgZm91
bmQsIGVsc2UgYC0xYC4KKyAgICovCisgIGZ1bmN0aW9uIGNhY2hlSW5kZXhPZihjYWNoZSwgdmFs
dWUpIHsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKyAgICBjYWNoZSA9IGNhY2hlLmNh
Y2hlOworCisgICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHsKKyAg
ICAgIHJldHVybiBjYWNoZVt2YWx1ZV0gPyAwIDogLTE7CisgICAgfQorICAgIGlmICh0eXBlICE9
ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKKyAgICAgIHR5cGUgPSAnb2JqZWN0JzsK
KyAgICB9CisgICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZp
eCArIHZhbHVlOworICAgIGNhY2hlID0gKGNhY2hlID0gY2FjaGVbdHlwZV0pICYmIGNhY2hlW2tl
eV07CisKKyAgICByZXR1cm4gdHlwZSA9PSAnb2JqZWN0JworICAgICAgPyAoY2FjaGUgJiYgYmFz
ZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA+IC0xID8gMCA6IC0xKQorICAgICAgOiAoY2FjaGUgPyAw
IDogLTEpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSBnaXZlbiB2YWx1ZSB0byB0aGUgY29y
cmVzcG9uZGluZyBjYWNoZSBvYmplY3QuCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJh
bSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgY2FjaGUuCisgICAqLworICBmdW5j
dGlvbiBjYWNoZVB1c2godmFsdWUpIHsKKyAgICB2YXIgY2FjaGUgPSB0aGlzLmNhY2hlLAorICAg
ICAgICB0eXBlID0gdHlwZW9mIHZhbHVlOworCisgICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8
IHZhbHVlID09IG51bGwpIHsKKyAgICAgIGNhY2hlW3ZhbHVlXSA9IHRydWU7CisgICAgfSBlbHNl
IHsKKyAgICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHsKKyAg
ICAgICAgdHlwZSA9ICdvYmplY3QnOworICAgICAgfQorICAgICAgdmFyIGtleSA9IHR5cGUgPT0g
J251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlLAorICAgICAgICAgIHR5cGVDYWNo
ZSA9IGNhY2hlW3R5cGVdIHx8IChjYWNoZVt0eXBlXSA9IHt9KTsKKworICAgICAgaWYgKHR5cGUg
PT0gJ29iamVjdCcpIHsKKyAgICAgICAgKHR5cGVDYWNoZVtrZXldIHx8ICh0eXBlQ2FjaGVba2V5
XSA9IFtdKSkucHVzaCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0eXBlQ2FjaGVb
a2V5XSA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVzZWQgYnkg
YF8ubWF4YCBhbmQgYF8ubWluYCBhcyB0aGUgZGVmYXVsdCBjYWxsYmFjayB3aGVuIGEgZ2l2ZW4K
KyAgICogY29sbGVjdGlvbiBpcyBhIHN0cmluZyB2YWx1ZS4KKyAgICoKKyAgICogQHByaXZhdGUK
KyAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBjaGFyYWN0ZXIgdG8gaW5zcGVjdC4KKyAg
ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29kZSB1bml0IG9mIGdpdmVuIGNoYXJh
Y3Rlci4KKyAgICovCisgIGZ1bmN0aW9uIGNoYXJBdENhbGxiYWNrKHZhbHVlKSB7CisgICAgcmV0
dXJuIHZhbHVlLmNoYXJDb2RlQXQoMCk7CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSBgc29y
dEJ5YCB0byBjb21wYXJlIHRyYW5zZm9ybWVkIGBjb2xsZWN0aW9uYCBlbGVtZW50cywgc3RhYmxl
IHNvcnRpbmcKKyAgICogdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAqCisgICAqIEBwcml2
YXRlCisgICAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYmAu
CisgICAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYWAuCisg
ICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIG9m
IGAxYCBvciBgLTFgLgorICAgKi8KKyAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyhhLCBiKSB7
CisgICAgdmFyIGFjID0gYS5jcml0ZXJpYSwKKyAgICAgICAgYmMgPSBiLmNyaXRlcmlhLAorICAg
ICAgICBpbmRleCA9IC0xLAorICAgICAgICBsZW5ndGggPSBhYy5sZW5ndGg7CisKKyAgICB3aGls
ZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgdmFyIHZhbHVlID0gYWNbaW5kZXhdLAorICAg
ICAgICAgIG90aGVyID0gYmNbaW5kZXhdOworCisgICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7
CisgICAgICAgIGlmICh2YWx1ZSA+IG90aGVyIHx8IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVk
JykgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA8
IG90aGVyIHx8IHR5cGVvZiBvdGhlciA9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIHJldHVy
biAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBGaXhlcyBhbiBgQXJyYXkj
c29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25z
CisgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8g
cmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvcgorICAgIC8vIGBhYCBhbmQgYGJgLiBTZWUgaHR0cHM6
Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0NworICAgIC8vCisgICAg
Ly8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5l
cy4KKyAgICAvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/
aWQ9OTAKKyAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7CisgIH0KKworICAvKioKKyAgICog
Q3JlYXRlcyBhIGNhY2hlIG9iamVjdCB0byBvcHRpbWl6ZSBsaW5lYXIgc2VhcmNoZXMgb2YgbGFy
Z2UgYXJyYXlzLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge0FycmF5fSBbYXJy
YXk9W11dIFRoZSBhcnJheSB0byBzZWFyY2guCisgICAqIEByZXR1cm5zIHtudWxsfE9iamVjdH0g
UmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9yIGBudWxsYCBpZiBjYWNoaW5nIHNob3VsZCBub3Qg
YmUgdXNlZC4KKyAgICovCisgIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGFycmF5KSB7CisgICAgdmFy
IGluZGV4ID0gLTEsCisgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwKKyAgICAgICAgZmly
c3QgPSBhcnJheVswXSwKKyAgICAgICAgbWlkID0gYXJyYXlbKGxlbmd0aCAvIDIpIHwgMF0sCisg
ICAgICAgIGxhc3QgPSBhcnJheVtsZW5ndGggLSAxXTsKKworICAgIGlmIChmaXJzdCAmJiB0eXBl
b2YgZmlyc3QgPT0gJ29iamVjdCcgJiYKKyAgICAgICAgbWlkICYmIHR5cGVvZiBtaWQgPT0gJ29i
amVjdCcgJiYgbGFzdCAmJiB0eXBlb2YgbGFzdCA9PSAnb2JqZWN0JykgeworICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICB2YXIgY2FjaGUgPSBnZXRPYmplY3QoKTsKKyAgICBjYWNoZVsn
ZmFsc2UnXSA9IGNhY2hlWydudWxsJ10gPSBjYWNoZVsndHJ1ZSddID0gY2FjaGVbJ3VuZGVmaW5l
ZCddID0gZmFsc2U7CisKKyAgICB2YXIgcmVzdWx0ID0gZ2V0T2JqZWN0KCk7CisgICAgcmVzdWx0
LmFycmF5ID0gYXJyYXk7CisgICAgcmVzdWx0LmNhY2hlID0gY2FjaGU7CisgICAgcmVzdWx0LnB1
c2ggPSBjYWNoZVB1c2g7CisKKyAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAg
cmVzdWx0LnB1c2goYXJyYXlbaW5kZXhdKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAg
fQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGB0ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMg
Zm9yIGluY2x1c2lvbiBpbiBjb21waWxlZAorICAgKiBzdHJpbmcgbGl0ZXJhbHMuCisgICAqCisg
ICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFy
YWN0ZXIgdG8gZXNjYXBlLgorICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2Nh
cGVkIGNoYXJhY3Rlci4KKyAgICovCisgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIobWF0Y2gp
IHsKKyAgICByZXR1cm4gJ1xcJyArIHN0cmluZ0VzY2FwZXNbbWF0Y2hdOworICB9CisKKyAgLyoq
CisgICAqIEdldHMgYW4gYXJyYXkgZnJvbSB0aGUgYXJyYXkgcG9vbCBvciBjcmVhdGVzIGEgbmV3
IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHJl
dHVybnMge0FycmF5fSBUaGUgYXJyYXkgZnJvbSB0aGUgcG9vbC4KKyAgICovCisgIGZ1bmN0aW9u
IGdldEFycmF5KCkgeworICAgIHJldHVybiBhcnJheVBvb2wucG9wKCkgfHwgW107CisgIH0KKwor
ICAvKioKKyAgICogR2V0cyBhbiBvYmplY3QgZnJvbSB0aGUgb2JqZWN0IHBvb2wgb3IgY3JlYXRl
cyBhIG5ldyBvbmUgaWYgdGhlIHBvb2wgaXMgZW1wdHkuCisgICAqCisgICAqIEBwcml2YXRlCisg
ICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBvYmplY3QgZnJvbSB0aGUgcG9vbC4KKyAgICovCisg
IGZ1bmN0aW9uIGdldE9iamVjdCgpIHsKKyAgICByZXR1cm4gb2JqZWN0UG9vbC5wb3AoKSB8fCB7
CisgICAgICAnYXJyYXknOiBudWxsLAorICAgICAgJ2NhY2hlJzogbnVsbCwKKyAgICAgICdjcml0
ZXJpYSc6IG51bGwsCisgICAgICAnZmFsc2UnOiBmYWxzZSwKKyAgICAgICdpbmRleCc6IDAsCisg
ICAgICAnbnVsbCc6IGZhbHNlLAorICAgICAgJ251bWJlcic6IG51bGwsCisgICAgICAnb2JqZWN0
JzogbnVsbCwKKyAgICAgICdwdXNoJzogbnVsbCwKKyAgICAgICdzdHJpbmcnOiBudWxsLAorICAg
ICAgJ3RydWUnOiBmYWxzZSwKKyAgICAgICd1bmRlZmluZWQnOiBmYWxzZSwKKyAgICAgICd2YWx1
ZSc6IG51bGwKKyAgICB9OworICB9CisKKyAgLyoqCisgICAqIFJlbGVhc2VzIHRoZSBnaXZlbiBh
cnJheSBiYWNrIHRvIHRoZSBhcnJheSBwb29sLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBA
cGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byByZWxlYXNlLgorICAgKi8KKyAgZnVu
Y3Rpb24gcmVsZWFzZUFycmF5KGFycmF5KSB7CisgICAgYXJyYXkubGVuZ3RoID0gMDsKKyAgICBp
ZiAoYXJyYXlQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7CisgICAgICBhcnJheVBvb2wucHVz
aChhcnJheSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlbGVhc2VzIHRoZSBnaXZlbiBv
YmplY3QgYmFjayB0byB0aGUgb2JqZWN0IHBvb2wuCisgICAqCisgICAqIEBwcml2YXRlCisgICAq
IEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHJlbGVhc2UuCisgICAqLwor
ICBmdW5jdGlvbiByZWxlYXNlT2JqZWN0KG9iamVjdCkgeworICAgIHZhciBjYWNoZSA9IG9iamVj
dC5jYWNoZTsKKyAgICBpZiAoY2FjaGUpIHsKKyAgICAgIHJlbGVhc2VPYmplY3QoY2FjaGUpOwor
ICAgIH0KKyAgICBvYmplY3QuYXJyYXkgPSBvYmplY3QuY2FjaGUgPSBvYmplY3QuY3JpdGVyaWEg
PSBvYmplY3Qub2JqZWN0ID0gb2JqZWN0Lm51bWJlciA9IG9iamVjdC5zdHJpbmcgPSBvYmplY3Qu
dmFsdWUgPSBudWxsOworICAgIGlmIChvYmplY3RQb29sLmxlbmd0aCA8IG1heFBvb2xTaXplKSB7
CisgICAgICBvYmplY3RQb29sLnB1c2gob2JqZWN0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAg
ICogU2xpY2VzIHRoZSBgY29sbGVjdGlvbmAgZnJvbSB0aGUgYHN0YXJ0YCBpbmRleCB1cCB0bywg
YnV0IG5vdCBpbmNsdWRpbmcsCisgICAqIHRoZSBgZW5kYCBpbmRleC4KKyAgICoKKyAgICogTm90
ZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYEFycmF5I3NsaWNlYCB0byBzdXBw
b3J0IG5vZGUgbGlzdHMKKyAgICogaW4gSUUgPCA5IGFuZCB0byBlbnN1cmUgZGVuc2UgYXJyYXlz
IGFyZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtBcnJheXxP
YmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNsaWNlLgorICAgKiBA
cGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IGluZGV4LgorICAgKiBAcGFyYW0ge251bWJl
cn0gZW5kIFRoZSBlbmQgaW5kZXguCisgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUg
bmV3IGFycmF5LgorICAgKi8KKyAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHsK
KyAgICBzdGFydCB8fCAoc3RhcnQgPSAwKTsKKyAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZp
bmVkJykgeworICAgICAgZW5kID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworICAgIH0KKyAg
ICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQgfHwgMCwKKyAg
ICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoIDwgMCA/IDAgOiBsZW5ndGgpOworCisgICAgd2hp
bGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtzdGFy
dCArIGluZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0qLworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgYGxvZGFzaGAgZnVuY3Rp
b24gdXNpbmcgdGhlIGdpdmVuIGNvbnRleHQgb2JqZWN0LgorICAgKgorICAgKiBAc3RhdGljCisg
ICAqIEBtZW1iZXJPZiBfCisgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICogQHBhcmFtIHtP
YmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC4KKyAgICogQHJldHVybnMg
e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KKyAgICovCisgIGZ1bmN0
aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7CisgICAgLy8gQXZvaWQgaXNzdWVzIHdpdGggc29t
ZSBFUzMgZW52aXJvbm1lbnRzIHRoYXQgYXR0ZW1wdCB0byB1c2UgdmFsdWVzLCBuYW1lZAorICAg
IC8vIGFmdGVyIGJ1aWx0LWluIGNvbnN0cnVjdG9ycyBsaWtlIGBPYmplY3RgLCBmb3IgdGhlIGNy
ZWF0aW9uIG9mIGxpdGVyYWxzLgorICAgIC8vIEVTNSBjbGVhcnMgdGhpcyB1cCBieSBzdGF0aW5n
IHRoYXQgbGl0ZXJhbHMgbXVzdCB1c2UgYnVpbHQtaW4gY29uc3RydWN0b3JzLgorICAgIC8vIFNl
ZSBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDExLjEuNS4KKyAgICBjb250ZXh0ID0gY29udGV4dCA/
IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQ
cm9wcykpIDogcm9vdDsKKworICAgIC8qKiBOYXRpdmUgY29uc3RydWN0b3IgcmVmZXJlbmNlcyAq
LworICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksCisgICAgICAgIEJvb2xlYW4gPSBjb250
ZXh0LkJvb2xlYW4sCisgICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsCisgICAgICAgIEZ1bmN0
aW9uID0gY29udGV4dC5GdW5jdGlvbiwKKyAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCwKKyAg
ICAgICAgTnVtYmVyID0gY29udGV4dC5OdW1iZXIsCisgICAgICAgIE9iamVjdCA9IGNvbnRleHQu
T2JqZWN0LAorICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCwKKyAgICAgICAgU3RyaW5n
ID0gY29udGV4dC5TdHJpbmcsCisgICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9y
OworCisgICAgLyoqCisgICAgICogVXNlZCBmb3IgYEFycmF5YCBtZXRob2QgcmVmZXJlbmNlcy4K
KyAgICAgKgorICAgICAqIE5vcm1hbGx5IGBBcnJheS5wcm90b3R5cGVgIHdvdWxkIHN1ZmZpY2Us
IGhvd2V2ZXIsIHVzaW5nIGFuIGFycmF5IGxpdGVyYWwKKyAgICAgKiBhdm9pZHMgaXNzdWVzIGlu
IE5hcndoYWwuCisgICAgICovCisgICAgdmFyIGFycmF5UmVmID0gW107CisKKyAgICAvKiogVXNl
ZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzICovCisgICAgdmFyIG9iamVjdFByb3RvID0g
T2JqZWN0LnByb3RvdHlwZTsKKworICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFs
IGBfYCByZWZlcmVuY2UgaW4gYG5vQ29uZmxpY3RgICovCisgICAgdmFyIG9sZERhc2ggPSBjb250
ZXh0Ll87CisKKyAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBpbnRlcm5hbCBbW0NsYXNzXV0g
b2YgdmFsdWVzICovCisgICAgdmFyIHRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisK
KyAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlICovCisgICAgdmFy
IHJlTmF0aXZlID0gUmVnRXhwKCdeJyArCisgICAgICBTdHJpbmcodG9TdHJpbmcpCisgICAgICAg
IC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKQorICAgICAgICAucmVwbGFj
ZSgvdG9TdHJpbmd8IGZvciBbXlxdXSsvZywgJy4qPycpICsgJyQnCisgICAgKTsKKworICAgIC8q
KiBOYXRpdmUgbWV0aG9kIHNob3J0Y3V0cyAqLworICAgIHZhciBjZWlsID0gTWF0aC5jZWlsLAor
ICAgICAgICBjbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCwKKyAgICAgICAgZmxv
b3IgPSBNYXRoLmZsb29yLAorICAgICAgICBmblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBl
LnRvU3RyaW5nLAorICAgICAgICBnZXRQcm90b3R5cGVPZiA9IGlzTmF0aXZlKGdldFByb3RvdHlw
ZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBnZXRQcm90b3R5cGVPZiwKKyAgICAgICAg
aGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eSwKKyAgICAgICAgcHVz
aCA9IGFycmF5UmVmLnB1c2gsCisgICAgICAgIHNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVv
dXQsCisgICAgICAgIHNwbGljZSA9IGFycmF5UmVmLnNwbGljZSwKKyAgICAgICAgdW5zaGlmdCA9
IGFycmF5UmVmLnVuc2hpZnQ7CisKKyAgICAvKiogVXNlZCB0byBzZXQgbWV0YSBkYXRhIG9uIGZ1
bmN0aW9ucyAqLworICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHsKKyAgICAg
IC8vIElFIDggb25seSBhY2NlcHRzIERPTSBlbGVtZW50cworICAgICAgdHJ5IHsKKyAgICAgICAg
dmFyIG8gPSB7fSwKKyAgICAgICAgICAgIGZ1bmMgPSBpc05hdGl2ZShmdW5jID0gT2JqZWN0LmRl
ZmluZVByb3BlcnR5KSAmJiBmdW5jLAorICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhvLCBvLCBv
KSAmJiBmdW5jOworICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfSgpKTsKKworICAgIC8qIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzIGZvciBtZXRob2RzIHdp
dGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzICovCisgICAgdmFyIG5h
dGl2ZUNyZWF0ZSA9IGlzTmF0aXZlKG5hdGl2ZUNyZWF0ZSA9IE9iamVjdC5jcmVhdGUpICYmIG5h
dGl2ZUNyZWF0ZSwKKyAgICAgICAgbmF0aXZlSXNBcnJheSA9IGlzTmF0aXZlKG5hdGl2ZUlzQXJy
YXkgPSBBcnJheS5pc0FycmF5KSAmJiBuYXRpdmVJc0FycmF5LAorICAgICAgICBuYXRpdmVJc0Zp
bml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsCisgICAgICAgIG5hdGl2ZUlzTmFOID0gY29udGV4dC5p
c05hTiwKKyAgICAgICAgbmF0aXZlS2V5cyA9IGlzTmF0aXZlKG5hdGl2ZUtleXMgPSBPYmplY3Qu
a2V5cykgJiYgbmF0aXZlS2V5cywKKyAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsCisgICAg
ICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLAorICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRl
eHQucGFyc2VJbnQsCisgICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tOworCisgICAg
LyoqIFVzZWQgdG8gbG9va3VwIGEgYnVpbHQtaW4gY29uc3RydWN0b3IgYnkgW1tDbGFzc11dICov
CisgICAgdmFyIGN0b3JCeUNsYXNzID0ge307CisgICAgY3RvckJ5Q2xhc3NbYXJyYXlDbGFzc10g
PSBBcnJheTsKKyAgICBjdG9yQnlDbGFzc1tib29sQ2xhc3NdID0gQm9vbGVhbjsKKyAgICBjdG9y
QnlDbGFzc1tkYXRlQ2xhc3NdID0gRGF0ZTsKKyAgICBjdG9yQnlDbGFzc1tmdW5jQ2xhc3NdID0g
RnVuY3Rpb247CisgICAgY3RvckJ5Q2xhc3Nbb2JqZWN0Q2xhc3NdID0gT2JqZWN0OworICAgIGN0
b3JCeUNsYXNzW251bWJlckNsYXNzXSA9IE51bWJlcjsKKyAgICBjdG9yQnlDbGFzc1tyZWdleHBD
bGFzc10gPSBSZWdFeHA7CisgICAgY3RvckJ5Q2xhc3Nbc3RyaW5nQ2xhc3NdID0gU3RyaW5nOwor
CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEg
YGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIHRoZSBnaXZlbiB2YWx1ZSB0byBlbmFibGUgaW50
dWl0aXZlCisgICAgICogbWV0aG9kIGNoYWluaW5nLgorICAgICAqCisgICAgICogSW4gYWRkaXRp
b24gdG8gTG8tRGFzaCBtZXRob2RzLCB3cmFwcGVycyBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBg
QXJyYXlgIG1ldGhvZHM6CisgICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwg
YHJldmVyc2VgLCBgc2hpZnRgLCBgc2xpY2VgLCBgc29ydGAsIGBzcGxpY2VgLAorICAgICAqIGFu
ZCBgdW5zaGlmdGAKKyAgICAgKgorICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0
b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGB2YWx1ZWAgbWV0aG9kIGlzCisgICAgICogaW1wbGlj
aXRseSBvciBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC4KKyAgICAgKgorICAgICAq
IFRoZSBjaGFpbmFibGUgd3JhcHBlciBmdW5jdGlvbnMgYXJlOgorICAgICAqIGBhZnRlcmAsIGBh
c3NpZ25gLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2hhaW5gLCBgY29tcGFjdGAs
CisgICAgICogYGNvbXBvc2VgLCBgY29uY2F0YCwgYGNvdW50QnlgLCBgY3JlYXRlYCwgYGNyZWF0
ZUNhbGxiYWNrYCwgYGN1cnJ5YCwKKyAgICAgKiBgZGVib3VuY2VgLCBgZGVmYXVsdHNgLCBgZGVm
ZXJgLCBgZGVsYXlgLCBgZGlmZmVyZW5jZWAsIGBmaWx0ZXJgLCBgZmxhdHRlbmAsCisgICAgICog
YGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCwgYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3du
YCwgYGZvck93blJpZ2h0YCwKKyAgICAgKiBgZnVuY3Rpb25zYCwgYGdyb3VwQnlgLCBgaW5kZXhC
eWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnZlcnRgLAorICAgICAqIGBpbnZva2Vg
LCBga2V5c2AsIGBtYXBgLCBgbWF4YCwgYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWluYCwgYG9iamVj
dGAsIGBvbWl0YCwKKyAgICAgKiBgb25jZWAsIGBwYWlyc2AsIGBwYXJ0aWFsYCwgYHBhcnRpYWxS
aWdodGAsIGBwaWNrYCwgYHBsdWNrYCwgYHB1bGxgLCBgcHVzaGAsCisgICAgICogYHJhbmdlYCwg
YHJlamVjdGAsIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNodWZmbGVgLCBgc2xpY2Vg
LCBgc29ydGAsCisgICAgICogYHNvcnRCeWAsIGBzcGxpY2VgLCBgdGFwYCwgYHRocm90dGxlYCwg
YHRpbWVzYCwgYHRvQXJyYXlgLCBgdHJhbnNmb3JtYCwKKyAgICAgKiBgdW5pb25gLCBgdW5pcWAs
IGB1bnNoaWZ0YCwgYHVuemlwYCwgYHZhbHVlc2AsIGB3aGVyZWAsIGB3aXRob3V0YCwgYHdyYXBg
LAorICAgICAqIGFuZCBgemlwYAorICAgICAqCisgICAgICogVGhlIG5vbi1jaGFpbmFibGUgd3Jh
cHBlciBmdW5jdGlvbnMgYXJlOgorICAgICAqIGBjbG9uZWAsIGBjbG9uZURlZXBgLCBgY29udGFp
bnNgLCBgZXNjYXBlYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwKKyAgICAgKiBgZmlu
ZEtleWAsIGBmaW5kTGFzdGAsIGBmaW5kTGFzdEluZGV4YCwgYGZpbmRMYXN0S2V5YCwgYGhhc2As
IGBpZGVudGl0eWAsCisgICAgICogYGluZGV4T2ZgLCBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAs
IGBpc0Jvb2xlYW5gLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsCisgICAgICogYGlzRW1wdHlgLCBg
aXNFcXVhbGAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzTmFOYCwgYGlzTnVsbGAsIGBp
c051bWJlcmAsCisgICAgICogYGlzT2JqZWN0YCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBg
LCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgam9pbmAsCisgICAgICogYGxhc3RJbmRleE9m
YCwgYG1peGluYCwgYG5vQ29uZmxpY3RgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGBy
ZWR1Y2VgLAorICAgICAqIGByZWR1Y2VSaWdodGAsIGByZXN1bHRgLCBgc2hpZnRgLCBgc2l6ZWAs
IGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHJ1bkluQ29udGV4dGAsCisgICAgICogYHRlbXBsYXRl
YCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYW5kIGB2YWx1ZWAKKyAgICAgKgorICAgICAqIFRo
ZSB3cmFwcGVyIGZ1bmN0aW9ucyBgZmlyc3RgIGFuZCBgbGFzdGAgcmV0dXJuIHdyYXBwZWQgdmFs
dWVzIHdoZW4gYG5gIGlzCisgICAgICogcHJvdmlkZWQsIG90aGVyd2lzZSB0aGV5IHJldHVybiB1
bndyYXBwZWQgdmFsdWVzLgorICAgICAqCisgICAgICogRXhwbGljaXQgY2hhaW5pbmcgY2FuIGJl
IGVuYWJsZWQgYnkgdXNpbmcgdGhlIGBfLmNoYWluYCBtZXRob2QuCisgICAgICoKKyAgICAgKiBA
bmFtZSBfCisgICAgICogQGNvbnN0cnVjdG9yCisgICAgICogQGNhdGVnb3J5IENoYWluaW5nCisg
ICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGlu
c3RhbmNlLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBgbG9kYXNoYCBpbnN0
YW5jZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIHdyYXBwZWQgPSBfKFsx
LCAyLCAzXSk7CisgICAgICoKKyAgICAgKiAvLyByZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZQor
ICAgICAqIHdyYXBwZWQucmVkdWNlKGZ1bmN0aW9uKHN1bSwgbnVtKSB7CisgICAgICogICByZXR1
cm4gc3VtICsgbnVtOworICAgICAqIH0pOworICAgICAqIC8vID0+IDYKKyAgICAgKgorICAgICAq
IC8vIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlCisgICAgICogdmFyIHNxdWFyZXMgPSB3cmFwcGVk
Lm1hcChmdW5jdGlvbihudW0pIHsKKyAgICAgKiAgIHJldHVybiBudW0gKiBudW07CisgICAgICog
fSk7CisgICAgICoKKyAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7CisgICAgICogLy8gPT4gZmFs
c2UKKyAgICAgKgorICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpOworICAgICAqIC8v
ID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHsKKyAgICAgIC8v
IGRvbid0IHdyYXAgaWYgYWxyZWFkeSB3cmFwcGVkLCBldmVuIGlmIHdyYXBwZWQgYnkgYSBkaWZm
ZXJlbnQgYGxvZGFzaGAgY29uc3RydWN0b3IKKyAgICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9m
IHZhbHVlID09ICdvYmplY3QnICYmICFpc0FycmF5KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5j
YWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkKKyAgICAgICA/IHZhbHVlCisgICAgICAgOiBuZXcg
bG9kYXNoV3JhcHBlcih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYXN0IHBh
dGggZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy4KKyAgICAgKgorICAgICAq
IEBwcml2YXRlCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBh
IGBsb2Rhc2hgIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhaW5BbGwgQSBm
bGFnIHRvIGVuYWJsZSBjaGFpbmluZyBmb3IgYWxsIG1ldGhvZHMKKyAgICAgKiBAcmV0dXJucyB7
T2JqZWN0fSBSZXR1cm5zIGEgYGxvZGFzaGAgaW5zdGFuY2UuCisgICAgICovCisgICAgZnVuY3Rp
b24gbG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHsKKyAgICAgIHRoaXMuX19jaGFpbl9f
ID0gISFjaGFpbkFsbDsKKyAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTsKKyAgICB9Cisg
ICAgLy8gZW5zdXJlIGBuZXcgbG9kYXNoV3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGxvZGFz
aGAKKyAgICBsb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGxvZGFzaC5wcm90b3R5cGU7CisKKyAg
ICAvKioKKyAgICAgKiBBbiBvYmplY3QgdXNlZCB0byBmbGFnIGVudmlyb25tZW50cyBmZWF0dXJl
cy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0
eXBlIE9iamVjdAorICAgICAqLworICAgIHZhciBzdXBwb3J0ID0gbG9kYXNoLnN1cHBvcnQgPSB7
fTsKKworICAgIC8qKgorICAgICAqIERldGVjdCBpZiBmdW5jdGlvbnMgY2FuIGJlIGRlY29tcGls
ZWQgYnkgYEZ1bmN0aW9uI3RvU3RyaW5nYAorICAgICAqIChhbGwgYnV0IFBTMyBhbmQgb2xkZXIg
T3BlcmEgbW9iaWxlIGJyb3dzZXJzICYgYXZvaWRlZCBpbiBXaW5kb3dzIDggYXBwcykuCisgICAg
ICoKKyAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAgICogQHR5cGUgYm9vbGVhbgorICAg
ICAqLworICAgIHN1cHBvcnQuZnVuY0RlY29tcCA9ICFpc05hdGl2ZShjb250ZXh0LldpblJURXJy
b3IpICYmIHJlVGhpcy50ZXN0KHJ1bkluQ29udGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBEZXRl
Y3QgaWYgYEZ1bmN0aW9uI25hbWVgIGlzIHN1cHBvcnRlZCAoYWxsIGJ1dCBJRSkuCisgICAgICoK
KyAgICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAgICogQHR5cGUgYm9vbGVhbgorICAgICAq
LworICAgIHN1cHBvcnQuZnVuY05hbWVzID0gdHlwZW9mIEZ1bmN0aW9uLm5hbWUgPT0gJ3N0cmlu
Zyc7CisKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVy
cyB1c2VkIGJ5IExvLURhc2ggYXJlIHNpbWlsYXIgdG8gdGhvc2UgaW4KKyAgICAgKiBlbWJlZGRl
ZCBSdWJ5IChFUkIpLiBDaGFuZ2UgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1
c2UgYWx0ZXJuYXRpdmUKKyAgICAgKiBkZWxpbWl0ZXJzLgorICAgICAqCisgICAgICogQHN0YXRp
YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgT2JqZWN0CisgICAgICovCisgICAg
bG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7CisKKyAgICAgIC8qKgorICAgICAgICogVXNlZCB0
byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuCisgICAg
ICAgKgorICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncworICAgICAgICogQHR5
cGUgUmVnRXhwCisgICAgICAgKi8KKyAgICAgICdlc2NhcGUnOiAvPCUtKFtcc1xTXSs/KSU+L2cs
CisKKyAgICAgIC8qKgorICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0
ZWQuCisgICAgICAgKgorICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncworICAg
ICAgICogQHR5cGUgUmVnRXhwCisgICAgICAgKi8KKyAgICAgICdldmFsdWF0ZSc6IC88JShbXHNc
U10rPyklPi9nLAorCisgICAgICAvKioKKyAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBw
cm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LgorICAgICAgICoKKyAgICAgICAqIEBtZW1iZXJPZiBf
LnRlbXBsYXRlU2V0dGluZ3MKKyAgICAgICAqIEB0eXBlIFJlZ0V4cAorICAgICAgICovCisgICAg
ICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLAorCisgICAgICAvKioKKyAgICAgICAqIFVz
ZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC4KKyAg
ICAgICAqCisgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCisgICAgICAgKiBA
dHlwZSBzdHJpbmcKKyAgICAgICAqLworICAgICAgJ3ZhcmlhYmxlJzogJycsCisKKyAgICAgIC8q
KgorICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRl
bXBsYXRlLgorICAgICAgICoKKyAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MK
KyAgICAgICAqIEB0eXBlIE9iamVjdAorICAgICAgICovCisgICAgICAnaW1wb3J0cyc6IHsKKwor
ICAgICAgICAvKioKKyAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0
aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdz
LmltcG9ydHMKKyAgICAgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAg
ICdfJzogbG9kYXNoCisgICAgICB9CisgICAgfTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0q
LworCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYmluZGAg
dGhhdCBjcmVhdGVzIHRoZSBib3VuZCBmdW5jdGlvbiBhbmQKKyAgICAgKiBzZXRzIGl0cyBtZXRh
IGRhdGEuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7QXJyYXl9IGJp
bmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBS
ZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVuY3Rpb24gYmFz
ZUJpbmQoYmluZERhdGEpIHsKKyAgICAgIHZhciBmdW5jID0gYmluZERhdGFbMF0sCisgICAgICAg
ICAgcGFydGlhbEFyZ3MgPSBiaW5kRGF0YVsyXSwKKyAgICAgICAgICB0aGlzQXJnID0gYmluZERh
dGFbNF07CisKKyAgICAgIGZ1bmN0aW9uIGJvdW5kKCkgeworICAgICAgICAvLyBgRnVuY3Rpb24j
YmluZGAgc3BlYworICAgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC41Cisg
ICAgICAgIGlmIChwYXJ0aWFsQXJncykgeworICAgICAgICAgIC8vIGF2b2lkIGBhcmd1bWVudHNg
IG9iamVjdCBkZW9wdGltaXphdGlvbnMgYnkgdXNpbmcgYHNsaWNlYCBpbnN0ZWFkCisgICAgICAg
ICAgLy8gb2YgYEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsYCBhbmQgbm90IGFzc2lnbmluZyBg
YXJndW1lbnRzYCB0byBhCisgICAgICAgICAgLy8gdmFyaWFibGUgYXMgYSB0ZXJuYXJ5IGV4cHJl
c3Npb24KKyAgICAgICAgICB2YXIgYXJncyA9IHNsaWNlKHBhcnRpYWxBcmdzKTsKKyAgICAgICAg
ICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbWlt
aWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IKKyAgICAgICAgLy8gaHR0cDov
L2VzNS5naXRodWIuaW8vI3gxMy4yLjIKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3Vu
ZCkgeworICAgICAgICAgIC8vIGVuc3VyZSBgbmV3IGJvdW5kYCBpcyBhbiBpbnN0YW5jZSBvZiBg
ZnVuY2AKKyAgICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKGZ1bmMucHJvdG90
eXBlKSwKKyAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJn
cyB8fCBhcmd1bWVudHMpOworICAgICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVz
dWx0IDogdGhpc0JpbmRpbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHko
dGhpc0FyZywgYXJncyB8fCBhcmd1bWVudHMpOworICAgICAgfQorICAgICAgc2V0QmluZERhdGEo
Ym91bmQsIGJpbmREYXRhKTsKKyAgICAgIHJldHVybiBib3VuZDsKKyAgICB9CisKKyAgICAvKioK
KyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgd2l0aG91dCBhcmd1
bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CisgICAgICogZm9yIGB0aGlzQXJnYCBiaW5kaW5nLgor
ICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1
ZSB0byBjbG9uZS4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNp
ZnkgYSBkZWVwIGNsb25lLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhl
IGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0ge0Fy
cmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLgorICAgICAq
IEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNl
IGNvdW50ZXJwYXJ0cy4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZh
bHVlLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjYWxs
YmFjaywgc3RhY2tBLCBzdGFja0IpIHsKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICB2
YXIgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUpOworICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAh
PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICAgIC8vIGluc3BlY3QgW1tDbGFzc11dCisgICAgICB2YXIgaXNPYmogPSBpc09i
amVjdCh2YWx1ZSk7CisgICAgICBpZiAoaXNPYmopIHsKKyAgICAgICAgdmFyIGNsYXNzTmFtZSA9
IHRvU3RyaW5nLmNhbGwodmFsdWUpOworICAgICAgICBpZiAoIWNsb25lYWJsZUNsYXNzZXNbY2xh
c3NOYW1lXSkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB2
YXIgY3RvciA9IGN0b3JCeUNsYXNzW2NsYXNzTmFtZV07CisgICAgICAgIHN3aXRjaCAoY2xhc3NO
YW1lKSB7CisgICAgICAgICAgY2FzZSBib29sQ2xhc3M6CisgICAgICAgICAgY2FzZSBkYXRlQ2xh
c3M6CisgICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IoK3ZhbHVlKTsKKworICAgICAgICAgIGNh
c2UgbnVtYmVyQ2xhc3M6CisgICAgICAgICAgY2FzZSBzdHJpbmdDbGFzczoKKyAgICAgICAgICAg
IHJldHVybiBuZXcgY3Rvcih2YWx1ZSk7CisKKyAgICAgICAgICBjYXNlIHJlZ2V4cENsYXNzOgor
ICAgICAgICAgICAgcmVzdWx0ID0gY3Rvcih2YWx1ZS5zb3VyY2UsIHJlRmxhZ3MuZXhlYyh2YWx1
ZSkpOworICAgICAgICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHZhbHVlLmxhc3RJbmRleDsKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFs
dWUpOworICAgICAgaWYgKGlzRGVlcCkgeworICAgICAgICAvLyBjaGVjayBmb3IgY2lyY3VsYXIg
cmVmZXJlbmNlcyBhbmQgcmV0dXJuIGNvcnJlc3BvbmRpbmcgY2xvbmUKKyAgICAgICAgdmFyIGlu
aXRlZFN0YWNrID0gIXN0YWNrQTsKKyAgICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBnZXRBcnJh
eSgpKTsKKyAgICAgICAgc3RhY2tCIHx8IChzdGFja0IgPSBnZXRBcnJheSgpKTsKKworICAgICAg
ICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7
CisgICAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IHZhbHVlKSB7CisgICAgICAgICAgICBy
ZXR1cm4gc3RhY2tCW2xlbmd0aF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJl
c3VsdCA9IGlzQXJyID8gY3Rvcih2YWx1ZS5sZW5ndGgpIDoge307CisgICAgICB9CisgICAgICBl
bHNlIHsKKyAgICAgICAgcmVzdWx0ID0gaXNBcnIgPyBzbGljZSh2YWx1ZSkgOiBhc3NpZ24oe30s
IHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIC8vIGFkZCBhcnJheSBwcm9wZXJ0aWVzIGFzc2lnbmVk
IGJ5IGBSZWdFeHAjZXhlY2AKKyAgICAgIGlmIChpc0FycikgeworICAgICAgICBpZiAoaGFzT3du
UHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2luZGV4JykpIHsKKyAgICAgICAgICByZXN1bHQuaW5kZXgg
PSB2YWx1ZS5pbmRleDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2Fs
bCh2YWx1ZSwgJ2lucHV0JykpIHsKKyAgICAgICAgICByZXN1bHQuaW5wdXQgPSB2YWx1ZS5pbnB1
dDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZXhpdCBmb3Igc2hhbGxvdyBjbG9uZQor
ICAgICAgaWYgKCFpc0RlZXApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAg
ICAgIC8vIGFkZCB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2Jq
ZWN0cworICAgICAgLy8gYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGl0cyBjbG9uZQorICAgICAgc3Rh
Y2tBLnB1c2godmFsdWUpOworICAgICAgc3RhY2tCLnB1c2gocmVzdWx0KTsKKworICAgICAgLy8g
cmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGlt
aXRzKQorICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikodmFsdWUsIGZ1bmN0aW9uKG9i
alZhbHVlLCBrZXkpIHsKKyAgICAgICAgcmVzdWx0W2tleV0gPSBiYXNlQ2xvbmUob2JqVmFsdWUs
IGlzRGVlcCwgY2FsbGJhY2ssIHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgIH0pOworCisgICAgICBp
ZiAoaW5pdGVkU3RhY2spIHsKKyAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7CisgICAgICAg
IHJlbGVhc2VBcnJheShzdGFja0IpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVh
dGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nCisgICAgICogcHJvcGVydGllcyB0byB0
aGUgY3JlYXRlZCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJh
bSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uCisgICAgICog
QHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgeworICAgICAgcmV0dXJu
IGlzT2JqZWN0KHByb3RvdHlwZSkgPyBuYXRpdmVDcmVhdGUocHJvdG90eXBlKSA6IHt9OworICAg
IH0KKyAgICAvLyBmYWxsYmFjayBmb3IgYnJvd3NlcnMgd2l0aG91dCBgT2JqZWN0LmNyZWF0ZWAK
KyAgICBpZiAoIW5hdGl2ZUNyZWF0ZSkgeworICAgICAgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigp
IHsKKyAgICAgICAgZnVuY3Rpb24gT2JqZWN0KCkge30KKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9u
KHByb3RvdHlwZSkgeworICAgICAgICAgIGlmIChpc09iamVjdChwcm90b3R5cGUpKSB7CisgICAg
ICAgICAgICBPYmplY3QucHJvdG90eXBlID0gcHJvdG90eXBlOworICAgICAgICAgICAgdmFyIHJl
c3VsdCA9IG5ldyBPYmplY3Q7CisgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlID0gbnVsbDsK
KyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBjb250ZXh0Lk9iamVjdCgp
OworICAgICAgICB9OworICAgICAgfSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUg
YmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVDYWxsYmFja2Agd2l0aG91dCBzdXBwb3J0
IGZvciBjcmVhdGluZworICAgICAqICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJh
Y2tzLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0geyp9IFtmdW5jPWlk
ZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLgorICAgICAqIEBwYXJh
bSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBjYWxsYmFj
ay4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVyIG9mIGFyZ3Vt
ZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJl
dHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlQ3Jl
YXRlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHsKKyAgICAgIGlmICh0eXBlb2Yg
ZnVuYyAhPSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHJldHVybiBpZGVudGl0eTsKKyAgICAgIH0K
KyAgICAgIC8vIGV4aXQgZWFybHkgZm9yIG5vIGB0aGlzQXJnYCBvciBhbHJlYWR5IGJvdW5kIGJ5
IGBGdW5jdGlvbiNiaW5kYAorICAgICAgaWYgKHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQn
IHx8ICEoJ3Byb3RvdHlwZScgaW4gZnVuYykpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAg
ICB9CisgICAgICB2YXIgYmluZERhdGEgPSBmdW5jLl9fYmluZERhdGFfXzsKKyAgICAgIGlmICh0
eXBlb2YgYmluZERhdGEgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgaWYgKHN1cHBvcnQuZnVu
Y05hbWVzKSB7CisgICAgICAgICAgYmluZERhdGEgPSAhZnVuYy5uYW1lOworICAgICAgICB9Cisg
ICAgICAgIGJpbmREYXRhID0gYmluZERhdGEgfHwgIXN1cHBvcnQuZnVuY0RlY29tcDsKKyAgICAg
ICAgaWYgKCFiaW5kRGF0YSkgeworICAgICAgICAgIHZhciBzb3VyY2UgPSBmblRvU3RyaW5nLmNh
bGwoZnVuYyk7CisgICAgICAgICAgaWYgKCFzdXBwb3J0LmZ1bmNOYW1lcykgeworICAgICAgICAg
ICAgYmluZERhdGEgPSAhcmVGdW5jTmFtZS50ZXN0KHNvdXJjZSk7CisgICAgICAgICAgfQorICAg
ICAgICAgIGlmICghYmluZERhdGEpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrcyBpZiBgZnVuY2Ag
cmVmZXJlbmNlcyB0aGUgYHRoaXNgIGtleXdvcmQgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CisgICAg
ICAgICAgICBiaW5kRGF0YSA9IHJlVGhpcy50ZXN0KHNvdXJjZSk7CisgICAgICAgICAgICBzZXRC
aW5kRGF0YShmdW5jLCBiaW5kRGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9
CisgICAgICAvLyBleGl0IGVhcmx5IGlmIHRoZXJlIGFyZSBubyBgdGhpc2AgcmVmZXJlbmNlcyBv
ciBgZnVuY2AgaXMgYm91bmQKKyAgICAgIGlmIChiaW5kRGF0YSA9PT0gZmFsc2UgfHwgKGJpbmRE
YXRhICE9PSB0cnVlICYmIGJpbmREYXRhWzFdICYgMSkpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmM7
CisgICAgICB9CisgICAgICBzd2l0Y2ggKGFyZ0NvdW50KSB7CisgICAgICAgIGNhc2UgMTogcmV0
dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJn
LCB2YWx1ZSk7CisgICAgICAgIH07CisgICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEs
IGIpIHsKKyAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGEsIGIpOworICAgICAg
ICB9OworICAgICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxl
Y3Rpb24pIHsKKyAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRl
eCwgY29sbGVjdGlvbik7CisgICAgICAgIH07CisgICAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0
aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICBy
ZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxl
Y3Rpb24pOworICAgICAgICB9OworICAgICAgfQorICAgICAgcmV0dXJuIGJpbmQoZnVuYywgdGhp
c0FyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24g
b2YgYGNyZWF0ZVdyYXBwZXJgIHRoYXQgY3JlYXRlcyB0aGUgd3JhcHBlciBhbmQKKyAgICAgKiBz
ZXRzIGl0cyBtZXRhIGRhdGEuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJh
bSB7QXJyYXl9IGJpbmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybnMg
e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVuY3Rp
b24gYmFzZUNyZWF0ZVdyYXBwZXIoYmluZERhdGEpIHsKKyAgICAgIHZhciBmdW5jID0gYmluZERh
dGFbMF0sCisgICAgICAgICAgYml0bWFzayA9IGJpbmREYXRhWzFdLAorICAgICAgICAgIHBhcnRp
YWxBcmdzID0gYmluZERhdGFbMl0sCisgICAgICAgICAgcGFydGlhbFJpZ2h0QXJncyA9IGJpbmRE
YXRhWzNdLAorICAgICAgICAgIHRoaXNBcmcgPSBiaW5kRGF0YVs0XSwKKyAgICAgICAgICBhcml0
eSA9IGJpbmREYXRhWzVdOworCisgICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIDEsCisgICAg
ICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIDIsCisgICAgICAgICAgaXNDdXJyeSA9IGJpdG1h
c2sgJiA0LAorICAgICAgICAgIGlzQ3VycnlCb3VuZCA9IGJpdG1hc2sgJiA4LAorICAgICAgICAg
IGtleSA9IGZ1bmM7CisKKyAgICAgIGZ1bmN0aW9uIGJvdW5kKCkgeworICAgICAgICB2YXIgdGhp
c0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpczsKKyAgICAgICAgaWYgKHBhcnRpYWxB
cmdzKSB7CisgICAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShwYXJ0aWFsQXJncyk7CisgICAgICAg
ICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChw
YXJ0aWFsUmlnaHRBcmdzIHx8IGlzQ3VycnkpIHsKKyAgICAgICAgICBhcmdzIHx8IChhcmdzID0g
c2xpY2UoYXJndW1lbnRzKSk7CisgICAgICAgICAgaWYgKHBhcnRpYWxSaWdodEFyZ3MpIHsKKyAg
ICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgcGFydGlhbFJpZ2h0QXJncyk7CisgICAgICAgICAg
fQorICAgICAgICAgIGlmIChpc0N1cnJ5ICYmIGFyZ3MubGVuZ3RoIDwgYXJpdHkpIHsKKyAgICAg
ICAgICAgIGJpdG1hc2sgfD0gMTYgJiB+MzI7CisgICAgICAgICAgICByZXR1cm4gYmFzZUNyZWF0
ZVdyYXBwZXIoW2Z1bmMsIChpc0N1cnJ5Qm91bmQgPyBiaXRtYXNrIDogYml0bWFzayAmIH4zKSwg
YXJncywgbnVsbCwgdGhpc0FyZywgYXJpdHldKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgYXJncyB8fCAoYXJncyA9IGFyZ3VtZW50cyk7CisgICAgICAgIGlmIChpc0JpbmRLZXkp
IHsKKyAgICAgICAgICBmdW5jID0gdGhpc0JpbmRpbmdba2V5XTsKKyAgICAgICAgfQorICAgICAg
ICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7CisgICAgICAgICAgdGhpc0JpbmRpbmcgPSBi
YXNlQ3JlYXRlKGZ1bmMucHJvdG90eXBlKTsKKyAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5h
cHBseSh0aGlzQmluZGluZywgYXJncyk7CisgICAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3Vs
dCkgPyByZXN1bHQgOiB0aGlzQmluZGluZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnVu
Yy5hcHBseSh0aGlzQmluZGluZywgYXJncyk7CisgICAgICB9CisgICAgICBzZXRCaW5kRGF0YShi
b3VuZCwgYmluZERhdGEpOworICAgICAgcmV0dXJuIGJvdW5kOworICAgIH0KKworICAgIC8qKgor
ICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRpZmZlcmVuY2VgIHRoYXQgYWNj
ZXB0cyBhIHNpbmdsZSBhcnJheQorICAgICAqIG9mIHZhbHVlcyB0byBleGNsdWRlLgorICAgICAq
CisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkg
dG8gcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgYXJyYXkgb2Yg
dmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3
IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlRGlm
ZmVyZW5jZShhcnJheSwgdmFsdWVzKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAg
ICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJy
YXkubGVuZ3RoIDogMCwKKyAgICAgICAgICBpc0xhcmdlID0gbGVuZ3RoID49IGxhcmdlQXJyYXlT
aXplICYmIGluZGV4T2YgPT09IGJhc2VJbmRleE9mLAorICAgICAgICAgIHJlc3VsdCA9IFtdOwor
CisgICAgICBpZiAoaXNMYXJnZSkgeworICAgICAgICB2YXIgY2FjaGUgPSBjcmVhdGVDYWNoZSh2
YWx1ZXMpOworICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICBpbmRleE9mID0gY2FjaGVJ
bmRleE9mOworICAgICAgICAgIHZhbHVlcyA9IGNhY2hlOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgIGlzTGFyZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUg
KCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwor
ICAgICAgICBpZiAoaW5kZXhPZih2YWx1ZXMsIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICByZXN1
bHQucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc0xhcmdlKSB7
CisgICAgICAgIHJlbGVhc2VPYmplY3QodmFsdWVzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24g
b2YgYF8uZmxhdHRlbmAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjaworICAgICAqIHNob3J0
aGFuZHMgb3IgYHRoaXNBcmdgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAg
ICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLgorICAgICAqIEBw
YXJhbSB7Ym9vbGVhbn0gW2lzU2hhbGxvdz1mYWxzZV0gQSBmbGFnIHRvIHJlc3RyaWN0IGZsYXR0
ZW5pbmcgdG8gYSBzaW5nbGUgbGV2ZWwuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJp
Y3Q9ZmFsc2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGFycmF5cyBhbmQgYGFy
Z3VtZW50c2Agb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBU
aGUgaW5kZXggdG8gc3RhcnQgZnJvbS4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg
YSBuZXcgZmxhdHRlbmVkIGFycmF5LgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVu
KGFycmF5LCBpc1NoYWxsb3csIGlzU3RyaWN0LCBmcm9tSW5kZXgpIHsKKyAgICAgIHZhciBpbmRl
eCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJy
YXkubGVuZ3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSBbXTsKKworICAgICAgd2hpbGUgKCsr
aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOworCisg
ICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZh
bHVlLmxlbmd0aCA9PSAnbnVtYmVyJworICAgICAgICAgICAgJiYgKGlzQXJyYXkodmFsdWUpIHx8
IGlzQXJndW1lbnRzKHZhbHVlKSkpIHsKKyAgICAgICAgICAvLyByZWN1cnNpdmVseSBmbGF0dGVu
IGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpCisgICAgICAgICAgaWYg
KCFpc1NoYWxsb3cpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYmFzZUZsYXR0ZW4odmFsdWUsIGlz
U2hhbGxvdywgaXNTdHJpY3QpOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgdmFsSW5kZXgg
PSAtMSwKKyAgICAgICAgICAgICAgdmFsTGVuZ3RoID0gdmFsdWUubGVuZ3RoLAorICAgICAgICAg
ICAgICByZXNJbmRleCA9IHJlc3VsdC5sZW5ndGg7CisKKyAgICAgICAgICByZXN1bHQubGVuZ3Ro
ICs9IHZhbExlbmd0aDsKKyAgICAgICAgICB3aGlsZSAoKyt2YWxJbmRleCA8IHZhbExlbmd0aCkg
eworICAgICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWVbdmFsSW5kZXhdOworICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHsKKyAgICAgICAgICByZXN1
bHQucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8u
aXNFcXVhbGAsIHdpdGhvdXQgc3VwcG9ydCBmb3IgYHRoaXNBcmdgIGJpbmRpbmcsCisgICAgICog
dGhhdCBhbGxvd3MgcGFydGlhbCAiXy53aGVyZSIgc3R5bGUgY29tcGFyaXNvbnMuCisgICAgICoK
KyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFy
ZS4KKyAgICAgKiBAcGFyYW0geyp9IGIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAg
ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXpl
IGNvbXBhcmluZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2lzV2hlcmU9ZmFs
c2VdIEEgZmxhZyB0byBpbmRpY2F0ZSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuCisg
ICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBgYWAgb2Jq
ZWN0cy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2Vk
IGBiYCBvYmplY3RzLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBp
ZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgICAgICovCisgICAg
ZnVuY3Rpb24gYmFzZUlzRXF1YWwoYSwgYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3Rh
Y2tCKSB7CisgICAgICAvLyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2hlbiBjb21wYXJpbmcgb2Jq
ZWN0cywgYGFgIGhhcyBhdCBsZWFzdCB0aGUgcHJvcGVydGllcyBvZiBgYmAKKyAgICAgIGlmIChj
YWxsYmFjaykgeworICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soYSwgYik7CisgICAgICAg
IGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgcmV0dXJuICEh
cmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBleGl0IGVhcmx5IGZvciBpZGVu
dGljYWwgdmFsdWVzCisgICAgICBpZiAoYSA9PT0gYikgeworICAgICAgICAvLyB0cmVhdCBgKzBg
IHZzLiBgLTBgIGFzIG5vdCBlcXVhbAorICAgICAgICByZXR1cm4gYSAhPT0gMCB8fCAoMSAvIGEg
PT0gMSAvIGIpOworICAgICAgfQorICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgYSwKKyAgICAgICAg
ICBvdGhlclR5cGUgPSB0eXBlb2YgYjsKKworICAgICAgLy8gZXhpdCBlYXJseSBmb3IgdW5saWtl
IHByaW1pdGl2ZSB2YWx1ZXMKKyAgICAgIGlmIChhID09PSBhICYmCisgICAgICAgICAgIShhICYm
IG9iamVjdFR5cGVzW3R5cGVdKSAmJgorICAgICAgICAgICEoYiAmJiBvYmplY3RUeXBlc1tvdGhl
clR5cGVdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBleGl0
IGVhcmx5IGZvciBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGF2b2lkaW5nIEVTMydzIEZ1bmN0aW9u
I2NhbGwgYmVoYXZpb3IKKyAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMy40LjQK
KyAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBhID09
PSBiOworICAgICAgfQorICAgICAgLy8gY29tcGFyZSBbW0NsYXNzXV0gbmFtZXMKKyAgICAgIHZh
ciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLAorICAgICAgICAgIG90aGVyQ2xhc3MgPSB0
b1N0cmluZy5jYWxsKGIpOworCisgICAgICBpZiAoY2xhc3NOYW1lID09IGFyZ3NDbGFzcykgewor
ICAgICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzczsKKyAgICAgIH0KKyAgICAgIGlmIChvdGhl
ckNsYXNzID09IGFyZ3NDbGFzcykgeworICAgICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7
CisgICAgICB9CisgICAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyQ2xhc3MpIHsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHsKKyAgICAg
ICAgY2FzZSBib29sQ2xhc3M6CisgICAgICAgIGNhc2UgZGF0ZUNsYXNzOgorICAgICAgICAgIC8v
IGNvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNv
bmRzIGFuZCBib29sZWFucworICAgICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52
YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbAorICAgICAgICAgIHJldHVy
biArYSA9PSArYjsKKworICAgICAgICBjYXNlIG51bWJlckNsYXNzOgorICAgICAgICAgIC8vIHRy
ZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbAorICAgICAgICAgIHJldHVybiAoYSAhPSArYSkK
KyAgICAgICAgICAgID8gYiAhPSArYgorICAgICAgICAgICAgLy8gYnV0IHRyZWF0IGArMGAgdnMu
IGAtMGAgYXMgbm90IGVxdWFsCisgICAgICAgICAgICA6IChhID09IDAgPyAoMSAvIGEgPT0gMSAv
IGIpIDogYSA9PSArYik7CisKKyAgICAgICAgY2FzZSByZWdleHBDbGFzczoKKyAgICAgICAgY2Fz
ZSBzdHJpbmdDbGFzczoKKyAgICAgICAgICAvLyBjb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzICho
dHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEwLjYuNCkKKyAgICAgICAgICAvLyB0cmVhdCBzdHJp
bmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFz
IGVxdWFsCisgICAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpOworICAgICAgfQorICAgICAg
dmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7CisgICAgICBpZiAoIWlzQXJyKSB7
CisgICAgICAgIC8vIHVud3JhcCBhbnkgYGxvZGFzaGAgd3JhcHBlZCB2YWx1ZXMKKyAgICAgICAg
dmFyIGFXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChhLCAnX193cmFwcGVkX18nKSwKKyAg
ICAgICAgICAgIGJXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChiLCAnX193cmFwcGVkX18n
KTsKKworICAgICAgICBpZiAoYVdyYXBwZWQgfHwgYldyYXBwZWQpIHsKKyAgICAgICAgICByZXR1
cm4gYmFzZUlzRXF1YWwoYVdyYXBwZWQgPyBhLl9fd3JhcHBlZF9fIDogYSwgYldyYXBwZWQgPyBi
Ll9fd3JhcHBlZF9fIDogYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKTsKKyAg
ICAgICAgfQorICAgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2RlcworICAg
ICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzKSB7CisgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIE9wZXJhLCBg
YXJndW1lbnRzYCBvYmplY3RzIGhhdmUgYEFycmF5YCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgdmFy
IGN0b3JBID0gYS5jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgIGN0b3JCID0gYi5jb25zdHJ1Y3Rv
cjsKKworICAgICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZl
cmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbAorICAgICAgICBpZiAoY3RvckEgIT0gY3Rv
ckIgJiYKKyAgICAgICAgICAgICAgIShpc0Z1bmN0aW9uKGN0b3JBKSAmJiBjdG9yQSBpbnN0YW5j
ZW9mIGN0b3JBICYmIGlzRnVuY3Rpb24oY3RvckIpICYmIGN0b3JCIGluc3RhbmNlb2YgY3RvckIp
ICYmCisgICAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBp
biBiKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICB9CisgICAgICAvLyBhc3N1bWUgY3ljbGljIHN0cnVjdHVyZXMgYXJlIGVxdWFsCisg
ICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljIHN0cnVjdHVyZXMgaXMg
YWRhcHRlZCBmcm9tIEVTIDUuMQorICAgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBv
cGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKQorICAgICAgdmFy
IGluaXRlZFN0YWNrID0gIXN0YWNrQTsKKyAgICAgIHN0YWNrQSB8fCAoc3RhY2tBID0gZ2V0QXJy
YXkoKSk7CisgICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IGdldEFycmF5KCkpOworCisgICAgICB2
YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAg
ICAgICBpZiAoc3RhY2tBW2xlbmd0aF0gPT0gYSkgeworICAgICAgICAgIHJldHVybiBzdGFja0Jb
bGVuZ3RoXSA9PSBiOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgc2l6ZSA9IDA7Cisg
ICAgICByZXN1bHQgPSB0cnVlOworCisgICAgICAvLyBhZGQgYGFgIGFuZCBgYmAgdG8gdGhlIHN0
YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzCisgICAgICBzdGFja0EucHVzaChhKTsKKyAgICAgIHN0
YWNrQi5wdXNoKGIpOworCisgICAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5k
IGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpCisgICAgICBpZiAoaXNB
cnIpIHsKKyAgICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAg
Y29tcGFyaXNvbiBpcyBuZWNlc3NhcnkKKyAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7CisgICAg
ICAgIHNpemUgPSBiLmxlbmd0aDsKKyAgICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBsZW5ndGg7CisK
KyAgICAgICAgaWYgKHJlc3VsdCB8fCBpc1doZXJlKSB7CisgICAgICAgICAgLy8gZGVlcCBjb21w
YXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllcworICAgICAg
ICAgIHdoaWxlIChzaXplLS0pIHsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aCwKKyAg
ICAgICAgICAgICAgICB2YWx1ZSA9IGJbc2l6ZV07CisKKyAgICAgICAgICAgIGlmIChpc1doZXJl
KSB7CisgICAgICAgICAgICAgIHdoaWxlIChpbmRleC0tKSB7CisgICAgICAgICAgICAgICAgaWYg
KChyZXN1bHQgPSBiYXNlSXNFcXVhbChhW2luZGV4XSwgdmFsdWUsIGNhbGxiYWNrLCBpc1doZXJl
LCBzdGFja0EsIHN0YWNrQikpKSB7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShyZXN1
bHQgPSBiYXNlSXNFcXVhbChhW3NpemVdLCB2YWx1ZSwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNr
QSwgc3RhY2tCKSkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gZGVl
cCBjb21wYXJlIG9iamVjdHMgdXNpbmcgYGZvckluYCwgaW5zdGVhZCBvZiBgZm9yT3duYCwgdG8g
YXZvaWQgYE9iamVjdC5rZXlzYAorICAgICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBt
b3JlIGNvc3RseQorICAgICAgICBmb3JJbihiLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBiKSB7Cisg
ICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgeworICAgICAgICAgICAg
Ly8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgc2l6ZSsrOwor
ICAgICAgICAgICAgLy8gZGVlcCBjb21wYXJlIGVhY2ggcHJvcGVydHkgdmFsdWUuCisgICAgICAg
ICAgICByZXR1cm4gKHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSAmJiBiYXNl
SXNFcXVhbChhW2tleV0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0Ip
KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChyZXN1bHQgJiYgIWlz
V2hlcmUpIHsKKyAgICAgICAgICAvLyBlbnN1cmUgYm90aCBvYmplY3RzIGhhdmUgdGhlIHNhbWUg
bnVtYmVyIG9mIHByb3BlcnRpZXMKKyAgICAgICAgICBmb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwg
a2V5LCBhKSB7CisgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpKSB7
CisgICAgICAgICAgICAgIC8vIGBzaXplYCB3aWxsIGJlIGAtMWAgaWYgYGFgIGhhcyBtb3JlIHBy
b3BlcnRpZXMgdGhhbiBgYmAKKyAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUg
PiAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICAgIHN0YWNrQS5wb3AoKTsKKyAgICAgIHN0YWNrQi5wb3AoKTsKKworICAgICAgaWYgKGlu
aXRlZFN0YWNrKSB7CisgICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpOworICAgICAgICByZWxl
YXNlQXJyYXkoc3RhY2tCKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdp
dGhvdXQgYXJndW1lbnQganVnZ2xpbmcgb3Igc3VwcG9ydAorICAgICAqIGZvciBgdGhpc0FyZ2Ag
YmluZGluZy4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFtIHtPYmplY3R9
IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBz
b3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxi
YWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdpbmcgcHJvcGVydGllcy4KKyAgICAg
KiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmpl
Y3RzLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVz
IHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiYXNlTWVy
Z2Uob2JqZWN0LCBzb3VyY2UsIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQikgeworICAgICAgKGlz
QXJyYXkoc291cmNlKSA/IGZvckVhY2ggOiBmb3JPd24pKHNvdXJjZSwgZnVuY3Rpb24oc291cmNl
LCBrZXkpIHsKKyAgICAgICAgdmFyIGZvdW5kLAorICAgICAgICAgICAgaXNBcnIsCisgICAgICAg
ICAgICByZXN1bHQgPSBzb3VyY2UsCisgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldOwor
CisgICAgICAgIGlmIChzb3VyY2UgJiYgKChpc0FyciA9IGlzQXJyYXkoc291cmNlKSkgfHwgaXNQ
bGFpbk9iamVjdChzb3VyY2UpKSkgeworICAgICAgICAgIC8vIGF2b2lkIG1lcmdpbmcgcHJldmlv
dXNseSBtZXJnZWQgY3ljbGljIHNvdXJjZXMKKyAgICAgICAgICB2YXIgc3RhY2tMZW5ndGggPSBz
dGFja0EubGVuZ3RoOworICAgICAgICAgIHdoaWxlIChzdGFja0xlbmd0aC0tKSB7CisgICAgICAg
ICAgICBpZiAoKGZvdW5kID0gc3RhY2tBW3N0YWNrTGVuZ3RoXSA9PSBzb3VyY2UpKSB7CisgICAg
ICAgICAgICAgIHZhbHVlID0gc3RhY2tCW3N0YWNrTGVuZ3RoXTsKKyAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghZm91bmQpIHsK
KyAgICAgICAgICAgIHZhciBpc1NoYWxsb3c7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsK
KyAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7CisgICAgICAg
ICAgICAgIGlmICgoaXNTaGFsbG93ID0gdHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykpIHsK
KyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1NoYWxsb3cpIHsKKyAgICAgICAgICAgICAgdmFs
dWUgPSBpc0FycgorICAgICAgICAgICAgICAgID8gKGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBb
XSkKKyAgICAgICAgICAgICAgICA6IChpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDoge30p
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIGBzb3VyY2VgIGFuZCBhc3NvY2lh
dGVkIGB2YWx1ZWAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzCisgICAgICAgICAg
ICBzdGFja0EucHVzaChzb3VyY2UpOworICAgICAgICAgICAgc3RhY2tCLnB1c2godmFsdWUpOwor
CisgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1
c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKQorICAgICAgICAgICAgaWYgKCFpc1NoYWxs
b3cpIHsKKyAgICAgICAgICAgICAgYmFzZU1lcmdlKHZhbHVlLCBzb3VyY2UsIGNhbGxiYWNrLCBz
dGFja0EsIHN0YWNrQik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGVsc2UgeworICAgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgICAgcmVz
dWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7CisgICAgICAgICAgICBpZiAodHlwZW9mIHJl
c3VsdCA9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2U7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9
ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKKyAgICAgIH0pOworICAg
IH0KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRv
bWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0CisgICAgICogZm9yIHJldHVy
bmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAg
ICAgKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBtaW5pbXVtIHBvc3NpYmxlIHZhbHVlLgorICAg
ICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisgICAg
ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCisgICAgICovCisg
ICAgZnVuY3Rpb24gYmFzZVJhbmRvbShtaW4sIG1heCkgeworICAgICAgcmV0dXJuIG1pbiArIGZs
b29yKG5hdGl2ZVJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTsKKyAgICB9CisKKyAgICAvKioK
KyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxYCB3aXRob3V0IHN1cHBv
cnQgZm9yIGNhbGxiYWNrIHNob3J0aGFuZHMKKyAgICAgKiBvciBgdGhpc0FyZ2AgYmluZGluZy4K
KyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhl
IGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFs
c2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLgorICAgICAqIEBw
YXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0
aW9uLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1m
cmVlIGFycmF5LgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpc1NvcnRl
ZCwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGluZGV4T2Yg
PSBnZXRJbmRleE9mKCksCisgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGgg
OiAwLAorICAgICAgICAgIHJlc3VsdCA9IFtdOworCisgICAgICB2YXIgaXNMYXJnZSA9ICFpc1Nv
cnRlZCAmJiBsZW5ndGggPj0gbGFyZ2VBcnJheVNpemUgJiYgaW5kZXhPZiA9PT0gYmFzZUluZGV4
T2YsCisgICAgICAgICAgc2VlbiA9IChjYWxsYmFjayB8fCBpc0xhcmdlKSA/IGdldEFycmF5KCkg
OiByZXN1bHQ7CisKKyAgICAgIGlmIChpc0xhcmdlKSB7CisgICAgICAgIHZhciBjYWNoZSA9IGNy
ZWF0ZUNhY2hlKHNlZW4pOworICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mOworICAgICAg
ICBzZWVuID0gY2FjaGU7CisgICAgICB9CisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkg
eworICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sCisgICAgICAgICAgICBjb21wdXRl
ZCA9IGNhbGxiYWNrID8gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBhcnJheSkgOiB2YWx1ZTsKKwor
ICAgICAgICBpZiAoaXNTb3J0ZWQKKyAgICAgICAgICAgICAgPyAhaW5kZXggfHwgc2VlbltzZWVu
Lmxlbmd0aCAtIDFdICE9PSBjb21wdXRlZAorICAgICAgICAgICAgICA6IGluZGV4T2Yoc2Vlbiwg
Y29tcHV0ZWQpIDwgMAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgaWYgKGNhbGxiYWNrIHx8
IGlzTGFyZ2UpIHsKKyAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7CisgICAgICAgICAg
fQorICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAg
ICAgaWYgKGlzTGFyZ2UpIHsKKyAgICAgICAgcmVsZWFzZUFycmF5KHNlZW4uYXJyYXkpOworICAg
ICAgICByZWxlYXNlT2JqZWN0KHNlZW4pOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgewor
ICAgICAgICByZWxlYXNlQXJyYXkoc2Vlbik7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFnZ3Jl
Z2F0ZXMgYSBjb2xsZWN0aW9uLCBjcmVhdGluZyBhbiBvYmplY3QgY29tcG9zZWQKKyAgICAgKiBv
ZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50
IG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICogdGhyb3VnaCBhIGNhbGxiYWNrLiBUaGUgZ2l2ZW4g
YHNldHRlcmAgZnVuY3Rpb24gc2V0cyB0aGUga2V5cyBhbmQgdmFsdWVzCisgICAgICogb2YgdGhl
IGNvbXBvc2VkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFt
IHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBzZXR0ZXIgZnVuY3Rpb24uCisgICAgICogQHJldHVybnMg
e0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi4KKyAgICAgKi8K
KyAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcikgeworICAgICAgcmV0dXJuIGZ1
bmN0aW9uKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICAgIHZhciByZXN1
bHQgPSB7fTsKKyAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJh
Y2ssIHRoaXNBcmcsIDMpOworCisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgICAg
bGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKworICAgICAgICBp
ZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICAgIHdoaWxlICgrK2luZGV4
IDwgbGVuZ3RoKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4XTsK
KyAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1ZSwgaW5kZXgs
IGNvbGxlY3Rpb24pLCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxl
Y3Rpb24pIHsKKyAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1
ZSwga2V5LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7CisgICAgICAgICAgfSk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoqCisg
ICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBlaXRoZXIgY3Vycmll
cyBvciBpbnZva2VzIGBmdW5jYAorICAgICAqIHdpdGggYW4gb3B0aW9uYWwgYHRoaXNgIGJpbmRp
bmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEBwcml2
YXRlCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9y
IG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFz
ayBUaGUgYml0bWFzayBvZiBtZXRob2QgZmxhZ3MgdG8gY29tcG9zZS4KKyAgICAgKiAgVGhlIGJp
dG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICogIDEg
LSBgXy5iaW5kYAorICAgICAqICAyIC0gYF8uYmluZEtleWAKKyAgICAgKiAgNCAtIGBfLmN1cnJ5
YAorICAgICAqICA4IC0gYF8uY3VycnlgIChib3VuZCkKKyAgICAgKiAgMTYgLSBgXy5wYXJ0aWFs
YAorICAgICAqICAzMiAtIGBfLnBhcnRpYWxSaWdodGAKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBb
cGFydGlhbEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlCisg
ICAgICogIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQHBhcmFtIHtBcnJh
eX0gW3BhcnRpYWxSaWdodEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8g
dGhvc2UKKyAgICAgKiAgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgKiBAcGFy
YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICAgICAqIEBw
YXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuCisgICAgICogQHJldHVy
bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVu
Y3Rpb24gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCBwYXJ0aWFsQXJncywgcGFydGlhbFJp
Z2h0QXJncywgdGhpc0FyZywgYXJpdHkpIHsKKyAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYg
MSwKKyAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgMiwKKyAgICAgICAgICBpc0N1cnJ5
ID0gYml0bWFzayAmIDQsCisgICAgICAgICAgaXNDdXJyeUJvdW5kID0gYml0bWFzayAmIDgsCisg
ICAgICAgICAgaXNQYXJ0aWFsID0gYml0bWFzayAmIDE2LAorICAgICAgICAgIGlzUGFydGlhbFJp
Z2h0ID0gYml0bWFzayAmIDMyOworCisgICAgICBpZiAoIWlzQmluZEtleSAmJiAhaXNGdW5jdGlv
bihmdW5jKSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAg
aWYgKGlzUGFydGlhbCAmJiAhcGFydGlhbEFyZ3MubGVuZ3RoKSB7CisgICAgICAgIGJpdG1hc2sg
Jj0gfjE2OworICAgICAgICBpc1BhcnRpYWwgPSBwYXJ0aWFsQXJncyA9IGZhbHNlOworICAgICAg
fQorICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0ICYmICFwYXJ0aWFsUmlnaHRBcmdzLmxlbmd0aCkg
eworICAgICAgICBiaXRtYXNrICY9IH4zMjsKKyAgICAgICAgaXNQYXJ0aWFsUmlnaHQgPSBwYXJ0
aWFsUmlnaHRBcmdzID0gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgYmluZERhdGEgPSBmdW5j
ICYmIGZ1bmMuX19iaW5kRGF0YV9fOworICAgICAgaWYgKGJpbmREYXRhICYmIGJpbmREYXRhICE9
PSB0cnVlKSB7CisgICAgICAgIC8vIGNsb25lIGBiaW5kRGF0YWAKKyAgICAgICAgYmluZERhdGEg
PSBzbGljZShiaW5kRGF0YSk7CisgICAgICAgIGlmIChiaW5kRGF0YVsyXSkgeworICAgICAgICAg
IGJpbmREYXRhWzJdID0gc2xpY2UoYmluZERhdGFbMl0pOworICAgICAgICB9CisgICAgICAgIGlm
IChiaW5kRGF0YVszXSkgeworICAgICAgICAgIGJpbmREYXRhWzNdID0gc2xpY2UoYmluZERhdGFb
M10pOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBgdGhpc0JpbmRpbmdgIGlzIG5vdCBwcmV2
aW91c2x5IGJvdW5kCisgICAgICAgIGlmIChpc0JpbmQgJiYgIShiaW5kRGF0YVsxXSAmIDEpKSB7
CisgICAgICAgICAgYmluZERhdGFbNF0gPSB0aGlzQXJnOworICAgICAgICB9CisgICAgICAgIC8v
IHNldCBpZiBwcmV2aW91c2x5IGJvdW5kIGJ1dCBub3QgY3VycmVudGx5IChzdWJzZXF1ZW50IGN1
cnJpZWQgZnVuY3Rpb25zKQorICAgICAgICBpZiAoIWlzQmluZCAmJiBiaW5kRGF0YVsxXSAmIDEp
IHsKKyAgICAgICAgICBiaXRtYXNrIHw9IDg7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IGN1
cnJpZWQgYXJpdHkgaWYgbm90IHlldCBzZXQKKyAgICAgICAgaWYgKGlzQ3VycnkgJiYgIShiaW5k
RGF0YVsxXSAmIDQpKSB7CisgICAgICAgICAgYmluZERhdGFbNV0gPSBhcml0eTsKKyAgICAgICAg
fQorICAgICAgICAvLyBhcHBlbmQgcGFydGlhbCBsZWZ0IGFyZ3VtZW50cworICAgICAgICBpZiAo
aXNQYXJ0aWFsKSB7CisgICAgICAgICAgcHVzaC5hcHBseShiaW5kRGF0YVsyXSB8fCAoYmluZERh
dGFbMl0gPSBbXSksIHBhcnRpYWxBcmdzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhcHBlbmQg
cGFydGlhbCByaWdodCBhcmd1bWVudHMKKyAgICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0KSB7Cisg
ICAgICAgICAgdW5zaGlmdC5hcHBseShiaW5kRGF0YVszXSB8fCAoYmluZERhdGFbM10gPSBbXSks
IHBhcnRpYWxSaWdodEFyZ3MpOworICAgICAgICB9CisgICAgICAgIC8vIG1lcmdlIGZsYWdzCisg
ICAgICAgIGJpbmREYXRhWzFdIHw9IGJpdG1hc2s7CisgICAgICAgIHJldHVybiBjcmVhdGVXcmFw
cGVyLmFwcGx5KG51bGwsIGJpbmREYXRhKTsKKyAgICAgIH0KKyAgICAgIC8vIGZhc3QgcGF0aCBm
b3IgYF8uYmluZGAKKyAgICAgIHZhciBjcmVhdGVyID0gKGJpdG1hc2sgPT0gMSB8fCBiaXRtYXNr
ID09PSAxNykgPyBiYXNlQmluZCA6IGJhc2VDcmVhdGVXcmFwcGVyOworICAgICAgcmV0dXJuIGNy
ZWF0ZXIoW2Z1bmMsIGJpdG1hc2ssIHBhcnRpYWxBcmdzLCBwYXJ0aWFsUmlnaHRBcmdzLCB0aGlz
QXJnLCBhcml0eV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgYGVzY2FwZWAg
dG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuCisgICAgICoKKyAgICAgKiBA
cHJpdmF0ZQorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0
ZXIgdG8gZXNjYXBlLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2Fw
ZWQgY2hhcmFjdGVyLgorICAgICAqLworICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWxDaGFyKG1hdGNo
KSB7CisgICAgICByZXR1cm4gaHRtbEVzY2FwZXNbbWF0Y2hdOworICAgIH0KKworICAgIC8qKgor
ICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlICJpbmRleE9mIiBmdW5jdGlvbi4gSWYgdGhlIGBf
LmluZGV4T2ZgIG1ldGhvZCBpcworICAgICAqIGN1c3RvbWl6ZWQsIHRoaXMgbWV0aG9kIHJldHVy
bnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgICAgICogdGhlIGBi
YXNlSW5kZXhPZmAgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBy
ZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgImluZGV4T2YiIGZ1bmN0aW9uLgorICAgICAq
LworICAgIGZ1bmN0aW9uIGdldEluZGV4T2YoKSB7CisgICAgICB2YXIgcmVzdWx0ID0gKHJlc3Vs
dCA9IGxvZGFzaC5pbmRleE9mKSA9PT0gaW5kZXhPZiA/IGJhc2VJbmRleE9mIDogcmVzdWx0Owor
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYg
YHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisg
ICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVy
bnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1
bmN0aW9uLCBlbHNlIGBmYWxzZWAuCisgICAgICovCisgICAgZnVuY3Rpb24gaXNOYXRpdmUodmFs
dWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiByZU5hdGl2
ZS50ZXN0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGB0aGlzYCBiaW5k
aW5nIGRhdGEgb24gYSBnaXZlbiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisg
ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc2V0IGRhdGEgb24u
CisgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWUgVGhlIGRhdGEgYXJyYXkgdG8gc2V0LgorICAg
ICAqLworICAgIHZhciBzZXRCaW5kRGF0YSA9ICFkZWZpbmVQcm9wZXJ0eSA/IG5vb3AgOiBmdW5j
dGlvbihmdW5jLCB2YWx1ZSkgeworICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IHZhbHVlOworICAg
ICAgZGVmaW5lUHJvcGVydHkoZnVuYywgJ19fYmluZERhdGFfXycsIGRlc2NyaXB0b3IpOworICAg
IH07CisKKyAgICAvKioKKyAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBpc1Bs
YWluT2JqZWN0YCB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB2YWx1ZQorICAgICAqIGlzIGFuIG9i
amVjdCBjcmVhdGVkIGJ5IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3RvciwgYXNzdW1pbmcgb2JqZWN0
cyBjcmVhdGVkCisgICAgICogYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yIGhhdmUgbm8gaW5o
ZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgdGhhdAorICAgICAqIHRoZXJlIGFyZSBu
byBgT2JqZWN0LnByb3RvdHlwZWAgZXh0ZW5zaW9ucy4KKyAgICAgKgorICAgICAqIEBwcml2YXRl
CisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJl
dHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmpl
Y3QsIGVsc2UgYGZhbHNlYC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzaGltSXNQbGFpbk9iamVj
dCh2YWx1ZSkgeworICAgICAgdmFyIGN0b3IsCisgICAgICAgICAgcmVzdWx0OworCisgICAgICAv
LyBhdm9pZCBub24gT2JqZWN0IG9iamVjdHMsIGBhcmd1bWVudHNgIG9iamVjdHMsIGFuZCBET00g
ZWxlbWVudHMKKyAgICAgIGlmICghKHZhbHVlICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG9i
amVjdENsYXNzKSB8fAorICAgICAgICAgIChjdG9yID0gdmFsdWUuY29uc3RydWN0b3IsIGlzRnVu
Y3Rpb24oY3RvcikgJiYgIShjdG9yIGluc3RhbmNlb2YgY3RvcikpKSB7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIEluIG1vc3QgZW52aXJvbm1lbnRzIGFuIG9iamVj
dCdzIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBiZWZvcmUKKyAgICAgIC8vIGl0cyBpbmhl
cml0ZWQgcHJvcGVydGllcy4gSWYgdGhlIGxhc3QgaXRlcmF0ZWQgcHJvcGVydHkgaXMgYW4gb2Jq
ZWN0J3MKKyAgICAgIC8vIG93biBwcm9wZXJ0eSB0aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0ZWQg
ZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgorICAgICAgZm9ySW4odmFsdWUsIGZ1bmN0aW9uKHZhbHVl
LCBrZXkpIHsKKyAgICAgICAgcmVzdWx0ID0ga2V5OworICAgICAgfSk7CisgICAgICByZXR1cm4g
dHlwZW9mIHJlc3VsdCA9PSAndW5kZWZpbmVkJyB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVl
LCByZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgYHVuZXNjYXBlYCB0
byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBw
cml2YXRlCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoIFRoZSBtYXRjaGVkIGNoYXJhY3Rl
ciB0byB1bmVzY2FwZS4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVz
Y2FwZWQgY2hhcmFjdGVyLgorICAgICAqLworICAgIGZ1bmN0aW9uIHVuZXNjYXBlSHRtbENoYXIo
bWF0Y2gpIHsKKyAgICAgIHJldHVybiBodG1sVW5lc2NhcGVzW21hdGNoXTsKKyAgICB9CisKKyAg
ICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFs
dWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg
ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFt
IHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59
IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwg
ZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAoZnVuY3Rpb24o
KSB7IHJldHVybiBfLmlzQXJndW1lbnRzKGFyZ3VtZW50cyk7IH0pKDEsIDIsIDMpOworICAgICAq
IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTsKKyAg
ICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVl
KSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5
cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicgJiYKKyAgICAgICAgdG9TdHJpbmcuY2FsbCh2
YWx1ZSkgPT0gYXJnc0NsYXNzIHx8IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENo
ZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LgorICAgICAqCisgICAgICogQHN0YXRpYworICAg
ICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdvcnkg
T2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAg
ICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBh
biBhcnJheSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAo
ZnVuY3Rpb24oKSB7IHJldHVybiBfLmlzQXJyYXkoYXJndW1lbnRzKTsgfSkoKTsKKyAgICAgKiAv
LyA9PiBmYWxzZQorICAgICAqCisgICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7CisgICAgICog
Ly8gPT4gdHJ1ZQorICAgICAqLworICAgIHZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBm
dW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAn
b2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09ICdudW1iZXInICYmCisgICAgICAgIHRv
U3RyaW5nLmNhbGwodmFsdWUpID09IGFycmF5Q2xhc3MgfHwgZmFsc2U7CisgICAgfTsKKworICAg
IC8qKgorICAgICAqIEEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5rZXlzYCB3
aGljaCBwcm9kdWNlcyBhbiBhcnJheSBvZiB0aGUKKyAgICAgKiBnaXZlbiBvYmplY3QncyBvd24g
ZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAg
ICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmpl
Y3QgdG8gaW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkg
b2YgcHJvcGVydHkgbmFtZXMuCisgICAgICovCisgICAgdmFyIHNoaW1LZXlzID0gZnVuY3Rpb24o
b2JqZWN0KSB7CisgICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBb
XTsKKyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7CisgICAgICBpZiAoIShvYmpl
Y3RUeXBlc1t0eXBlb2Ygb2JqZWN0XSkpIHJldHVybiByZXN1bHQ7CisgICAgICAgIGZvciAoaW5k
ZXggaW4gaXRlcmFibGUpIHsKKyAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpdGVy
YWJsZSwgaW5kZXgpKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaChpbmRleCk7CisgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgor
ICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY29tcG9zZWQgb2YgdGhlIG93biBlbnVtZXJhYmxlIHBy
b3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg
KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtP
YmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0Fy
cmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgorICAgICAqIEBleGFtcGxl
CisgICAgICoKKyAgICAgKiBfLmtleXMoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMg
fSk7CisgICAgICogLy8gPT4gWydvbmUnLCAndHdvJywgJ3RocmVlJ10gKHByb3BlcnR5IG9yZGVy
IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICovCisgICAgdmFy
IGtleXMgPSAhbmF0aXZlS2V5cyA/IHNoaW1LZXlzIDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAg
ICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHsKKyAgICAgICAgcmV0dXJuIFtdOworICAgICAgfQor
ICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTsKKyAgICB9OworCisgICAgLyoqCisgICAg
ICogVXNlZCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllczoKKyAgICAgKgor
ICAgICAqIFRob3VnaCB0aGUgYD5gIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwg
Y2hhcmFjdGVycyBsaWtlIGA+YCBhbmQgYC9gCisgICAgICogZG9uJ3QgcmVxdWlyZSBlc2NhcGlu
ZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyB1bmxlc3MgdGhleSdyZSBwYXJ0
CisgICAgICogb2YgYSB0YWcgb3IgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLgorICAgICAq
IGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzICh1bmRl
ciAic2VtaS1yZWxhdGVkIGZ1biBmYWN0IikKKyAgICAgKi8KKyAgICB2YXIgaHRtbEVzY2FwZXMg
PSB7CisgICAgICAnJic6ICcmYW1wOycsCisgICAgICAnPCc6ICcmbHQ7JywKKyAgICAgICc+Jzog
JyZndDsnLAorICAgICAgJyInOiAnJnF1b3Q7JywKKyAgICAgICInIjogJyYjMzk7JworICAgIH07
CisKKyAgICAvKiogVXNlZCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycyAq
LworICAgIHZhciBodG1sVW5lc2NhcGVzID0gaW52ZXJ0KGh0bWxFc2NhcGVzKTsKKworICAgIC8q
KiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycyAqLworICAg
IHZhciByZUVzY2FwZWRIdG1sID0gUmVnRXhwKCcoJyArIGtleXMoaHRtbFVuZXNjYXBlcykuam9p
bignfCcpICsgJyknLCAnZycpLAorICAgICAgICByZVVuZXNjYXBlZEh0bWwgPSBSZWdFeHAoJ1sn
ICsga2V5cyhodG1sRXNjYXBlcykuam9pbignJykgKyAnXScsICdnJyk7CisKKyAgICAvKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUg
cHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAq
IG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2ln
bm1lbnRzIG9mIHByZXZpb3VzCisgICAgICogc291cmNlcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92
aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlCisgICAgICogYXNzaWduZWQg
dmFsdWVzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdp
dGggdHdvCisgICAgICogYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS4KKyAg
ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBlIEZ1
bmN0aW9uCisgICAgICogQGFsaWFzIGV4dGVuZAorICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisg
ICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAg
ICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisgICAg
ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXpl
IGFzc2lnbmluZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlz
YCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJu
cyB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg
KiBfLmFzc2lnbih7ICduYW1lJzogJ2ZyZWQnIH0sIHsgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTsK
KyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAg
ICAgKgorICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5j
dGlvbihhLCBiKSB7CisgICAgICogICByZXR1cm4gdHlwZW9mIGEgPT0gJ3VuZGVmaW5lZCcgPyBi
IDogYTsKKyAgICAgKiB9KTsKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzog
J2Jhcm5leScgfTsKKyAgICAgKiBkZWZhdWx0cyhvYmplY3QsIHsgJ25hbWUnOiAnZnJlZCcsICdl
bXBsb3llcic6ICdzbGF0ZScgfSk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAn
ZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAgICAgKi8KKyAgICB2YXIgYXNzaWduID0gZnVuY3Rpb24o
b2JqZWN0LCBzb3VyY2UsIGd1YXJkKSB7CisgICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2Jq
ZWN0LCByZXN1bHQgPSBpdGVyYWJsZTsKKyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1
bHQ7CisgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKKyAgICAgICAgICBhcmdzSW5kZXggPSAw
LAorICAgICAgICAgIGFyZ3NMZW5ndGggPSB0eXBlb2YgZ3VhcmQgPT0gJ251bWJlcicgPyAyIDog
YXJncy5sZW5ndGg7CisgICAgICBpZiAoYXJnc0xlbmd0aCA+IDMgJiYgdHlwZW9mIGFyZ3NbYXJn
c0xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gYmFz
ZUNyZWF0ZUNhbGxiYWNrKGFyZ3NbLS1hcmdzTGVuZ3RoIC0gMV0sIGFyZ3NbYXJnc0xlbmd0aC0t
XSwgMik7CisgICAgICB9IGVsc2UgaWYgKGFyZ3NMZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzW2Fy
Z3NMZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGNhbGxiYWNrID0gYXJnc1st
LWFyZ3NMZW5ndGhdOworICAgICAgfQorICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xl
bmd0aCkgeworICAgICAgICBpdGVyYWJsZSA9IGFyZ3NbYXJnc0luZGV4XTsKKyAgICAgICAgaWYg
KGl0ZXJhYmxlICYmIG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHsKKyAgICAgICAgdmFy
IG93bkluZGV4ID0gLTEsCisgICAgICAgICAgICBvd25Qcm9wcyA9IG9iamVjdFR5cGVzW3R5cGVv
ZiBpdGVyYWJsZV0gJiYga2V5cyhpdGVyYWJsZSksCisgICAgICAgICAgICBsZW5ndGggPSBvd25Q
cm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7CisKKyAgICAgICAgd2hpbGUgKCsrb3duSW5kZXgg
PCBsZW5ndGgpIHsKKyAgICAgICAgICBpbmRleCA9IG93blByb3BzW293bkluZGV4XTsKKyAgICAg
ICAgICByZXN1bHRbaW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjayhyZXN1bHRbaW5kZXhdLCBp
dGVyYWJsZVtpbmRleF0pIDogaXRlcmFibGVbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQKKyAgICB9OworCisgICAgLyoqCisgICAgICog
Q3JlYXRlcyBhIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBpc0RlZXBgIGlzIGB0cnVlYCBuZXN0ZWQg
b2JqZWN0cyB3aWxsIGFsc28KKyAgICAgKiBiZSBjbG9uZWQsIG90aGVyd2lzZSB0aGV5IHdpbGwg
YmUgYXNzaWduZWQgYnkgcmVmZXJlbmNlLiBJZiBhIGNhbGxiYWNrCisgICAgICogaXMgcHJvdmlk
ZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWVzLiBJZiB0
aGUKKyAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNsb25pbmcgd2lsbCBiZSBo
YW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4KKyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91
bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgor
ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn
b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4K
KyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNpZnkgYSBkZWVwIGNs
b25lLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRv
IGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBU
aGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0
dXJucyB0aGUgY2xvbmVkIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2
YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2
IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsK
KyAgICAgKgorICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShjaGFyYWN0ZXJzKTsKKyAgICAg
KiBzaGFsbG93WzBdID09PSBjaGFyYWN0ZXJzWzBdOworICAgICAqIC8vID0+IHRydWUKKyAgICAg
KgorICAgICAqIHZhciBkZWVwID0gXy5jbG9uZShjaGFyYWN0ZXJzLCB0cnVlKTsKKyAgICAgKiBk
ZWVwWzBdID09PSBjaGFyYWN0ZXJzWzBdOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAg
ICAgKiBfLm1peGluKHsKKyAgICAgKiAgICdjbG9uZSc6IF8ucGFydGlhbFJpZ2h0KF8uY2xvbmUs
IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICogICAgIHJldHVybiBfLmlzRWxlbWVudCh2YWx1ZSkg
PyB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpIDogdW5kZWZpbmVkOworICAgICAqICAgfSkKKyAgICAg
KiB9KTsKKyAgICAgKgorICAgICAqIHZhciBjbG9uZSA9IF8uY2xvbmUoZG9jdW1lbnQuYm9keSk7
CisgICAgICogY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7CisgICAgICogLy8gPT4gMAorICAgICAq
LworICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlLCBpc0RlZXAsIGNhbGxiYWNrLCB0aGlzQXJnKSB7
CisgICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoICJDb2xsZWN0aW9ucyIgbWV0aG9kcyB3aXRo
b3V0IHVzaW5nIHRoZWlyIGBpbmRleGAKKyAgICAgIC8vIGFuZCBgY29sbGVjdGlvbmAgYXJndW1l
bnRzIGZvciBgaXNEZWVwYCBhbmQgYGNhbGxiYWNrYAorICAgICAgaWYgKHR5cGVvZiBpc0RlZXAg
IT0gJ2Jvb2xlYW4nICYmIGlzRGVlcCAhPSBudWxsKSB7CisgICAgICAgIHRoaXNBcmcgPSBjYWxs
YmFjazsKKyAgICAgICAgY2FsbGJhY2sgPSBpc0RlZXA7CisgICAgICAgIGlzRGVlcCA9IGZhbHNl
OworICAgICAgfQorICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCB0eXBlb2Yg
Y2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyAmJiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo
aXNBcmcsIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVlcCBjbG9u
ZSBvZiBgdmFsdWVgLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUKKyAgICAg
KiBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWVzLiBJZiB0aGUgY2FsbGJhY2sg
cmV0dXJucyBgdW5kZWZpbmVkYAorICAgICAqIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRo
ZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvCisgICAgICogYHRoaXNB
cmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgorICAgICAqCisgICAg
ICogTm90ZTogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgc3RydWN0dXJlZCBj
bG9uZSBhbGdvcml0aG0uIEZ1bmN0aW9ucworICAgICAqIGFuZCBET00gbm9kZXMgYXJlICoqbm90
KiogY2xvbmVkLiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVj
dHMgYW5kCisgICAgICogb2JqZWN0cyBjcmVhdGVkIGJ5IGNvbnN0cnVjdG9ycyBvdGhlciB0aGFu
IGBPYmplY3RgIGFyZSBjbG9uZWQgdG8gcGxhaW4gYE9iamVjdGAgb2JqZWN0cy4KKyAgICAgKiBT
ZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNpbnRlcm5h
bC1zdHJ1Y3R1cmVkLWNsb25pbmctYWxnb3JpdGhtLgorICAgICAqCisgICAgICogQHN0YXRpYwor
ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFy
YW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBkZWVwIGNsb25lLgorICAgICAqIEBwYXJhbSB7RnVu
Y3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVl
cy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNh
bGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFs
dWUuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwor
ICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKKyAgICAgKiAgIHsgJ25h
bWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogdmFy
IGRlZXAgPSBfLmNsb25lRGVlcChjaGFyYWN0ZXJzKTsKKyAgICAgKiBkZWVwWzBdID09PSBjaGFy
YWN0ZXJzWzBdOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiB2YXIgdmlldyA9
IHsKKyAgICAgKiAgICdsYWJlbCc6ICdkb2NzJywKKyAgICAgKiAgICdub2RlJzogZWxlbWVudAor
ICAgICAqIH07CisgICAgICoKKyAgICAgKiB2YXIgY2xvbmUgPSBfLmNsb25lRGVlcCh2aWV3LCBm
dW5jdGlvbih2YWx1ZSkgeworICAgICAqICAgcmV0dXJuIF8uaXNFbGVtZW50KHZhbHVlKSA/IHZh
bHVlLmNsb25lTm9kZSh0cnVlKSA6IHVuZGVmaW5lZDsKKyAgICAgKiB9KTsKKyAgICAgKgorICAg
ICAqIGNsb25lLm5vZGUgPT0gdmlldy5ub2RlOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICov
CisgICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg
ICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgdHJ1ZSwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5j
dGlvbicgJiYgYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSk7CisgICAg
fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9t
IHRoZSBnaXZlbiBgcHJvdG90eXBlYCBvYmplY3QuIElmIGEKKyAgICAgKiBgcHJvcGVydGllc2Ag
b2JqZWN0IGlzIHByb3ZpZGVkIGl0cyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBhc3Np
Z25lZAorICAgICAqIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0
aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICog
QHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS4KKyAg
ICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2ln
biB0byB0aGUgb2JqZWN0LgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5l
dyBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIGZ1bmN0aW9uIFNoYXBl
KCkgeworICAgICAqICAgdGhpcy54ID0gMDsKKyAgICAgKiAgIHRoaXMueSA9IDA7CisgICAgICog
fQorICAgICAqCisgICAgICogZnVuY3Rpb24gQ2lyY2xlKCkgeworICAgICAqICAgU2hhcGUuY2Fs
bCh0aGlzKTsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5j
cmVhdGUoU2hhcGUucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IENpcmNsZSB9KTsKKyAgICAg
KgorICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlOworICAgICAqIGNpcmNsZSBpbnN0YW5j
ZW9mIENpcmNsZTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBjaXJjbGUgaW5z
dGFuY2VvZiBTaGFwZTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24g
Y3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgeworICAgICAgdmFyIHJlc3VsdCA9IGJhc2VD
cmVhdGUocHJvdG90eXBlKTsKKyAgICAgIHJldHVybiBwcm9wZXJ0aWVzID8gYXNzaWduKHJlc3Vs
dCwgcHJvcGVydGllcykgOiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWdu
cyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3QocykgdG8gdGhlIGRl
c3RpbmF0aW9uCisgICAgICogb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0
aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIE9uY2UgYQorICAgICAqIHByb3BlcnR5IGlzIHNl
dCwgYWRkaXRpb25hbCBkZWZhdWx0cyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9y
ZWQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA
dHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtP
YmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIEBwYXJhbSB7Li4u
T2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisgICAgICogQHBhcmFtLSB7T2Jq
ZWN0fSBbZ3VhcmRdIEFsbG93cyB3b3JraW5nIHdpdGggYF8ucmVkdWNlYCB3aXRob3V0IHVzaW5n
IGl0cworICAgICAqICBga2V5YCBhbmQgYG9iamVjdGAgYXJndW1lbnRzIGFzIHNvdXJjZXMuCisg
ICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0Lgor
ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdi
YXJuZXknIH07CisgICAgICogXy5kZWZhdWx0cyhvYmplY3QsIHsgJ25hbWUnOiAnZnJlZCcsICdl
bXBsb3llcic6ICdzbGF0ZScgfSk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAn
ZW1wbG95ZXInOiAnc2xhdGUnIH0KKyAgICAgKi8KKyAgICB2YXIgZGVmYXVsdHMgPSBmdW5jdGlv
bihvYmplY3QsIHNvdXJjZSwgZ3VhcmQpIHsKKyAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBv
YmplY3QsIHJlc3VsdCA9IGl0ZXJhYmxlOworICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJl
c3VsdDsKKyAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGFyZ3NJbmRleCA9
IDAsCisgICAgICAgICAgYXJnc0xlbmd0aCA9IHR5cGVvZiBndWFyZCA9PSAnbnVtYmVyJyA/IDIg
OiBhcmdzLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsK
KyAgICAgICAgaXRlcmFibGUgPSBhcmdzW2FyZ3NJbmRleF07CisgICAgICAgIGlmIChpdGVyYWJs
ZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSB7CisgICAgICAgIHZhciBvd25JbmRl
eCA9IC0xLAorICAgICAgICAgICAgb3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFi
bGVdICYmIGtleXMoaXRlcmFibGUpLAorICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBv
d25Qcm9wcy5sZW5ndGggOiAwOworCisgICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3Ro
KSB7CisgICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07CisgICAgICAgICAgaWYg
KHR5cGVvZiByZXN1bHRbaW5kZXhdID09ICd1bmRlZmluZWQnKSByZXN1bHRbaW5kZXhdID0gaXRl
cmFibGVbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVy
biByZXN1bHQKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBg
Xy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUKKyAgICAg
KiBmaXJzdCBlbGVtZW50IHRoYXQgcGFzc2VzIHRoZSBjYWxsYmFjayBjaGVjaywgaW5zdGVhZCBv
ZiB0aGUgZWxlbWVudCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUg
aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisg
ICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZl
biBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBg
Y2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdp
bGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9m
IHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICog
QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAg
ICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLgorICAgICAq
IEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg
ZnVuY3Rpb24gY2FsbGVkIHBlcgorICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFt
ZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvCisgICAgICogIGNyZWF0
ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4K
KyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxi
YWNrYC4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5
IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgorICAgICAqIEBleGFtcGxl
CisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHsKKyAgICAgKiAgICdiYXJuZXknOiB7
ICAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKKyAgICAgKiAgICdmcmVkJzogeyAgICAn
YWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9LAorICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2Un
OiAxLCAgJ2Jsb2NrZWQnOiBmYWxzZSB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8uZmlu
ZEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKKyAgICAgKiAgIHJldHVybiBjaHIuYWdl
IDwgNDA7CisgICAgICogfSk7CisgICAgICogLy8gPT4gJ2Jhcm5leScgKHByb3BlcnR5IG9yZGVy
IGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICoKKyAgICAgKiAv
LyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kS2V5KGNo
YXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CisgICAgICogLy8gPT4gJ3BlYmJsZXMnCisgICAgICoK
KyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5m
aW5kS2V5KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7CisgICAgICogLy8gPT4gJ2ZyZWQnCisgICAg
ICovCisgICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7Cisg
ICAgICB2YXIgcmVzdWx0OworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2so
Y2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgZm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFs
dWUsIGtleSwgb2JqZWN0KSB7CisgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmpl
Y3QpKSB7CisgICAgICAgICAgcmVzdWx0ID0ga2V5OworICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg
IC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQg
aXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGluIHRo
ZSBvcHBvc2l0ZSBvcmRlci4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBw
cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAg
KiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVs
ZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxs
YmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCBy
ZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhl
IGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3Rh
dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq
IEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBzZWFyY2guCisgICAgICogQHBh
cmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5j
dGlvbiBjYWxsZWQgcGVyCisgICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9y
IG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgKiAgY3JlYXRlIGEg
Il8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAg
ICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tg
LgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2Yg
dGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuCisgICAgICogQGV4YW1wbGUKKyAg
ICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0geworICAgICAqICAgJ2Jhcm5leSc6IHsgICdh
Z2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sCisgICAgICogICAnZnJlZCc6IHsgICAgJ2FnZSc6
IDQwLCAnYmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEs
ICAnYmxvY2tlZCc6IHRydWUgfQorICAgICAqIH07CisgICAgICoKKyAgICAgKiBfLmZpbmRMYXN0
S2V5KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2Ug
PCA0MDsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiByZXR1cm5zIGBwZWJibGVzYCwgYXNzdW1p
bmcgYF8uZmluZEtleWAgcmV0dXJucyBgYmFybmV5YAorICAgICAqCisgICAgICogLy8gdXNpbmcg
Il8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmluZExhc3RLZXkoY2hhcmFj
dGVycywgeyAnYWdlJzogNDAgfSk7CisgICAgICogLy8gPT4gJ2ZyZWQnCisgICAgICoKKyAgICAg
KiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kTGFz
dEtleShjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8vID0+ICdwZWJibGVzJworICAg
ICAqLworICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcp
IHsKKyAgICAgIHZhciByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxs
YmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBmb3JPd25SaWdodChvYmplY3QsIGZ1
bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgeworICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUs
IGtleSwgb2JqZWN0KSkgeworICAgICAgICAgIHJlc3VsdCA9IGtleTsKKyAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVu
dW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QsCisgICAgICogZXhlY3V0aW5nIHRoZSBj
YWxsYmFjayBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlz
QXJnYAorICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGtl
eSwgb2JqZWN0KS4gQ2FsbGJhY2tzIG1heSBleGl0CisgICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5
IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg
ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAdHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29y
eSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0
ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHld
IFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0
aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJu
cyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAg
ICAgKiBmdW5jdGlvbiBTaGFwZSgpIHsKKyAgICAgKiAgIHRoaXMueCA9IDA7CisgICAgICogICB0
aGlzLnkgPSAwOworICAgICAqIH0KKyAgICAgKgorICAgICAqIFNoYXBlLnByb3RvdHlwZS5tb3Zl
ID0gZnVuY3Rpb24oeCwgeSkgeworICAgICAqICAgdGhpcy54ICs9IHg7CisgICAgICogICB0aGlz
LnkgKz0geTsKKyAgICAgKiB9OworICAgICAqCisgICAgICogXy5mb3JJbihuZXcgU2hhcGUsIGZ1
bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CisgICAgICog
fSk7CisgICAgICogLy8gPT4gbG9ncyAneCcsICd5JywgYW5kICdtb3ZlJyAocHJvcGVydHkgb3Jk
ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICB2
YXIgZm9ySW4gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg
ICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IGNvbGxlY3Rpb24sIHJlc3VsdCA9IGl0ZXJhYmxlOwor
ICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDsKKyAgICAgIGlmICghb2JqZWN0VHlw
ZXNbdHlwZW9mIGl0ZXJhYmxlXSkgcmV0dXJuIHJlc3VsdDsKKyAgICAgIGNhbGxiYWNrID0gY2Fs
bGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VD
cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAgIGZvciAoaW5kZXgg
aW4gaXRlcmFibGUpIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soaXRlcmFibGVbaW5kZXhdLCBp
bmRleCwgY29sbGVjdGlvbikgPT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OworICAgICAgICB9Cisg
ICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9k
IGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMK
KyAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICoK
KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2Jq
ZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRl
IG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg
ZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0Fy
Z10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09i
amVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog
ZnVuY3Rpb24gU2hhcGUoKSB7CisgICAgICogICB0aGlzLnggPSAwOworICAgICAqICAgdGhpcy55
ID0gMDsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBTaGFwZS5wcm90b3R5cGUubW92ZSA9IGZ1
bmN0aW9uKHgsIHkpIHsKKyAgICAgKiAgIHRoaXMueCArPSB4OworICAgICAqICAgdGhpcy55ICs9
IHk7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8uZm9ySW5SaWdodChuZXcgU2hhcGUsIGZ1
bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CisgICAgICog
fSk7CisgICAgICogLy8gPT4gbG9ncyAnbW92ZScsICd5JywgYW5kICd4JyBhc3N1bWluZyBgXy5m
b3JJbiBgIGxvZ3MgJ3gnLCAneScsIGFuZCAnbW92ZScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBm
b3JJblJpZ2h0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBwYWlycyA9
IFtdOworCisgICAgICBmb3JJbihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAg
ICAgcGFpcnMucHVzaChrZXksIHZhbHVlKTsKKyAgICAgIH0pOworCisgICAgICB2YXIgbGVuZ3Ro
ID0gcGFpcnMubGVuZ3RoOworICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2Fs
bGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIGlm
IChjYWxsYmFjayhwYWlyc1tsZW5ndGgtLV0sIHBhaXJzW2xlbmd0aF0sIG9iamVjdCkgPT09IGZh
bHNlKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVy
biBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51
bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCwgZXhlY3V0aW5nIHRoZSBjYWxsYmFjawor
ICAgICAqIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNB
cmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKKyAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwga2V5
LCBvYmplY3QpLiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5CisgICAgICog
ZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg
ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBlIEZ1bmN0aW9uCisgICAgICogQGNhdGVnb3J5
IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRl
cmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0g
VGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro
aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z
IHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg
ICAqIF8uZm9yT3duKHsgJzAnOiAnemVybycsICcxJzogJ29uZScsICdsZW5ndGgnOiAyIH0sIGZ1
bmN0aW9uKG51bSwga2V5KSB7CisgICAgICogICBjb25zb2xlLmxvZyhrZXkpOworICAgICAqIH0p
OworICAgICAqIC8vID0+IGxvZ3MgJzAnLCAnMScsIGFuZCAnbGVuZ3RoJyAocHJvcGVydHkgb3Jk
ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICB2
YXIgZm9yT3duID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAg
ICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBjb2xsZWN0aW9uLCByZXN1bHQgPSBpdGVyYWJsZTsK
KyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7CisgICAgICBpZiAoIW9iamVjdFR5
cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHJldHVybiByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGNh
bGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnID8gY2FsbGJhY2sgOiBiYXNl
Q3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgICB2YXIgb3duSW5k
ZXggPSAtMSwKKyAgICAgICAgICAgIG93blByb3BzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJh
YmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSwKKyAgICAgICAgICAgIGxlbmd0aCA9IG93blByb3BzID8g
b3duUHJvcHMubGVuZ3RoIDogMDsKKworICAgICAgICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0
aCkgeworICAgICAgICAgIGluZGV4ID0gb3duUHJvcHNbb3duSW5kZXhdOworICAgICAgICAgIGlm
IChjYWxsYmFjayhpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2Up
IHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQKKyAgICB9Owor
CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0
aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBp
biB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l
bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0
fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5j
dGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRp
b24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj
YWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAg
ICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5mb3JPd25SaWdodCh7ICcwJzogJ3plcm8n
LCAnMSc6ICdvbmUnLCAnbGVuZ3RoJzogMiB9LCBmdW5jdGlvbihudW0sIGtleSkgeworICAgICAq
ICAgY29uc29sZS5sb2coa2V5KTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBsb2dzICdsZW5n
dGgnLCAnMScsIGFuZCAnMCcgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICcwJywgJzEnLCBhbmQg
J2xlbmd0aCcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGNhbGxi
YWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAg
ICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgICBjYWxsYmFjayA9IGJhc2VDcmVhdGVD
YWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsK
KyAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF07CisgICAgICAgIGlmIChjYWxsYmFjayhv
YmplY3Rba2V5XSwga2V5LCBvYmplY3QpID09PSBmYWxzZSkgeworICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIC8q
KgorICAgICAqIENyZWF0ZXMgYSBzb3J0ZWQgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb2YgYWxs
IGVudW1lcmFibGUgcHJvcGVydGllcywKKyAgICAgKiBvd24gYW5kIGluaGVyaXRlZCwgb2YgYG9i
amVjdGAgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMK
KyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBtZXRob2RzCisgICAgICogQGNhdGVn
b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8g
aW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJv
cGVydHkgbmFtZXMgdGhhdCBoYXZlIGZ1bmN0aW9uIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQor
ICAgICAqCisgICAgICogXy5mdW5jdGlvbnMoXyk7CisgICAgICogLy8gPT4gWydhbGwnLCAnYW55
JywgJ2JpbmQnLCAnYmluZEFsbCcsICdjbG9uZScsICdjb21wYWN0JywgJ2NvbXBvc2UnLCAuLi5d
CisgICAgICovCisgICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkgeworICAgICAgdmFyIHJl
c3VsdCA9IFtdOworICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7Cisg
ICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgeworICAgICAgICAgIHJlc3VsdC5wdXNoKGtl
eSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7Cisg
ICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkg
bmFtZSBleGlzdHMgYXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAsCisgICAgICogaW5z
dGVhZCBvZiBhbiBpbmhlcml0ZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg
ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJh
bSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgorICAgICAqIEBwYXJhbSB7
c3RyaW5nfSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrLgorICAgICAqIEBy
ZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBrZXkgaXMgYSBkaXJlY3QgcHJvcGVy
dHksIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5oYXMo
eyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sICdiJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAg
ICAqLworICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIGtleSkgeworICAgICAgcmV0dXJuIG9iamVj
dCA/IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpIDogZmFsc2U7CisgICAgfQorCisg
ICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVk
IGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqCisgICAgICogQHN0
YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAg
KiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LgorICAgICAqIEBy
ZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNyZWF0ZWQgaW52ZXJ0ZWQgb2JqZWN0LgorICAg
ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmludmVydCh7ICdmaXJzdCc6ICdmcmVkJywg
J3NlY29uZCc6ICdiYXJuZXknIH0pOworICAgICAqIC8vID0+IHsgJ2ZyZWQnOiAnZmlyc3QnLCAn
YmFybmV5JzogJ3NlY29uZCcgfQorICAgICAqLworICAgIGZ1bmN0aW9uIGludmVydChvYmplY3Qp
IHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3Qp
LAorICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgICAgICByZXN1bHQgPSB7
fTsKKworICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGtleSA9
IHByb3BzW2luZGV4XTsKKyAgICAgICAgcmVzdWx0W29iamVjdFtrZXldXSA9IGtleTsKKyAgICAg
IH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tz
IGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuIHZhbHVlLgorICAgICAqCisgICAgICogQHN0YXRpYwor
ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFy
YW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVh
bn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBib29sZWFuIHZhbHVlLCBlbHNl
IGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNCb29sZWFuKG51
bGwpOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNCb29sZWFu
KHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNl
IHx8CisgICAgICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmlu
Zy5jYWxsKHZhbHVlKSA9PSBib29sQ2xhc3MgfHwgZmFsc2U7CisgICAgfQorCisgICAgLyoqCisg
ICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBkYXRlLgorICAgICAqCisgICAgICogQHN0YXRp
YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBA
cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9v
bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBkYXRlLCBlbHNlIGBmYWxz
ZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTsK
KyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7
CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3Ry
aW5nLmNhbGwodmFsdWUpID09IGRhdGVDbGFzcyB8fCBmYWxzZTsKKyAgICB9CisKKyAgICAvKioK
KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LgorICAgICAqCisgICAg
ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMK
KyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0
dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBET00gZWxl
bWVudCwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlz
RWxlbWVudChkb2N1bWVudC5ib2R5KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAg
ZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUu
bm9kZVR5cGUgPT09IDEgfHwgZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tz
IGlmIGB2YWx1ZWAgaXMgZW1wdHkuIEFycmF5cywgc3RyaW5ncywgb3IgYGFyZ3VtZW50c2Agb2Jq
ZWN0cyB3aXRoIGEKKyAgICAgKiBsZW5ndGggb2YgYDBgIGFuZCBvYmplY3RzIHdpdGggbm8gb3du
IGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZAorICAgICAqICJlbXB0eSIuCisg
ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv
cnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gdmFsdWUgVGhl
IHZhbHVlIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRy
dWVgIGlmIHRoZSBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1w
bGUKKyAgICAgKgorICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pOworICAgICAqIC8vID0+IGZh
bHNlCisgICAgICoKKyAgICAgKiBfLmlzRW1wdHkoe30pOworICAgICAqIC8vID0+IHRydWUKKyAg
ICAgKgorICAgICAqIF8uaXNFbXB0eSgnJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLwor
ICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHsKKyAgICAgIHZhciByZXN1bHQgPSB0cnVlOwor
ICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAg
ICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwodmFsdWUpLAorICAgICAgICAgIGxlbmd0
aCA9IHZhbHVlLmxlbmd0aDsKKworICAgICAgaWYgKChjbGFzc05hbWUgPT0gYXJyYXlDbGFzcyB8
fCBjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MgfHwgY2xhc3NOYW1lID09IGFyZ3NDbGFzcyApIHx8
CisgICAgICAgICAgKGNsYXNzTmFtZSA9PSBvYmplY3RDbGFzcyAmJiB0eXBlb2YgbGVuZ3RoID09
ICdudW1iZXInICYmIGlzRnVuY3Rpb24odmFsdWUuc3BsaWNlKSkpIHsKKyAgICAgICAgcmV0dXJu
ICFsZW5ndGg7CisgICAgICB9CisgICAgICBmb3JPd24odmFsdWUsIGZ1bmN0aW9uKCkgeworICAg
ICAgICByZXR1cm4gKHJlc3VsdCA9IGZhbHNlKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNv
biBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlCisgICAgICogZXF1
aXZhbGVudCB0byBlYWNoIG90aGVyLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwg
YmUgZXhlY3V0ZWQKKyAgICAgKiB0byBjb21wYXJlIHZhbHVlcy4gSWYgdGhlIGNhbGxiYWNrIHJl
dHVybnMgYHVuZGVmaW5lZGAgY29tcGFyaXNvbnMgd2lsbAorICAgICAqIGJlIGhhbmRsZWQgYnkg
dGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFu
ZAorICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOyAoYSwgYikuCisgICAgICoKKyAg
ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0
cworICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgKiBAcGFy
YW0geyp9IGIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHtGdW5j
dGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1
ZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj
YWxsYmFja2AuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRo
ZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQor
ICAgICAqCisgICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKiB2
YXIgY29weSA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKgorICAgICAqIG9iamVjdCA9PSBj
b3B5OworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmlzRXF1YWwob2JqZWN0
LCBjb3B5KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiB2YXIgd29yZHMgPSBb
J2hlbGxvJywgJ2dvb2RieWUnXTsKKyAgICAgKiB2YXIgb3RoZXJXb3JkcyA9IFsnaGknLCAnZ29v
ZGJ5ZSddOworICAgICAqCisgICAgICogXy5pc0VxdWFsKHdvcmRzLCBvdGhlcldvcmRzLCBmdW5j
dGlvbihhLCBiKSB7CisgICAgICogICB2YXIgcmVHcmVldCA9IC9eKD86aGVsbG98aGkpJC9pLAor
ICAgICAqICAgICAgIGFHcmVldCA9IF8uaXNTdHJpbmcoYSkgJiYgcmVHcmVldC50ZXN0KGEpLAor
ICAgICAqICAgICAgIGJHcmVldCA9IF8uaXNTdHJpbmcoYikgJiYgcmVHcmVldC50ZXN0KGIpOwor
ICAgICAqCisgICAgICogICByZXR1cm4gKGFHcmVldCB8fCBiR3JlZXQpID8gKGFHcmVldCA9PSBi
R3JlZXQpIDogdW5kZWZpbmVkOworICAgICAqIH0pOworICAgICAqIC8vID0+IHRydWUKKyAgICAg
Ki8KKyAgICBmdW5jdGlvbiBpc0VxdWFsKGEsIGIsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAg
ICByZXR1cm4gYmFzZUlzRXF1YWwoYSwgYiwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicg
JiYgYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAyKSk7CisgICAgfQorCisg
ICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMsIG9yIGNhbiBiZSBjb2VyY2VkIHRv
LCBhIGZpbml0ZSBudW1iZXIuCisgICAgICoKKyAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdCB0aGUg
c2FtZSBhcyBuYXRpdmUgYGlzRmluaXRlYCB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvcgorICAg
ICAqIGJvb2xlYW5zIGFuZCBlbXB0eSBzdHJpbmdzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8v
I3gxNS4xLjIuNS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor
ICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFs
dWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlm
IHRoZSBgdmFsdWVgIGlzIGZpbml0ZSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisg
ICAgICoKKyAgICAgKiBfLmlzRmluaXRlKC0xMDEpOworICAgICAqIC8vID0+IHRydWUKKyAgICAg
KgorICAgICAqIF8uaXNGaW5pdGUoJzEwJyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisg
ICAgICogXy5pc0Zpbml0ZSh0cnVlKTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqCisgICAg
ICogXy5pc0Zpbml0ZSgnJyk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8u
aXNGaW5pdGUoSW5maW5pdHkpOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICovCisgICAgZnVu
Y3Rpb24gaXNGaW5pdGUodmFsdWUpIHsKKyAgICAgIHJldHVybiBuYXRpdmVJc0Zpbml0ZSh2YWx1
ZSkgJiYgIW5hdGl2ZUlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioK
KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLgorICAgICAqCisgICAgICog
QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAg
ICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJu
cyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwg
ZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlzRnVuY3Rp
b24oXyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzRnVuY3Rp
b24odmFsdWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJzsKKyAg
ICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUgbGFuZ3VhZ2Ug
dHlwZSBvZiBPYmplY3QuCisgICAgICogKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMs
IHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApCisgICAgICoK
KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2Jq
ZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAq
IEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBv
YmplY3QsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5p
c09iamVjdCh7fSk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5pc09iamVj
dChbMSwgMiwgM10pOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNPYmpl
Y3QoMSk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBpc09iamVj
dCh2YWx1ZSkgeworICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIHRoZSBFQ01BU2NyaXB0
IGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0CisgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8j
eDgKKyAgICAgIC8vIGFuZCBhdm9pZCBhIFY4IGJ1ZworICAgICAgLy8gaHR0cDovL2NvZGUuZ29v
Z2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MQorICAgICAgcmV0dXJuICEhKHZhbHVl
ICYmIG9iamVjdFR5cGVzW3R5cGVvZiB2YWx1ZV0pOworICAgIH0KKworICAgIC8qKgorICAgICAq
IENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBp
cyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc05hTmAgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVg
IGZvcgorICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtZXJpYyB2YWx1ZXMuIFNl
ZSBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi40LgorICAgICAqCisgICAgICogQHN0YXRp
YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBA
cGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9v
bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNl
YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc05hTihOYU4pOworICAgICAq
IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTsKKyAg
ICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBpc05hTih1bmRlZmluZWQpOworICAgICAq
IC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTsKKyAgICAgKiAv
LyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7CisgICAgICAv
LyBgTmFOYCBhcyBhIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVh
bCB0byBpdHNlbGYKKyAgICAgIC8vIChwZXJmb3JtIHRoZSBbW0NsYXNzXV0gY2hlY2sgZmlyc3Qg
dG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZSBob3N0IG9iamVjdHMgaW4gSUUpCisgICAgICByZXR1
cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTsKKyAgICB9CisKKyAgICAvKioK
KyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuCisgICAgICoKKyAgICAgKiBAc3Rh
dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq
IEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHti
b29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZh
bHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc051bGwobnVsbCk7Cisg
ICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5pc051bGwodW5kZWZpbmVkKTsKKyAg
ICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkgewor
ICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENo
ZWNrcyBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLgorICAgICAqCisgICAgICogTm90ZTogYE5hTmAg
aXMgY29uc2lkZXJlZCBhIG51bWJlci4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4OC41Lgor
ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn
b3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4K
KyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAg
aXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg
ICogXy5pc051bWJlcig4LjQgKiA1KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAg
ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0g
J251bWJlcicgfHwKKyAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYm
IHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlckNsYXNzIHx8IGZhbHNlOworICAgIH0KKwor
ICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCBjcmVhdGVkIGJ5
IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg
KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsq
fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJl
dHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC4K
KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogZnVuY3Rpb24gU2hhcGUoKSB7CisgICAg
ICogICB0aGlzLnggPSAwOworICAgICAqICAgdGhpcy55ID0gMDsKKyAgICAgKiB9CisgICAgICoK
KyAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IFNoYXBlKTsKKyAgICAgKiAvLyA9PiBmYWxzZQor
ICAgICAqCisgICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7CisgICAgICogLy8gPT4g
ZmFsc2UKKyAgICAgKgorICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0p
OworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICB2YXIgaXNQbGFpbk9iamVjdCA9ICFn
ZXRQcm90b3R5cGVPZiA/IHNoaW1Jc1BsYWluT2JqZWN0IDogZnVuY3Rpb24odmFsdWUpIHsKKyAg
ICAgIGlmICghKHZhbHVlICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IG9iamVjdENsYXNzKSkg
eworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgdmFsdWVPZiA9IHZh
bHVlLnZhbHVlT2YsCisgICAgICAgICAgb2JqUHJvdG8gPSBpc05hdGl2ZSh2YWx1ZU9mKSAmJiAo
b2JqUHJvdG8gPSBnZXRQcm90b3R5cGVPZih2YWx1ZU9mKSkgJiYgZ2V0UHJvdG90eXBlT2Yob2Jq
UHJvdG8pOworCisgICAgICByZXR1cm4gb2JqUHJvdG8KKyAgICAgICAgPyAodmFsdWUgPT0gb2Jq
UHJvdG8gfHwgZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IG9ialByb3RvKQorICAgICAgICA6IHNo
aW1Jc1BsYWluT2JqZWN0KHZhbHVlKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ2hlY2tz
IGlmIGB2YWx1ZWAgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICoKKyAgICAgKiBAc3Rh
dGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAq
IEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHti
b29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIHJlZ3VsYXIgZXhwcmVz
c2lvbiwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlz
UmVnRXhwKC9mcmVkLyk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9u
IGlzUmVnRXhwKHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09
ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IHJlZ2V4cENsYXNzIHx8IGZhbHNl
OworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc3RyaW5n
LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh
dGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVj
ay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1
ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg
ICAgICogXy5pc1N0cmluZygnZnJlZCcpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAg
ICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgeworICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9
PSAnc3RyaW5nJyB8fAorICAgICAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcg
JiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nQ2xhc3MgfHwgZmFsc2U7CisgICAgfQor
CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuCisgICAg
ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg
T2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAg
ICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBg
dW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg
KiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLworICAg
IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlwZW9mIHZhbHVl
ID09ICd1bmRlZmluZWQnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2Jq
ZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZCBi
eQorICAgICAqIHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBvZiBgb2JqZWN0
YCB0aHJvdWdoIHRoZSBjYWxsYmFjay4KKyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8g
YHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1
ZSwga2V5LCBvYmplY3QpLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHBy
b3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAq
IGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxl
bWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxi
YWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJl
dHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUg
Z2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0
aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICog
QHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg
KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl
IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h
bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh
dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku
CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs
YmFja2AuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRo
IHZhbHVlcyBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLgorICAg
ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLm1hcFZhbHVlcyh7ICdhJzogMSwgJ2InOiAy
LCAnYyc6IDN9ICwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTsKKyAgICAgKiAv
LyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQorICAgICAqCisgICAgICogdmFyIGNoYXJh
Y3RlcnMgPSB7CisgICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9
LAorICAgICAqICAgJ3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9Cisg
ICAgICogfTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9y
dGhhbmQKKyAgICAgKiBfLm1hcFZhbHVlcyhjaGFyYWN0ZXJzLCAnYWdlJyk7CisgICAgICogLy8g
PT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfQorICAgICAqLworICAgIGZ1bmN0aW9uIG1h
cFZhbHVlcyhvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0ID0g
e307CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhp
c0FyZywgMyk7CisKKyAgICAgIGZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9i
amVjdCkgeworICAgICAgICByZXN1bHRba2V5XSA9IGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVj
dCk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisg
ICAgICogUmVjdXJzaXZlbHkgbWVyZ2VzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhl
IHNvdXJjZSBvYmplY3QocyksIHRoYXQKKyAgICAgKiBkb24ndCByZXNvbHZlIHRvIGB1bmRlZmlu
ZWRgIGludG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzCisgICAg
ICogd2lsbCBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNl
cy4gSWYgYSBjYWxsYmFjayBpcworICAgICAqIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQg
dG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBh
bmQgc291cmNlIHByb3BlcnRpZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRg
IG1lcmdpbmcgd2lsbAorICAgICAqIGJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBU
aGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZAorICAgICAqIGludm9rZWQgd2l0
aCB0d28gYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS4KKyAgICAgKgorICAg
ICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3Rz
CisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0Lgor
ICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuCisg
ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9t
aXplIG1lcmdpbmcgcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg
YHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBS
ZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor
ICAgICAqIHZhciBuYW1lcyA9IHsKKyAgICAgKiAgICdjaGFyYWN0ZXJzJzogWworICAgICAqICAg
ICB7ICduYW1lJzogJ2Jhcm5leScgfSwKKyAgICAgKiAgICAgeyAnbmFtZSc6ICdmcmVkJyB9Cisg
ICAgICogICBdCisgICAgICogfTsKKyAgICAgKgorICAgICAqIHZhciBhZ2VzID0geworICAgICAq
ICAgJ2NoYXJhY3RlcnMnOiBbCisgICAgICogICAgIHsgJ2FnZSc6IDM2IH0sCisgICAgICogICAg
IHsgJ2FnZSc6IDQwIH0KKyAgICAgKiAgIF0KKyAgICAgKiB9OworICAgICAqCisgICAgICogXy5t
ZXJnZShuYW1lcywgYWdlcyk7CisgICAgICogLy8gPT4geyAnY2hhcmFjdGVycyc6IFt7ICduYW1l
JzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0g
fQorICAgICAqCisgICAgICogdmFyIGZvb2QgPSB7CisgICAgICogICAnZnJ1aXRzJzogWydhcHBs
ZSddLAorICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnXQorICAgICAqIH07CisgICAgICoK
KyAgICAgKiB2YXIgb3RoZXJGb29kID0geworICAgICAqICAgJ2ZydWl0cyc6IFsnYmFuYW5hJ10s
CisgICAgICogICAndmVnZXRhYmxlcyc6IFsnY2Fycm90J10KKyAgICAgKiB9OworICAgICAqCisg
ICAgICogXy5tZXJnZShmb29kLCBvdGhlckZvb2QsIGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgKiAg
IHJldHVybiBfLmlzQXJyYXkoYSkgPyBhLmNvbmNhdChiKSA6IHVuZGVmaW5lZDsKKyAgICAgKiB9
KTsKKyAgICAgKiAvLyA9PiB7ICdmcnVpdHMnOiBbJ2FwcGxlJywgJ2JhbmFuYSddLCAndmVnZXRh
Ymxlcyc6IFsnYmVldCcsICdjYXJyb3RdIH0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtZXJnZShv
YmplY3QpIHsKKyAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGxlbmd0aCA9
IDI7CisKKyAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkgeworICAgICAgICByZXR1cm4gb2Jq
ZWN0OworICAgICAgfQorICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBgXy5yZWR1Y2VgIGFu
ZCBgXy5yZWR1Y2VSaWdodGAgd2l0aG91dCB1c2luZworICAgICAgLy8gdGhlaXIgYGluZGV4YCBh
bmQgYGNvbGxlY3Rpb25gIGFyZ3VtZW50cworICAgICAgaWYgKHR5cGVvZiBhcmdzWzJdICE9ICdu
dW1iZXInKSB7CisgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoOworICAgICAgfQorICAgICAg
aWYgKGxlbmd0aCA+IDMgJiYgdHlwZW9mIGFyZ3NbbGVuZ3RoIC0gMl0gPT0gJ2Z1bmN0aW9uJykg
eworICAgICAgICB2YXIgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soYXJnc1stLWxlbmd0
aCAtIDFdLCBhcmdzW2xlbmd0aC0tXSwgMik7CisgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIg
JiYgdHlwZW9mIGFyZ3NbbGVuZ3RoIC0gMV0gPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBjYWxs
YmFjayA9IGFyZ3NbLS1sZW5ndGhdOworICAgICAgfQorICAgICAgdmFyIHNvdXJjZXMgPSBzbGlj
ZShhcmd1bWVudHMsIDEsIGxlbmd0aCksCisgICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAg
ICBzdGFja0EgPSBnZXRBcnJheSgpLAorICAgICAgICAgIHN0YWNrQiA9IGdldEFycmF5KCk7CisK
KyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIGJhc2VNZXJnZShvYmpl
Y3QsIHNvdXJjZXNbaW5kZXhdLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpOworICAgICAgfQor
ICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7CisgICAgICByZWxlYXNlQXJyYXkoc3RhY2tCKTsK
KyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBh
IHNoYWxsb3cgY2xvbmUgb2YgYG9iamVjdGAgZXhjbHVkaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVy
dGllcy4KKyAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1
YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZgorICAgICAqIHByb3BlcnR5IG5hbWVzLiBJZiBh
IGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGVhY2gKKyAgICAg
KiBwcm9wZXJ0eSBvZiBgb2JqZWN0YCBvbWl0dGluZyB0aGUgcHJvcGVydGllcyB0aGUgY2FsbGJh
Y2sgcmV0dXJucyB0cnVleQorICAgICAqIGZvci4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0
aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAgKiAodmFsdWUs
IGtleSwgb2JqZWN0KS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg
XworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVj
dCBUaGUgc291cmNlIG9iamVjdC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufC4uLnN0cmluZ3xz
dHJpbmdbXX0gW2NhbGxiYWNrXSBUaGUgcHJvcGVydGllcyB0byBvbWl0IG9yIHRoZQorICAgICAq
ICBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlz
QXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7
T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRob3V0IHRoZSBvbWl0dGVkIHByb3BlcnRpZXMu
CisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ub21pdCh7ICduYW1lJzogJ2ZyZWQn
LCAnYWdlJzogNDAgfSwgJ2FnZScpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcgfQor
ICAgICAqCisgICAgICogXy5vbWl0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LCBmdW5j
dGlvbih2YWx1ZSkgeworICAgICAqICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJzsK
KyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH0KKyAgICAgKi8KKyAg
ICBmdW5jdGlvbiBvbWl0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBy
ZXN1bHQgPSB7fTsKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgewor
ICAgICAgICB2YXIgcHJvcHMgPSBbXTsKKyAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2
YWx1ZSwga2V5KSB7CisgICAgICAgICAgcHJvcHMucHVzaChrZXkpOworICAgICAgICB9KTsKKyAg
ICAgICAgcHJvcHMgPSBiYXNlRGlmZmVyZW5jZShwcm9wcywgYmFzZUZsYXR0ZW4oYXJndW1lbnRz
LCB0cnVlLCBmYWxzZSwgMSkpOworCisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAg
ICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVu
Z3RoKSB7CisgICAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTsKKyAgICAgICAgICByZXN1
bHRba2V5XSA9IG9iamVjdFtrZXldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAg
ICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7
CisgICAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7Cisg
ICAgICAgICAgaWYgKCFjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpKSB7CisgICAgICAgICAg
ICByZXN1bHRba2V5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9
CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMg
YSB0d28gZGltZW5zaW9uYWwgYXJyYXkgb2YgYW4gb2JqZWN0J3Mga2V5LXZhbHVlIHBhaXJzLAor
ICAgICAqIGkuZS4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYC4KKyAgICAgKgor
ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmpl
Y3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3Qu
CisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIG5ldyBhcnJheSBvZiBrZXktdmFsdWUg
cGFpcnMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ucGFpcnMoeyAnYmFybmV5
JzogMzYsICdmcmVkJzogNDAgfSk7CisgICAgICogLy8gPT4gW1snYmFybmV5JywgMzZdLCBbJ2Zy
ZWQnLCA0MF1dIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJv
bm1lbnRzKQorICAgICAqLworICAgIGZ1bmN0aW9uIHBhaXJzKG9iamVjdCkgeworICAgICAgdmFy
IGluZGV4ID0gLTEsCisgICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAgICAg
bGVuZ3RoID0gcHJvcHMubGVuZ3RoLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7
CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBrZXkgPSBw
cm9wc1tpbmRleF07CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBba2V5LCBvYmplY3Rba2V5XV07
CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAq
IENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGBvYmplY3RgIGNvbXBvc2VkIG9mIHRoZSBzcGVj
aWZpZWQgcHJvcGVydGllcy4KKyAgICAgKiBQcm9wZXJ0eSBuYW1lcyBtYXkgYmUgc3BlY2lmaWVk
IGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZgorICAgICAqIHByb3BlcnR5
IG5hbWVzLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9y
IGVhY2gKKyAgICAgKiBwcm9wZXJ0eSBvZiBgb2JqZWN0YCBwaWNraW5nIHRoZSBwcm9wZXJ0aWVz
IHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5CisgICAgICogZm9yLiBUaGUgY2FsbGJhY2sgaXMg
Ym91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAg
ICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq
IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09i
amVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258
Li4uc3RyaW5nfHN0cmluZ1tdfSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyCisg
ICAgICogIGl0ZXJhdGlvbiBvciBwcm9wZXJ0eSBuYW1lcyB0byBwaWNrLCBzcGVjaWZpZWQgYXMg
aW5kaXZpZHVhbCBwcm9wZXJ0eQorICAgICAqICBuYW1lcyBvciBhcnJheXMgb2YgcHJvcGVydHkg
bmFtZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9m
IGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qg
Y29tcG9zZWQgb2YgdGhlIHBpY2tlZCBwcm9wZXJ0aWVzLgorICAgICAqIEBleGFtcGxlCisgICAg
ICoKKyAgICAgKiBfLnBpY2soeyAnbmFtZSc6ICdmcmVkJywgJ191c2VyaWQnOiAnZnJlZDEnIH0s
ICduYW1lJyk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9CisgICAgICoKKyAgICAg
KiBfLnBpY2soeyAnbmFtZSc6ICdmcmVkJywgJ191c2VyaWQnOiAnZnJlZDEnIH0sIGZ1bmN0aW9u
KHZhbHVlLCBrZXkpIHsKKyAgICAgKiAgIHJldHVybiBrZXkuY2hhckF0KDApICE9ICdfJzsKKyAg
ICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH0KKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBwaWNrKG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciByZXN1
bHQgPSB7fTsKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgeworICAg
ICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIHByb3BzID0gYmFzZUZsYXR0ZW4oYXJn
dW1lbnRzLCB0cnVlLCBmYWxzZSwgMSksCisgICAgICAgICAgICBsZW5ndGggPSBpc09iamVjdChv
YmplY3QpID8gcHJvcHMubGVuZ3RoIDogMDsKKworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxl
bmd0aCkgeworICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CisgICAgICAgICAgaWYg
KGtleSBpbiBvYmplY3QpIHsKKyAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV07
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjYWxsYmFj
ayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAg
IGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7CisgICAgICAgICAg
aWYgKGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCkpIHsKKyAgICAgICAgICAgIHJlc3VsdFtr
ZXldID0gdmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJl
dHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWx0ZXJuYXRpdmUgdG8g
YF8ucmVkdWNlYCB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3CisgICAg
ICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVh
Y2ggb2YgaXRzIG93bgorICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyB0aHJvdWdoIGEgY2Fs
bGJhY2ssIHdpdGggZWFjaCBjYWxsYmFjayBleGVjdXRpb24KKyAgICAgKiBwb3RlbnRpYWxseSBt
dXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0
bworICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOyAoYWNj
dW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuCisgICAgICogQ2FsbGJhY2tzIG1heSBleGl0
IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLgorICAgICAq
CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9i
amVjdHMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8g
aXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0
eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Kn0g
W2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLgorICAgICAqIEBwYXJh
bSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAq
IEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgKiBAZXhh
bXBsZQorICAgICAqCisgICAgICogdmFyIHNxdWFyZXMgPSBfLnRyYW5zZm9ybShbMSwgMiwgMywg
NCwgNSwgNiwgNywgOCwgOSwgMTBdLCBmdW5jdGlvbihyZXN1bHQsIG51bSkgeworICAgICAqICAg
bnVtICo9IG51bTsKKyAgICAgKiAgIGlmIChudW0gJSAyKSB7CisgICAgICogICAgIHJldHVybiBy
ZXN1bHQucHVzaChudW0pIDwgMzsKKyAgICAgKiAgIH0KKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9
PiBbMSwgOSwgMjVdCisgICAgICoKKyAgICAgKiB2YXIgbWFwcGVkID0gXy50cmFuc2Zvcm0oeyAn
YSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtLCBrZXkpIHsKKyAg
ICAgKiAgIHJlc3VsdFtrZXldID0gbnVtICogMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7
ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQorICAgICAqLworICAgIGZ1bmN0aW9uIHRyYW5zZm9y
bShvYmplY3QsIGNhbGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykgeworICAgICAgdmFyIGlz
QXJyID0gaXNBcnJheShvYmplY3QpOworICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHsK
KyAgICAgICAgaWYgKGlzQXJyKSB7CisgICAgICAgICAgYWNjdW11bGF0b3IgPSBbXTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgY3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3Ry
dWN0b3IsCisgICAgICAgICAgICAgIHByb3RvID0gY3RvciAmJiBjdG9yLnByb3RvdHlwZTsKKwor
ICAgICAgICAgIGFjY3VtdWxhdG9yID0gYmFzZUNyZWF0ZShwcm90byk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5j
cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgNCk7CisgICAgICAgIChpc0FyciA/IGZv
ckVhY2ggOiBmb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHsK
KyAgICAgICAgICByZXR1cm4gY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2Jq
ZWN0KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gYWNjdW11bGF0b3I7Cisg
ICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBjb21wb3NlZCBvZiB0aGUg
b3duIGVudW1lcmFibGUgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLgorICAgICAqCisgICAg
ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMK
KyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAg
ICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVz
LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnZhbHVlcyh7ICdvbmUnOiAxLCAn
dHdvJzogMiwgJ3RocmVlJzogMyB9KTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgM10gKHByb3BlcnR5
IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAgICovCisg
ICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAg
ICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksCisgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVu
Z3RoLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIHdoaWxlICgr
K2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBvYmplY3RbcHJvcHNb
aW5kZXhdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9m
IGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleGVzLCBvciBrZXlzLCBvZiB0aGUKKyAg
ICAgKiBgY29sbGVjdGlvbmAuIEluZGV4ZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFs
IGFyZ3VtZW50cyBvciBhcyBhcnJheXMKKyAgICAgKiBvZiBpbmRleGVzLgorICAgICAqCisgICAg
ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp
b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj
b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVt
YmVyW118c3RyaW5nfHN0cmluZ1tdKX0gW2luZGV4XSBUaGUgaW5kZXhlcyBvZiBgY29sbGVjdGlv
bmAKKyAgICAgKiAgIHRvIHJldHJpZXZlLCBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBpbmRleGVz
IG9yIGFycmF5cyBvZiBpbmRleGVzLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBh
IG5ldyBhcnJheSBvZiBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqICBwcm92
aWRlZCBpbmRleGVzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmF0KFsnYScs
ICdiJywgJ2MnLCAnZCcsICdlJ10sIFswLCAyLCA0XSk7CisgICAgICogLy8gPT4gWydhJywgJ2Mn
LCAnZSddCisgICAgICoKKyAgICAgKiBfLmF0KFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcydd
LCAwLCAyKTsKKyAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAncGViYmxlcyddCisgICAgICovCisgICAg
ZnVuY3Rpb24gYXQoY29sbGVjdGlvbikgeworICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisg
ICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBwcm9wcyA9IGJhc2VGbGF0dGVuKGFyZ3Ms
IHRydWUsIGZhbHNlLCAxKSwKKyAgICAgICAgICBsZW5ndGggPSAoYXJnc1syXSAmJiBhcmdzWzJd
W2FyZ3NbMV1dID09PSBjb2xsZWN0aW9uKSA/IDEgOiBwcm9wcy5sZW5ndGgsCisgICAgICAgICAg
cmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKKworICAgICAgd2hpbGUoKytpbmRleCA8IGxlbmd0aCkg
eworICAgICAgICByZXN1bHRbaW5kZXhdID0gY29sbGVjdGlvbltwcm9wc1tpbmRleF1dOworICAg
ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVj
a3MgaWYgYSBnaXZlbiB2YWx1ZSBpcyBwcmVzZW50IGluIGEgY29sbGVjdGlvbiB1c2luZyBzdHJp
Y3QgZXF1YWxpdHkKKyAgICAgKiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIGBmcm9t
SW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkIGFzIHRoZQorICAgICAqIG9mZnNldCBmcm9t
IHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg
ICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgaW5jbHVkZQorICAgICAqIEBjYXRlZ29yeSBD
b2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlv
biBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHsqfSB0YXJn
ZXQgVGhlIHZhbHVlIHRvIGNoZWNrIGZvci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21J
bmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAgICogQHJldHVybnMge2Jvb2xl
YW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdGFyZ2V0YCBlbGVtZW50IGlzIGZvdW5kLCBlbHNl
IGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uY29udGFpbnMoWzEs
IDIsIDNdLCAxKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBfLmNvbnRhaW5z
KFsxLCAyLCAzXSwgMSwgMik7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8u
Y29udGFpbnMoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sICdmcmVkJyk7CisgICAgICog
Ly8gPT4gdHJ1ZQorICAgICAqCisgICAgICogXy5jb250YWlucygncGViYmxlcycsICdlYicpOwor
ICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjb250YWlucyhjb2xsZWN0
aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAg
ICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSwKKyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9u
ID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworCisg
ICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBm
cm9tSW5kZXgpIDogZnJvbUluZGV4KSB8fCAwOworICAgICAgaWYgKGlzQXJyYXkoY29sbGVjdGlv
bikpIHsKKyAgICAgICAgcmVzdWx0ID0gaW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21J
bmRleCkgPiAtMTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykg
eworICAgICAgICByZXN1bHQgPSAoaXNTdHJpbmcoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uLmlu
ZGV4T2YodGFyZ2V0LCBmcm9tSW5kZXgpIDogaW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZy
b21JbmRleCkpID4gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlv
biwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICBpZiAoKytpbmRleCA+PSBmcm9tSW5kZXgp
IHsKKyAgICAgICAgICAgIHJldHVybiAhKHJlc3VsdCA9IHZhbHVlID09PSB0YXJnZXQpOworICAg
ICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMg
Z2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZworICAgICAqIGVhY2ggZWxlbWVu
dCBvZiBgY29sbGVjdGlvbmAgdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5n
IHZhbHVlCisgICAgICogb2YgZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5
IHdhcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2suCisgICAgICogVGhlIGNhbGxiYWNrIGlzIGJv
dW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAg
KiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAgKiBJZiBhIHBy
b3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1
Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVl
IG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHBy
b3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFj
aworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBw
cm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAg
ICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5
IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0
aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0
aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxl
ZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlz
IHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIg
b3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFt
IHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICog
QHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC4K
KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5jb3VudEJ5KFs0LjMsIDYuMSwgNi40
XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBNYXRoLmZsb29yKG51bSk7IH0pOworICAgICAqIC8v
ID0+IHsgJzQnOiAxLCAnNic6IDIgfQorICAgICAqCisgICAgICogXy5jb3VudEJ5KFs0LjMsIDYu
MSwgNi40XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiB0aGlzLmZsb29yKG51bSk7IH0sIE1hdGgp
OworICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfQorICAgICAqCisgICAgICogXy5jb3Vu
dEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7CisgICAgICogLy8gPT4geyAn
Myc6IDIsICc1JzogMSB9CisgICAgICovCisgICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdh
dG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgeworICAgICAgKGhhc093blByb3BlcnR5
LmNhbGwocmVzdWx0LCBrZXkpID8gcmVzdWx0W2tleV0rKyA6IHJlc3VsdFtrZXldID0gMSk7Cisg
ICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGNhbGxiYWNrIHJl
dHVybnMgdHJ1ZXkgdmFsdWUgZm9yICoqYWxsKiogZWxlbWVudHMgb2YKKyAgICAgKiBhIGNvbGxl
Y3Rpb24uIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0
aCB0aHJlZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24p
LgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2Fs
bGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwg
cmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgor
ICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRl
ZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9y
IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAor
ICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt
YmVyT2YgXworICAgICAqIEBhbGlhcyBhbGwKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMK
KyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxl
Y3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0
cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl
ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg
d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg
c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn
XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Ym9v
bGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3NlZCB0aGUgY2FsbGJhY2sg
Y2hlY2ssCisgICAgICogIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg
ICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddKTsKKyAgICAgKiAvLyA9PiBmYWxz
ZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzog
J2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdl
JzogNDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2Fs
bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5ldmVyeShjaGFyYWN0ZXJzLCAnYWdlJyk7CisgICAg
ICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNr
IHNob3J0aGFuZAorICAgICAqIF8uZXZlcnkoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7Cisg
ICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9u
LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisgICAgICBj
YWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisK
KyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBj
b2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1i
ZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgaWYg
KCEocmVzdWx0ID0gISFjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rp
b24pKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGlu
ZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAhIWNhbGxiYWNr
KHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBl
bGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVu
dHMKKyAgICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleSBmb3IuIFRoZSBjYWxsYmFjayBp
cyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kCisgICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3Vt
ZW50czsgKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAqCisgICAgICogSWYg
YSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJf
LnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2
YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBp
cyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2Fs
bGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0
aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4K
KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlh
cyBzZWxlY3QKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Fy
cmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBv
dmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlk
ZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEg
cHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAg
ICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJl
c3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRp
bmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcg
YXJyYXkgb2YgZWxlbWVudHMgdGhhdCBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLgorICAgICAq
IEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgZXZlbnMgPSBfLmZpbHRlcihbMSwgMiwgMywg
NCwgNSwgNl0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTsKKyAgICAg
KiAvLyA9PiBbMiwgNCwgNl0KKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAg
ICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwK
KyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUg
fQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sg
c2hvcnRoYW5kCisgICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAg
KiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfV0K
KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg
ICAgKiBfLmZpbHRlcihjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTsKKyAgICAgKiAvLyA9PiBb
eyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfV0KKyAgICAg
Ki8KKyAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsK
KyAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNh
bGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKworICAgICAgdmFyIGluZGV4ID0gLTEsCisg
ICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKwor
ICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgd2hpbGUgKCsr
aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4
XTsKKyAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkgewor
ICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVl
LCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5k
ZXgsIGNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CisgICAg
ICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBhIGNvbGxlY3Rp
b24sIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0CisgICAgICogdGhlIGNhbGxiYWNr
IHJldHVybnMgdHJ1ZXkgZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFu
ZAorICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5
LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92
aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBj
YWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1l
bnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFj
a2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1
cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdp
dmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGlj
CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZGV0ZWN0LCBmaW5kV2hlcmUKKyAg
ICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxz
dHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAq
IEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUg
ZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFt
ZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0
ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4K
KyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxi
YWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCwgZWxz
ZSBgdW5kZWZpbmVkYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJh
Y3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdibG9j
a2VkJzogZmFsc2UgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwg
J2Jsb2NrZWQnOiB0cnVlIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzog
MSwgICdibG9ja2VkJzogZmFsc2UgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLmZpbmQo
Y2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7CisgICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQw
OworICAgICAqIH0pOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2
LCAnYmxvY2tlZCc6IGZhbHNlIH0KKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBj
YWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpbmQoY2hhcmFjdGVycywgeyAnYWdlJzogMSB9
KTsKKyAgICAgKiAvLyA9PiAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEsICdibG9ja2Vk
JzogZmFsc2UgfQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNo
b3J0aGFuZAorICAgICAqIF8uZmluZChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8v
ID0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAg
Ki8KKyAgICBmdW5jdGlvbiBmaW5kKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7Cisg
ICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywg
Myk7CisKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rp
b24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09
ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAg
ICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYgKGNhbGxiYWNr
KHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciByZXN1
bHQ7CisgICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNv
bGxlY3Rpb24pIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0
aW9uKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBf
LmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgICAgKiBvZiBh
IGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgICAgICoKKyAgICAgKiBAc3RhdGlj
CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAg
KiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24g
dG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30g
W2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVy
YXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBi
ZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUg
Y2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg
YHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJu
cyB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC4KKyAgICAgKiBAZXhhbXBsZQor
ICAgICAqCisgICAgICogXy5maW5kTGFzdChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKG51bSkgewor
ICAgICAqICAgcmV0dXJuIG51bSAlIDIgPT0gMTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiAz
CisgICAgICovCisgICAgZnVuY3Rpb24gZmluZExhc3QoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRo
aXNBcmcpIHsKKyAgICAgIHZhciByZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVh
dGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBmb3JFYWNoUmlnaHQoY29s
bGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgIGlm
IChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgcmVzdWx0
ID0gdmFsdWU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMg
b3ZlciBlbGVtZW50cyBvZiBhIGNvbGxlY3Rpb24sIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sgZm9y
IGVhY2gKKyAgICAgKiBlbGVtZW50LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdg
IGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1ZSwgaW5kZXh8
a2V5LCBjb2xsZWN0aW9uKS4gQ2FsbGJhY2tzIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieQor
ICAgICAqIGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBOb3Rl
OiBBcyB3aXRoIG90aGVyICJDb2xsZWN0aW9ucyIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgYGxl
bmd0aGAgcHJvcGVydHkKKyAgICAgKiBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lk
IHRoaXMgYmVoYXZpb3IgYF8uZm9ySW5gIG9yIGBfLmZvck93bmAKKyAgICAgKiBtYXkgYmUgdXNl
ZCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA
bWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBlYWNoCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp
b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj
b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2Fs
bGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAg
KiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4K
KyAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlv
bmAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8oWzEsIDIsIDNdKS5mb3JFYWNo
KGZ1bmN0aW9uKG51bSkgeyBjb25zb2xlLmxvZyhudW0pOyB9KS5qb2luKCcsJyk7CisgICAgICog
Ly8gPT4gbG9ncyBlYWNoIG51bWJlciBhbmQgcmV0dXJucyAnMSwyLDMnCisgICAgICoKKyAgICAg
KiBfLmZvckVhY2goeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSwgZnVuY3Rpb24o
bnVtKSB7IGNvbnNvbGUubG9nKG51bSk7IH0pOworICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1i
ZXIgYW5kIHJldHVybnMgdGhlIG9iamVjdCAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRl
ZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JFYWNoKGNv
bGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAg
ICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworCisg
ICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQn
ID8gY2FsbGJhY2sgOiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwor
ICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgd2hpbGUgKCsr
aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltpbmRl
eF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNv
bGxlY3Rpb24sIGNhbGxiYWNrKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2xsZWN0aW9uOwor
ICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAg
ZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICAgICAqIG9mIGEgYGNvbGxl
Y3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg
KiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBlYWNoUmlnaHQKKyAgICAgKiBAY2F0ZWdvcnkg
Q29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rp
b24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rp
b259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9u
LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2Fs
bGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBj
b2xsZWN0aW9uYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXyhbMSwgMiwgM10p
LmZvckVhY2hSaWdodChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2cobnVtKTsgfSkuam9pbign
LCcpOworICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1iZXIgZnJvbSByaWdodCB0byBsZWZ0IGFu
ZCByZXR1cm5zICczLDIsMScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29s
bGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0
aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAm
JiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNh
bGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09
ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgICAgIGlmIChj
YWxsYmFjayhjb2xsZWN0aW9uW2xlbmd0aF0sIGxlbmd0aCwgY29sbGVjdGlvbikgPT09IGZhbHNl
KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHZhciBwcm9wcyA9IGtleXMoY29sbGVjdGlvbik7CisgICAgICAgIGxl
bmd0aCA9IHByb3BzLmxlbmd0aDsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9u
KHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICBrZXkgPSBwcm9wcyA/IHByb3Bz
Wy0tbGVuZ3RoXSA6IC0tbGVuZ3RoOworICAgICAgICAgIHJldHVybiBjYWxsYmFjayhjb2xsZWN0
aW9uW2tleV0sIGtleSwgY29sbGVjdGlvbik7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAg
cmV0dXJuIGNvbGxlY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBv
YmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5u
aW5nCisgICAgICogZWFjaCBlbGVtZW50IG9mIGEgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxs
YmFjay4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAgICAgKiBvZiBlYWNoIGtleSBpcyBhbiBh
cnJheSBvZiB0aGUgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4K
KyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdp
dGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9u
KS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNh
bGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxs
IHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoK
KyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0
ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZv
ciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwK
KyAgICAgKiBlbHNlIGBmYWxzZWAKKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt
YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJy
YXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92
ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRl
bnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBw
cm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAg
KiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVz
cGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGlu
ZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNv
bXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAq
IF8uZ3JvdXBCeShbNC4yLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5m
bG9vcihudW0pOyB9KTsKKyAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40
XSB9CisgICAgICoKKyAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihu
dW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4geyAn
NCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuNF0gfQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8u
cGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28n
LCAndGhyZWUnXSwgJ2xlbmd0aCcpOworICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28n
XSwgJzUnOiBbJ3RocmVlJ10gfQorICAgICAqLworICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdn
cmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHsKKyAgICAgIChoYXNPd25Qcm9w
ZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtrZXldIDogcmVzdWx0W2tleV0gPSBbXSku
cHVzaCh2YWx1ZSk7CisgICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIG9iamVj
dCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcK
KyAgICAgKiBlYWNoIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgZ2l2ZW4g
Y2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5nCisgICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMg
dGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LgorICAg
ICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0
aHJlZSBhcmd1bWVudHM7CisgICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgor
ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh
Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0
dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg
ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi
Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs
ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg
ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy
T2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8
T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIu
CisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRp
dHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9w
ZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAg
dG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVj
dGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBv
ZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBv
c2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZh
ciBrZXlzID0gWworICAgICAqICAgeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sCisgICAg
ICogICB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9CisgICAgICogXTsKKyAgICAgKgor
ICAgICAqIF8uaW5kZXhCeShrZXlzLCAnZGlyJyk7CisgICAgICogLy8gPT4geyAnbGVmdCc6IHsg
J2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAn
Y29kZSc6IDEwMCB9IH0KKyAgICAgKgorICAgICAqIF8uaW5kZXhCeShrZXlzLCBmdW5jdGlvbihr
ZXkpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5LmNvZGUpOyB9KTsKKyAgICAgKiAv
LyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzog
J3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CisgICAgICoKKyAgICAgKiBfLmluZGV4QnkoY2hhcmFj
dGVycywgZnVuY3Rpb24oa2V5KSB7IHRoaXMuZnJvbUNoYXJDb2RlKGtleS5jb2RlKTsgfSwgU3Ry
aW5nKTsKKyAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0s
ICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CisgICAgICovCisgICAgdmFy
IGluZGV4QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkg
eworICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKKyAgICB9KTsKKworICAgIC8qKgorICAgICAq
IEludm9rZXMgdGhlIG1ldGhvZCBuYW1lZCBieSBgbWV0aG9kTmFtZWAgb24gZWFjaCBlbGVtZW50
IGluIHRoZSBgY29sbGVjdGlvbmAKKyAgICAgKiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJl
c3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQWRkaXRpb25hbCBhcmd1bWVudHMKKyAgICAg
KiB3aWxsIGJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBtZXRob2ROYW1l
YCBpcyBhIGZ1bmN0aW9uIGl0CisgICAgICogd2lsbCBiZSBpbnZva2VkIGZvciwgYW5kIGB0aGlz
YCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIHRoZSBgY29sbGVjdGlvbmAuCisgICAgICoKKyAg
ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVj
dGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhl
IGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3Ry
aW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9yCisgICAg
ICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsu
Li4qfSBbYXJnXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC4KKyAgICAgKiBA
cmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFj
aCBpbnZva2VkIG1ldGhvZC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pbnZv
a2UoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTsKKyAgICAgKiAvLyA9PiBbWzEsIDUs
IDddLCBbMSwgMiwgM11dCisgICAgICoKKyAgICAgKiBfLmludm9rZShbMTIzLCA0NTZdLCBTdHJp
bmcucHJvdG90eXBlLnNwbGl0LCAnJyk7CisgICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwg
Wyc0JywgJzUnLCAnNiddXQorICAgICAqLworICAgIGZ1bmN0aW9uIGludm9rZShjb2xsZWN0aW9u
LCBtZXRob2ROYW1lKSB7CisgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMiksCisg
ICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgbWV0aG9kTmFt
ZSA9PSAnZnVuY3Rpb24nLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0
aW9uLmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9
PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOworCisgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1
bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IChpc0Z1bmMgPyBtZXRo
b2ROYW1lIDogdmFsdWVbbWV0aG9kTmFtZV0pLmFwcGx5KHZhbHVlLCBhcmdzKTsKKyAgICAgIH0p
OworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz
IGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVj
dGlvbgorICAgICAqIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQg
dG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGgKKyAgICAgKiB0aHJlZSBhcmd1bWVudHM7ICh2
YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy
dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg
c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg
dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk
ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg
ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl
cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK
KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgY29sbGVj
dAorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2Jq
ZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisg
ICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHld
IFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0
eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8g
Y3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2
ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBg
Y2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBv
ZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLgorICAgICAqIEBleGFt
cGxlCisgICAgICoKKyAgICAgKiBfLm1hcChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1
cm4gbnVtICogMzsgfSk7CisgICAgICogLy8gPT4gWzMsIDYsIDldCisgICAgICoKKyAgICAgKiBf
Lm1hcCh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9LCBmdW5jdGlvbihudW0pIHsg
cmV0dXJuIG51bSAqIDM7IH0pOworICAgICAqIC8vID0+IFszLCA2LCA5XSAocHJvcGVydHkgb3Jk
ZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKgorICAgICAq
IHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzog
MzYgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBd
OworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAor
ICAgICAqIF8ubWFwKGNoYXJhY3RlcnMsICduYW1lJyk7CisgICAgICogLy8gPT4gWydiYXJuZXkn
LCAnZnJlZCddCisgICAgICovCisgICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGNhbGxiYWNr
LCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBj
b2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworCisgICAgICBjYWxsYmFjayA9IGxv
ZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICBpZiAodHlw
ZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVu
Z3RoKTsKKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICByZXN1
bHRbaW5kZXhdID0gY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9u
KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gW107CisgICAg
ICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7
CisgICAgICAgICAgcmVzdWx0WysraW5kZXhdID0gY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVj
dGlvbik7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYSBjb2xs
ZWN0aW9uLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBvcgorICAgICAqIGZhbHNleSBgLUlu
ZmluaXR5YCBpcyByZXR1cm5lZC4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJl
IGV4ZWN1dGVkCisgICAgICogZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNvbGxlY3Rpb24gdG8gZ2Vu
ZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUKKyAgICAgKiBpcyByYW5rZWQu
IFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJl
ZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuCisgICAgICoK
KyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhl
IGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhl
IHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYg
YW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJl
IiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMg
dGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxz
ZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg
ICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8
c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg
KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl
IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h
bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh
dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku
CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs
YmFja2AuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuCisg
ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7CisgICAg
ICogLy8gPT4gOAorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7
ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk
JywgICAnYWdlJzogNDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLm1heChjaGFyYWN0
ZXJzLCBmdW5jdGlvbihjaHIpIHsgcmV0dXJuIGNoci5hZ2U7IH0pOworICAgICAqIC8vID0+IHsg
J25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9OworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8u
cGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8ubWF4KGNoYXJhY3RlcnMsICdhZ2Un
KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfTsKKyAgICAgKi8K
KyAgICBmdW5jdGlvbiBtYXgoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAg
IHZhciBjb21wdXRlZCA9IC1JbmZpbml0eSwKKyAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDsK
KworICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdp
dGhvdXQgdXNpbmcKKyAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFj
aworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYg
dGhpc0FyZ1tjYWxsYmFja10gPT09IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgY2FsbGJhY2sgPSBu
dWxsOworICAgICAgfQorICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgJiYgaXNBcnJheShjb2xs
ZWN0aW9uKSkgeworICAgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIGxlbmd0aCA9
IGNvbGxlY3Rpb24ubGVuZ3RoOworCisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7
CisgICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYg
KHZhbHVlID4gcmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrID0gKGNhbGxi
YWNrID09IG51bGwgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpCisgICAgICAgICAgPyBjaGFyQXRD
YWxsYmFjaworICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlz
QXJnLCAzKTsKKworICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBp
bmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFs
dWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICBpZiAoY3VycmVudCA+IGNvbXB1dGVk
KSB7CisgICAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7CisgICAgICAgICAgICByZXN1bHQg
PSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbmltdW0g
dmFsdWUgb2YgYSBjb2xsZWN0aW9uLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBvcgorICAg
ICAqIGZhbHNleSBgSW5maW5pdHlgIGlzIHJldHVybmVkLiBJZiBhIGNhbGxiYWNrIGlzIHByb3Zp
ZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQKKyAgICAgKiBmb3IgZWFjaCB2YWx1ZSBpbiB0aGUgY29s
bGVjdGlvbiB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZQorICAg
ICAqIGlzIHJhbmtlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52
b2tlZCB3aXRoIHRocmVlCisgICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBjb2xsZWN0
aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3Ig
YGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3
aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAg
ICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNy
ZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVg
IGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVj
dCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICog
QG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0g
e0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0
ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNr
PWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElm
IGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisg
ICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ss
IHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJp
bmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWlu
aW11bSB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5taW4oWzQsIDIs
IDgsIDZdKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9
IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7
ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAq
IF8ubWluKGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgeyByZXR1cm4gY2hyLmFnZTsgfSk7Cisg
ICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfTsKKyAgICAgKgorICAg
ICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLm1pbihj
aGFyYWN0ZXJzLCAnYWdlJyk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdl
JzogMzYgfTsKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtaW4oY29sbGVjdGlvbiwgY2FsbGJhY2ss
IHRoaXNBcmcpIHsKKyAgICAgIHZhciBjb21wdXRlZCA9IEluZmluaXR5LAorICAgICAgICAgIHJl
c3VsdCA9IGNvbXB1dGVkOworCisgICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIGZ1bmN0aW9u
cyBsaWtlIGBfLm1hcGAgd2l0aG91dCB1c2luZworICAgICAgLy8gdGhlaXIgYGluZGV4YCBhcmd1
bWVudCBhcyBhIGNhbGxiYWNrCisgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlv
bicgJiYgdGhpc0FyZyAmJiB0aGlzQXJnW2NhbGxiYWNrXSA9PT0gY29sbGVjdGlvbikgeworICAg
ICAgICBjYWxsYmFjayA9IG51bGw7CisgICAgICB9CisgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVs
bCAmJiBpc0FycmF5KGNvbGxlY3Rpb24pKSB7CisgICAgICAgIHZhciBpbmRleCA9IC0xLAorICAg
ICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKCsr
aW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4
XTsKKyAgICAgICAgICBpZiAodmFsdWUgPCByZXN1bHQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9
IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg
Y2FsbGJhY2sgPSAoY2FsbGJhY2sgPT0gbnVsbCAmJiBpc1N0cmluZyhjb2xsZWN0aW9uKSkKKyAg
ICAgICAgICA/IGNoYXJBdENhbGxiYWNrCisgICAgICAgICAgOiBsb2Rhc2guY3JlYXRlQ2FsbGJh
Y2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICAgIGZvckVhY2goY29sbGVjdGlvbiwg
ZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgdmFyIGN1cnJl
bnQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgICAgIGlmIChj
dXJyZW50IDwgY29tcHV0ZWQpIHsKKyAgICAgICAgICAgIGNvbXB1dGVkID0gY3VycmVudDsKKyAg
ICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAg
ICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJp
ZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcHJvcGVydHkgZnJvbSBhbGwgZWxlbWVudHMg
aW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl
ck9mIF8KKyAgICAgKiBAdHlwZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9u
cworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29s
bGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5
IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwbHVjay4KKyAgICAgKiBAcmV0dXJucyB7QXJy
YXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgorICAgICAqIEBleGFt
cGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUn
OiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdh
Z2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8ucGx1Y2soY2hhcmFjdGVycywg
J25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KKyAgICAgKi8KKyAgICB2
YXIgcGx1Y2sgPSBtYXA7CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0
byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZworICAg
ICAqIGVhY2ggZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjaywg
d2hlcmUgZWFjaCBzdWNjZXNzaXZlCisgICAgICogY2FsbGJhY2sgZXhlY3V0aW9uIGNvbnN1bWVz
IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzIGV4ZWN1dGlvbi4gSWYKKyAgICAgKiBg
YWNjdW11bGF0b3JgIGlzIG5vdCBwcm92aWRlZCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY29s
bGVjdGlvbiB3aWxsIGJlCisgICAgICogdXNlZCBhcyB0aGUgaW5pdGlhbCBgYWNjdW11bGF0b3Jg
IHZhbHVlLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgCisgICAgICogYW5kIGlu
dm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czsgKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXh8a2V5
LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg
XworICAgICAqIEBhbGlhcyBmb2xkbCwgaW5qZWN0CisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rp
b25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBj
b2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2Fs
bGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAg
KiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0
b3IuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj
YWxsYmFja2AuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZh
bHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgc3VtID0gXy5yZWR1Y2Uo
WzEsIDIsIDNdLCBmdW5jdGlvbihzdW0sIG51bSkgeworICAgICAqICAgcmV0dXJuIHN1bSArIG51
bTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiA2CisgICAgICoKKyAgICAgKiB2YXIgbWFwcGVk
ID0gXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIGZ1bmN0aW9uKHJlc3VsdCwg
bnVtLCBrZXkpIHsKKyAgICAgKiAgIHJlc3VsdFtrZXldID0gbnVtICogMzsKKyAgICAgKiAgIHJl
dHVybiByZXN1bHQ7CisgICAgICogfSwge30pOworICAgICAqIC8vID0+IHsgJ2EnOiAzLCAnYic6
IDYsICdjJzogOSB9CisgICAgICovCisgICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGNh
bGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykgeworICAgICAgaWYgKCFjb2xsZWN0aW9uKSBy
ZXR1cm4gYWNjdW11bGF0b3I7CisgICAgICB2YXIgbm9hY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGgg
PCAzOworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo
aXNBcmcsIDQpOworCisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBj
b2xsZWN0aW9uLmxlbmd0aDsKKworICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicp
IHsKKyAgICAgICAgaWYgKG5vYWNjdW0pIHsKKyAgICAgICAgICBhY2N1bXVsYXRvciA9IGNvbGxl
Y3Rpb25bKytpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5n
dGgpIHsKKyAgICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrKGFjY3VtdWxhdG9yLCBjb2xs
ZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgICB9CisgICAgICB9IGVs
c2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBj
b2xsZWN0aW9uKSB7CisgICAgICAgICAgYWNjdW11bGF0b3IgPSBub2FjY3VtCisgICAgICAgICAg
ICA/IChub2FjY3VtID0gZmFsc2UsIHZhbHVlKQorICAgICAgICAgICAgOiBjYWxsYmFjayhhY2N1
bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKQorICAgICAgICB9KTsKKyAgICAgIH0K
KyAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlz
IG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBl
bGVtZW50cworICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAg
ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBm
b2xkcgorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8
T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIu
CisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rp
b24gY2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3Jd
IEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro
aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z
IHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAg
ICAqCisgICAgICogdmFyIGxpc3QgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07CisgICAgICog
dmFyIGZsYXQgPSBfLnJlZHVjZVJpZ2h0KGxpc3QsIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEu
Y29uY2F0KGIpOyB9LCBbXSk7CisgICAgICogLy8gPT4gWzQsIDUsIDIsIDMsIDAsIDFdCisgICAg
ICovCisgICAgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgY2FsbGJhY2ssIGFjY3Vt
dWxhdG9yLCB0aGlzQXJnKSB7CisgICAgICB2YXIgbm9hY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGgg
PCAzOworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo
aXNBcmcsIDQpOworICAgICAgZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVl
LCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICBhY2N1bXVsYXRvciA9IG5vYWNjdW0KKyAg
ICAgICAgICA/IChub2FjY3VtID0gZmFsc2UsIHZhbHVlKQorICAgICAgICAgIDogY2FsbGJhY2so
YWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CisgICAgICB9KTsKKyAgICAg
IHJldHVybiBhY2N1bXVsYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3Bwb3Np
dGUgb2YgYF8uZmlsdGVyYCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBhCisg
ICAgICogY29sbGVjdGlvbiB0aGF0IHRoZSBjYWxsYmFjayBkb2VzICoqbm90KiogcmV0dXJuIHRy
dWV5IGZvci4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBm
b3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFj
ayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisg
ICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhl
IGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRy
dWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9i
amVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg
ICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFy
YW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRl
cmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxi
YWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24u
IElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2Vk
CisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJh
Y2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNg
IGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg
YSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBmYWlsZWQgdGhlIGNhbGxiYWNrIGNoZWNrLgor
ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2RkcyA9IF8ucmVqZWN0KFsxLCAy
LCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pOwor
ICAgICAqIC8vID0+IFsxLCAzLCA1XQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBb
CisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxz
ZSB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdibG9ja2VkJzog
dHJ1ZSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxs
YmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnJlamVjdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOwor
ICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBm
YWxzZSB9XQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0
aGFuZAorICAgICAqIF8ucmVqZWN0KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOworICAgICAq
IC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9XQor
ICAgICAqLworICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0Fy
ZykgeworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRo
aXNBcmcsIDMpOworICAgICAgcmV0dXJuIGZpbHRlcihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1
ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuICFjYWxsYmFjayh2YWx1ZSwg
aW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog
UmV0cmlldmVzIGEgcmFuZG9tIGVsZW1lbnQgb3IgYG5gIHJhbmRvbSBlbGVtZW50cyBmcm9tIGEg
Y29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor
ICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0
fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuCisgICAgICogQHBh
cmFtIHtudW1iZXJ9IFtuXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS4KKyAgICAg
KiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gQWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMg
bGlrZSBgXy5tYXBgCisgICAgICogIHdpdGhvdXQgdXNpbmcgdGhlaXIgYGluZGV4YCBhcmd1bWVu
dHMgYXMgYG5gLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIHNh
bXBsZShzKSBvZiBgY29sbGVjdGlvbmAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAq
IF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7CisgICAgICogLy8gPT4gMgorICAgICAqCisgICAgICog
Xy5zYW1wbGUoWzEsIDIsIDMsIDRdLCAyKTsKKyAgICAgKiAvLyA9PiBbMywgMV0KKyAgICAgKi8K
KyAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIHsKKyAgICAgIGlmIChj
b2xsZWN0aW9uICYmIHR5cGVvZiBjb2xsZWN0aW9uLmxlbmd0aCAhPSAnbnVtYmVyJykgeworICAg
ICAgICBjb2xsZWN0aW9uID0gdmFsdWVzKGNvbGxlY3Rpb24pOworICAgICAgfQorICAgICAgaWYg
KG4gPT0gbnVsbCB8fCBndWFyZCkgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbiA/IGNvbGxl
Y3Rpb25bYmFzZVJhbmRvbSgwLCBjb2xsZWN0aW9uLmxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDsK
KyAgICAgIH0KKyAgICAgIHZhciByZXN1bHQgPSBzaHVmZmxlKGNvbGxlY3Rpb24pOworICAgICAg
cmVzdWx0Lmxlbmd0aCA9IG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbiksIHJlc3VsdC5sZW5ndGgp
OworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz
IGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZSBGaXNo
ZXItWWF0ZXMKKyAgICAgKiBzaHVmZmxlLiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lr
aS9GaXNoZXItWWF0ZXNfc2h1ZmZsZS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA
bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7
QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxl
LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBzaHVmZmxlZCBjb2xsZWN0
aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMs
IDQsIDUsIDZdKTsKKyAgICAgKiAvLyA9PiBbNCwgMSwgNiwgMywgNSwgMl0KKyAgICAgKi8KKyAg
ICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAor
ICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsCisg
ICAgICAgICAgcmVzdWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0
aCA6IDApOworCisgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7Cisg
ICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbSgwLCArK2luZGV4KTsKKyAgICAgICAgcmVzdWx0
W2luZGV4XSA9IHJlc3VsdFtyYW5kXTsKKyAgICAgICAgcmVzdWx0W3JhbmRdID0gdmFsdWU7Cisg
ICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog
R2V0cyB0aGUgc2l6ZSBvZiB0aGUgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBgY29sbGVjdGlv
bi5sZW5ndGhgIGZvciBhcnJheXMKKyAgICAgKiBhbmQgYXJyYXktbGlrZSBvYmplY3RzIG9yIHRo
ZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBmb3Igb2JqZWN0cy4KKyAgICAg
KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBD
b2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlv
biBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJl
dHVybnMgYGNvbGxlY3Rpb24ubGVuZ3RoYCBvciBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgcHJv
cGVydGllcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5zaXplKFsxLCAyXSk7
CisgICAgICogLy8gPT4gMgorICAgICAqCisgICAgICogXy5zaXplKHsgJ29uZSc6IDEsICd0d28n
OiAyLCAndGhyZWUnOiAzIH0pOworICAgICAqIC8vID0+IDMKKyAgICAgKgorICAgICAqIF8uc2l6
ZSgncGViYmxlcycpOworICAgICAqIC8vID0+IDcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzaXpl
KGNvbGxlY3Rpb24pIHsKKyAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlv
bi5sZW5ndGggOiAwOworICAgICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBs
ZW5ndGggOiBrZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAg
KiBDaGVja3MgaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0cnVleSB2YWx1ZSBmb3IgKiphbnkq
KiBlbGVtZW50IG9mIGEKKyAgICAgKiBjb2xsZWN0aW9uLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBh
cyBzb29uIGFzIGl0IGZpbmRzIGEgcGFzc2luZyB2YWx1ZSBhbmQKKyAgICAgKiBkb2VzIG5vdCBp
dGVyYXRlIG92ZXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQg
dG8KKyAgICAgKiBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2
YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy
dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg
c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg
dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk
ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg
ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl
cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK
KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgYW55Cisg
ICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8
c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg
KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl
IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h
bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh
dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku
CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs
YmFja2AuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBl
bGVtZW50IHBhc3NlZCB0aGUgY2FsbGJhY2sgY2hlY2ssCisgICAgICogIGVsc2UgYGZhbHNlYC4K
KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywg
ZmFsc2VdLCBCb29sZWFuKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiB2YXIg
Y2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAn
YmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0
MCwgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogLy8gdXNpbmcg
Il8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uc29tZShjaGFyYWN0ZXJzLCAn
YmxvY2tlZCcpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJf
LndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnNvbWUoY2hhcmFjdGVycywgeyAn
YWdlJzogMSB9KTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIHNv
bWUoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciByZXN1bHQ7Cisg
ICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywg
Myk7CisKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rp
b24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09
ICdudW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAg
ICAgaWYgKChyZXN1bHQgPSBjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxl
Y3Rpb24pKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUs
IGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuICEocmVzdWx0ID0gY2FsbGJh
Y2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSk7CisgICAgICAgIH0pOworICAgICAgfQorICAg
ICAgcmV0dXJuICEhcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4g
YXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3Vs
dHMgb2YKKyAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhyb3Vn
aCB0aGUgY2FsbGJhY2suIFRoaXMgbWV0aG9kCisgICAgICogcGVyZm9ybXMgYSBzdGFibGUgc29y
dCwgdGhhdCBpcywgaXQgd2lsbCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc29ydCBvcmRlcgorICAg
ICAqIG9mIGVxdWFsIGVsZW1lbnRzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdg
IGFuZCBpbnZva2VkIHdpdGgKKyAgICAgKiB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8
a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBw
cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAg
KiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVs
ZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBpcyBw
cm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY29sbGVjdGlvbgorICAgICAqIHdpbGwgYmUgc29y
dGVkIGJ5IGVhY2ggcHJvcGVydHkgdmFsdWUuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3Qg
aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNh
bGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUg
dGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAu
CisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0
ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNv
bGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7
QXJyYXl8RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVu
Y3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBv
ciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBh
ICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAg
ICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNr
YC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2Ygc29ydGVk
IGVsZW1lbnRzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNvcnRCeShbMSwg
MiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5zaW4obnVtKTsgfSk7CisgICAgICog
Ly8gPT4gWzMsIDEsIDJdCisgICAgICoKKyAgICAgKiBfLnNvcnRCeShbMSwgMiwgM10sIGZ1bmN0
aW9uKG51bSkgeyByZXR1cm4gdGhpcy5zaW4obnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4g
WzMsIDEsIDJdCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsg
J25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk
JywgICAgJ2FnZSc6IDQwIH0sCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzog
MjYgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiAzMCB9CisgICAgICog
XTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQK
KyAgICAgKiBfLm1hcChfLnNvcnRCeShjaGFyYWN0ZXJzLCAnYWdlJyksIF8udmFsdWVzKTsKKyAg
ICAgKiAvLyA9PiBbWydiYXJuZXknLCAyNl0sIFsnZnJlZCcsIDMwXSwgWydiYXJuZXknLCAzNl0s
IFsnZnJlZCcsIDQwXV0KKyAgICAgKgorICAgICAqIC8vIHNvcnRpbmcgYnkgbXVsdGlwbGUgcHJv
cGVydGllcworICAgICAqIF8ubWFwKF8uc29ydEJ5KGNoYXJhY3RlcnMsIFsnbmFtZScsICdhZ2Un
XSksIF8udmFsdWVzKTsKKyAgICAgKiAvLyA9ID4gW1snYmFybmV5JywgMjZdLCBbJ2Jhcm5leScs
IDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0MF1dCisgICAgICovCisgICAgZnVuY3Rpb24g
c29ydEJ5KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXgg
PSAtMSwKKyAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoY2FsbGJhY2spLAorICAgICAgICAgIGxl
bmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVz
dWx0ID0gQXJyYXkodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyA/IGxlbmd0aCA6IDApOworCisg
ICAgICBpZiAoIWlzQXJyKSB7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxi
YWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIH0KKyAgICAgIGZvckVhY2goY29sbGVj
dGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgeworICAgICAgICB2YXIgb2Jq
ZWN0ID0gcmVzdWx0WysraW5kZXhdID0gZ2V0T2JqZWN0KCk7CisgICAgICAgIGlmIChpc0Fycikg
eworICAgICAgICAgIG9iamVjdC5jcml0ZXJpYSA9IG1hcChjYWxsYmFjaywgZnVuY3Rpb24oa2V5
KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAo
b2JqZWN0LmNyaXRlcmlhID0gZ2V0QXJyYXkoKSlbMF0gPSBjYWxsYmFjayh2YWx1ZSwga2V5LCBj
b2xsZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBvYmplY3QuaW5kZXggPSBpbmRleDsKKyAg
ICAgICAgb2JqZWN0LnZhbHVlID0gdmFsdWU7CisgICAgICB9KTsKKworICAgICAgbGVuZ3RoID0g
cmVzdWx0Lmxlbmd0aDsKKyAgICAgIHJlc3VsdC5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpOworICAg
ICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIHZhciBvYmplY3QgPSByZXN1bHRbbGVuZ3Ro
XTsKKyAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBvYmplY3QudmFsdWU7CisgICAgICAgIGlmICgh
aXNBcnIpIHsKKyAgICAgICAgICByZWxlYXNlQXJyYXkob2JqZWN0LmNyaXRlcmlhKTsKKyAgICAg
ICAgfQorICAgICAgICByZWxlYXNlT2JqZWN0KG9iamVjdCk7CisgICAgICB9CisgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBgY29sbGVj
dGlvbmAgdG8gYW4gYXJyYXkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl
ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5
fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gY29udmVydC4KKyAg
ICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb252ZXJ0ZWQgYXJyYXkuCisg
ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIChmdW5jdGlvbigpIHsgcmV0dXJuIF8udG9B
cnJheShhcmd1bWVudHMpLnNsaWNlKDEpOyB9KSgxLCAyLCAzLCA0KTsKKyAgICAgKiAvLyA9PiBb
MiwgMywgNF0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB0b0FycmF5KGNvbGxlY3Rpb24pIHsKKyAg
ICAgIGlmIChjb2xsZWN0aW9uICYmIHR5cGVvZiBjb2xsZWN0aW9uLmxlbmd0aCA9PSAnbnVtYmVy
JykgeworICAgICAgICByZXR1cm4gc2xpY2UoY29sbGVjdGlvbik7CisgICAgICB9CisgICAgICBy
ZXR1cm4gdmFsdWVzKGNvbGxlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZv
cm1zIGEgZGVlcCBjb21wYXJpc29uIG9mIGVhY2ggZWxlbWVudCBpbiBhIGBjb2xsZWN0aW9uYCB0
byB0aGUgZ2l2ZW4KKyAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0LCByZXR1cm5pbmcgYW4gYXJy
YXkgb2YgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBlcXVpdmFsZW50CisgICAgICogcHJvcGVydHkg
dmFsdWVzLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAg
ICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBA
cGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8g
aXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGUgb2JqZWN0IG9m
IHByb3BlcnR5IHZhbHVlcyB0byBmaWx0ZXIgYnkuCisgICAgICogQHJldHVybnMge0FycmF5fSBS
ZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gcHJvcGVy
dGllcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBb
CisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ3BldHMnOiBbJ2hvcHB5
J10gfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAncGV0cyc6IFsn
YmFieSBwdXNzJywgJ2Rpbm8nXSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8ud2hlcmUo
Y2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFy
bmV5JywgJ2FnZSc6IDM2LCAncGV0cyc6IFsnaG9wcHknXSB9XQorICAgICAqCisgICAgICogXy53
aGVyZShjaGFyYWN0ZXJzLCB7ICdwZXRzJzogWydkaW5vJ10gfSk7CisgICAgICogLy8gPT4gW3sg
J25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10g
fV0KKyAgICAgKi8KKyAgICB2YXIgd2hlcmUgPSBmaWx0ZXI7CisKKyAgICAvKi0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFs
c2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCwKKyAgICAgKiBg
MGAsIGAiImAsIGB1bmRlZmluZWRgLCBhbmQgYE5hTmAgYXJlIGFsbCBmYWxzZXkuCisgICAgICoK
KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJy
YXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuCisg
ICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZh
bHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5jb21wYWN0KFswLCAxLCBm
YWxzZSwgMiwgJycsIDNdKTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgM10KKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBjb21wYWN0KGFycmF5KSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAg
ICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVzdWx0ID0g
W107CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciB2YWx1
ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgcmVzdWx0
LnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCB2
YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIGFycmF5cyB1c2luZyBzdHJpY3QKKyAgICAgKiBlcXVhbGl0
eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg
ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFt
IHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHsuLi5B
cnJheX0gW3ZhbHVlc10gVGhlIGFycmF5cyBvZiB2YWx1ZXMgdG8gZXhjbHVkZS4KKyAgICAgKiBA
cmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgor
ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmRpZmZlcmVuY2UoWzEsIDIsIDMsIDQs
IDVdLCBbNSwgMiwgMTBdKTsKKyAgICAgKiAvLyA9PiBbMSwgMywgNF0KKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBkaWZmZXJlbmNlKGFycmF5KSB7CisgICAgICByZXR1cm4gYmFzZURpZmZlcmVuY2Uo
YXJyYXksIGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgdHJ1ZSwgMSkpOworICAgIH0KKwor
ICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQg
aXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgICAgICogZWxlbWVudCB0aGF0IHBh
c3NlcyB0aGUgY2FsbGJhY2sgY2hlY2ssIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgor
ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh
Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0
dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg
ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi
Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs
ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg
ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy
T2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJh
eSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0
cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl
ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg
d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg
c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn
XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7bnVt
YmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgor
ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAg
KiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LAor
ICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUg
fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiBm
YWxzZSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMs
IGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCAyMDsKKyAgICAgKiB9
KTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2Fs
bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kSW5kZXgoY2hhcmFjdGVycywgeyAnYWdlJzog
MzYgfSk7CisgICAgICogLy8gPT4gMAorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2si
IGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMsICdibG9j
a2VkJyk7CisgICAgICogLy8gPT4gMQorICAgICAqLworICAgIGZ1bmN0aW9uIGZpbmRJbmRleChh
cnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAg
ICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKKworICAgICAgY2FsbGJhY2sg
PSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgd2hp
bGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2luZGV4
XSwgaW5kZXgsIGFycmF5KSkgeworICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQor
ICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMg
bWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVy
IGVsZW1lbnRzCisgICAgICogb2YgYSBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0Lgor
ICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh
Y2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0
dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAg
ICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi
Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVs
ZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAg
ICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVy
T2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJh
eSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0
cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBl
ciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQg
d2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIg
c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn
XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7bnVt
YmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLgor
ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAg
KiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sCisg
ICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdibG9ja2VkJzogZmFsc2Ug
fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0
cnVlIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3Rl
cnMsIGZ1bmN0aW9uKGNocikgeworICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPiAzMDsKKyAgICAg
KiB9KTsKKyAgICAgKiAvLyA9PiAxCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIg
Y2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsIHsg
J2FnZSc6IDM2IH0pOworICAgICAqIC8vID0+IDAKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJf
LnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpbmRMYXN0SW5kZXgoY2hhcmFj
dGVycywgJ2Jsb2NrZWQnKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICovCisgICAgZnVuY3Rpb24g
ZmluZExhc3RJbmRleChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBsZW5n
dGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5j
cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICB3aGlsZSAobGVuZ3Ro
LS0pIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkp
KSB7CisgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAg
cmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1l
bnQgb3IgZmlyc3QgYG5gIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrCisgICAg
ICogaXMgcHJvdmlkZWQgZWxlbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgYXJl
IHJldHVybmVkIGFzIGxvbmcKKyAgICAgKiBhcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleS4g
VGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKKyAgICAgKiBpbnZva2VkIHdp
dGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICoKKyAgICAg
KiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0
ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3Bl
cnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2Jq
ZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHls
ZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBo
YXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFs
c2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICog
QGFsaWFzIGhlYWQsIHRha2UKKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFt
IHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgorICAgICAqIEBwYXJhbSB7RnVuY3Rp
b258T2JqZWN0fG51bWJlcnxzdHJpbmd9IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAor
ICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi4g
SWYgYSBwcm9wZXJ0eSBuYW1lIG9yCisgICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxs
IGJlIHVzZWQgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIgorICAgICAqICBzdHls
ZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRo
ZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1
cm5zIHRoZSBmaXJzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuCisgICAgICogQGV4YW1wbGUKKyAg
ICAgKgorICAgICAqIF8uZmlyc3QoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiAxCisgICAgICoK
KyAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgMik7CisgICAgICogLy8gPT4gWzEsIDJdCisgICAg
ICoKKyAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CisgICAgICogICBy
ZXR1cm4gbnVtIDwgMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbMSwgMl0KKyAgICAgKgor
ICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAg
J2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAgeyAnbmFt
ZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAor
ICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVy
JzogJ25hJyB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBj
YWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpcnN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7
CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1w
bG95ZXInOiAnc2xhdGUnIH1dCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2Fs
bGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5wbHVjayhfLmZpcnN0KGNoYXJhY3RlcnMsIHsgJ2Vt
cGxveWVyJzogJ3NsYXRlJyB9KSwgJ25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdm
cmVkJ10KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmaXJzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNB
cmcpIHsKKyAgICAgIHZhciBuID0gMCwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5
Lmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ251bWJlcicgJiYg
Y2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICB2YXIgaW5kZXggPSAtMTsKKyAgICAgICAgY2Fs
bGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAg
ICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGlu
ZGV4LCBhcnJheSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIG4gPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCB0aGlzQXJn
KSB7CisgICAgICAgICAgcmV0dXJuIGFycmF5ID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzbGljZShhcnJheSwgMCwgbmF0aXZlTWluKG5h
dGl2ZU1heCgwLCBuKSwgbGVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhdHRl
bnMgYSBuZXN0ZWQgYXJyYXkgKHRoZSBuZXN0aW5nIGNhbiBiZSB0byBhbnkgZGVwdGgpLiBJZiBg
aXNTaGFsbG93YAorICAgICAqIGlzIHRydWV5LCB0aGUgYXJyYXkgd2lsbCBvbmx5IGJlIGZsYXR0
ZW5lZCBhIHNpbmdsZSBsZXZlbC4gSWYgYSBjYWxsYmFjaworICAgICAqIGlzIHByb3ZpZGVkIGVh
Y2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrIGJl
Zm9yZQorICAgICAqIGZsYXR0ZW5pbmcuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0Fy
Z2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZQorICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRl
eCwgYXJyYXkpLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVk
IGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxi
YWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4K
KyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0
aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBg
dHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4g
b2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg
ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0g
e0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KKyAgICAgKiBAcGFyYW0ge2Jvb2xl
YW59IFtpc1NoYWxsb3c9ZmFsc2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGEg
c2luZ2xlIGxldmVsLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2Nh
bGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRp
b24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1
c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2Fs
bGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRo
aXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVy
bnMgYSBuZXcgZmxhdHRlbmVkIGFycmF5LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg
KiBfLmZsYXR0ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0pOworICAgICAqIC8vID0+IFsxLCAyLCAz
LCA0XTsKKyAgICAgKgorICAgICAqIF8uZmxhdHRlbihbMSwgWzJdLCBbMywgW1s0XV1dXSwgdHJ1
ZSk7CisgICAgICogLy8gPT4gWzEsIDIsIDMsIFtbNF1dXTsKKyAgICAgKgorICAgICAqIHZhciBj
aGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzAsICdw
ZXRzJzogWydob3BweSddIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0
MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfQorICAgICAqIF07CisgICAgICoKKyAg
ICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5mbGF0
dGVuKGNoYXJhY3RlcnMsICdwZXRzJyk7CisgICAgICogLy8gPT4gWydob3BweScsICdiYWJ5IHB1
c3MnLCAnZGlubyddCisgICAgICovCisgICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSwgaXNTaGFs
bG93LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgLy8ganVnZ2xlIGFyZ3VtZW50cworICAg
ICAgaWYgKHR5cGVvZiBpc1NoYWxsb3cgIT0gJ2Jvb2xlYW4nICYmIGlzU2hhbGxvdyAhPSBudWxs
KSB7CisgICAgICAgIHRoaXNBcmcgPSBjYWxsYmFjazsKKyAgICAgICAgY2FsbGJhY2sgPSAodHlw
ZW9mIGlzU2hhbGxvdyAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tpc1NoYWxs
b3ddID09PSBhcnJheSkgPyBudWxsIDogaXNTaGFsbG93OworICAgICAgICBpc1NoYWxsb3cgPSBm
YWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgIGFy
cmF5ID0gbWFwKGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZyk7CisgICAgICB9CisgICAgICByZXR1
cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGlzU2hhbGxvdyk7CisgICAgfQorCisgICAgLyoqCisgICAg
ICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVl
YCBpcyBmb3VuZCB1c2luZworICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMs
IGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBhbHJlYWR5IHNvcnRlZAorICAgICAqIHByb3Zp
ZGluZyBgdHJ1ZWAgZm9yIGBmcm9tSW5kZXhgIHdpbGwgcnVuIGEgZmFzdGVyIGJpbmFyeSBzZWFy
Y2guCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA
Y2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRv
IHNlYXJjaC4KKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9y
LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4
IHRvIHNlYXJjaCBmcm9tIG9yIGB0cnVlYAorICAgICAqICB0byBwZXJmb3JtIGEgYmluYXJ5IHNl
YXJjaCBvbiBhIHNvcnRlZCBhcnJheS4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5z
IHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSBvciBgLTFgLgorICAgICAqIEBleGFtcGxl
CisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyKTsKKyAgICAg
KiAvLyA9PiAxCisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAy
LCAzKTsKKyAgICAgKiAvLyA9PiA0CisgICAgICoKKyAgICAgKiBfLmluZGV4T2YoWzEsIDEsIDIs
IDIsIDMsIDNdLCAyLCB0cnVlKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICovCisgICAgZnVuY3Rp
b24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgeworICAgICAgaWYgKHR5cGVvZiBm
cm9tSW5kZXggPT0gJ251bWJlcicpIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJy
YXkubGVuZ3RoIDogMDsKKyAgICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRp
dmVNYXgoMCwgbGVuZ3RoICsgZnJvbUluZGV4KSA6IGZyb21JbmRleCB8fCAwKTsKKyAgICAgIH0g
ZWxzZSBpZiAoZnJvbUluZGV4KSB7CisgICAgICAgIHZhciBpbmRleCA9IHNvcnRlZEluZGV4KGFy
cmF5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBhcnJheVtpbmRleF0gPT09IHZhbHVlID8gaW5k
ZXggOiAtMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUs
IGZyb21JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgYnV0IHRoZSBs
YXN0IGVsZW1lbnQgb3IgbGFzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEKKyAgICAg
KiBjYWxsYmFjayBpcyBwcm92aWRlZCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBh
cmUgZXhjbHVkZWQgZnJvbQorICAgICAqIHRoZSByZXN1bHQgYXMgbG9uZyBhcyB0aGUgY2FsbGJh
Y2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kCisgICAgICogdG8gYHRoaXNB
cmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJh
eSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBj
YWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2ls
bCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAq
CisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVh
dGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBm
b3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3Qs
CisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt
ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9
IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVj
dHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAq
ICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEg
cHJvcGVydHkgbmFtZSBvcgorICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1
c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIKKyAgICAgKiAgc3R5bGUgY2Fs
bGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRo
aXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVy
bnMgYSBzbGljZSBvZiBgYXJyYXlgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBf
LmluaXRpYWwoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiBbMSwgMl0KKyAgICAgKgorICAgICAq
IF8uaW5pdGlhbChbMSwgMiwgM10sIDIpOworICAgICAqIC8vID0+IFsxXQorICAgICAqCisgICAg
ICogXy5pbml0aWFsKFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CisgICAgICogICByZXR1cm4g
bnVtID4gMTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbMV0KKyAgICAgKgorICAgICAqIHZh
ciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQn
OiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk
JywgICAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAg
eyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ25hJyB9
CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBz
aG9ydGhhbmQKKyAgICAgKiBfLmluaXRpYWwoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAg
KiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVy
JzogJ3NsYXRlJyB9XQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNr
IHNob3J0aGFuZAorICAgICAqIF8ucGx1Y2soXy5pbml0aWFsKGNoYXJhY3RlcnMsIHsgJ2VtcGxv
eWVyJzogJ25hJyB9KSwgJ25hbWUnKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10K
KyAgICAgKi8KKyAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykg
eworICAgICAgdmFyIG4gPSAwLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVu
Z3RoIDogMDsKKworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxs
YmFjayAhPSBudWxsKSB7CisgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aDsKKyAgICAgICAgY2Fs
bGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAg
ICAgICB3aGlsZSAoaW5kZXgtLSAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJh
eSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IG4gPSAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0aGlzQXJnKSA/IDEgOiBjYWxsYmFjayB8fCBuOwor
ICAgICAgfQorICAgICAgcmV0dXJuIHNsaWNlKGFycmF5LCAwLCBuYXRpdmVNaW4obmF0aXZlTWF4
KDAsIGxlbmd0aCAtIG4pLCBsZW5ndGgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVh
dGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgcHJlc2VudCBpbiBhbGwgcHJvdmlkZWQgYXJy
YXlzIHVzaW5nCisgICAgICogc3RyaWN0IGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBg
PT09YC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAq
IEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXldIFRoZSBh
cnJheXMgdG8gaW5zcGVjdC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJy
YXkgb2Ygc2hhcmVkIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5p
bnRlcnNlY3Rpb24oWzEsIDIsIDNdLCBbNSwgMiwgMSwgNF0sIFsyLCAxXSk7CisgICAgICogLy8g
PT4gWzEsIDJdCisgICAgICovCisgICAgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKCkgeworICAgICAg
dmFyIGFyZ3MgPSBbXSwKKyAgICAgICAgICBhcmdzSW5kZXggPSAtMSwKKyAgICAgICAgICBhcmdz
TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKKyAgICAgICAgICBjYWNoZXMgPSBnZXRBcnJheSgp
LAorICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksCisgICAgICAgICAgdHJ1c3RJbmRl
eE9mID0gaW5kZXhPZiA9PT0gYmFzZUluZGV4T2YsCisgICAgICAgICAgc2VlbiA9IGdldEFycmF5
KCk7CisKKyAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsKKyAgICAgICAg
dmFyIHZhbHVlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CisgICAgICAgIGlmIChpc0FycmF5KHZh
bHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpIHsKKyAgICAgICAgICBhcmdzLnB1c2godmFsdWUp
OworICAgICAgICAgIGNhY2hlcy5wdXNoKHRydXN0SW5kZXhPZiAmJiB2YWx1ZS5sZW5ndGggPj0g
bGFyZ2VBcnJheVNpemUgJiYKKyAgICAgICAgICAgIGNyZWF0ZUNhY2hlKGFyZ3NJbmRleCA/IGFy
Z3NbYXJnc0luZGV4XSA6IHNlZW4pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmFyIGFy
cmF5ID0gYXJnc1swXSwKKyAgICAgICAgICBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9
IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSBbXTsKKworICAg
ICAgb3V0ZXI6CisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICB2YXIg
Y2FjaGUgPSBjYWNoZXNbMF07CisgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdOworCisgICAg
ICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2Yoc2Vl
biwgdmFsdWUpKSA8IDApIHsKKyAgICAgICAgICBhcmdzSW5kZXggPSBhcmdzTGVuZ3RoOworICAg
ICAgICAgIChjYWNoZSB8fCBzZWVuKS5wdXNoKHZhbHVlKTsKKyAgICAgICAgICB3aGlsZSAoLS1h
cmdzSW5kZXgpIHsKKyAgICAgICAgICAgIGNhY2hlID0gY2FjaGVzW2FyZ3NJbmRleF07CisgICAg
ICAgICAgICBpZiAoKGNhY2hlID8gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkgOiBpbmRleE9m
KGFyZ3NbYXJnc0luZGV4XSwgdmFsdWUpKSA8IDApIHsKKyAgICAgICAgICAgICAgY29udGludWUg
b3V0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdC5wdXNo
KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkg
eworICAgICAgICBjYWNoZSA9IGNhY2hlc1thcmdzTGVuZ3RoXTsKKyAgICAgICAgaWYgKGNhY2hl
KSB7CisgICAgICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICAgIHJlbGVhc2VBcnJheShjYWNoZXMpOworICAgICAgcmVsZWFzZUFycmF5KHNlZW4pOwor
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBs
YXN0IGVsZW1lbnQgb3IgbGFzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEgY2FsbGJh
Y2sgaXMKKyAgICAgKiBwcm92aWRlZCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBh
cmUgcmV0dXJuZWQgYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBjYWxsYmFjayByZXR1cm5zIHRydWV5
LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkCisgICAgICog
d2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KKyAgICAgKgorICAg
ICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3Jl
YXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJv
cGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBv
YmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0
eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0
IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBm
YWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg
KiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5
IHRvIHF1ZXJ5LgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fG51bWJlcnxzdHJpbmd9
IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgZWxlbWVudCBvciB0
aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yCisg
ICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgIl8u
cGx1Y2siIG9yICJfLndoZXJlIgorICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5
LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2Fs
bGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQocykg
b2YgYGFycmF5YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5sYXN0KFsxLCAy
LCAzXSk7CisgICAgICogLy8gPT4gMworICAgICAqCisgICAgICogXy5sYXN0KFsxLCAyLCAzXSwg
Mik7CisgICAgICogLy8gPT4gWzIsIDNdCisgICAgICoKKyAgICAgKiBfLmxhc3QoWzEsIDIsIDNd
LCBmdW5jdGlvbihudW0pIHsKKyAgICAgKiAgIHJldHVybiBudW0gPiAxOworICAgICAqIH0pOwor
ICAgICAqIC8vID0+IFsyLCAzXQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisg
ICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYmxvY2tlZCc6IGZhbHNlLCAnZW1wbG95ZXIn
OiAnc2xhdGUnIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYmxvY2tlZCc6IHRy
dWUsICAnZW1wbG95ZXInOiAnc2xhdGUnIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMn
LCAnYmxvY2tlZCc6IHRydWUsICAnZW1wbG95ZXInOiAnbmEnIH0KKyAgICAgKiBdOworICAgICAq
CisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8u
cGx1Y2soXy5sYXN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyksICduYW1lJyk7CisgICAgICogLy8g
PT4gWydmcmVkJywgJ3BlYmJsZXMnXQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUi
IGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8ubGFzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3ll
cic6ICduYScgfSk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2Vk
JzogdHJ1ZSwgJ2VtcGxveWVyJzogJ25hJyB9XQorICAgICAqLworICAgIGZ1bmN0aW9uIGxhc3Qo
YXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgbiA9IDAsCisgICAgICAgICAg
bGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworCisgICAgICBpZiAodHlwZW9mIGNh
bGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgdmFyIGlu
ZGV4ID0gbGVuZ3RoOworICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhj
YWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICAgIHdoaWxlIChpbmRleC0tICYmIGNhbGxiYWNr
KGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgeworICAgICAgICAgIG4rKzsKKyAgICAgICAg
fQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IGNhbGxiYWNrOworICAgICAgICBpZiAobiA9
PSBudWxsIHx8IHRoaXNBcmcpIHsKKyAgICAgICAgICByZXR1cm4gYXJyYXkgPyBhcnJheVtsZW5n
dGggLSAxXSA6IHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHNs
aWNlKGFycmF5LCBuYXRpdmVNYXgoMCwgbGVuZ3RoIC0gbikpOworICAgIH0KKworICAgIC8qKgor
ICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYHZh
bHVlYCBpcyBmb3VuZCB1c2luZyBzdHJpY3QKKyAgICAgKiBlcXVhbGl0eSBmb3IgY29tcGFyaXNv
bnMsIGkuZS4gYD09PWAuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCBpcyB1c2VkCisg
ICAgICogYXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAg
ICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2Ag
dGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4g
dGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICog
SWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndo
ZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVu
dHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICog
ZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBf
CisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRo
ZSBhcnJheSB0byBzZWFyY2guCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8g
c2VhcmNoIGZvci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5n
dGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9
IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuCisgICAgICog
QGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNd
LCAyKTsKKyAgICAgKiAvLyA9PiA0CisgICAgICoKKyAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAy
LCAzLCAxLCAyLCAzXSwgMiwgMyk7CisgICAgICogLy8gPT4gMQorICAgICAqLworICAgIGZ1bmN0
aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CisgICAgICB2YXIgaW5k
ZXggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisgICAgICBpZiAodHlwZW9mIGZyb21JbmRl
eCA9PSAnbnVtYmVyJykgeworICAgICAgICBpbmRleCA9IChmcm9tSW5kZXggPCAwID8gbmF0aXZl
TWF4KDAsIGluZGV4ICsgZnJvbUluZGV4KSA6IG5hdGl2ZU1pbihmcm9tSW5kZXgsIGluZGV4IC0g
MSkpICsgMTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChpbmRleC0tKSB7CisgICAgICAgIGlmIChh
cnJheVtpbmRleF0gPT09IHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAg
ICB9CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICog
UmVtb3ZlcyBhbGwgcHJvdmlkZWQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHVzaW5nIHN0
cmljdCBlcXVhbGl0eSBmb3IKKyAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KKyAgICAg
KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBB
cnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5Lgor
ICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS4KKyAgICAg
KiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KKyAgICAgKiBAZXhhbXBsZQorICAg
ICAqCisgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDEsIDIsIDNdOworICAgICAqIF8ucHVs
bChhcnJheSwgMiwgMyk7CisgICAgICogY29uc29sZS5sb2coYXJyYXkpOworICAgICAqIC8vID0+
IFsxLCAxXQorICAgICAqLworICAgIGZ1bmN0aW9uIHB1bGwoYXJyYXkpIHsKKyAgICAgIHZhciBh
cmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGFyZ3NJbmRleCA9IDAsCisgICAgICAgICAgYXJn
c0xlbmd0aCA9IGFyZ3MubGVuZ3RoLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXku
bGVuZ3RoIDogMDsKKworICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkgewor
ICAgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIHZhbHVlID0gYXJnc1thcmdzSW5k
ZXhdOworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIGlmIChh
cnJheVtpbmRleF0gPT09IHZhbHVlKSB7CisgICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwg
aW5kZXgtLSwgMSk7CisgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAg
KiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkg
cHJvZ3Jlc3NpbmcgZnJvbQorICAgICAqIGBzdGFydGAgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcg
YGVuZGAuIElmIGBzdGFydGAgaXMgbGVzcyB0aGFuIGBzdG9wYCBhCisgICAgICogemVyby1sZW5n
dGggcmFuZ2UgaXMgY3JlYXRlZCB1bmxlc3MgYSBuZWdhdGl2ZSBgc3RlcGAgaXMgc3BlY2lmaWVk
LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh
dGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0
IG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhl
IHJhbmdlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5j
cmVtZW50IG9yIGRlY3JlbWVudCBieS4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMg
YSBuZXcgcmFuZ2UgYXJyYXkuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ucmFu
Z2UoNCk7CisgICAgICogLy8gPT4gWzAsIDEsIDIsIDNdCisgICAgICoKKyAgICAgKiBfLnJhbmdl
KDEsIDUpOworICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XQorICAgICAqCisgICAgICogXy5yYW5n
ZSgwLCAyMCwgNSk7CisgICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV0KKyAgICAgKgorICAgICAq
IF8ucmFuZ2UoMCwgLTQsIC0xKTsKKyAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM10KKyAgICAg
KgorICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7CisgICAgICogLy8gPT4gWzEsIDEsIDFdCisgICAg
ICoKKyAgICAgKiBfLnJhbmdlKDApOworICAgICAqIC8vID0+IFtdCisgICAgICovCisgICAgZnVu
Y3Rpb24gcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkgeworICAgICAgc3RhcnQgPSArc3RhcnQgfHwg
MDsKKyAgICAgIHN0ZXAgPSB0eXBlb2Ygc3RlcCA9PSAnbnVtYmVyJyA/IHN0ZXAgOiAoK3N0ZXAg
fHwgMSk7CisKKyAgICAgIGlmIChlbmQgPT0gbnVsbCkgeworICAgICAgICBlbmQgPSBzdGFydDsK
KyAgICAgICAgc3RhcnQgPSAwOworICAgICAgfQorICAgICAgLy8gdXNlIGBBcnJheShsZW5ndGgp
YCBzbyBlbmdpbmVzIGxpa2UgQ2hha3JhIGFuZCBWOCBhdm9pZCBzbG93ZXIgbW9kZXMKKyAgICAg
IC8vIGh0dHA6Ly95b3V0dS5iZS9YQXFJcEdVOFpaayN0PTE3bTI1cworICAgICAgdmFyIGluZGV4
ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KDAsIGNlaWwoKGVuZCAtIHN0YXJ0
KSAvIChzdGVwIHx8IDEpKSksCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKKwor
ICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgcmVzdWx0W2luZGV4XSA9
IHN0YXJ0OworICAgICAgICBzdGFydCArPSBzdGVwOworICAgICAgfQorICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9t
IGFuIGFycmF5IHRoYXQgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkgZm9yCisgICAgICogYW5k
IHJldHVybnMgYW4gYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJv
dW5kIHRvIGB0aGlzQXJnYAorICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRz
OyAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5h
bWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxl
CisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBn
aXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZv
ciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAq
IHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVz
IG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAg
ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cwor
ICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCisgICAgICog
QHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBm
dW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1l
IG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRl
IGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5Lgor
ICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJh
Y2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiByZW1v
dmVkIGVsZW1lbnRzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgYXJyYXkg
PSBbMSwgMiwgMywgNCwgNSwgNl07CisgICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXks
IGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTsKKyAgICAgKgorICAgICAq
IGNvbnNvbGUubG9nKGFycmF5KTsKKyAgICAgKiAvLyA9PiBbMSwgMywgNV0KKyAgICAgKgorICAg
ICAqIGNvbnNvbGUubG9nKGV2ZW5zKTsKKyAgICAgKiAvLyA9PiBbMiwgNCwgNl0KKyAgICAgKi8K
KyAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2
YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6
IDAsCisgICAgICAgICAgcmVzdWx0ID0gW107CisKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNy
ZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIHdoaWxlICgrK2luZGV4
IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAg
aWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7CisgICAgICAgICAgcmVzdWx0LnB1
c2godmFsdWUpOworICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBpbmRleC0tLCAxKTsKKyAg
ICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uaW5pdGlhbGAg
dGhpcyBtZXRob2QgZ2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9yCisgICAgICogZmly
c3QgYG5gIGVsZW1lbnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBy
b3ZpZGVkIGVsZW1lbnRzCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkgYXJl
IGV4Y2x1ZGVkIGZyb20gdGhlIHJlc3VsdCBhcyBsb25nIGFzIHRoZQorICAgICAqIGNhbGxiYWNr
IHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGlu
dm9rZWQKKyAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkp
LgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2Fs
bGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwg
cmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgor
ICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRl
ZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9y
IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAor
ICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt
YmVyT2YgXworICAgICAqIEBhbGlhcyBkcm9wLCB0YWlsCisgICAgICogQGNhdGVnb3J5IEFycmF5
cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAg
KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhl
IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVs
ZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvcgorICAgICAqICBvYmplY3Qg
aXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53
aGVyZSIKKyAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFy
YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAg
KiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBzbGljZSBvZiBgYXJyYXlgLgorICAgICAqIEBl
eGFtcGxlCisgICAgICoKKyAgICAgKiBfLnJlc3QoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiBb
MiwgM10KKyAgICAgKgorICAgICAqIF8ucmVzdChbMSwgMiwgM10sIDIpOworICAgICAqIC8vID0+
IFszXQorICAgICAqCisgICAgICogXy5yZXN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7Cisg
ICAgICogICByZXR1cm4gbnVtIDwgMzsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbM10KKyAg
ICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJu
ZXknLCAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAg
eyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgICdlbXBsb3llcic6ICdzbGF0
ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgJ2Vt
cGxveWVyJzogJ25hJyB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBs
dWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnBsdWNrKF8ucmVzdChjaGFyYWN0ZXJz
LCAnYmxvY2tlZCcpLCAnbmFtZScpOworICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ10K
KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg
ICAgKiBfLnJlc3QoY2hhcmFjdGVycywgeyAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOworICAgICAq
IC8vID0+IFt7ICduYW1lJzogJ3BlYmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6
ICduYScgfV0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZXN0KGFycmF5LCBjYWxsYmFjaywgdGhp
c0FyZykgeworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFj
ayAhPSBudWxsKSB7CisgICAgICAgIHZhciBuID0gMCwKKyAgICAgICAgICAgIGluZGV4ID0gLTEs
CisgICAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICAg
ICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMp
OworICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjYWxsYmFjayhhcnJheVtpbmRl
eF0sIGluZGV4LCBhcnJheSkpIHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIG4gPSAoY2FsbGJhY2sgPT0gbnVsbCB8fCB0aGlzQXJnKSA/IDEgOiBu
YXRpdmVNYXgoMCwgY2FsbGJhY2spOworICAgICAgfQorICAgICAgcmV0dXJuIHNsaWNlKGFycmF5
LCBuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBk
ZXRlcm1pbmUgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoIGEgdmFsdWUKKyAgICAgKiBzaG91
bGQgYmUgaW5zZXJ0ZWQgaW50byBhIGdpdmVuIHNvcnRlZCBhcnJheSBpbiBvcmRlciB0byBtYWlu
dGFpbiB0aGUgc29ydAorICAgICAqIG9yZGVyIG9mIHRoZSBhcnJheS4gSWYgYSBjYWxsYmFjayBp
cyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvcgorICAgICAqIGB2YWx1ZWAgYW5kIGVh
Y2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXIgc29ydCByYW5raW5nLiBUaGUK
KyAgICAgKiBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBv
bmUgYXJndW1lbnQ7ICh2YWx1ZSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUg
aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisg
ICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZl
biBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBg
Y2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdp
bGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9m
IHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICog
QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAg
ICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgorICAgICAqIEBw
YXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLgorICAgICAqIEBwYXJhbSB7RnVu
Y3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2Fs
bGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3Qg
aXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNr
IiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFy
YW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAg
KiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNo
b3VsZCBiZSBpbnNlcnRlZAorICAgICAqICBpbnRvIGBhcnJheWAuCisgICAgICogQGV4YW1wbGUK
KyAgICAgKgorICAgICAqIF8uc29ydGVkSW5kZXgoWzIwLCAzMCwgNTBdLCA0MCk7CisgICAgICog
Ly8gPT4gMgorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0
aGFuZAorICAgICAqIF8uc29ydGVkSW5kZXgoW3sgJ3gnOiAyMCB9LCB7ICd4JzogMzAgfSwgeyAn
eCc6IDUwIH1dLCB7ICd4JzogNDAgfSwgJ3gnKTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAg
ICAgKiB2YXIgZGljdCA9IHsKKyAgICAgKiAgICd3b3JkVG9OdW1iZXInOiB7ICd0d2VudHknOiAy
MCwgJ3RoaXJ0eSc6IDMwLCAnZm91cnR5JzogNDAsICdmaWZ0eSc6IDUwIH0KKyAgICAgKiB9Owor
ICAgICAqCisgICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHkn
XSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHsKKyAgICAgKiAgIHJldHVybiBkaWN0LndvcmRU
b051bWJlclt3b3JkXTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiAyCisgICAgICoKKyAgICAg
KiBfLnNvcnRlZEluZGV4KFsndHdlbnR5JywgJ3RoaXJ0eScsICdmaWZ0eSddLCAnZm91cnR5Jywg
ZnVuY3Rpb24od29yZCkgeworICAgICAqICAgcmV0dXJuIHRoaXMud29yZFRvTnVtYmVyW3dvcmRd
OworICAgICAqIH0sIGRpY3QpOworICAgICAqIC8vID0+IDIKKyAgICAgKi8KKyAgICBmdW5jdGlv
biBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2
YXIgbG93ID0gMCwKKyAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiBsb3c7
CisKKyAgICAgIC8vIGV4cGxpY2l0bHkgcmVmZXJlbmNlIGBpZGVudGl0eWAgZm9yIGJldHRlciBp
bmxpbmluZyBpbiBGaXJlZm94CisgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gbG9kYXNoLmNy
ZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSA6IGlkZW50aXR5OworICAgICAgdmFs
dWUgPSBjYWxsYmFjayh2YWx1ZSk7CisKKyAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CisgICAg
ICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7CisgICAgICAgIChjYWxsYmFjayhhcnJh
eVttaWRdKSA8IHZhbHVlKQorICAgICAgICAgID8gbG93ID0gbWlkICsgMQorICAgICAgICAgIDog
aGlnaCA9IG1pZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBsb3c7CisgICAgfQorCisgICAgLyoq
CisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgb2Yg
dGhlIHByb3ZpZGVkIGFycmF5cyB1c2luZworICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29t
cGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l
bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHsuLi5BcnJh
eX0gW2FycmF5XSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0FycmF5
fSBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQor
ICAgICAqCisgICAgICogXy51bmlvbihbMSwgMiwgM10sIFs1LCAyLCAxLCA0XSwgWzIsIDFdKTsK
KyAgICAgKiAvLyA9PiBbMSwgMiwgMywgNSwgNF0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB1bmlv
bigpIHsKKyAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUs
IHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLXZh
bHVlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHkKKyAgICAg
KiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBzb3J0ZWQsIHBy
b3ZpZGluZworICAgICAqIGB0cnVlYCBmb3IgYGlzU29ydGVkYCB3aWxsIHVzZSBhIGZhc3RlciBh
bGdvcml0aG0uIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQKKyAgICAgKiBlYWNoIGVsZW1lbnQg
b2YgYGFycmF5YCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sgYmVmb3JlIHVuaXF1ZW5l
c3MKKyAgICAgKiBpcyBjb21wdXRlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJn
YCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCisgICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4
LCBhcnJheSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQg
Zm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJh
Y2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50Lgor
ICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRo
ZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0
cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBv
YmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAg
ICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFzIHVuaXF1ZQorICAgICAqIEBjYXRlZ29yeSBB
cnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy4K
KyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1NvcnRlZD1mYWxzZV0gQSBmbGFnIHRvIGluZGlj
YXRlIHRoYXQgYGFycmF5YCBpcyBzb3J0ZWQuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmpl
Y3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAg
KiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRl
ZCBpdCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndo
ZXJlIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro
aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z
IHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1mcmVlIGFycmF5LgorICAgICAqIEBl
eGFtcGxlCisgICAgICoKKyAgICAgKiBfLnVuaXEoWzEsIDIsIDEsIDMsIDFdKTsKKyAgICAgKiAv
LyA9PiBbMSwgMiwgM10KKyAgICAgKgorICAgICAqIF8udW5pcShbMSwgMSwgMiwgMiwgM10sIHRy
dWUpOworICAgICAqIC8vID0+IFsxLCAyLCAzXQorICAgICAqCisgICAgICogXy51bmlxKFsnQScs
ICdiJywgJ0MnLCAnYScsICdCJywgJ2MnXSwgZnVuY3Rpb24obGV0dGVyKSB7IHJldHVybiBsZXR0
ZXIudG9Mb3dlckNhc2UoKTsgfSk7CisgICAgICogLy8gPT4gWydBJywgJ2InLCAnQyddCisgICAg
ICoKKyAgICAgKiBfLnVuaXEoWzEsIDIuNSwgMywgMS41LCAyLCAzLjVdLCBmdW5jdGlvbihudW0p
IHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7CisgICAgICogLy8gPT4gWzEsIDIu
NSwgM10KKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhh
bmQKKyAgICAgKiBfLnVuaXEoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAn
eCcpOworICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XQorICAgICAqLworICAg
IGZ1bmN0aW9uIHVuaXEoYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAg
ICAgLy8ganVnZ2xlIGFyZ3VtZW50cworICAgICAgaWYgKHR5cGVvZiBpc1NvcnRlZCAhPSAnYm9v
bGVhbicgJiYgaXNTb3J0ZWQgIT0gbnVsbCkgeworICAgICAgICB0aGlzQXJnID0gY2FsbGJhY2s7
CisgICAgICAgIGNhbGxiYWNrID0gKHR5cGVvZiBpc1NvcnRlZCAhPSAnZnVuY3Rpb24nICYmIHRo
aXNBcmcgJiYgdGhpc0FyZ1tpc1NvcnRlZF0gPT09IGFycmF5KSA/IG51bGwgOiBpc1NvcnRlZDsK
KyAgICAgICAgaXNTb3J0ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChjYWxsYmFjayAh
PSBudWxsKSB7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxi
YWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNlVW5pcShhcnJheSwg
aXNTb3J0ZWQsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFu
IGFycmF5IGV4Y2x1ZGluZyBhbGwgcHJvdmlkZWQgdmFsdWVzIHVzaW5nIHN0cmljdCBlcXVhbGl0
eSBmb3IKKyAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KKyAgICAgKgorICAgICAqIEBz
dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAg
KiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsdGVyLgorICAgICAqIEBwYXJh
bSB7Li4uKn0gW3ZhbHVlXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICogQHJldHVybnMg
e0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgKiBA
ZXhhbXBsZQorICAgICAqCisgICAgICogXy53aXRob3V0KFsxLCAyLCAxLCAwLCAzLCAxLCA0XSwg
MCwgMSk7CisgICAgICogLy8gPT4gWzIsIDMsIDRdCisgICAgICovCisgICAgZnVuY3Rpb24gd2l0
aG91dChhcnJheSkgeworICAgICAgcmV0dXJuIGJhc2VEaWZmZXJlbmNlKGFycmF5LCBzbGljZShh
cmd1bWVudHMsIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5
IHRoYXQgaXMgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHRoZSBwcm92aWRlZCBhcnJheXMu
CisgICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZl
cmVuY2UuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg
KiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5XSBUaGUg
YXJyYXlzIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFy
cmF5IG9mIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy54b3IoWzEs
IDIsIDNdLCBbNSwgMiwgMSwgNF0pOworICAgICAqIC8vID0+IFszLCA1LCA0XQorICAgICAqCisg
ICAgICogXy54b3IoWzEsIDIsIDVdLCBbMiwgMywgNV0sIFszLCA0LCA1XSk7CisgICAgICogLy8g
PT4gWzEsIDQsIDVdCisgICAgICovCisgICAgZnVuY3Rpb24geG9yKCkgeworICAgICAgdmFyIGlu
ZGV4ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKworICAgICAg
d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGFycmF5ID0gYXJndW1lbnRz
W2luZGV4XTsKKyAgICAgICAgaWYgKGlzQXJyYXkoYXJyYXkpIHx8IGlzQXJndW1lbnRzKGFycmF5
KSkgeworICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHQKKyAgICAgICAgICAgID8gYmFzZVVu
aXEoYmFzZURpZmZlcmVuY2UocmVzdWx0LCBhcnJheSkuY29uY2F0KGJhc2VEaWZmZXJlbmNlKGFy
cmF5LCByZXN1bHQpKSkKKyAgICAgICAgICAgIDogYXJyYXk7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICAgIHJldHVybiByZXN1bHQgfHwgW107CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3Jl
YXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29u
dGFpbnMgdGhlIGZpcnN0CisgICAgICogZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhl
IHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGUgc2Vjb25kCisgICAgICogZWxlbWVudHMgb2Yg
dGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAg
ICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFzIHVuemlwCisgICAgICogQGNhdGVnb3J5IEFy
cmF5cworICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gQXJyYXlzIHRvIHByb2Nlc3Mu
CisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGdyb3VwZWQg
ZWxlbWVudHMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uemlwKFsnZnJlZCcs
ICdiYXJuZXknXSwgWzMwLCA0MF0sIFt0cnVlLCBmYWxzZV0pOworICAgICAqIC8vID0+IFtbJ2Zy
ZWQnLCAzMCwgdHJ1ZV0sIFsnYmFybmV5JywgNDAsIGZhbHNlXV0KKyAgICAgKi8KKyAgICBmdW5j
dGlvbiB6aXAoKSB7CisgICAgICB2YXIgYXJyYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFy
Z3VtZW50cyA6IGFyZ3VtZW50c1swXSwKKyAgICAgICAgICBpbmRleCA9IC0xLAorICAgICAgICAg
IGxlbmd0aCA9IGFycmF5ID8gbWF4KHBsdWNrKGFycmF5LCAnbGVuZ3RoJykpIDogMCwKKyAgICAg
ICAgICByZXN1bHQgPSBBcnJheShsZW5ndGggPCAwID8gMCA6IGxlbmd0aCk7CisKKyAgICAgIHdo
aWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBwbHVjayhh
cnJheSwgaW5kZXgpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAg
ICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBmcm9tIGFycmF5cyBvZiBg
a2V5c2AgYW5kIGB2YWx1ZXNgLiBQcm92aWRlCisgICAgICogZWl0aGVyIGEgc2luZ2xlIHR3byBk
aW1lbnNpb25hbCBhcnJheSwgaS5lLiBgW1trZXkxLCB2YWx1ZTFdLCBba2V5MiwgdmFsdWUyXV1g
CisgICAgICogb3IgdHdvIGFycmF5cywgb25lIG9mIGBrZXlzYCBhbmQgb25lIG9mIGNvcnJlc3Bv
bmRpbmcgYHZhbHVlc2AuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9m
IF8KKyAgICAgKiBAYWxpYXMgb2JqZWN0CisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAq
IEBwYXJhbSB7QXJyYXl9IGtleXMgVGhlIGFycmF5IG9mIGtleXMuCisgICAgICogQHBhcmFtIHtB
cnJheX0gW3ZhbHVlcz1bXV0gVGhlIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJucyB7
T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQK
KyAgICAgKiAgY29ycmVzcG9uZGluZyB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor
ICAgICAqIF8uemlwT2JqZWN0KFsnZnJlZCcsICdiYXJuZXknXSwgWzMwLCA0MF0pOworICAgICAq
IC8vID0+IHsgJ2ZyZWQnOiAzMCwgJ2Jhcm5leSc6IDQwIH0KKyAgICAgKi8KKyAgICBmdW5jdGlv
biB6aXBPYmplY3Qoa2V5cywgdmFsdWVzKSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAg
ICAgICBsZW5ndGggPSBrZXlzID8ga2V5cy5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9
IHt9OworCisgICAgICBpZiAoIXZhbHVlcyAmJiBsZW5ndGggJiYgIWlzQXJyYXkoa2V5c1swXSkp
IHsKKyAgICAgICAgdmFsdWVzID0gW107CisgICAgICB9CisgICAgICB3aGlsZSAoKytpbmRleCA8
IGxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07CisgICAgICAgIGlmICh2
YWx1ZXMpIHsKKyAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlc1tpbmRleF07CisgICAgICAg
IH0gZWxzZSBpZiAoa2V5KSB7CisgICAgICAgICAgcmVzdWx0W2tleVswXV0gPSBrZXlbMV07Cisg
ICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24g
dGhhdCBleGVjdXRlcyBgZnVuY2AsIHdpdGggIHRoZSBgdGhpc2AgYmluZGluZyBhbmQKKyAgICAg
KiBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIG9ubHkgYWZ0ZXIgYmVpbmcgY2Fs
bGVkIGBuYCB0aW1lcy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg
XworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBU
aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAg
ICAgKiAgYGZ1bmNgIGlzIGV4ZWN1dGVkLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMg
VGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0
dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAg
KgorICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddOworICAgICAqCisg
ICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7CisgICAg
ICogICBjb25zb2xlLmxvZygnRG9uZSBzYXZpbmchJyk7CisgICAgICogfSk7CisgICAgICoKKyAg
ICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHsKKyAgICAgKiAgIGFzeW5jU2F2
ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTsKKyAgICAgKiB9KTsKKyAgICAg
KiAvLyA9PiBsb2dzICdEb25lIHNhdmluZyEnLCBhZnRlciBhbGwgc2F2ZXMgaGF2ZSBjb21wbGV0
ZWQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7CisgICAgICBpZiAoIWlz
RnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKKyAgICAgIH0K
KyAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKC0tbiA8IDEpIHsKKyAgICAg
ICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAg
ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3
aGVuIGNhbGxlZCwgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgCisgICAgICogYmluZGlu
ZyBvZiBgdGhpc0FyZ2AgYW5kIHByZXBlbmRzIGFueSBhZGRpdGlvbmFsIGBiaW5kYCBhcmd1bWVu
dHMgdG8gdGhvc2UKKyAgICAgKiBwcm92aWRlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uCisgICAg
ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg
RnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8g
YmluZC4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg
YGZ1bmNgLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGJlIHBhcnRp
YWxseSBhcHBsaWVkLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3
IGJvdW5kIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgZnVu
YyA9IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcg
KyB0aGlzLm5hbWU7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIGZ1bmMgPSBfLmJpbmQoZnVu
YywgeyAnbmFtZSc6ICdmcmVkJyB9LCAnaGknKTsKKyAgICAgKiBmdW5jKCk7CisgICAgICogLy8g
PT4gJ2hpIGZyZWQnCisgICAgICovCisgICAgZnVuY3Rpb24gYmluZChmdW5jLCB0aGlzQXJnKSB7
CisgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDIKKyAgICAgICAgPyBjcmVhdGVXcmFw
cGVyKGZ1bmMsIDE3LCBzbGljZShhcmd1bWVudHMsIDIpLCBudWxsLCB0aGlzQXJnKQorICAgICAg
ICA6IGNyZWF0ZVdyYXBwZXIoZnVuYywgMSwgbnVsbCwgbnVsbCwgdGhpc0FyZyk7CisgICAgfQor
CisgICAgLyoqCisgICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVj
dCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZworICAgICAqIG1ldGhvZC4gTWV0aG9k
IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJy
YXlzCisgICAgICogb2YgbWV0aG9kIG5hbWVzLiBJZiBubyBtZXRob2QgbmFtZXMgYXJlIHByb3Zp
ZGVkIGFsbCB0aGUgZnVuY3Rpb24gcHJvcGVydGllcworICAgICAqIG9mIGBvYmplY3RgIHdpbGwg
YmUgYm91bmQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAg
ICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBU
aGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by4KKyAgICAg
KiBAcGFyYW0gey4uLnN0cmluZ30gW21ldGhvZE5hbWVdIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVz
IHRvCisgICAgICogIGJpbmQsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIG1ldGhvZCBuYW1lcyBv
ciBhcnJheXMgb2YgbWV0aG9kIG5hbWVzLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVy
bnMgYG9iamVjdGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciB2aWV3ID0g
eworICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLAorICAgICAqICAgJ29uQ2xpY2snOiBmdW5jdGlv
bigpIHsgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpOyB9CisgICAgICogfTsK
KyAgICAgKgorICAgICAqIF8uYmluZEFsbCh2aWV3KTsKKyAgICAgKiBqUXVlcnkoJyNkb2NzJyku
b24oJ2NsaWNrJywgdmlldy5vbkNsaWNrKTsKKyAgICAgKiAvLyA9PiBsb2dzICdjbGlja2VkIGRv
Y3MnLCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZAorICAgICAqLworICAgIGZ1bmN0aW9uIGJp
bmRBbGwob2JqZWN0KSB7CisgICAgICB2YXIgZnVuY3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/
IGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpIDogZnVuY3Rpb25zKG9iamVj
dCksCisgICAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBmdW5jcy5sZW5n
dGg7CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZhciBrZXkg
PSBmdW5jc1tpbmRleF07CisgICAgICAgIG9iamVjdFtrZXldID0gY3JlYXRlV3JhcHBlcihvYmpl
Y3Rba2V5XSwgMSwgbnVsbCwgbnVsbCwgb2JqZWN0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBv
YmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQs
IHdoZW4gY2FsbGVkLCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYAorICAgICAq
IGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgYmluZEtleWAgYXJndW1lbnRzIHRvIHRob3Nl
IHByb3ZpZGVkIHRvIHRoZSBib3VuZAorICAgICAqIGZ1bmN0aW9uLiBUaGlzIG1ldGhvZCBkaWZm
ZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvCisgICAgICog
cmVmZXJlbmNlIG1ldGhvZHMgdGhhdCB3aWxsIGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhp
c3QuCisgICAgICogU2VlIGh0dHA6Ly9taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24t
ZGVmaW5pdGlvbi1wYXR0ZXJuLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i
ZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7T2JqZWN0
fSBvYmplY3QgVGhlIG9iamVjdCB0aGUgbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAgICogQHBhcmFt
IHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuCisgICAgICogQHBhcmFtIHsuLi4q
fSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCisgICAgICogQHJldHVy
bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgICAgICogQGV4
YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7CisgICAgICogICAnbmFtZSc6ICdm
cmVkJywKKyAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgICAgICogICAg
IHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMubmFtZTsKKyAgICAgKiAgIH0KKyAgICAgKiB9
OworICAgICAqCisgICAgICogdmFyIGZ1bmMgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAn
aGknKTsKKyAgICAgKiBmdW5jKCk7CisgICAgICogLy8gPT4gJ2hpIGZyZWQnCisgICAgICoKKyAg
ICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZykgeworICAgICAqICAgcmV0dXJu
IGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLm5hbWUgKyAnISc7CisgICAgICogfTsKKyAgICAgKgor
ICAgICAqIGZ1bmMoKTsKKyAgICAgKiAvLyA9PiAnaGl5YSBmcmVkIScKKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBiaW5kS2V5KG9iamVjdCwga2V5KSB7CisgICAgICByZXR1cm4gYXJndW1lbnRzLmxl
bmd0aCA+IDIKKyAgICAgICAgPyBjcmVhdGVXcmFwcGVyKGtleSwgMTksIHNsaWNlKGFyZ3VtZW50
cywgMiksIG51bGwsIG9iamVjdCkKKyAgICAgICAgOiBjcmVhdGVXcmFwcGVyKGtleSwgMywgbnVs
bCwgbnVsbCwgb2JqZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVu
Y3Rpb24gdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucywK
KyAgICAgKiB3aGVyZSBlYWNoIGZ1bmN0aW9uIGNvbnN1bWVzIHRoZSByZXR1cm4gdmFsdWUgb2Yg
dGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgY29tcG9zaW5n
IHRoZSBmdW5jdGlvbnMgYGYoKWAsIGBnKClgLCBhbmQgYGgoKWAgcHJvZHVjZXMgYGYoZyhoKCkp
KWAuCisgICAgICogRWFjaCBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aXRoIHRoZSBgdGhpc2AgYmlu
ZGluZyBvZiB0aGUgY29tcG9zZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg
ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBh
cmFtIHsuLi5GdW5jdGlvbn0gW2Z1bmNdIEZ1bmN0aW9ucyB0byBjb21wb3NlLgorICAgICAqIEBy
ZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2VkIGZ1bmN0aW9uLgorICAg
ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgcmVhbE5hbWVNYXAgPSB7CisgICAgICog
ICAncGViYmxlcyc6ICdwZW5lbG9wZScKKyAgICAgKiB9OworICAgICAqCisgICAgICogdmFyIGZv
cm1hdCA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgKiAgIG5hbWUgPSByZWFsTmFtZU1hcFtuYW1l
LnRvTG93ZXJDYXNlKCldIHx8IG5hbWU7CisgICAgICogICByZXR1cm4gbmFtZS5jaGFyQXQoMCku
dG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTsKKyAgICAgKiB9Owor
ICAgICAqCisgICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZm9ybWF0dGVkKSB7CisgICAgICog
ICByZXR1cm4gJ0hpeWEgJyArIGZvcm1hdHRlZCArICchJzsKKyAgICAgKiB9OworICAgICAqCisg
ICAgICogdmFyIHdlbGNvbWUgPSBfLmNvbXBvc2UoZ3JlZXQsIGZvcm1hdCk7CisgICAgICogd2Vs
Y29tZSgncGViYmxlcycpOworICAgICAqIC8vID0+ICdIaXlhIFBlbmVsb3BlIScKKyAgICAgKi8K
KyAgICBmdW5jdGlvbiBjb21wb3NlKCkgeworICAgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzLAor
ICAgICAgICAgIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aDsKKworICAgICAgd2hpbGUgKGxlbmd0aC0t
KSB7CisgICAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jc1tsZW5ndGhdKSkgeworICAgICAgICAg
IHRocm93IG5ldyBUeXBlRXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBm
dW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisgICAgICAgICAgICBs
ZW5ndGggPSBmdW5jcy5sZW5ndGg7CisKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAg
ICAgICAgYXJncyA9IFtmdW5jc1tsZW5ndGhdLmFwcGx5KHRoaXMsIGFyZ3MpXTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gYXJnc1swXTsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoqCisg
ICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgb25lIG9yIG1vcmUgYXJndW1l
bnRzIG9mIGBmdW5jYCB0aGF0IHdoZW4KKyAgICAgKiBpbnZva2VkIGVpdGhlciBleGVjdXRlcyBg
ZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGFsbCBgZnVuY2AgYXJndW1lbnRzCisgICAg
ICogaGF2ZSBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRz
IG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAqIHJlbWFpbmluZyBgZnVuY2AgYXJndW1lbnRzLCBh
bmQgc28gb24uIFRoZSBhcml0eSBvZiBgZnVuY2AgY2FuIGJlIHNwZWNpZmllZAorICAgICAqIGlm
IGBmdW5jLmxlbmd0aGAgaXMgbm90IHN1ZmZpY2llbnQuCisgICAgICoKKyAgICAgKiBAc3RhdGlj
CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICog
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICogQHBh
cmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KKyAg
ICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9u
LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY3VycmllZCA9IF8uY3Vycnko
ZnVuY3Rpb24oYSwgYiwgYykgeworICAgICAqICAgY29uc29sZS5sb2coYSArIGIgKyBjKTsKKyAg
ICAgKiB9KTsKKyAgICAgKgorICAgICAqIGN1cnJpZWQoMSkoMikoMyk7CisgICAgICogLy8gPT4g
NgorICAgICAqCisgICAgICogY3VycmllZCgxLCAyKSgzKTsKKyAgICAgKiAvLyA9PiA2CisgICAg
ICoKKyAgICAgKiBjdXJyaWVkKDEsIDIsIDMpOworICAgICAqIC8vID0+IDYKKyAgICAgKi8KKyAg
ICBmdW5jdGlvbiBjdXJyeShmdW5jLCBhcml0eSkgeworICAgICAgYXJpdHkgPSB0eXBlb2YgYXJp
dHkgPT0gJ251bWJlcicgPyBhcml0eSA6ICgrYXJpdHkgfHwgZnVuYy5sZW5ndGgpOworICAgICAg
cmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgNCwgbnVsbCwgbnVsbCwgbnVsbCwgYXJpdHkpOwor
ICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVs
YXkgdGhlIGV4ZWN1dGlvbiBvZiBgZnVuY2AgdW50aWwgYWZ0ZXIKKyAgICAgKiBgd2FpdGAgbWls
bGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBpbnZva2Vk
LgorICAgICAqIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBgZnVu
Y2Agc2hvdWxkIGJlIGludm9rZWQgb24KKyAgICAgKiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxp
bmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMKKyAgICAgKiB0
byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxh
c3QgYGZ1bmNgIGNhbGwuCisgICAgICoKKyAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0
cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgIGBmdW5jYCB3aWxsIGJlIGNhbGxlZAorICAgICAq
IG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSBkZWJv
dW5jZWQgZnVuY3Rpb24gaXMKKyAgICAgKiBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0
aGUgYHdhaXRgIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl
ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlv
bn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuCisgICAgICogQHBhcmFtIHtudW1iZXJ9
IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuCisgICAgICogQHBhcmFt
IHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICogQHBhcmFtIHti
b29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUg
bGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0
aW9ucy5tYXhXYWl0XSBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRl
bGF5ZWQgYmVmb3JlIGl0J3MgY2FsbGVkLgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlv
bnMudHJhaWxpbmc9dHJ1ZV0gU3BlY2lmeSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ug
b2YgdGhlIHRpbWVvdXQuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBu
ZXcgZGVib3VuY2VkIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAv
LyBhdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBm
bHV4CisgICAgICogdmFyIGxhenlMYXlvdXQgPSBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwg
MTUwKTsKKyAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgbGF6eUxheW91dCk7Cisg
ICAgICoKKyAgICAgKiAvLyBleGVjdXRlIGBzZW5kTWFpbGAgd2hlbiB0aGUgY2xpY2sgZXZlbnQg
aXMgZmlyZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscworICAgICAqIGpRdWVyeSgnI3Bv
c3Rib3gnKS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHsKKyAgICAgKiAg
ICdsZWFkaW5nJzogdHJ1ZSwKKyAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlCisgICAgICogfSk7
CisgICAgICoKKyAgICAgKiAvLyBlbnN1cmUgYGJhdGNoTG9nYCBpcyBleGVjdXRlZCBvbmNlIGFm
dGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscworICAgICAqIHZhciBzb3VyY2UgPSBuZXcg
RXZlbnRTb3VyY2UoJy9zdHJlYW0nKTsKKyAgICAgKiBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcign
bWVzc2FnZScsIF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeworICAgICAqICAgJ21heFdhaXQn
OiAxMDAwCisgICAgICogfSwgZmFsc2UpOworICAgICAqLworICAgIGZ1bmN0aW9uIGRlYm91bmNl
KGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBhcmdzLAorICAgICAgICAgIG1heFRp
bWVvdXRJZCwKKyAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgc3RhbXAsCisgICAgICAgICAg
dGhpc0FyZywKKyAgICAgICAgICB0aW1lb3V0SWQsCisgICAgICAgICAgdHJhaWxpbmdDYWxsLAor
ICAgICAgICAgIGxhc3RDYWxsZWQgPSAwLAorICAgICAgICAgIG1heFdhaXQgPSBmYWxzZSwKKyAg
ICAgICAgICB0cmFpbGluZyA9IHRydWU7CisKKyAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkg
eworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAgd2FpdCA9IG5h
dGl2ZU1heCgwLCB3YWl0KSB8fCAwOworICAgICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHsKKyAg
ICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlOworICAgICAgICB0cmFpbGluZyA9IGZhbHNlOworICAg
ICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSkgeworICAgICAgICBsZWFkaW5nID0gb3B0
aW9ucy5sZWFkaW5nOworICAgICAgICBtYXhXYWl0ID0gJ21heFdhaXQnIGluIG9wdGlvbnMgJiYg
KG5hdGl2ZU1heCh3YWl0LCBvcHRpb25zLm1heFdhaXQpIHx8IDApOworICAgICAgICB0cmFpbGlu
ZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsK
KyAgICAgIH0KKyAgICAgIHZhciBkZWxheWVkID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBy
ZW1haW5pbmcgPSB3YWl0IC0gKG5vdygpIC0gc3RhbXApOworICAgICAgICBpZiAocmVtYWluaW5n
IDw9IDApIHsKKyAgICAgICAgICBpZiAobWF4VGltZW91dElkKSB7CisgICAgICAgICAgICBjbGVh
clRpbWVvdXQobWF4VGltZW91dElkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIGlzQ2Fs
bGVkID0gdHJhaWxpbmdDYWxsOworICAgICAgICAgIG1heFRpbWVvdXRJZCA9IHRpbWVvdXRJZCA9
IHRyYWlsaW5nQ2FsbCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICBpZiAoaXNDYWxsZWQpIHsKKyAg
ICAgICAgICAgIGxhc3RDYWxsZWQgPSBub3coKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMu
YXBwbHkodGhpc0FyZywgYXJncyk7CisgICAgICAgICAgICBpZiAoIXRpbWVvdXRJZCAmJiAhbWF4
VGltZW91dElkKSB7CisgICAgICAgICAgICAgIGFyZ3MgPSB0aGlzQXJnID0gbnVsbDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGltZW91
dElkID0gc2V0VGltZW91dChkZWxheWVkLCByZW1haW5pbmcpOworICAgICAgICB9CisgICAgICB9
OworCisgICAgICB2YXIgbWF4RGVsYXllZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAodGlt
ZW91dElkKSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CisgICAgICAgIH0K
KyAgICAgICAgbWF4VGltZW91dElkID0gdGltZW91dElkID0gdHJhaWxpbmdDYWxsID0gdW5kZWZp
bmVkOworICAgICAgICBpZiAodHJhaWxpbmcgfHwgKG1heFdhaXQgIT09IHdhaXQpKSB7CisgICAg
ICAgICAgbGFzdENhbGxlZCA9IG5vdygpOworICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHko
dGhpc0FyZywgYXJncyk7CisgICAgICAgICAgaWYgKCF0aW1lb3V0SWQgJiYgIW1heFRpbWVvdXRJ
ZCkgeworICAgICAgICAgICAgYXJncyA9IHRoaXNBcmcgPSBudWxsOworICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgfTsKKworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICBh
cmdzID0gYXJndW1lbnRzOworICAgICAgICBzdGFtcCA9IG5vdygpOworICAgICAgICB0aGlzQXJn
ID0gdGhpczsKKyAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJhaWxpbmcgJiYgKHRpbWVvdXRJZCB8
fCAhbGVhZGluZyk7CisKKyAgICAgICAgaWYgKG1heFdhaXQgPT09IGZhbHNlKSB7CisgICAgICAg
ICAgdmFyIGxlYWRpbmdDYWxsID0gbGVhZGluZyAmJiAhdGltZW91dElkOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIGlmICghbWF4VGltZW91dElkICYmICFsZWFkaW5nKSB7CisgICAgICAg
ICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciByZW1h
aW5pbmcgPSBtYXhXYWl0IC0gKHN0YW1wIC0gbGFzdENhbGxlZCksCisgICAgICAgICAgICAgIGlz
Q2FsbGVkID0gcmVtYWluaW5nIDw9IDA7CisKKyAgICAgICAgICBpZiAoaXNDYWxsZWQpIHsKKyAg
ICAgICAgICAgIGlmIChtYXhUaW1lb3V0SWQpIHsKKyAgICAgICAgICAgICAgbWF4VGltZW91dElk
ID0gY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBsYXN0Q2FsbGVkID0gc3RhbXA7CisgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRo
aXNBcmcsIGFyZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICghbWF4VGltZW91
dElkKSB7CisgICAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KG1heERlbGF5ZWQs
IHJlbWFpbmluZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc0NhbGxl
ZCAmJiB0aW1lb3V0SWQpIHsKKyAgICAgICAgICB0aW1lb3V0SWQgPSBjbGVhclRpbWVvdXQodGlt
ZW91dElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghdGltZW91dElkICYmIHdhaXQg
IT09IG1heFdhaXQpIHsKKyAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGRlbGF5ZWQs
IHdhaXQpOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFkaW5nQ2FsbCkgeworICAgICAgICAg
IGlzQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcs
IGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NhbGxlZCAmJiAhdGltZW91dElkICYm
ICFtYXhUaW1lb3V0SWQpIHsKKyAgICAgICAgICBhcmdzID0gdGhpc0FyZyA9IG51bGw7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoq
CisgICAgICogRGVmZXJzIGV4ZWN1dGluZyB0aGUgYGZ1bmNgIGZ1bmN0aW9uIHVudGlsIHRoZSBj
dXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuCisgICAgICogQWRkaXRpb25hbCBhcmd1bWVu
dHMgd2lsbCBiZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCBpcyBpbnZva2VkLgorICAgICAq
CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1
bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRl
ZmVyLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGludm9rZSB0aGUg
ZnVuY3Rpb24gd2l0aC4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1l
ciBpZC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5kZWZlcihmdW5jdGlvbih0
ZXh0KSB7IGNvbnNvbGUubG9nKHRleHQpOyB9LCAnZGVmZXJyZWQnKTsKKyAgICAgKiAvLyBsb2dz
ICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG9yIG1vcmUgbWlsbGlzZWNvbmRzCisgICAgICovCisgICAg
ZnVuY3Rpb24gZGVmZXIoZnVuYykgeworICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7Cisg
ICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7CisgICAgICB9CisgICAgICB2YXIgYXJncyA9IHNs
aWNlKGFyZ3VtZW50cywgMSk7CisgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsg
ZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAg
ICAgKiBFeGVjdXRlcyB0aGUgYGZ1bmNgIGZ1bmN0aW9uIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29u
ZHMuIEFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICogd2lsbCBiZSBwcm92aWRlZCB0byBgZnVu
Y2Agd2hlbiBpdCBpcyBpbnZva2VkLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt
ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVu
Y3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LgorICAgICAqIEBwYXJhbSB7bnVtYmVy
fSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGV4ZWN1dGlvbi4KKyAg
ICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9u
IHdpdGguCisgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuCisg
ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkgeyBj
b25zb2xlLmxvZyh0ZXh0KTsgfSwgMTAwMCwgJ2xhdGVyJyk7CisgICAgICogLy8gPT4gbG9ncyAn
bGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBkZWxheShmdW5j
LCB3YWl0KSB7CisgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cg
bmV3IFR5cGVFcnJvcjsKKyAgICAgIH0KKyAgICAgIHZhciBhcmdzID0gc2xpY2UoYXJndW1lbnRz
LCAyKTsKKyAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVu
ZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0
ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVz
b2x2ZXJgIGlzCisgICAgICogcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0
aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQKKyAgICAgKiBiYXNlZCBvbiB0aGUg
YXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwg
dGhlCisgICAgICogZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0
aW9uIGlzIHVzZWQgYXMgdGhlIGNhY2hlIGtleS4KKyAgICAgKiBUaGUgYGZ1bmNgIGlzIGV4ZWN1
dGVkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4KKyAg
ICAgKiBUaGUgcmVzdWx0IGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkg
b24gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq
IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7
RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC4K
KyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIEEgZnVuY3Rpb24gdXNlZCB0byBy
ZXNvbHZlIHRoZSBjYWNoZSBrZXkuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5z
IHRoZSBuZXcgbWVtb2l6aW5nIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAg
ICAgKiB2YXIgZmlib25hY2NpID0gXy5tZW1vaXplKGZ1bmN0aW9uKG4pIHsKKyAgICAgKiAgIHJl
dHVybiBuIDwgMiA/IG4gOiBmaWJvbmFjY2kobiAtIDEpICsgZmlib25hY2NpKG4gLSAyKTsKKyAg
ICAgKiB9KTsKKyAgICAgKgorICAgICAqIGZpYm9uYWNjaSg5KQorICAgICAqIC8vID0+IDM0Cisg
ICAgICoKKyAgICAgKiB2YXIgZGF0YSA9IHsKKyAgICAgKiAgICdmcmVkJzogeyAnbmFtZSc6ICdm
cmVkJywgJ2FnZSc6IDQwIH0sCisgICAgICogICAncGViYmxlcyc6IHsgJ25hbWUnOiAncGViYmxl
cycsICdhZ2UnOiAxIH0KKyAgICAgKiB9OworICAgICAqCisgICAgICogLy8gbW9kaWZ5aW5nIHRo
ZSByZXN1bHQgY2FjaGUKKyAgICAgKiB2YXIgZ2V0ID0gXy5tZW1vaXplKGZ1bmN0aW9uKG5hbWUp
IHsgcmV0dXJuIGRhdGFbbmFtZV07IH0sIF8uaWRlbnRpdHkpOworICAgICAqIGdldCgncGViYmxl
cycpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KKyAgICAg
KgorICAgICAqIGdldC5jYWNoZS5wZWJibGVzLm5hbWUgPSAncGVuZWxvcGUnOworICAgICAqIGdl
dCgncGViYmxlcycpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAncGVuZWxvcGUnLCAnYWdlJzog
MSB9CisgICAgICovCisgICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikgeworICAg
ICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7
CisgICAgICB9CisgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFy
IGNhY2hlID0gbWVtb2l6ZWQuY2FjaGUsCisgICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJl
c29sdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXlQcmVmaXggKyBhcmd1bWVudHNbMF07
CisKKyAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIGtleSkKKyAgICAg
ICAgICA/IGNhY2hlW2tleV0KKyAgICAgICAgICA6IChjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0
aGlzLCBhcmd1bWVudHMpKTsKKyAgICAgIH0KKyAgICAgIG1lbW9pemVkLmNhY2hlID0ge307Cisg
ICAgICByZXR1cm4gbWVtb2l6ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBh
IGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBleGVjdXRlIGBmdW5jYCBvbmNlLiBSZXBl
YXQgY2FsbHMgdG8KKyAgICAgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9m
IHRoZSBmaXJzdCBjYWxsLiBUaGUgYGZ1bmNgIGlzIGV4ZWN1dGVkCisgICAgICogd2l0aCB0aGUg
YHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBA
c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisg
ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCisg
ICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5j
dGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGluaXRpYWxpemUgPSBf
Lm9uY2UoY3JlYXRlQXBwbGljYXRpb24pOworICAgICAqIGluaXRpYWxpemUoKTsKKyAgICAgKiBp
bml0aWFsaXplKCk7CisgICAgICogLy8gYGluaXRpYWxpemVgIGV4ZWN1dGVzIGBjcmVhdGVBcHBs
aWNhdGlvbmAgb25jZQorICAgICAqLworICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykgeworICAgICAg
dmFyIHJhbiwKKyAgICAgICAgICByZXN1bHQ7CisKKyAgICAgIGlmICghaXNGdW5jdGlvbihmdW5j
KSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAgcmV0dXJu
IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAocmFuKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICAgICAgfQorICAgICAgICByYW4gPSB0cnVlOworICAgICAgICByZXN1bHQgPSBmdW5j
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgICAgLy8gY2xlYXIgdGhlIGBmdW5jYCB2
YXJpYWJsZSBzbyB0aGUgZnVuY3Rpb24gbWF5IGJlIGdhcmJhZ2UgY29sbGVjdGVkCisgICAgICAg
IGZ1bmMgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfTsKKyAgICB9CisK
KyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGlu
dm9rZXMgYGZ1bmNgIHdpdGggYW55IGFkZGl0aW9uYWwKKyAgICAgKiBgcGFydGlhbGAgYXJndW1l
bnRzIHByZXBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLiBUaGlz
CisgICAgICogbWV0aG9kIGlzIHNpbWlsYXIgdG8gYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipu
b3QqKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg
ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBh
cmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3Vt
ZW50cyB0by4KKyAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0
aWFsbHkgYXBwbGllZC4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5l
dyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg
ICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIG5hbWUpIHsgcmV0dXJuIGdyZWV0
aW5nICsgJyAnICsgbmFtZTsgfTsKKyAgICAgKiB2YXIgaGkgPSBfLnBhcnRpYWwoZ3JlZXQsICdo
aScpOworICAgICAqIGhpKCdmcmVkJyk7CisgICAgICogLy8gPT4gJ2hpIGZyZWQnCisgICAgICov
CisgICAgZnVuY3Rpb24gcGFydGlhbChmdW5jKSB7CisgICAgICByZXR1cm4gY3JlYXRlV3JhcHBl
cihmdW5jLCAxNiwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CisgICAgfQorCisgICAgLyoqCisgICAg
ICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBgcGFydGlhbGAg
YXJndW1lbnRzIGFyZQorICAgICAqIGFwcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBu
ZXcgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8K
KyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVu
YyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by4KKyAgICAgKiBA
cGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KKyAg
ICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGll
ZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGRlZmF1bHRz
RGVlcCA9IF8ucGFydGlhbFJpZ2h0KF8ubWVyZ2UsIF8uZGVmYXVsdHMpOworICAgICAqCisgICAg
ICogdmFyIG9wdGlvbnMgPSB7CisgICAgICogICAndmFyaWFibGUnOiAnZGF0YScsCisgICAgICog
ICAnaW1wb3J0cyc6IHsgJ2pxJzogJCB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIGRlZmF1
bHRzRGVlcChvcHRpb25zLCBfLnRlbXBsYXRlU2V0dGluZ3MpOworICAgICAqCisgICAgICogb3B0
aW9ucy52YXJpYWJsZQorICAgICAqIC8vID0+ICdkYXRhJworICAgICAqCisgICAgICogb3B0aW9u
cy5pbXBvcnRzCisgICAgICogLy8gPT4geyAnXyc6IF8sICdqcSc6ICQgfQorICAgICAqLworICAg
IGZ1bmN0aW9uIHBhcnRpYWxSaWdodChmdW5jKSB7CisgICAgICByZXR1cm4gY3JlYXRlV3JhcHBl
cihmdW5jLCAzMiwgbnVsbCwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CisgICAgfQorCisgICAgLyoq
CisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZXhlY3V0ZWQsIHdpbGwgb25s
eSBjYWxsIHRoZSBgZnVuY2AgZnVuY3Rpb24KKyAgICAgKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5
IGB3YWl0YCBtaWxsaXNlY29uZHMuIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8KKyAgICAg
KiBpbmRpY2F0ZSB0aGF0IGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBh
bmQvb3IgdHJhaWxpbmcgZWRnZQorICAgICAqIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gU3Vic2Vx
dWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiByZXR1cm4g
dGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgY2FsbC4KKyAgICAgKgorICAgICAqIE5vdGU6
IElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAgYGZ1bmNgIHdp
bGwgYmUgY2FsbGVkCisgICAgICogb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQg
b25seSBpZiB0aGUgdGhlIHRocm90dGxlZCBmdW5jdGlvbiBpcworICAgICAqIGludm9rZWQgbW9y
ZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBz
dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKKyAg
ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS4KKyAg
ICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0
aHJvdHRsZSBleGVjdXRpb25zIHRvLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10g
VGhlIG9wdGlvbnMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVh
ZGluZz10cnVlXSBTcGVjaWZ5IGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0
aW1lb3V0LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV0g
U3BlY2lmeSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCisg
ICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0
aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAvLyBhdm9pZCBleGNlc3NpdmVs
eSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nCisgICAgICogdmFyIHRocm90
dGxlZCA9IF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCk7CisgICAgICogalF1ZXJ5KHdp
bmRvdykub24oJ3Njcm9sbCcsIHRocm90dGxlZCk7CisgICAgICoKKyAgICAgKiAvLyBleGVjdXRl
IGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3Jl
IHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMKKyAgICAgKiBqUXVlcnkoJy5pbnRlcmFjdGl2ZScp
Lm9uKCdjbGljaycsIF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7CisgICAgICogICAn
dHJhaWxpbmcnOiBmYWxzZQorICAgICAqIH0pKTsKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB0aHJv
dHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7CisgICAgICB2YXIgbGVhZGluZyA9IHRydWUsCisg
ICAgICAgICAgdHJhaWxpbmcgPSB0cnVlOworCisgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykp
IHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmIChvcHRp
b25zID09PSBmYWxzZSkgeworICAgICAgICBsZWFkaW5nID0gZmFsc2U7CisgICAgICB9IGVsc2Ug
aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7CisgICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4g
b3B0aW9ucyA/IG9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7CisgICAgICAgIHRyYWlsaW5nID0g
J3RyYWlsaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nOworICAg
ICAgfQorICAgICAgZGVib3VuY2VPcHRpb25zLmxlYWRpbmcgPSBsZWFkaW5nOworICAgICAgZGVi
b3VuY2VPcHRpb25zLm1heFdhaXQgPSB3YWl0OworICAgICAgZGVib3VuY2VPcHRpb25zLnRyYWls
aW5nID0gdHJhaWxpbmc7CisKKyAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCBkZWJv
dW5jZU9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlv
biB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gYXMgaXRzCisg
ICAgICogZmlyc3QgYXJndW1lbnQuIEFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRo
ZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQKKyAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUg
d3JhcHBlciBmdW5jdGlvbi4gVGhlIHdyYXBwZXIgaXMgZXhlY3V0ZWQgd2l0aAorICAgICAqIHRo
ZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAq
IEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMK
KyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgorICAgICAqIEBwYXJh
bSB7RnVuY3Rpb259IHdyYXBwZXIgVGhlIHdyYXBwZXIgZnVuY3Rpb24uCisgICAgICogQHJldHVy
bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUK
KyAgICAgKgorICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0
ZXh0KSB7CisgICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nOworICAg
ICAqIH0pOworICAgICAqCisgICAgICogcCgnRnJlZCwgV2lsbWEsICYgUGViYmxlcycpOworICAg
ICAqIC8vID0+ICc8cD5GcmVkLCBXaWxtYSwgJmFtcDsgUGViYmxlczwvcD4nCisgICAgICovCisg
ICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikgeworICAgICAgcmV0dXJuIGNyZWF0ZVdy
YXBwZXIod3JhcHBlciwgMTYsIFt2YWx1ZV0pOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0qLworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJu
cyBgdmFsdWVgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg
ICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZh
bHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQHJldHVybnMge0Z1
bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAg
KgorICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07CisgICAgICogdmFyIGdl
dHRlciA9IF8uY29uc3RhbnQob2JqZWN0KTsKKyAgICAgKiBnZXR0ZXIoKSA9PT0gb2JqZWN0Owor
ICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkg
eworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAg
ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgY2FsbGJhY2sgYm91bmQg
dG8gYW4gb3B0aW9uYWwgYHRoaXNBcmdgLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eQorICAgICAq
IG5hbWUgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVl
IGZvciBhIGdpdmVuIGVsZW1lbnQuCisgICAgICogSWYgYGZ1bmNgIGlzIGFuIG9iamVjdCB0aGUg
Y3JlYXRlZCBjYWxsYmFjayB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzCisgICAgICog
dGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50IG9iamVjdCBwcm9wZXJ0aWVzLCBvdGhlcndpc2Ug
aXQgd2lsbCByZXR1cm4gYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA
bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0geyp9
IFtmdW5jPWlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLgorICAg
ICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRl
ZCBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVy
IG9mIGFyZ3VtZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KKyAgICAgKiBAcmV0dXJucyB7RnVu
Y3Rpb259IFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAg
ICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5l
eScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAg
fQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB3cmFwIHRvIGNyZWF0ZSBjdXN0b20gY2Fs
bGJhY2sgc2hvcnRoYW5kcworICAgICAqIF8uY3JlYXRlQ2FsbGJhY2sgPSBfLndyYXAoXy5jcmVh
dGVDYWxsYmFjaywgZnVuY3Rpb24oZnVuYywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgKiAg
IHZhciBtYXRjaCA9IC9eKC4rPylfXyhbZ2xddCkoLispJC8uZXhlYyhjYWxsYmFjayk7CisgICAg
ICogICByZXR1cm4gIW1hdGNoID8gZnVuYyhjYWxsYmFjaywgdGhpc0FyZykgOiBmdW5jdGlvbihv
YmplY3QpIHsKKyAgICAgKiAgICAgcmV0dXJuIG1hdGNoWzJdID09ICdndCcgPyBvYmplY3RbbWF0
Y2hbMV1dID4gbWF0Y2hbM10gOiBvYmplY3RbbWF0Y2hbMV1dIDwgbWF0Y2hbM107CisgICAgICog
ICB9OworICAgICAqIH0pOworICAgICAqCisgICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgJ2Fn
ZV9fZ3QzOCcpOworICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0K
KyAgICAgKi8KKyAgICBmdW5jdGlvbiBjcmVhdGVDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdD
b3VudCkgeworICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZnVuYzsKKyAgICAgIGlmIChmdW5jID09
IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHJldHVybiBiYXNlQ3JlYXRl
Q2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpOworICAgICAgfQorICAgICAgLy8gaGFu
ZGxlICJfLnBsdWNrIiBzdHlsZSBjYWxsYmFjayBzaG9ydGhhbmRzCisgICAgICBpZiAodHlwZSAh
PSAnb2JqZWN0JykgeworICAgICAgICByZXR1cm4gcHJvcGVydHkoZnVuYyk7CisgICAgICB9Cisg
ICAgICB2YXIgcHJvcHMgPSBrZXlzKGZ1bmMpLAorICAgICAgICAgIGtleSA9IHByb3BzWzBdLAor
ICAgICAgICAgIGEgPSBmdW5jW2tleV07CisKKyAgICAgIC8vIGhhbmRsZSAiXy53aGVyZSIgc3R5
bGUgY2FsbGJhY2sgc2hvcnRoYW5kcworICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PSAxICYmIGEg
PT09IGEgJiYgIWlzT2JqZWN0KGEpKSB7CisgICAgICAgIC8vIGZhc3QgcGF0aCB0aGUgY29tbW9u
IGNhc2Ugb2YgcHJvdmlkaW5nIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlCisgICAgICAgIC8vIHBy
b3BlcnR5IGNvbnRhaW5pbmcgYSBwcmltaXRpdmUgdmFsdWUKKyAgICAgICAgcmV0dXJuIGZ1bmN0
aW9uKG9iamVjdCkgeworICAgICAgICAgIHZhciBiID0gb2JqZWN0W2tleV07CisgICAgICAgICAg
cmV0dXJuIGEgPT09IGIgJiYgKGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKSk7CisgICAgICAg
IH07CisgICAgICB9CisgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICAgIHZh
ciBsZW5ndGggPSBwcm9wcy5sZW5ndGgsCisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKwor
ICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgICAgICBpZiAoIShyZXN1bHQgPSBiYXNl
SXNFcXVhbChvYmplY3RbcHJvcHNbbGVuZ3RoXV0sIGZ1bmNbcHJvcHNbbGVuZ3RoXV0sIG51bGws
IHRydWUpKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAq
IENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIGAmYCwgYDxgLCBgPmAsIGAiYCwgYW5kIGAnYCBpbiBg
c3RyaW5nYCB0byB0aGVpcgorICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KKyAg
ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29y
eSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8g
ZXNjYXBlLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3Ry
aW5nLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmVzY2FwZSgnRnJlZCwgV2ls
bWEsICYgUGViYmxlcycpOworICAgICAqIC8vID0+ICdGcmVkLCBXaWxtYSwgJmFtcDsgUGViYmxl
cycKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CisgICAgICByZXR1cm4g
c3RyaW5nID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVVbmVzY2FwZWRI
dG1sLCBlc2NhcGVIdG1sQ2hhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRo
b2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gaXQuCisgICAgICoKKyAg
ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0
aWVzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuCisgICAgICogQHJldHVybnMg
eyp9IFJldHVybnMgYHZhbHVlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFy
IG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTsKKyAgICAgKiBfLmlkZW50aXR5KG9iamVjdCkg
PT09IG9iamVjdDsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaWRl
bnRpdHkodmFsdWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAg
ICAgKiBBZGRzIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBk
ZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiBtZXRo
b2RzIHdpbGwgYmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLgorICAgICAqCisgICAg
ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGll
cworICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gb2JqZWN0
IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBU
aGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuCisgICAgICogQHBhcmFtIHtPYmplY3R9IFtv
cHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0
aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgdGhlIGZ1bmN0aW9ucyBhZGRlZCBhcmUg
Y2hhaW5hYmxlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBmdW5jdGlvbiBjYXBp
dGFsaXplKHN0cmluZykgeworICAgICAqICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBl
ckNhc2UoKSArIHN0cmluZy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOworICAgICAqIH0KKyAgICAg
KgorICAgICAqIF8ubWl4aW4oeyAnY2FwaXRhbGl6ZSc6IGNhcGl0YWxpemUgfSk7CisgICAgICog
Xy5jYXBpdGFsaXplKCdmcmVkJyk7CisgICAgICogLy8gPT4gJ0ZyZWQnCisgICAgICoKKyAgICAg
KiBfKCdmcmVkJykuY2FwaXRhbGl6ZSgpLnZhbHVlKCk7CisgICAgICogLy8gPT4gJ0ZyZWQnCisg
ICAgICoKKyAgICAgKiBfLm1peGluKHsgJ2NhcGl0YWxpemUnOiBjYXBpdGFsaXplIH0sIHsgJ2No
YWluJzogZmFsc2UgfSk7CisgICAgICogXygnZnJlZCcpLmNhcGl0YWxpemUoKTsKKyAgICAgKiAv
LyA9PiAnRnJlZCcKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwg
b3B0aW9ucykgeworICAgICAgdmFyIGNoYWluID0gdHJ1ZSwKKyAgICAgICAgICBtZXRob2ROYW1l
cyA9IHNvdXJjZSAmJiBmdW5jdGlvbnMoc291cmNlKTsKKworICAgICAgaWYgKCFzb3VyY2UgfHwg
KCFvcHRpb25zICYmICFtZXRob2ROYW1lcy5sZW5ndGgpKSB7CisgICAgICAgIGlmIChvcHRpb25z
ID09IG51bGwpIHsKKyAgICAgICAgICBvcHRpb25zID0gc291cmNlOworICAgICAgICB9CisgICAg
ICAgIGN0b3IgPSBsb2Rhc2hXcmFwcGVyOworICAgICAgICBzb3VyY2UgPSBvYmplY3Q7CisgICAg
ICAgIG9iamVjdCA9IGxvZGFzaDsKKyAgICAgICAgbWV0aG9kTmFtZXMgPSBmdW5jdGlvbnMoc291
cmNlKTsKKyAgICAgIH0KKyAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkgeworICAgICAgICBj
aGFpbiA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2hh
aW4nIGluIG9wdGlvbnMpIHsKKyAgICAgICAgY2hhaW4gPSBvcHRpb25zLmNoYWluOworICAgICAg
fQorICAgICAgdmFyIGN0b3IgPSBvYmplY3QsCisgICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlv
bihjdG9yKTsKKworICAgICAgZm9yRWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFt
ZSkgeworICAgICAgICB2YXIgZnVuYyA9IG9iamVjdFttZXRob2ROYW1lXSA9IHNvdXJjZVttZXRo
b2ROYW1lXTsKKyAgICAgICAgaWYgKGlzRnVuYykgeworICAgICAgICAgIGN0b3IucHJvdG90eXBl
W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0
aGlzLl9fY2hhaW5fXywKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18s
CisgICAgICAgICAgICAgICAgYXJncyA9IFt2YWx1ZV07CisKKyAgICAgICAgICAgIHB1c2guYXBw
bHkoYXJncywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5
KG9iamVjdCwgYXJncyk7CisgICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHsKKyAg
ICAgICAgICAgICAgaWYgKHZhbHVlID09PSByZXN1bHQgJiYgaXNPYmplY3QocmVzdWx0KSkgewor
ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgIHJlc3VsdCA9IG5ldyBjdG9yKHJlc3VsdCk7CisgICAgICAgICAgICAgIHJlc3VsdC5fX2No
YWluX18gPSBjaGFpbkFsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgICAgLyoq
CisgICAgICogUmV2ZXJ0cyB0aGUgJ18nIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBh
bmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0bworICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4K
KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRl
Z29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBs
b2Rhc2hgIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgbG9k
YXNoID0gXy5ub0NvbmZsaWN0KCk7CisgICAgICovCisgICAgZnVuY3Rpb24gbm9Db25mbGljdCgp
IHsKKyAgICAgIGNvbnRleHQuXyA9IG9sZERhc2g7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9
CisKKyAgICAvKioKKyAgICAgKiBBIG5vLW9wZXJhdGlvbiBmdW5jdGlvbi4KKyAgICAgKgorICAg
ICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRp
ZXMKKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUn
OiAnZnJlZCcgfTsKKyAgICAgKiBfLm5vb3Aob2JqZWN0KSA9PT0gdW5kZWZpbmVkOworICAgICAq
IC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBub29wKCkgeworICAgICAgLy8gbm8g
b3BlcmF0aW9uIHBlcmZvcm1lZAorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51
bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIFVuaXggZXBv
Y2gKKyAgICAgKiAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4KKyAgICAgKgorICAgICAq
IEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMK
KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIHN0YW1wID0gXy5ub3coKTsKKyAg
ICAgKiBfLmRlZmVyKGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApOyB9
KTsKKyAgICAgKiAvLyA9PiBsb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sg
Zm9yIHRoZSBkZWZlcnJlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKyAgICAgKi8KKyAgICB2YXIg
bm93ID0gaXNOYXRpdmUobm93ID0gRGF0ZS5ub3cpICYmIG5vdyB8fCBmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICB9OworCisgICAgLyoqCisgICAg
ICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lm
aWVkIHJhZGl4LgorICAgICAqIElmIGByYWRpeGAgaXMgYHVuZGVmaW5lZGAgb3IgYDBgIGEgYHJh
ZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIHRoZQorICAgICAqIGB2YWx1ZWAgaXMgYSBoZXhh
ZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLgorICAgICAq
CisgICAgICogTm90ZTogVGhpcyBtZXRob2QgYXZvaWRzIGRpZmZlcmVuY2VzIGluIG5hdGl2ZSBF
UzMgYW5kIEVTNSBgcGFyc2VJbnRgCisgICAgICogaW1wbGVtZW50YXRpb25zLiBTZWUgaHR0cDov
L2VzNS5naXRodWIuaW8vI0UuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl
ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtzdHJpbmd9
IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4
XSBUaGUgcmFkaXggdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIHRvIHBhcnNlLgorICAgICAq
IEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG5ldyBpbnRlZ2VyIHZhbHVlLgorICAgICAq
IEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnBhcnNlSW50KCcwOCcpOworICAgICAqIC8vID0+
IDgKKyAgICAgKi8KKyAgICB2YXIgcGFyc2VJbnQgPSBuYXRpdmVQYXJzZUludCh3aGl0ZXNwYWNl
ICsgJzA4JykgPT0gOCA/IG5hdGl2ZVBhcnNlSW50IDogZnVuY3Rpb24odmFsdWUsIHJhZGl4KSB7
CisgICAgICAvLyBGaXJlZm94IDwgMjEgYW5kIE9wZXJhIDwgMTUgZm9sbG93IHRoZSBFUzMgc3Bl
Y2lmaWVkIGltcGxlbWVudGF0aW9uIG9mIGBwYXJzZUludGAKKyAgICAgIHJldHVybiBuYXRpdmVQ
YXJzZUludChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKHJlTGVhZGluZ1NwYWNlc0Fu
ZFplcm9zLCAnJykgOiB2YWx1ZSwgcmFkaXggfHwgMCk7CisgICAgfTsKKworICAgIC8qKgorICAg
ICAqIENyZWF0ZXMgYSAiXy5wbHVjayIgc3R5bGUgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgdGhl
IGBrZXlgIHZhbHVlIG9mIGEKKyAgICAgKiBnaXZlbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBA
c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisg
ICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0
cmlldmUuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rp
b24uCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWwor
ICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfSwKKyAgICAgKiAgIHsgJ25h
bWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogdmFy
IGdldE5hbWUgPSBfLnByb3BlcnR5KCduYW1lJyk7CisgICAgICoKKyAgICAgKiBfLm1hcChjaGFy
YWN0ZXJzLCBnZXROYW1lKTsKKyAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ10KKyAgICAg
KgorICAgICAqIF8uc29ydEJ5KGNoYXJhY3RlcnMsIGdldE5hbWUpOworICAgICAqIC8vID0+IFt7
ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2Un
OiA0MCB9XQorICAgICAqLworICAgIGZ1bmN0aW9uIHByb3BlcnR5KGtleSkgeworICAgICAgcmV0
dXJuIGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgICByZXR1cm4gb2JqZWN0W2tleV07CisgICAg
ICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBi
ZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCAoaW5jbHVzaXZlKS4gSWYgb25seSBvbmUKKyAgICAgKiBh
cmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51
bWJlciB3aWxsIGJlCisgICAgICogcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgdHJ1ZXkgb3Ig
ZWl0aGVyIGBtaW5gIG9yIGBtYXhgIGFyZSBmbG9hdHMgYQorICAgICAqIGZsb2F0aW5nLXBvaW50
IG51bWJlciB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci4KKyAgICAgKgor
ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGls
aXRpZXMKKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbj0wXSBUaGUgbWluaW11bSBwb3NzaWJs
ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heD0xXSBUaGUgbWF4aW11bSBwb3Nz
aWJsZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZz1mYWxzZV0gU3Bl
Y2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgICogQHJldHVybnMg
e251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuCisgICAgICogQGV4YW1wbGUKKyAgICAg
KgorICAgICAqIF8ucmFuZG9tKDAsIDUpOworICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2Vl
biAwIGFuZCA1CisgICAgICoKKyAgICAgKiBfLnJhbmRvbSg1KTsKKyAgICAgKiAvLyA9PiBhbHNv
IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1CisgICAgICoKKyAgICAgKiBfLnJhbmRvbSg1LCB0
cnVlKTsKKyAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5k
IDUKKyAgICAgKgorICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTsKKyAgICAgKiAvLyA9PiBhIGZs
b2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yCisgICAgICovCisgICAgZnVu
Y3Rpb24gcmFuZG9tKG1pbiwgbWF4LCBmbG9hdGluZykgeworICAgICAgdmFyIG5vTWluID0gbWlu
ID09IG51bGwsCisgICAgICAgICAgbm9NYXggPSBtYXggPT0gbnVsbDsKKworICAgICAgaWYgKGZs
b2F0aW5nID09IG51bGwpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBtaW4gPT0gJ2Jvb2xlYW4nICYm
IG5vTWF4KSB7CisgICAgICAgICAgZmxvYXRpbmcgPSBtaW47CisgICAgICAgICAgbWluID0gMTsK
KyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghbm9NYXggJiYgdHlwZW9mIG1heCA9PSAnYm9v
bGVhbicpIHsKKyAgICAgICAgICBmbG9hdGluZyA9IG1heDsKKyAgICAgICAgICBub01heCA9IHRy
dWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChub01pbiAmJiBub01heCkgeworICAg
ICAgICBtYXggPSAxOworICAgICAgfQorICAgICAgbWluID0gK21pbiB8fCAwOworICAgICAgaWYg
KG5vTWF4KSB7CisgICAgICAgIG1heCA9IG1pbjsKKyAgICAgICAgbWluID0gMDsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIG1heCA9ICttYXggfHwgMDsKKyAgICAgIH0KKyAgICAgIGlmIChmbG9h
dGluZyB8fCBtaW4gJSAxIHx8IG1heCAlIDEpIHsKKyAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVS
YW5kb20oKTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihtaW4gKyAocmFuZCAqIChtYXggLSBt
aW4gKyBwYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsnJykubGVuZ3RoIC0gMSkpKSksIG1heCk7
CisgICAgICB9CisgICAgICByZXR1cm4gYmFzZVJhbmRvbShtaW4sIG1heCk7CisgICAgfQorCisg
ICAgLyoqCisgICAgICogUmVzb2x2ZXMgdGhlIHZhbHVlIG9mIHByb3BlcnR5IGBrZXlgIG9uIGBv
YmplY3RgLiBJZiBga2V5YCBpcyBhIGZ1bmN0aW9uCisgICAgICogaXQgd2lsbCBiZSBpbnZva2Vk
IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBvYmplY3RgIGFuZCBpdHMgcmVzdWx0IHJldHVy
bmVkLAorICAgICAqIGVsc2UgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJldHVybmVkLiBJZiBgb2Jq
ZWN0YCBpcyBmYWxzZXkgdGhlbiBgdW5kZWZpbmVkYAorICAgICAqIGlzIHJldHVybmVkLgorICAg
ICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5
IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBp
bnNwZWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3Bl
cnR5IHRvIHJlc29sdmUuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVk
IHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2JqZWN0ID0gewor
ICAgICAqICAgJ2NoZWVzZSc6ICdjcnVtcGV0cycsCisgICAgICogICAnc3R1ZmYnOiBmdW5jdGlv
bigpIHsKKyAgICAgKiAgICAgcmV0dXJuICdub25zZW5zZSc7CisgICAgICogICB9CisgICAgICog
fTsKKyAgICAgKgorICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2NoZWVzZScpOworICAgICAqIC8v
ID0+ICdjcnVtcGV0cycKKyAgICAgKgorICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ3N0dWZmJyk7
CisgICAgICogLy8gPT4gJ25vbnNlbnNlJworICAgICAqLworICAgIGZ1bmN0aW9uIHJlc3VsdChv
YmplY3QsIGtleSkgeworICAgICAgaWYgKG9iamVjdCkgeworICAgICAgICB2YXIgdmFsdWUgPSBv
YmplY3Rba2V5XTsKKyAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpID8gb2JqZWN0W2tl
eV0oKSA6IHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWljcm8t
dGVtcGxhdGluZyBtZXRob2QgdGhhdCBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVz
ZXJ2ZXMKKyAgICAgKiB3aGl0ZXNwYWNlLCBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdp
dGhpbiBpbnRlcnBvbGF0ZWQgY29kZS4KKyAgICAgKgorICAgICAqIE5vdGU6IEluIHRoZSBkZXZl
bG9wbWVudCBidWlsZCwgYF8udGVtcGxhdGVgIHV0aWxpemVzIHNvdXJjZVVSTHMgZm9yIGVhc2ll
cgorICAgICAqIGRlYnVnZ2luZy4gU2VlIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0
b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwKKyAgICAgKgor
ICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2Vl
OgorICAgICAqIGh0dHA6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMKKyAgICAgKgorICAgICAq
IEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZToK
KyAgICAgKiBodHRwOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vc3RhYmxlL2V4dGVuc2lvbnMvc2Fu
ZGJveGluZ0V2YWwuaHRtbAorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJP
ZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0
ZXh0IFRoZSB0ZW1wbGF0ZSB0ZXh0LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBk
YXRhIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSB7T2Jq
ZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB7UmVnRXhw
fSBbb3B0aW9ucy5lc2NhcGVdIFRoZSAiZXNjYXBlIiBkZWxpbWl0ZXIuCisgICAgICogQHBhcmFt
IHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlXSBUaGUgImV2YWx1YXRlIiBkZWxpbWl0ZXIuCisg
ICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHNdIEFuIG9iamVjdCB0byBpbXBv
cnQgaW50byB0aGUgdGVtcGxhdGUgYXMgbG9jYWwgdmFyaWFibGVzLgorICAgICAqIEBwYXJhbSB7
UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZV0gVGhlICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVy
LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc291cmNlVVJMXSBUaGUgc291cmNlVVJMIG9mIHRo
ZSB0ZW1wbGF0ZSdzIGNvbXBpbGVkIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Zh
cmlhYmxlXSBUaGUgZGF0YSBvYmplY3QgdmFyaWFibGUgbmFtZS4KKyAgICAgKiBAcmV0dXJucyB7
RnVuY3Rpb258c3RyaW5nfSBSZXR1cm5zIGEgY29tcGlsZWQgZnVuY3Rpb24gd2hlbiBubyBgZGF0
YWAgb2JqZWN0CisgICAgICogIGlzIGdpdmVuLCBlbHNlIGl0IHJldHVybnMgdGhlIGludGVycG9s
YXRlZCB0ZXh0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0aGUg
ImludGVycG9sYXRlIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUKKyAg
ICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gbmFtZSAlPicpOworICAg
ICAqIGNvbXBpbGVkKHsgJ25hbWUnOiAnZnJlZCcgfSk7CisgICAgICogLy8gPT4gJ2hlbGxvIGZy
ZWQnCisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0aGUgImVzY2FwZSIgZGVsaW1pdGVyIHRvIGVz
Y2FwZSBIVE1MIGluIGRhdGEgcHJvcGVydHkgdmFsdWVzCisgICAgICogXy50ZW1wbGF0ZSgnPGI+
PCUtIHZhbHVlICU+PC9iPicsIHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTsKKyAgICAgKiAvLyA9
PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+JworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlICJl
dmFsdWF0ZSIgZGVsaW1pdGVyIHRvIGdlbmVyYXRlIEhUTUwKKyAgICAgKiB2YXIgbGlzdCA9ICc8
JSBfLmZvckVhY2gocGVvcGxlLCBmdW5jdGlvbihuYW1lKSB7ICU+PGxpPjwlLSBuYW1lICU+PC9s
aT48JSB9KTsgJT4nOworICAgICAqIF8udGVtcGxhdGUobGlzdCwgeyAncGVvcGxlJzogWydmcmVk
JywgJ2Jhcm5leSddIH0pOworICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwv
bGk+JworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlIEVTNiBkZWxpbWl0ZXIgYXMgYW4gYWx0
ZXJuYXRpdmUgdG8gdGhlIGRlZmF1bHQgImludGVycG9sYXRlIiBkZWxpbWl0ZXIKKyAgICAgKiBf
LnRlbXBsYXRlKCdoZWxsbyAkeyBuYW1lIH0nLCB7ICduYW1lJzogJ3BlYmJsZXMnIH0pOworICAg
ICAqIC8vID0+ICdoZWxsbyBwZWJibGVzJworICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlIGlu
dGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gImV2YWx1YXRlIiBkZWxpbWl0ZXJzCisgICAgICog
Xy50ZW1wbGF0ZSgnPCUgcHJpbnQoImhlbGxvICIgKyBuYW1lKTsgJT4hJywgeyAnbmFtZSc6ICdi
YXJuZXknIH0pOworICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJworICAgICAqCisgICAgICog
Ly8gdXNpbmcgYSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycworICAgICAqIF8udGVtcGxhdGVT
ZXR0aW5ncyA9IHsKKyAgICAgKiAgICdpbnRlcnBvbGF0ZSc6IC97eyhbXHNcU10rPyl9fS9nCisg
ICAgICogfTsKKyAgICAgKgorICAgICAqIF8udGVtcGxhdGUoJ2hlbGxvIHt7IG5hbWUgfX0hJywg
eyAnbmFtZSc6ICdtdXN0YWNoZScgfSk7CisgICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlIScK
KyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBq
UXVlcnkKKyAgICAgKiB2YXIgbGlzdCA9ICc8JSBqcS5lYWNoKHBlb3BsZSwgZnVuY3Rpb24obmFt
ZSkgeyAlPjxsaT48JS0gbmFtZSAlPjwvbGk+PCUgfSk7ICU+JzsKKyAgICAgKiBfLnRlbXBsYXRl
KGxpc3QsIHsgJ3Blb3BsZSc6IFsnZnJlZCcsICdiYXJuZXknXSB9LCB7ICdpbXBvcnRzJzogeyAn
anEnOiBqUXVlcnkgfSB9KTsKKyAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8
L2xpPicKKyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8g
c3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZQorICAgICAqIHZhciBj
b21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSBuYW1lICU+JywgbnVsbCwgeyAnc291cmNl
VVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pOworICAgICAqIGNvbXBpbGVkKGRhdGEpOwor
ICAgICAqIC8vID0+IGZpbmQgdGhlIHNvdXJjZSBvZiAiZ3JlZXRpbmcuanN0IiB1bmRlciB0aGUg
U291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yCisgICAg
ICoKKyAgICAgKiAvLyB1c2luZyB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0
aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUKKyAgICAgKiB2
YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS5uYW1lICU+IScsIG51bGwsIHsg
J3ZhcmlhYmxlJzogJ2RhdGEnIH0pOworICAgICAqIGNvbXBpbGVkLnNvdXJjZTsKKyAgICAgKiAv
LyA9PiBmdW5jdGlvbihkYXRhKSB7CisgICAgICogICB2YXIgX190LCBfX3AgPSAnJywgX19lID0g
Xy5lc2NhcGU7CisgICAgICogICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS5uYW1lICkp
ID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7CisgICAgICogICByZXR1cm4gX19wOworICAgICAq
IH0KKyAgICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxp
bmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsCisgICAgICogLy8gbGluZSBudW1i
ZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBhIHN0YWNrIHRyYWNlCisgICAgICogZnMud3JpdGVG
aWxlU3luYyhwYXRoLmpvaW4oY3dkLCAnanN0LmpzJyksICdcCisgICAgICogICB2YXIgSlNUID0g
e1wKKyAgICAgKiAgICAgIm1haW4iOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsg
J1wKKyAgICAgKiAgIH07XAorICAgICAqICcpOworICAgICAqLworICAgIGZ1bmN0aW9uIHRlbXBs
YXRlKHRleHQsIGRhdGEsIG9wdGlvbnMpIHsKKyAgICAgIC8vIGJhc2VkIG9uIEpvaG4gUmVzaWcn
cyBgdG1wbGAgaW1wbGVtZW50YXRpb24KKyAgICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9q
YXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvCisgICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3Zh
J3MgZG9ULmpzCisgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UCisgICAgICB2
YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5nczsKKyAgICAgIHRleHQgPSBTdHJp
bmcodGV4dCB8fCAnJyk7CisKKyAgICAgIC8vIGF2b2lkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHdo
ZW4gYGl0ZXJhdG9yVGVtcGxhdGVgIGlzIG5vdCBkZWZpbmVkCisgICAgICBvcHRpb25zID0gZGVm
YXVsdHMoe30sIG9wdGlvbnMsIHNldHRpbmdzKTsKKworICAgICAgdmFyIGltcG9ydHMgPSBkZWZh
dWx0cyh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzKSwKKyAgICAgICAgICBp
bXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksCisgICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IHZh
bHVlcyhpbXBvcnRzKTsKKworICAgICAgdmFyIGlzRXZhbHVhdGluZywKKyAgICAgICAgICBpbmRl
eCA9IDAsCisgICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJl
Tm9NYXRjaCwKKyAgICAgICAgICBzb3VyY2UgPSAiX19wICs9ICciOworCisgICAgICAvLyBjb21w
aWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIKKyAgICAgIHZhciByZURlbGlt
aXRlcnMgPSBSZWdFeHAoCisgICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNv
dXJjZSArICd8JyArCisgICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArCisgICAgICAg
IChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRj
aCkuc291cmNlICsgJ3wnICsKKyAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNo
KS5zb3VyY2UgKyAnfCQnCisgICAgICAsICdnJyk7CisKKyAgICAgIHRleHQucmVwbGFjZShyZURl
bGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwg
ZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHsKKyAgICAgICAgaW50ZXJw
b2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7CisKKyAg
ICAgICAgLy8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gc3Ry
aW5nIGxpdGVyYWxzCisgICAgICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQp
LnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpOworCisgICAgICAg
IC8vIHJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzCisgICAgICAgIGlmIChlc2NhcGVW
YWx1ZSkgeworICAgICAgICAgIHNvdXJjZSArPSAiJyArXG5fX2UoIiArIGVzY2FwZVZhbHVlICsg
IikgK1xuJyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHsKKyAgICAg
ICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlOworICAgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBl
dmFsdWF0ZVZhbHVlICsgIjtcbl9fcCArPSAnIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50
ZXJwb2xhdGVWYWx1ZSkgeworICAgICAgICAgIHNvdXJjZSArPSAiJyArXG4oKF9fdCA9ICgiICsg
aW50ZXJwb2xhdGVWYWx1ZSArICIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciOworICAgICAg
ICB9CisgICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOworCisgICAgICAgIC8v
IHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgcmVxdWlyZXMgcmV0dXJu
aW5nIHRoZSBgbWF0Y2hgCisgICAgICAgIC8vIHN0cmluZyBpbiBvcmRlciB0byBwcm9kdWNlIHRo
ZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlCisgICAgICAgIHJldHVybiBtYXRjaDsKKyAgICAgIH0p
OworCisgICAgICBzb3VyY2UgKz0gIic7XG4iOworCisgICAgICAvLyBpZiBgdmFyaWFibGVgIGlz
IG5vdCBzcGVjaWZpZWQsIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRl
ZAorICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhl
IHNjb3BlIGNoYWluCisgICAgICB2YXIgdmFyaWFibGUgPSBvcHRpb25zLnZhcmlhYmxlLAorICAg
ICAgICAgIGhhc1ZhcmlhYmxlID0gdmFyaWFibGU7CisKKyAgICAgIGlmICghaGFzVmFyaWFibGUp
IHsKKyAgICAgICAgdmFyaWFibGUgPSAnb2JqJzsKKyAgICAgICAgc291cmNlID0gJ3dpdGggKCcg
KyB2YXJpYWJsZSArICcpIHtcbicgKyBzb3VyY2UgKyAnXG59XG4nOworICAgICAgfQorICAgICAg
Ly8gY2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzCisgICAgICBzb3VyY2Ug
PSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcn
KSA6IHNvdXJjZSkKKyAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJykK
KyAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7CisKKyAgICAg
IC8vIGZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkKKyAgICAgIHNvdXJjZSA9ICdmdW5j
dGlvbignICsgdmFyaWFibGUgKyAnKSB7XG4nICsKKyAgICAgICAgKGhhc1ZhcmlhYmxlID8gJycg
OiB2YXJpYWJsZSArICcgfHwgKCcgKyB2YXJpYWJsZSArICcgPSB7fSk7XG4nKSArCisgICAgICAg
ICJ2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGUiICsKKyAgICAgICAgKGlzRXZhbHVh
dGluZworICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG4nICsKKyAg
ICAgICAgICAgICJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywg
JycpIH1cbiIKKyAgICAgICAgICA6ICc7XG4nCisgICAgICAgICkgKworICAgICAgICBzb3VyY2Ug
KworICAgICAgICAncmV0dXJuIF9fcFxufSc7CisKKyAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBm
b3IgZWFzaWVyIGRlYnVnZ2luZy4KKyAgICAgIC8vIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20v
ZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwKKyAg
ICAgIHZhciBzb3VyY2VVUkwgPSAnXG4vKlxuLy8jIHNvdXJjZVVSTD0nICsgKG9wdGlvbnMuc291
cmNlVVJMIHx8ICcvbG9kYXNoL3RlbXBsYXRlL3NvdXJjZVsnICsgKHRlbXBsYXRlQ291bnRlcisr
KSArICddJykgKyAnXG4qLyc7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciByZXN1bHQgPSBG
dW5jdGlvbihpbXBvcnRzS2V5cywgJ3JldHVybiAnICsgc291cmNlICsgc291cmNlVVJMKS5hcHBs
eSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpOworICAgICAgfSBjYXRjaChlKSB7CisgICAgICAg
IGUuc291cmNlID0gc291cmNlOworICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgICAgaWYg
KGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdChkYXRhKTsKKyAgICAgIH0KKyAgICAgIC8v
IHByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdg
IG1ldGhvZCwgaW4KKyAgICAgIC8vIHN1cHBvcnRlZCBlbnZpcm9ubWVudHMsIG9yIHRoZSBgc291
cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvcgorICAgICAgLy8gaW5saW5pbmcgY29t
cGlsZWQgdGVtcGxhdGVzIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcworICAgICAgcmVzdWx0LnNv
dXJjZSA9IHNvdXJjZTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisg
ICAgICogRXhlY3V0ZXMgdGhlIGNhbGxiYWNrIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5
IG9mIHRoZSByZXN1bHRzCisgICAgICogb2YgZWFjaCBjYWxsYmFjayBleGVjdXRpb24uIFRoZSBj
YWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQKKyAgICAgKiB3aXRoIG9u
ZSBhcmd1bWVudDsgKGluZGV4KS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt
YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge251bWJl
cn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLgorICAgICAq
IEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJh
dGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg
YGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Yg
dGhlIHJlc3VsdHMgb2YgZWFjaCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi4KKyAgICAgKiBAZXhhbXBs
ZQorICAgICAqCisgICAgICogdmFyIGRpY2VSb2xscyA9IF8udGltZXMoMywgXy5wYXJ0aWFsKF8u
cmFuZG9tLCAxLCA2KSk7CisgICAgICogLy8gPT4gWzMsIDYsIDRdCisgICAgICoKKyAgICAgKiBf
LnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHsgbWFnZS5jYXN0U3BlbGwobik7IH0pOworICAgICAqIC8v
ID0+IGNhbGxzIGBtYWdlLmNhc3RTcGVsbChuKWAgdGhyZWUgdGltZXMsIHBhc3NpbmcgYG5gIG9m
IGAwYCwgYDFgLCBhbmQgYDJgIHJlc3BlY3RpdmVseQorICAgICAqCisgICAgICogXy50aW1lcygz
LCBmdW5jdGlvbihuKSB7IHRoaXMuY2FzdChuKTsgfSwgbWFnZSk7CisgICAgICogLy8gPT4gYWxz
byBjYWxscyBgbWFnZS5jYXN0U3BlbGwobilgIHRocmVlIHRpbWVzCisgICAgICovCisgICAgZnVu
Y3Rpb24gdGltZXMobiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIG4gPSAobiA9ICtuKSA+
IC0xID8gbiA6IDA7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICByZXN1bHQgPSBB
cnJheShuKTsKKworICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ss
IHRoaXNBcmcsIDEpOworICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CisgICAgICAgIHJlc3Vs
dFtpbmRleF0gPSBjYWxsYmFjayhpbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWAgdGhp
cyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXMKKyAgICAgKiBgJmFtcDtgLCBgJmx0
O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvIHRoZWlyCisg
ICAgICogY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHN0YXRpYwor
ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBw
YXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB1bmVzY2FwZS4KKyAgICAgKiBAcmV0
dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAqIEBleGFt
cGxlCisgICAgICoKKyAgICAgKiBfLnVuZXNjYXBlKCdGcmVkLCBCYXJuZXkgJmFtcDsgUGViYmxl
cycpOworICAgICAqIC8vID0+ICdGcmVkLCBCYXJuZXkgJiBQZWJibGVzJworICAgICAqLworICAg
IGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykgeworICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxs
ID8gJycgOiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRt
bENoYXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4g
SWYgYHByZWZpeGAgaXMgcHJvdmlkZWQgdGhlIElEIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuCisg
ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv
cnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXhdIFRoZSB2YWx1ZSB0
byBwcmVmaXggdGhlIElEIHdpdGguCisgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0
aGUgdW5pcXVlIElELgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnVuaXF1ZUlk
KCdjb250YWN0XycpOworICAgICAqIC8vID0+ICdjb250YWN0XzEwNCcKKyAgICAgKgorICAgICAq
IF8udW5pcXVlSWQoKTsKKyAgICAgKiAvLyA9PiAnMTA1JworICAgICAqLworICAgIGZ1bmN0aW9u
IHVuaXF1ZUlkKHByZWZpeCkgeworICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7CisgICAgICBy
ZXR1cm4gU3RyaW5nKHByZWZpeCA9PSBudWxsID8gJycgOiBwcmVmaXgpICsgaWQ7CisgICAgfQor
CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEg
YGxvZGFzaGAgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHdpdGggZXhwbGljaXQK
KyAgICAgKiBtZXRob2QgY2hhaW5pbmcgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMK
KyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEBw
YXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCisgICAgICogQHJldHVybnMge09iamVj
dH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor
ICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAg
J2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSwK
KyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH0KKyAgICAgKiBdOworICAg
ICAqCisgICAgICogdmFyIHlvdW5nZXN0ID0gXy5jaGFpbihjaGFyYWN0ZXJzKQorICAgICAqICAg
ICAuc29ydEJ5KCdhZ2UnKQorICAgICAqICAgICAubWFwKGZ1bmN0aW9uKGNocikgeyByZXR1cm4g
Y2hyLm5hbWUgKyAnIGlzICcgKyBjaHIuYWdlOyB9KQorICAgICAqICAgICAuZmlyc3QoKQorICAg
ICAqICAgICAudmFsdWUoKTsKKyAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJworICAgICAqLwor
ICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7CisgICAgICB2YWx1ZSA9IG5ldyBsb2Rhc2hXcmFw
cGVyKHZhbHVlKTsKKyAgICAgIHZhbHVlLl9fY2hhaW5fXyA9IHRydWU7CisgICAgICByZXR1cm4g
dmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyBgaW50ZXJjZXB0b3JgIHdp
dGggdGhlIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGVuCisgICAgICogcmV0
dXJucyBgdmFsdWVgLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAidGFwIGludG8i
IGEgbWV0aG9kCisgICAgICogY2hhaW4gaW4gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9u
IGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbgorICAgICAqIHRoZSBjaGFpbi4KKyAgICAgKgor
ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDaGFp
bmluZworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGlu
dGVyY2VwdG9yYC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVu
Y3Rpb24gdG8gaW52b2tlLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCisg
ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8oWzEsIDIsIDMsIDRdKQorICAgICAqICAu
dGFwKGZ1bmN0aW9uKGFycmF5KSB7IGFycmF5LnBvcCgpOyB9KQorICAgICAqICAucmV2ZXJzZSgp
CisgICAgICogIC52YWx1ZSgpOworICAgICAqIC8vID0+IFszLCAyLCAxXQorICAgICAqLworICAg
IGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHsKKyAgICAgIGludGVyY2VwdG9yKHZh
bHVlKTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFi
bGVzIGV4cGxpY2l0IG1ldGhvZCBjaGFpbmluZyBvbiB0aGUgd3JhcHBlciBvYmplY3QuCisgICAg
ICoKKyAgICAgKiBAbmFtZSBjaGFpbgorICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn
b3J5IENoYWluaW5nCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHdyYXBwZXIgb2Jq
ZWN0LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsK
KyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7ICdu
YW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8v
IHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcKKyAgICAgKiBfKGNoYXJhY3RlcnMpLmZpcnN0KCk7
CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfQorICAgICAqCisg
ICAgICogLy8gd2l0aCBleHBsaWNpdCBjaGFpbmluZworICAgICAqIF8oY2hhcmFjdGVycykuY2hh
aW4oKQorICAgICAqICAgLmZpcnN0KCkKKyAgICAgKiAgIC5waWNrKCdhZ2UnKQorICAgICAqICAg
LnZhbHVlKCk7CisgICAgICogLy8gPT4geyAnYWdlJzogMzYgfQorICAgICAqLworICAgIGZ1bmN0
aW9uIHdyYXBwZXJDaGFpbigpIHsKKyAgICAgIHRoaXMuX19jaGFpbl9fID0gdHJ1ZTsKKyAgICAg
IHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIHRoZSBgdG9T
dHJpbmdgIHJlc3VsdCBvZiB0aGUgd3JhcHBlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBuYW1l
IHRvU3RyaW5nCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmcK
KyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcgcmVzdWx0LgorICAg
ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfKFsxLCAyLCAzXSkudG9TdHJpbmcoKTsKKyAg
ICAgKiAvLyA9PiAnMSwyLDMnCisgICAgICovCisgICAgZnVuY3Rpb24gd3JhcHBlclRvU3RyaW5n
KCkgeworICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLl9fd3JhcHBlZF9fKTsKKyAgICB9CisKKyAg
ICAvKioKKyAgICAgKiBFeHRyYWN0cyB0aGUgd3JhcHBlZCB2YWx1ZS4KKyAgICAgKgorICAgICAq
IEBuYW1lIHZhbHVlT2YKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyB2YWx1ZQor
ICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRo
ZSB3cmFwcGVkIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfKFsxLCAy
LCAzXSkudmFsdWVPZigpOworICAgICAqIC8vID0+IFsxLCAyLCAzXQorICAgICAqLworICAgIGZ1
bmN0aW9uIHdyYXBwZXJWYWx1ZU9mKCkgeworICAgICAgcmV0dXJuIHRoaXMuX193cmFwcGVkX187
CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvLyBhZGQgZnVuY3Rp
b25zIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmcKKyAgICBsb2Rhc2gu
YWZ0ZXIgPSBhZnRlcjsKKyAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduOworICAgIGxvZGFzaC5h
dCA9IGF0OworICAgIGxvZGFzaC5iaW5kID0gYmluZDsKKyAgICBsb2Rhc2guYmluZEFsbCA9IGJp
bmRBbGw7CisgICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5OworICAgIGxvZGFzaC5jaGFpbiA9
IGNoYWluOworICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDsKKyAgICBsb2Rhc2guY29tcG9z
ZSA9IGNvbXBvc2U7CisgICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgbG9kYXNo
LmNvdW50QnkgPSBjb3VudEJ5OworICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7CisgICAgbG9k
YXNoLmNyZWF0ZUNhbGxiYWNrID0gY3JlYXRlQ2FsbGJhY2s7CisgICAgbG9kYXNoLmN1cnJ5ID0g
Y3Vycnk7CisgICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7CisgICAgbG9kYXNoLmRlZmF1
bHRzID0gZGVmYXVsdHM7CisgICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7CisgICAgbG9kYXNoLmRl
bGF5ID0gZGVsYXk7CisgICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOworICAgIGxv
ZGFzaC5maWx0ZXIgPSBmaWx0ZXI7CisgICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuOworICAg
IGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDsKKyAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9y
RWFjaFJpZ2h0OworICAgIGxvZGFzaC5mb3JJbiA9IGZvckluOworICAgIGxvZGFzaC5mb3JJblJp
Z2h0ID0gZm9ySW5SaWdodDsKKyAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duOworICAgIGxvZGFz
aC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0OworICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5j
dGlvbnM7CisgICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5OworICAgIGxvZGFzaC5pbmRleEJ5
ID0gaW5kZXhCeTsKKyAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7CisgICAgbG9kYXNoLmlu
dGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjsKKyAgICBsb2Rhc2guaW52ZXJ0ID0gaW52ZXJ0Owor
ICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7CisgICAgbG9kYXNoLmtleXMgPSBrZXlzOworICAg
IGxvZGFzaC5tYXAgPSBtYXA7CisgICAgbG9kYXNoLm1hcFZhbHVlcyA9IG1hcFZhbHVlczsKKyAg
ICBsb2Rhc2gubWF4ID0gbWF4OworICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTsKKyAgICBs
b2Rhc2gubWVyZ2UgPSBtZXJnZTsKKyAgICBsb2Rhc2gubWluID0gbWluOworICAgIGxvZGFzaC5v
bWl0ID0gb21pdDsKKyAgICBsb2Rhc2gub25jZSA9IG9uY2U7CisgICAgbG9kYXNoLnBhaXJzID0g
cGFpcnM7CisgICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsOworICAgIGxvZGFzaC5wYXJ0aWFs
UmlnaHQgPSBwYXJ0aWFsUmlnaHQ7CisgICAgbG9kYXNoLnBpY2sgPSBwaWNrOworICAgIGxvZGFz
aC5wbHVjayA9IHBsdWNrOworICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIGxv
ZGFzaC5wdWxsID0gcHVsbDsKKyAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTsKKyAgICBsb2Rhc2gu
cmVqZWN0ID0gcmVqZWN0OworICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7CisgICAgbG9kYXNo
LnJlc3QgPSByZXN0OworICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTsKKyAgICBsb2Rhc2gu
c29ydEJ5ID0gc29ydEJ5OworICAgIGxvZGFzaC50YXAgPSB0YXA7CisgICAgbG9kYXNoLnRocm90
dGxlID0gdGhyb3R0bGU7CisgICAgbG9kYXNoLnRpbWVzID0gdGltZXM7CisgICAgbG9kYXNoLnRv
QXJyYXkgPSB0b0FycmF5OworICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CisgICAg
bG9kYXNoLnVuaW9uID0gdW5pb247CisgICAgbG9kYXNoLnVuaXEgPSB1bmlxOworICAgIGxvZGFz
aC52YWx1ZXMgPSB2YWx1ZXM7CisgICAgbG9kYXNoLndoZXJlID0gd2hlcmU7CisgICAgbG9kYXNo
LndpdGhvdXQgPSB3aXRob3V0OworICAgIGxvZGFzaC53cmFwID0gd3JhcDsKKyAgICBsb2Rhc2gu
eG9yID0geG9yOworICAgIGxvZGFzaC56aXAgPSB6aXA7CisgICAgbG9kYXNoLnppcE9iamVjdCA9
IHppcE9iamVjdDsKKworICAgIC8vIGFkZCBhbGlhc2VzCisgICAgbG9kYXNoLmNvbGxlY3QgPSBt
YXA7CisgICAgbG9kYXNoLmRyb3AgPSByZXN0OworICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDsK
KyAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0OworICAgIGxvZGFzaC5leHRlbmQg
PSBhc3NpZ247CisgICAgbG9kYXNoLm1ldGhvZHMgPSBmdW5jdGlvbnM7CisgICAgbG9kYXNoLm9i
amVjdCA9IHppcE9iamVjdDsKKyAgICBsb2Rhc2guc2VsZWN0ID0gZmlsdGVyOworICAgIGxvZGFz
aC50YWlsID0gcmVzdDsKKyAgICBsb2Rhc2gudW5pcXVlID0gdW5pcTsKKyAgICBsb2Rhc2gudW56
aXAgPSB6aXA7CisKKyAgICAvLyBhZGQgZnVuY3Rpb25zIHRvIGBsb2Rhc2gucHJvdG90eXBlYAor
ICAgIG1peGluKGxvZGFzaCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8v
IGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5n
CisgICAgbG9kYXNoLmNsb25lID0gY2xvbmU7CisgICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25l
RGVlcDsKKyAgICBsb2Rhc2guY29udGFpbnMgPSBjb250YWluczsKKyAgICBsb2Rhc2guZXNjYXBl
ID0gZXNjYXBlOworICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5OworICAgIGxvZGFzaC5maW5kID0g
ZmluZDsKKyAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4OworICAgIGxvZGFzaC5maW5k
S2V5ID0gZmluZEtleTsKKyAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDsKKyAgICBsb2Rh
c2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7CisgICAgbG9kYXNoLmZpbmRMYXN0S2V5
ID0gZmluZExhc3RLZXk7CisgICAgbG9kYXNoLmhhcyA9IGhhczsKKyAgICBsb2Rhc2guaWRlbnRp
dHkgPSBpZGVudGl0eTsKKyAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7CisgICAgbG9kYXNo
LmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7CisgICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5
OworICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47CisgICAgbG9kYXNoLmlzRGF0ZSA9
IGlzRGF0ZTsKKyAgICBsb2Rhc2guaXNFbGVtZW50ID0gaXNFbGVtZW50OworICAgIGxvZGFzaC5p
c0VtcHR5ID0gaXNFbXB0eTsKKyAgICBsb2Rhc2guaXNFcXVhbCA9IGlzRXF1YWw7CisgICAgbG9k
YXNoLmlzRmluaXRlID0gaXNGaW5pdGU7CisgICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0
aW9uOworICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOOworICAgIGxvZGFzaC5pc051bGwgPSBpc051
bGw7CisgICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7CisgICAgbG9kYXNoLmlzT2JqZWN0
ID0gaXNPYmplY3Q7CisgICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0Owor
ICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwOworICAgIGxvZGFzaC5pc1N0cmluZyA9IGlz
U3RyaW5nOworICAgIGxvZGFzaC5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkOworICAgIGxvZGFz
aC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mOworICAgIGxvZGFzaC5taXhpbiA9IG1peGluOwor
ICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDsKKyAgICBsb2Rhc2gubm9vcCA9IG5v
b3A7CisgICAgbG9kYXNoLm5vdyA9IG5vdzsKKyAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUlu
dDsKKyAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tOworICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1
Y2U7CisgICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7CisgICAgbG9kYXNoLnJl
c3VsdCA9IHJlc3VsdDsKKyAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0Owor
ICAgIGxvZGFzaC5zaXplID0gc2l6ZTsKKyAgICBsb2Rhc2guc29tZSA9IHNvbWU7CisgICAgbG9k
YXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7CisgICAgbG9kYXNoLnRlbXBsYXRlID0gdGVt
cGxhdGU7CisgICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7CisgICAgbG9kYXNoLnVuaXF1
ZUlkID0gdW5pcXVlSWQ7CisKKyAgICAvLyBhZGQgYWxpYXNlcworICAgIGxvZGFzaC5hbGwgPSBl
dmVyeTsKKyAgICBsb2Rhc2guYW55ID0gc29tZTsKKyAgICBsb2Rhc2guZGV0ZWN0ID0gZmluZDsK
KyAgICBsb2Rhc2guZmluZFdoZXJlID0gZmluZDsKKyAgICBsb2Rhc2guZm9sZGwgPSByZWR1Y2U7
CisgICAgbG9kYXNoLmZvbGRyID0gcmVkdWNlUmlnaHQ7CisgICAgbG9kYXNoLmluY2x1ZGUgPSBj
b250YWluczsKKyAgICBsb2Rhc2guaW5qZWN0ID0gcmVkdWNlOworCisgICAgbWl4aW4oZnVuY3Rp
b24oKSB7CisgICAgICB2YXIgc291cmNlID0ge30KKyAgICAgIGZvck93bihsb2Rhc2gsIGZ1bmN0
aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgaWYgKCFsb2Rhc2gucHJvdG90eXBlW21l
dGhvZE5hbWVdKSB7CisgICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYzsKKyAgICAg
ICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gc291cmNlOworICAgIH0oKSwgZmFsc2UpOwor
CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvLyBhZGQgZnVuY3Rpb25zIGNhcGFi
bGUgb2YgcmV0dXJuaW5nIHdyYXBwZWQgYW5kIHVud3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmlu
ZworICAgIGxvZGFzaC5maXJzdCA9IGZpcnN0OworICAgIGxvZGFzaC5sYXN0ID0gbGFzdDsKKyAg
ICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlOworCisgICAgLy8gYWRkIGFsaWFzZXMKKyAgICBsb2Rh
c2gudGFrZSA9IGZpcnN0OworICAgIGxvZGFzaC5oZWFkID0gZmlyc3Q7CisKKyAgICBmb3JPd24o
bG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7CisgICAgICB2YXIgY2FsbGJhY2th
YmxlID0gbWV0aG9kTmFtZSAhPT0gJ3NhbXBsZSc7CisgICAgICBpZiAoIWxvZGFzaC5wcm90b3R5
cGVbbWV0aG9kTmFtZV0pIHsKKyAgICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT0g
ZnVuY3Rpb24obiwgZ3VhcmQpIHsKKyAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hh
aW5fXywKKyAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyh0aGlzLl9fd3JhcHBlZF9fLCBuLCBn
dWFyZCk7CisKKyAgICAgICAgICByZXR1cm4gIWNoYWluQWxsICYmIChuID09IG51bGwgfHwgKGd1
YXJkICYmICEoY2FsbGJhY2thYmxlICYmIHR5cGVvZiBuID09ICdmdW5jdGlvbicpKSkKKyAgICAg
ICAgICAgID8gcmVzdWx0CisgICAgICAgICAgICA6IG5ldyBsb2Rhc2hXcmFwcGVyKHJlc3VsdCwg
Y2hhaW5BbGwpOworICAgICAgICB9OworICAgICAgfQorICAgIH0pOworCisgICAgLyotLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1i
ZXIuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA
dHlwZSBzdHJpbmcKKyAgICAgKi8KKyAgICBsb2Rhc2guVkVSU0lPTiA9ICcyLjQuMSc7CisKKyAg
ICAvLyBhZGQgIkNoYWluaW5nIiBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIKKyAgICBsb2Rhc2gu
cHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluOworICAgIGxvZGFzaC5wcm90b3R5cGUudG9T
dHJpbmcgPSB3cmFwcGVyVG9TdHJpbmc7CisgICAgbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdy
YXBwZXJWYWx1ZU9mOworICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IHdyYXBwZXJWYWx1
ZU9mOworCisgICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHVud3JhcHBl
ZCB2YWx1ZXMKKyAgICBmb3JFYWNoKFsnam9pbicsICdwb3AnLCAnc2hpZnQnXSwgZnVuY3Rpb24o
bWV0aG9kTmFtZSkgeworICAgICAgdmFyIGZ1bmMgPSBhcnJheVJlZlttZXRob2ROYW1lXTsKKyAg
ICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHsKKyAgICAgICAg
dmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCisgICAgICAgICAgICByZXN1bHQgPSBmdW5j
LmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyk7CisKKyAgICAgICAgcmV0dXJuIGNo
YWluQWxsCisgICAgICAgICAgPyBuZXcgbG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKQor
ICAgICAgICAgIDogcmVzdWx0OworICAgICAgfTsKKyAgICB9KTsKKworICAgIC8vIGFkZCBgQXJy
YXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB0aGUgZXhpc3Rpbmcgd3JhcHBlZCB2YWx1ZQorICAg
IGZvckVhY2goWydwdXNoJywgJ3JldmVyc2UnLCAnc29ydCcsICd1bnNoaWZ0J10sIGZ1bmN0aW9u
KG1ldGhvZE5hbWUpIHsKKyAgICAgIHZhciBmdW5jID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07Cisg
ICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAg
IGZ1bmMuYXBwbHkodGhpcy5fX3dyYXBwZWRfXywgYXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgICB9OworICAgIH0pOworCisgICAgLy8gYWRkIGBBcnJheWAgZnVuY3Rpb25z
IHRoYXQgcmV0dXJuIG5ldyB3cmFwcGVkIHZhbHVlcworICAgIGZvckVhY2goWydjb25jYXQnLCAn
c2xpY2UnLCAnc3BsaWNlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICAgIHZhciBmdW5j
ID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07CisgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5h
bWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgbG9kYXNoV3JhcHBlcihmdW5j
LmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyksIHRoaXMuX19jaGFpbl9fKTsKKyAg
ICAgIH07CisgICAgfSk7CisKKyAgICByZXR1cm4gbG9kYXNoOworICB9CisKKyAgLyotLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSovCisKKyAgLy8gZXhwb3NlIExvLURhc2gKKyAgdmFyIF8gPSBydW5JbkNvbnRl
eHQoKTsKKworICAvLyBzb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzIGxpa2Ugci5qcyBjaGVjayBm
b3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgaWYgKHR5cGVvZiBk
ZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBk
ZWZpbmUuYW1kKSB7CisgICAgLy8gRXhwb3NlIExvLURhc2ggdG8gdGhlIGdsb2JhbCBvYmplY3Qg
ZXZlbiB3aGVuIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCBpbgorICAgIC8vIGNhc2UgTG8tRGFz
aCBpcyBsb2FkZWQgd2l0aCBhIFJlcXVpcmVKUyBzaGltIGNvbmZpZy4KKyAgICAvLyBTZWUgaHR0
cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9hcGkuaHRtbCNjb25maWctc2hpbQorICAgIHJvb3QuXyA9
IF87CisKKyAgICAvLyBkZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBw
YXRoIG1hcHBpbmcsIGl0IGNhbiBiZQorICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlICJ1bmRlcnNj
b3JlIiBtb2R1bGUKKyAgICBkZWZpbmUoZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gXzsKKyAg
ICB9KTsKKyAgfQorICAvLyBjaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNh
c2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBhbiBgZXhwb3J0c2Agb2JqZWN0CisgIGVsc2UgaWYg
KGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHsKKyAgICAvLyBpbiBOb2RlLmpzIG9yIFJpbmdv
SlMKKyAgICBpZiAobW9kdWxlRXhwb3J0cykgeworICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9
IF8pLl8gPSBfOworICAgIH0KKyAgICAvLyBpbiBOYXJ3aGFsIG9yIFJoaW5vIC1yZXF1aXJlCisg
ICAgZWxzZSB7CisgICAgICBmcmVlRXhwb3J0cy5fID0gXzsKKyAgICB9CisgIH0KKyAgZWxzZSB7
CisgICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vCisgICAgcm9vdC5fID0gXzsKKyAgfQorfS5j
YWxsKHRoaXMpKTsKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvb3ZpcnQt
anMtZ3d0LXdyYXBwZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9lbmdpbmUvc2RrL2d3
dC9jbGllbnQvcmVzb3VyY2VzL292aXJ0LmpzIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9v
dmlydC1qcy1nd3Qtd3JhcHBlci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS9z
ZGsvZ3d0L2NsaWVudC9yZXNvdXJjZXMvb3ZpcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZmRmNDc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu
L21vZHVsZXMvb3ZpcnQtanMtZ3d0LXdyYXBwZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmly
dC9lbmdpbmUvc2RrL2d3dC9jbGllbnQvcmVzb3VyY2VzL292aXJ0LmpzCkBAIC0wLDAgKzEsNDQ1
IEBACisvLyBvVmlydC5qcyBwcm90b3R5cGUuCisvLyBSZXF1aXJlcyBFQ01BU2NyaXB0IDUuMSBj
b21wbGlhbnQgZW52aXJvbm1lbnQ6CisvLyAgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwu
b3JnL2VjbWEtMjYyLzUuMS8KKy8vIEN1cnJlbnRseSByZXF1aXJlcyBMby1EYXNoIGxpYnJhcnk6
CisvLyAgaHR0cDovL2xvZGFzaC5jb20vCisKKy8vIENvbnRhaW4gdGhlIFNESyB3aXRoaW4gJ292
aXJ0JyBnbG9iYWwgdmFyaWFibGUuCit2YXIgb3ZpcnQgPSB7fTsKKworLy8gRXhwb3NlIHNlcnZp
Y2VzIHVzZWQgYnkgQVBJIGltcGxlbWVudGF0aW9uLgorLy8gRWFjaCBzZXJ2aWNlIHNob3VsZCBi
ZSBhbiBvYmplY3QgY29udGFpbmluZyByZXVzYWJsZSBtZXRob2RzLgorLy8gU2VydmljZXMgZGVj
bGFyZWQgaW4gdGhpcyBuYW1lc3BhY2UgaGF2ZSBtdWx0aXBsZSByb2xlczoKKy8vICAxLiBleGlz
dGluZyBzZXJ2aWNlcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBhY2hpZXZlIFNESyBwb3J0YWJpbGl0
eSBmb3IgZ2l2ZW4gcnVudGltZSBlbnZpcm9ubWVudAorLy8gIDIuIGV4aXN0aW5nIHNlcnZpY2Vz
IGNhbiBiZSB1c2VkIGFuZCBuZXcgc2VydmljZXMgY2FuIGJlIGFkZGVkIGJ5IFNESyBleHRlbnNp
b25zIG9yIGNsaWVudHMKK292aXJ0LnN2YyA9IChmdW5jdGlvbiAoKSB7CisgICAgJ3VzZSBzdHJp
Y3QnOworCisgICAgdmFyIHNlcnZpY2VzID0ge307CisKKyAgICAvLyBIVFRQIHNlcnZpY2UgZm9y
IHNlbmRpbmcgcmVxdWVzdHMgdG8gcmVtb3RlIHNlcnZlciB2aWEgSFRUUCBwcm90b2NvbC4KKyAg
ICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IHN1cHBv
cnRlZCBieSB3ZWIgYnJvd3NlcnMuCisgICAgc2VydmljZXMuaHR0cCA9IHsKKyAgICAgICAgLy8g
U2VuZCBIVFRQIHJlcXVlc3QgdG8gcmVtb3RlIHNlcnZlci4KKyAgICAgICAgLy8gJ2h0dHBQYXJh
bXMnIHNob3VsZCBiZSBhbiBvYmplY3QgY29udGFpbmluZyBIVFRQIHJlcXVlc3QgcGFyYW1ldGVy
czoKKyAgICAgICAgLy8gIC0gJ21ldGhvZCc6IEhUVFAgbWV0aG9kIHRvIHVzZSwgZGVmYXVsdHMg
dG8gJ0dFVCcKKyAgICAgICAgLy8gIC0gJ3VybCc6IFVSTCB0byBzZW5kIHJlcXVlc3QgdG8sIGRl
ZmF1bHRzIHRvIGVtcHR5IHN0cmluZyAoZG9jdW1lbnQgYmFzZSBVUkkpCisgICAgICAgIC8vICAt
ICdoZWFkZXJzJzogb2JqZWN0IGNvbnRhaW5pbmcgZXh0cmEgSFRUUCBoZWFkZXJzLCBkZWZhdWx0
cyB0byBlbXB0eSBvYmplY3QKKyAgICAgICAgLy8gIC0gJ2JvZHknOiBhbnkgdmFsdWUgc3VwcG9y
dGVkIGJ5IFhNTEh0dHBSZXF1ZXN0LnNlbmQgZnVuY3Rpb24sIGRlZmF1bHRzIHRvIG51bGwKKyAg
ICAgICAgLy8gJ29uU3VjY2Vzcycgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4g
SFRUUCByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKHN0YXR1cyBjb2RlIDIwMCkuCisg
ICAgICAgIC8vICdvbkVycm9yJyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBI
VFRQIHJlcXVlc3QgZmFpbGVkIChzdGF0dXMgY29kZSBvdGhlciB0aGFuIDIwMCkuCisgICAgICAg
IHNlbmQ6IGZ1bmN0aW9uIChodHRwUGFyYW1zLCBvblN1Y2Nlc3MsIG9uRXJyb3IpIHsKKyAgICAg
ICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKworICAgICAgICAgICAgLy8g
U2FuaXRpemUgaW5wdXRzLgorICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMgfHwg
e307CisKKyAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7
CisgICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CisgICAgICAgICAg
ICAgICAgICAgIHZhciB4aHJTdWNjZXNzID0geGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1
cyA8IDMwMDsKKworICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2UgYXBwcm9wcmlhdGUgaGFu
ZGxlciBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHhoclN1Y2Nlc3MgJiYgXy5p
c0Z1bmN0aW9uKG9uU3VjY2VzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vz
cyh4aHIucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgheGhy
U3VjY2VzcyAmJiBfLmlzRnVuY3Rpb24ob25FcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIG9uRXJyb3IoeGhyLnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBSZXNvbHZlIEhUVFAg
cmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGh0dHBQYXJhbXMu
bWV0aG9kIHx8ICdHRVQnOworICAgICAgICAgICAgdmFyIHVybCA9IGh0dHBQYXJhbXMudXJsIHx8
ICcnOworICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSBodHRwUGFyYW1zLmhlYWRlcnMgfHwge307
CisgICAgICAgICAgICB2YXIgYm9keSA9IGh0dHBQYXJhbXMuYm9keSB8fCBudWxsOworCisgICAg
ICAgICAgICAvLyBJbml0aWF0ZSBuZXcgcmVxdWVzdC4KKyAgICAgICAgICAgIHhoci5vcGVuKG1l
dGhvZCwgdXJsLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gSW5jbHVkZSBjcmVkZW50aWFscyBz
dWNoIGFzIEhUVFAgYXV0aCBpbmZvcm1hdGlvbiBhbmQgY29va2llcyBpbiBjcm9zcy1zaXRlIHJl
cXVlc3RzLgorICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7CisKKyAgICAg
ICAgICAgIC8vIEFwcGx5IHJlcXVlc3QgaGVhZGVycy4KKyAgICAgICAgICAgIE9iamVjdC5rZXlz
KGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgICAgICAgICB2YXIg
dmFsdWUgPSBoZWFkZXJzW25hbWVdICYmIGhlYWRlcnNbbmFtZV0udG9TdHJpbmcoKTsKKyAgICAg
ICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSB8fCAnJyk7CisgICAg
ICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gRmlyZSBvZmYgdGhlIHJlcXVlc3QuCisgICAg
ICAgICAgICB4aHIuc2VuZChib2R5KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4g
c2VydmljZXM7Cit9KSgpOworCisvLyBFeHBvc2UgdXRpbGl0aWVzIHVzZWQgYnkgQVBJIGltcGxl
bWVudGF0aW9uLgorLy8gVW5saWtlIHNlcnZpY2VzLCB1dGlsaXRpZXMgYXJlIG1lYW50IHRvIGFz
c2lzdCB3aXRoIHdyaXRpbmcgbW9yZSBlZmZpY2llbnQgSmF2YVNjcmlwdCBjb2RlLgorb3ZpcnQu
dXRpbCA9IChmdW5jdGlvbiAoc2VydmljZXMpIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICB2
YXIgdXRpbGl0aWVzID0ge307CisKKyAgICAvLyBVdGlsaXR5IGZvciBjcmVhdGluZyBvYmplY3Rz
IHVzaW5nIG1peGlucyB3aXRoIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBtZWNoYW5pc20uCisgICAg
dXRpbGl0aWVzLm1peGlucyA9IHsKKyAgICAgICAgLy8gQ29uc3RydWN0IGFuIG9iamVjdCB1c2lu
ZyBtaXhpbiBmdW5jdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4KKyAgICAgICAgLy8gJ3NwZWMnIHNo
b3VsZCBiZSBhbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIG9iamVj
dCBjcmVhdGlvbi4KKyAgICAgICAgLy8gJ21peGlucycgc2hvdWxkIGJlIGFuIGFycmF5IG9iamVj
dCBjb250YWluaW5nIDAgb3IgbW9yZSBtaXhpbiBmdW5jdGlvbnMuCisgICAgICAgIC8vICdkZXBz
JyBzaG91bGQgYmUgYW4gYXJyYXkgb2JqZWN0IGNvbnRhaW5pbmcgMCBvciBtb3JlIHN0cmluZyB2
YWx1ZXMgaWRlbnRpZnlpbmcgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLgorICAgICAgICAvLyBUaGlz
IGZ1bmN0aW9uIHBlcmZvcm1zIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8gIDEuIGNyZWF0
ZSAnbXknIG9iamVjdCwgcmVwcmVzZW50aW5nIHNoYXJlZCBzZWNyZXRzIGFtb25nIG1peGlucwor
ICAgICAgICAvLyAgMi4gY3JlYXRlICd0aGF0JyBvYmplY3QsIHJlcHJlc2VudGluZyBhY3R1YWwg
cmV0dXJuIHZhbHVlCisgICAgICAgIC8vICAzLiBhdWdtZW50ICdteScgb2JqZWN0IHdpdGggZGVw
ZW5kZW5jaWVzIHJlc29sdmVkIGZyb20gc2VydmljZSBuYW1lc3BhY2UKKyAgICAgICAgLy8gIDQu
IGFwcGx5IG1peGlucyBvbiAndGhhdCcgb2JqZWN0LCBiaW5kaW5nICd0aGlzJyB0byAndGhhdCcg
b2JqZWN0CisgICAgICAgIC8vICA1LiByZXR1cm4gJ3RoYXQnIG9iamVjdAorICAgICAgICBtaXg6
IGZ1bmN0aW9uIChzcGVjLCBtaXhpbnMsIGRlcHMpIHsKKyAgICAgICAgICAgIHZhciBteSA9IHt9
OworICAgICAgICAgICAgdmFyIHRoYXQgPSB7fTsKKworICAgICAgICAgICAgLy8gU2FuaXRpemUg
aW5wdXRzLgorICAgICAgICAgICAgc3BlYyA9IHNwZWMgfHwge307CisgICAgICAgICAgICBtaXhp
bnMgPSBtaXhpbnMgfHwgW107CisgICAgICAgICAgICBkZXBzID0gZGVwcyB8fCBbXTsKKworICAg
ICAgICAgICAgLy8gUmVzb2x2ZSBkZXBlbmRlbmNpZXMgYW5kIGF1Z21lbnQgJ215Jy4KKyAgICAg
ICAgICAgIGRlcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeworICAgICAgICAgICAgICAgIG15
W25hbWVdID0gc2VydmljZXNbbmFtZV07CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAg
Ly8gQXBwbHkgbWl4aW5zIG9uICd0aGF0JywgYmluZGluZyAndGhpcycgdG8gJ3RoYXQnLgorICAg
ICAgICAgICAgbWl4aW5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7CisgICAgICAgICAgICAgICAg
Zm4uY2FsbCh0aGF0LCB0aGF0LCBzcGVjLCBteSk7CisgICAgICAgICAgICB9KTsKKworICAgICAg
ICAgICAgcmV0dXJuIHRoYXQ7CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTWl4aW4gZm9yIG9i
amVjdHMgaGF2aW5nIGFyYml0cmFyeSBvcHRpb25zLgorICAgICAgICB3aXRoT3B0aW9uczogZnVu
Y3Rpb24gKHRoYXQsIHNwZWMpIHsKKyAgICAgICAgICAgIHZhciBvcHRpb25zID0gc3BlYy5vcHRp
b25zIHx8IHt9OworCisgICAgICAgICAgICAvLyBBY2Nlc3Mgb3B0aW9ucyB2aWEgZ2V0dGVyL3Nl
dHRlciBmdW5jdGlvbiB3aXRoIG1lcmdlLW9uLXNldCBiZWhhdmlvci4KKyAgICAgICAgICAgIHRo
YXQub3B0aW9ucyA9IHV0aWxpdGllcy5mbnMubWFrZUdldFNldE1lcmdlRm4odGhhdCwgb3B0aW9u
cyk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGF0OworICAgICAgICB9CisgICAgfTsKKworICAg
IC8vIFV0aWxpdHkgZm9yIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMuCisgICAgdXRpbGl0aWVzLmZu
cyA9IHsKKyAgICAgICAgLy8gTWFrZSBhIGZ1bmN0aW9uIGFjdGluZyBhcyBnZXR0ZXIgYW5kIHNl
dHRlciBvbiBvYmplY3QgdmFsdWUgd2l0aCBtZXJnZS1vbi1zZXQgYmVoYXZpb3IuCisgICAgICAg
IC8vIENhbGxpbmcgcmVzdWx0aW5nIGZ1bmN0aW9uIHdpdGggYW4gb2JqZWN0IGFyZ3VtZW50IHdp
bGwgbWVyZ2UgcHJvcGVydGllcyBvZiB0aGF0IG9iamVjdCBpbnRvICd0YXJnZXQnIG9iamVjdCBh
bmQgcmV0dXJuICd0aGF0Jy4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCAndGFyZ2V0JyBvYmplY3Qg
d2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgbWFrZUdldFNldE1lcmdlRm46IGZ1bmN0aW9uICh0
aGF0LCB0YXJnZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodXBkYXRlKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKF8uaXNPYmplY3QodXBkYXRlKSkgeworICAgICAgICAgICAgICAg
ICAgICBfLm1lcmdlKHRhcmdldCwgdXBkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRoYXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRhcmdldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9
CisgICAgfTsKKworICAgIC8vIFV0aWxpdHkgZm9yIHdvcmtpbmcgd2l0aCBvYmplY3RzLgorICAg
IHV0aWxpdGllcy5vYmplY3RzID0geworICAgICAgICAvLyBNYWtlIGEgZGVlcCBjbG9uZSBvZiAn
c291cmNlJywgbWVyZ2UgcHJvcGVydGllcyBvZiAndXBkYXRlJyBpbnRvIHRoYXQgY2xvbmUgYW5k
IHJldHVybiB0aGUgY2xvbmUuCisgICAgICAgIGRlZXBDbG9uZUFuZE1lcmdlOiBmdW5jdGlvbiAo
c291cmNlLCB1cGRhdGUpIHsKKyAgICAgICAgICAgIHZhciBjbG9uZSA9IF8uY2xvbmVEZWVwKHNv
dXJjZSk7CisgICAgICAgICAgICByZXR1cm4gXy5tZXJnZShjbG9uZSwgdXBkYXRlKTsKKyAgICAg
ICAgfQorICAgIH07CisKKyAgICByZXR1cm4gdXRpbGl0aWVzOworfSkob3ZpcnQuc3ZjKTsKKwor
Ly8gRXhwb3NlIEFQSSBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCB0byBTREsgZnVuY3Rpb25hbGl0
eS4KK292aXJ0LmFwaSA9IChmdW5jdGlvbiAodXRpbGl0aWVzKSB7CisgICAgJ3VzZSBzdHJpY3Qn
OworCisgICAgdmFyIG1peGlucyA9IHV0aWxpdGllcy5taXhpbnM7CisgICAgdmFyIG9iamVjdHMg
PSB1dGlsaXRpZXMub2JqZWN0czsKKyAgICB2YXIgZm5zID0gdXRpbGl0aWVzLmZuczsKKworICAg
IC8vIE1peGluIGZvciBvYmplY3RzIHJlcHJlc2VudGluZyBhIFJFU1RmdWwgcmVzb3VyY2UgY29s
bGVjdGlvbi4KKyAgICBmdW5jdGlvbiBhc1Jlc291cmNlQ29sbGVjdGlvbiAodGhhdCwgc3BlYykg
eworICAgICAgICB0aGF0LmdldCA9IGZ1bmN0aW9uIChpZCwgb3B0aW9ucykgeworICAgICAgICAg
ICAgcmV0dXJuIG1ha2VPcGVyYXRpb24ob2JqZWN0cy5kZWVwQ2xvbmVBbmRNZXJnZShzcGVjLCB7
CisgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywKKyAgICAgICAgICAgICAgICBodHRw
TWV0aG9kOiAnR0VUJywKKyAgICAgICAgICAgICAgICBhcGlDb250ZXh0UGF0aDogc3BlYy5hcGlD
b250ZXh0UGF0aCArICcvJyArIGlkLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlc3VsdDog
ZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VSZXNvdXJj
ZSh7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1SZXNvdXJjZURhdGEo
ZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfSkpOworICAgICAgICB9OworCisgICAgICAgIC8vIFJldHVybiBvcGVyYXRpb24gdG8g
bGlzdCByZXNvdXJjZXMgZ3JvdXBlZCBieSB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAg
ICAgIHRoYXQubGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4g
bWFrZU9wZXJhdGlvbihvYmplY3RzLmRlZXBDbG9uZUFuZE1lcmdlKHNwZWMsIHsKKyAgICAgICAg
ICAgICAgICBvcHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgIGh0dHBNZXRob2Q6ICdH
RVQnLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlc3VsdDogbWFrZVJlc291cmNlQXJyYXkK
KyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBSZXR1cm4gb3BlcmF0
aW9uIHRvIGFkZCByZXNvdXJjZSByZXByZXNlbnRlZCBieSAnZGF0YScgb2JqZWN0IHRvIHRoaXMg
cmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgICAgdGhhdC5hZGQgPSBmdW5jdGlvbiAoZGF0YSwg
b3B0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIG1ha2VPcGVyYXRpb24ob2JqZWN0cy5kZWVw
Q2xvbmVBbmRNZXJnZShzcGVjLCB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywK
KyAgICAgICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsCisgICAgICAgICAgICAgICAgaHR0
cEJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJl
c3VsdDogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VS
ZXNvdXJjZSh7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0cmFuc2Zvcm1SZXNvdXJj
ZURhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfSkpOworICAgICAgICB9OworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSBy
YXcgcmVzb3VyY2UgZGF0YSBmb3IgdXNlIGJ5IHJlc291cmNlIG9iamVjdHMuCisgICAgZnVuY3Rp
b24gdHJhbnNmb3JtUmVzb3VyY2VEYXRhIChkYXRhKSB7CisgICAgICAgIGZ1bmN0aW9uIGRlZmlu
ZVByb3BlcnR5UmVhZE9ubHkgKHByb3BOYW1lLCBwcm9wVmFsdWUpIHsKKyAgICAgICAgICAgIE9i
amVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCBwcm9wTmFtZSwgeworICAgICAgICAgICAgICAgIHZh
bHVlOiBwcm9wVmFsdWUsCisgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLAorICAgICAg
ICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBlbnVtZXJhYmxl
OiB0cnVlCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJl
ZHVjZUxpbmtzIChhcnJheSkgeworICAgICAgICAgICAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5j
dGlvbiAocmVzdWx0LCBsaW5rKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2xpbmsucmVsXSA9
IGxpbmsuaHJlZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAg
fSwge30pOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSAnaWQnIG5vbi13cml0YWJsZS4K
KyAgICAgICAgZGVmaW5lUHJvcGVydHlSZWFkT25seSgnaWQnLCBkYXRhLmlkKTsKKworICAgICAg
ICAvLyBNYWtlICdocmVmJyBub24td3JpdGFibGUuCisgICAgICAgIGRlZmluZVByb3BlcnR5UmVh
ZE9ubHkoJ2hyZWYnLCBkYXRhLmhyZWYpOworCisgICAgICAgIC8vIFRyYW5zZm9ybSBhbmQgZXhw
b3NlIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy4KKyAgICAgICAgdmFyIHN1YkNvbGxlY3Rp
b25MaW5rcyA9IGRhdGEubGluayB8fCBbXTsKKyAgICAgICAgZGVmaW5lUHJvcGVydHlSZWFkT25s
eSgnc3ViQ29sbGVjdGlvbnMnLCByZWR1Y2VMaW5rcyhzdWJDb2xsZWN0aW9uTGlua3MpKTsKKyAg
ICAgICAgZGVsZXRlIGRhdGEubGluazsKKworICAgICAgICAvLyBUcmFuc2Zvcm0gYW5kIGV4cG9z
ZSBzdXBwb3J0ZWQgYWN0aW9ucy4KKyAgICAgICAgdmFyIGFjdGlvbkxpbmtzID0gKGRhdGEuYWN0
aW9ucyAmJiBkYXRhLmFjdGlvbnMubGluaykgfHwgW107CisgICAgICAgIGRlZmluZVByb3BlcnR5
UmVhZE9ubHkoJ2FjdGlvbnMnLCByZWR1Y2VMaW5rcyhhY3Rpb25MaW5rcykpOworCisgICAgICAg
IHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgcmF3IHJlc291cmNlIGRhdGEg
ZnJvbSAnb2JqJyBhbmQgcmV0dXJuIGFycmF5IG9mIHJlc291cmNlIG9iamVjdHMuCisgICAgZnVu
Y3Rpb24gbWFrZVJlc291cmNlQXJyYXkgKG9iaikgeworICAgICAgICAvLyBFeHRyYWN0IHJlc291
cmNlIGRhdGEsICdvYmonIHNob3VsZCBjb250YWluIGEgc2luZ2xlIGVudW1lcmFibGUgcHJvcGVy
dHkuCisgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTsKKyAgICAgICAgdmFyIGRh
dGFBcnJheSA9IChrZXlzLmxlbmd0aCA9PT0gMSkgPyBvYmpba2V5c1swXV0gOiBbXTsKKworICAg
ICAgICAvLyBTYW5pdGl6ZSByZXNvdXJjZSBkYXRhLgorICAgICAgICBkYXRhQXJyYXkgPSBBcnJh
eS5pc0FycmF5KGRhdGFBcnJheSkgPyBkYXRhQXJyYXkgOiBbXTsKKworICAgICAgICAvLyBSZXR1
cm4gcmVzb3VyY2Ugb2JqZWN0cy4KKyAgICAgICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoZnVuY3Rp
b24gKGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlUmVzb3VyY2UoeworICAgICAgICAg
ICAgICAgIGRhdGE6IHRyYW5zZm9ybVJlc291cmNlRGF0YShkYXRhKQorICAgICAgICAgICAgfSk7
CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZUNvbGxlY3Rp
b24gKHNwZWMpIHsKKyAgICAgICAgcmV0dXJuIG1peGlucy5taXgoc3BlYywgW21peGlucy53aXRo
T3B0aW9ucywgYXNSZXNvdXJjZUNvbGxlY3Rpb25dKTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRl
IGNoYW5nZSBiZXR3ZWVuIHR3byBvYmplY3RzIGFuZCByZXR1cm4gYSBkaWZmIG9iamVjdCBjb250
YWluaW5nIHRoZSBkaWZmZXJlbmNlLgorICAgIC8vIFRoZSBkaWZmIG9iamVjdCB3aWxsIGJlIG51
bGwgaWYgdGhlcmUgaXMgbm8gY2hhbmdlLgorICAgIGZ1bmN0aW9uIGNvbXB1dGVEaWZmIChvcmln
aW5hbCwgbW9kaWZpZWQpIHsKKyAgICAgICAgdmFyIGRpZmYgPSB7fTsKKworICAgICAgICBpZiAo
Xy5pc09iamVjdChvcmlnaW5hbCkgJiYgXy5pc09iamVjdChtb2RpZmllZCkpIHsKKyAgICAgICAg
ICAgIE9iamVjdC5rZXlzKG1vZGlmaWVkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKKyAgICAg
ICAgICAgICAgICB2YXIgcHJvcGVydHlEaWZmOworCisgICAgICAgICAgICAgICAgaWYgKCFvcmln
aW5hbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBu
ZXcgcHJvcGVydHkgbWlzc2luZyBpbiAnb3JpZ2luYWwnIGF1dG9tYXRpY2FsbHkgaW50byBkaWZm
IG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgZGlmZltrZXldID0gbW9kaWZpZWRba2V5XTsK
KyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndp
c2UsIGNvbXB1dGUgY2hhbmdlIGZvciBleGlzdGluZyBwcm9wZXJ0eSByZWN1cnNpdmVseSBhbmQg
dXBkYXRlIGRpZmYgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURpZmYgPSBj
b21wdXRlRGlmZihvcmlnaW5hbFtrZXldLCBtb2RpZmllZFtrZXldKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHByb3BlcnR5RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZltr
ZXldID0gcHJvcGVydHlEaWZmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gXy5pc0VxdWFsKGRpZmYs
IHt9KSA/IG51bGwgOiBkaWZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJu
IF8uaXNFcXVhbChvcmlnaW5hbCwgbW9kaWZpZWQpID8gbnVsbCA6IG1vZGlmaWVkOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gTWl4aW4gZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgUkVT
VGZ1bCByZXNvdXJjZS4KKyAgICBmdW5jdGlvbiBhc1Jlc291cmNlICh0aGF0LCBzcGVjKSB7Cisg
ICAgICAgIC8vIFJhdyByZXNvdXJjZSBkYXRhIHN0b3JlZCBpbiBvYmplY3QgcmVwcmVzZW50YXRp
b24uCisgICAgICAgIHZhciBkYXRhLCBvcmlnaW5hbERhdGE7CisKKyAgICAgICAgZnVuY3Rpb24g
YXNzaWduRGF0YSAocmVzb3VyY2VEYXRhKSB7CisgICAgICAgICAgICBkYXRhID0gcmVzb3VyY2VE
YXRhIHx8IHt9OworICAgICAgICAgICAgb3JpZ2luYWxEYXRhID0gXy5jbG9uZURlZXAoZGF0YSk7
CisKKyAgICAgICAgICAgIC8vIEFjY2VzcyByZXNvdXJjZSBkYXRhIHZpYSBnZXR0ZXIvc2V0dGVy
IGZ1bmN0aW9uIHdpdGggbWVyZ2Utb24tc2V0IGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gVE9E
TyBwcmV2ZW50IHNldHRpbmcgbmV3IHByb3BlcnRpZXMgKG9uZXMgbm90IGFscmVhZHkgcHJlc2Vu
dCBpbiBmdWxsIGRhdGEgcmVwcmVzZW50YXRpb24pCisgICAgICAgICAgICB0aGF0LmRhdGEgPSBm
bnMubWFrZUdldFNldE1lcmdlRm4odGhhdCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBJbml0aWFsaXplIHJlc291cmNlIGRhdGEuCisgICAgICAgIGFzc2lnbkRhdGEoc3BlYy5kYXRh
KTsKKworICAgICAgICAvLyBSZXR1cm4gb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGlzIHJlc291cmNl
LgorICAgICAgICB0aGF0LnVwZGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICAgICAg
ICByZXR1cm4gbWFrZU9wZXJhdGlvbihvYmplY3RzLmRlZXBDbG9uZUFuZE1lcmdlKHNwZWMsIHsK
KyAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgIGh0dHBN
ZXRob2Q6ICdQVVQnLAorICAgICAgICAgICAgICAgIGh0dHBCb2R5OiBKU09OLnN0cmluZ2lmeShj
b21wdXRlRGlmZihvcmlnaW5hbERhdGEsIGRhdGEpKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zv
cm1SZXN1bHQ6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2lnbkRh
dGEodHJhbnNmb3JtUmVzb3VyY2VEYXRhKGRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRoYXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICB9
OworCisgICAgICAgIC8vIFJldHVybiBvcGVyYXRpb24gdG8gZGVsZXRlIHRoaXMgcmVzb3VyY2Uu
CisgICAgICAgIHRoYXQuZGVsZXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgICAgICAg
IHJldHVybiBtYWtlT3BlcmF0aW9uKG9iamVjdHMuZGVlcENsb25lQW5kTWVyZ2Uoc3BlYywgewor
ICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgaHR0cE1l
dGhvZDogJ0RFTEVURScsCisgICAgICAgICAgICAgICAgaHR0cEJvZHk6ICd7fScKKyAgICAgICAg
ICAgIH0pKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBBdWdtZW50IHJlc291cmNlIHdpdGgg
bmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLgorICAgICAgICB2YXIgc3ViQ29sbGVjdGlvbnMg
PSBkYXRhLnN1YkNvbGxlY3Rpb25zIHx8IHt9OworICAgICAgICBPYmplY3Qua2V5cyhzdWJDb2xs
ZWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeworICAgICAgICAgICAgdGhhdFtuYW1l
XSA9IG1ha2VSZXNvdXJjZUNvbGxlY3Rpb24oeworICAgICAgICAgICAgICAgIGFwaUNvbnRleHRQ
YXRoOiBzdWJDb2xsZWN0aW9uc1tuYW1lXQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOwor
CisgICAgICAgIC8vIEF1Z21lbnQgcmVzb3VyY2Ugd2l0aCBzdXBwb3J0ZWQgYWN0aW9ucy4KKyAg
ICAgICAgdmFyIGFjdGlvbnMgPSBkYXRhLmFjdGlvbnMgfHwge307CisgICAgICAgIE9iamVjdC5r
ZXlzKGFjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgICAgIC8vIFJl
dHVybiBvcGVyYXRpb24gdG8gaW52b2tlIGdpdmVuIGFjdGlvbiB1c2luZyAnYWN0aW9uRGF0YScg
b24gdGhpcyByZXNvdXJjZS4KKyAgICAgICAgICAgIHRoYXRbbmFtZV0gPSBmdW5jdGlvbiAoYWN0
aW9uRGF0YSwgb3B0aW9ucykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlT3BlcmF0aW9u
KG9iamVjdHMuZGVlcENsb25lQW5kTWVyZ2Uoc3BlYywgeworICAgICAgICAgICAgICAgICAgICBv
cHRpb25zOiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcs
CisgICAgICAgICAgICAgICAgICAgIGh0dHBCb2R5OiBKU09OLnN0cmluZ2lmeShhY3Rpb25EYXRh
KSwKKyAgICAgICAgICAgICAgICAgICAgYXBpQ29udGV4dFBhdGg6IGFjdGlvbnNbbmFtZV0KKyAg
ICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9OworICAgICAgICB9KTsKKworICAgICAg
ICAvLyBUT0RPIGV4cG9zZSB0b3AtbGV2ZWwgcmVzb3VyY2UgZGF0YSBwcm9wZXJ0aWVzIGZvciBj
b252ZW5pZW5jZQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VSZXNvdXJjZSAoc3BlYykgewor
ICAgICAgICByZXR1cm4gbWl4aW5zLm1peChfLm1lcmdlKHNwZWMsIHsKKyAgICAgICAgICAgIGFw
aUNvbnRleHRQYXRoOiBzcGVjLmRhdGEgJiYgc3BlYy5kYXRhLmhyZWYKKyAgICAgICAgfSksIFtt
aXhpbnMud2l0aE9wdGlvbnMsIGFzUmVzb3VyY2VdKTsKKyAgICB9CisKKyAgICAvLyBJZiAnZm4n
IGlzIGEgZnVuY3Rpb24sIHJldHVybiB0aGF0IGZ1bmN0aW9uLgorICAgIC8vIE90aGVyd2lzZSwg
cmV0dXJuIGEgbm8tb3AgZnVuY3Rpb24uCisgICAgZnVuY3Rpb24gZ2V0Rm5Pck5vb3AgKGZuKSB7
CisgICAgICAgIHJldHVybiBfLmlzRnVuY3Rpb24oZm4pID8gZm4gOiBfLm5vb3A7CisgICAgfQor
CisgICAgLy8gTWl4aW4gZm9yIG9iamVjdHMgaW1wbGVtZW50aW5nIGEgUkVTVGZ1bCBvcGVyYXRp
b24uCisgICAgLy8gUmVxdWlyZXMgJ2h0dHAnIHNlcnZpY2UuCisgICAgZnVuY3Rpb24gYXNPcGVy
YXRpb24gKHRoYXQsIHNwZWMsIG15KSB7CisgICAgICAgIHZhciBvblN1Y2Nlc3MgPSBfLm5vb3A7
CisgICAgICAgIHZhciBvbkVycm9yID0gXy5ub29wOworCisgICAgICAgIGZ1bmN0aW9uIGh0dHBT
dWNjZXNzIChyZXNwb25zZVRleHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAg
ICAgLy8gUGFyc2UgcmVzcG9uc2UgYXMgSlNPTi4KKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0
ID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpOworCisgICAgICAgICAgICAgICAgLy8gVHJhbnNm
b3JtIHJlc3VsdGluZyBvYmplY3QsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAo
Xy5pc0Z1bmN0aW9uKHNwZWMudHJhbnNmb3JtUmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAg
ICByZXN1bHQgPSBzcGVjLnRyYW5zZm9ybVJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIC8vIEludm9rZSBvcGVyYXRpb24gc3VjY2VzcyBjYWxsYmFj
ay4KKyAgICAgICAgICAgICAgICBvblN1Y2Nlc3MocmVzdWx0KTsKKyAgICAgICAgICAgIH0gY2F0
Y2ggKGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseQor
ICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSBwYXJzaW5nIHJlc3BvbnNl
OiAnICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBo
dHRwRXJyb3IgKHN0YXR1c0NvZGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9y
IHByb3Blcmx5CisgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBmYWlsZWQgd2l0aCBz
dGF0dXMgY29kZSAnICsgc3RhdHVzQ29kZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdp
c3RlciBvcGVyYXRpb24gc3VjY2VzcyBjYWxsYmFjay4KKyAgICAgICAgdGhhdC5zdWNjZXNzID0g
ZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBvblN1Y2Nlc3MgPSBnZXRGbk9yTm9v
cChjYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gdGhhdDsKKyAgICAgICAgfTsKKworICAg
ICAgICAvLyBSZWdpc3RlciBvcGVyYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICAgICAgIHRoYXQu
ZXJyb3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG9uRXJyb3IgPSBnZXRG
bk9yTm9vcChjYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gdGhhdDsKKyAgICAgICAgfTsK
KworICAgICAgICAvLyBSdW4gdGhlIG9wZXJhdGlvbiwgc2VuZGluZyBIVFRQIHJlcXVlc3QgdG8g
cmVtb3RlIHNlcnZlci4KKyAgICAgICAgdGhhdC5ydW4gPSBmdW5jdGlvbiAoKSB7CisgICAgICAg
ICAgICAvLyBQcmVwYXJlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgICAgICAgIHZhciBoZWFkZXJz
ID0gc3BlYy5odHRwSGVhZGVycyB8fCB7fTsKKyAgICAgICAgICAgIGhlYWRlcnNbJ0FjY2VwdCdd
ID0gJ2FwcGxpY2F0aW9uL2pzb24nOworICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBl
J10gPSAnYXBwbGljYXRpb24vanNvbic7CisgICAgICAgICAgICBoZWFkZXJzWydGaWx0ZXInXSA9
IGFwaS5vcHRpb25zKCkuZmlsdGVyUmVzdWx0czsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSBy
ZXF1ZXN0IHBhcmFtZXRlcnMuCisgICAgICAgICAgICB2YXIgaHR0cFBhcmFtcyA9IHsKKyAgICAg
ICAgICAgICAgICBtZXRob2Q6IHNwZWMuaHR0cE1ldGhvZCwKKyAgICAgICAgICAgICAgICB1cmw6
IGFwaS5vcHRpb25zKCkuZW5naW5lQmFzZVVybCArIHNwZWMuYXBpQ29udGV4dFBhdGgsCisgICAg
ICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycywKKyAgICAgICAgICAgICAgICBib2R5OiBzcGVj
Lmh0dHBCb2R5CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1
ZXN0LgorICAgICAgICAgICAgbXkuaHR0cC5zZW5kKGh0dHBQYXJhbXMsIGh0dHBTdWNjZXNzLCBo
dHRwRXJyb3IpOworICAgICAgICB9OworICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VPcGVyYXRp
b24gKHNwZWMpIHsKKyAgICAgICAgcmV0dXJuIG1peGlucy5taXgoc3BlYywgW21peGlucy53aXRo
T3B0aW9ucywgYXNPcGVyYXRpb25dLCBbJ2h0dHAnXSk7CisgICAgfQorCisgICAgdmFyIGFwaSA9
IG1peGlucy5taXgoeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAvLyBFbmdpbmUg
YmFzZSBVUkwsIHdpdGhvdXQgYSB0cmFpbGluZyBzbGFzaC4KKyAgICAgICAgICAgIGVuZ2luZUJh
c2VVcmw6ICdodHRwOi8vMTI3LjAuMC4xOjgwODAnLAorICAgICAgICAgICAgLy8gRmxhZyBpbmRp
Y2F0aW5nIHdoZXRoZXIgdG8gZmlsdGVyIHJlc3VsdHMgYmFzZWQgb24gdXNlcidzIHBlcm1pc3Np
b25zLgorICAgICAgICAgICAgZmlsdGVyUmVzdWx0czogZmFsc2UKKyAgICAgICAgfQorICAgIH0s
IFttaXhpbnMud2l0aE9wdGlvbnNdKTsKKworICAgIC8vIEF1Z21lbnQgQVBJIHdpdGggdG9wLWxl
dmVsIHJlc291cmNlIGNvbGxlY3Rpb25zLgorICAgIC8vIFRPRE8gaW1wbGVtZW50IGFwaS5pbml0
IGZ1bmN0aW9uIHRoYXQgZGlzY292ZXJzIGFsbCB0b3AtbGV2ZWwgY29sbGVjdGlvbnMKKyAgICBh
cGkuZGF0YWNlbnRlcnMgPSBtYWtlUmVzb3VyY2VDb2xsZWN0aW9uKHsKKyAgICAgICAgYXBpQ29u
dGV4dFBhdGg6ICcvb3ZpcnQtZW5naW5lL2FwaS9kYXRhY2VudGVycycKKyAgICB9KTsKKworICAg
IHJldHVybiBhcGk7Cit9KShvdmlydC51dGlsKTsKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFk
bWluL21vZHVsZXMvcG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvcG9tLnhtbApp
bmRleCA4YzVkNzBmLi41OGY1MzVhIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1
bGVzL3BvbS54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9wb20ueG1sCkBAIC0x
Nyw2ICsxNyw3IEBACiAgICAgPG1vZHVsZT5mcm9udGVuZDwvbW9kdWxlPgogICAgIDxtb2R1bGU+
dWljb21tb253ZWI8L21vZHVsZT4KICAgICA8bW9kdWxlPmd3dC1jb21tb248L21vZHVsZT4KKyAg
ICA8bW9kdWxlPm92aXJ0LWpzLWd3dC13cmFwcGVyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT53ZWJh
ZG1pbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+dXNlcnBvcnRhbC1nd3RwPC9tb2R1bGU+CiAgIDwv
bW9kdWxlcz4KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4v
cG9tLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vcG9tLnhtbAppbmRl
eCA3MDZkM2NhLi45YzljOGMxIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L3dlYmFkbWluL3BvbS54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p
bi9wb20ueG1sCkBAIC03OCw2ICs3OCwxMiBAQAogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVw
ZW5kZW5jeT4KICAgICAgIDxncm91cElkPiR7ZW5naW5lLmdyb3VwSWR9PC9ncm91cElkPgorICAg
ICAgPGFydGlmYWN0SWQ+b3ZpcnQtanMtZ3d0LXdyYXBwZXI8L2FydGlmYWN0SWQ+CisgICAgICA8
dmVyc2lvbj4ke2VuZ2luZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRl
ZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdy
b3VwSWQ+JHtlbmdpbmUuZ3JvdXBJZH08L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5mcm9u
dGVuZDwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7ZW5naW5lLnZlcnNpb259PC92ZXJz
aW9uPgogICAgIDwvZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v
ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu
L2dpbi9DbGllbnRNb2R1bGUuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRt
aW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9DbGllbnRN
b2R1bGUuamF2YQppbmRleCA0OTgwNTA3Li43OTMxN2UzIDEwMDY0NAotLS0gYS9mcm9udGVuZC93
ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91
aS93ZWJhZG1pbi9naW4vQ2xpZW50TW9kdWxlLmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt
aW4vZ2luL0NsaWVudE1vZHVsZS5qYXZhCkBAIC0xLDUgKzEsNyBAQAogcGFja2FnZSBvcmcub3Zp
cnQuZW5naW5lLnVpLndlYmFkbWluLmdpbjsKIAoraW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWku
d2ViYWRtaW4uc2RrX3Rlc3QuU2RrR3d0V3JhcHBlclRlc3Q7CisKIGltcG9ydCBjb20uZ29vZ2xl
Lmd3dC5pbmplY3QuY2xpZW50LkFic3RyYWN0R2luTW9kdWxlOwogCiAvKioKQEAgLTE0LDYgKzE2
LDcgQEAgcHVibGljIGNsYXNzIENsaWVudE1vZHVsZSBleHRlbmRzIEFic3RyYWN0R2luTW9kdWxl
IHsKICAgICAgICAgaW5zdGFsbChuZXcgVWlDb21tb25Nb2R1bGUoKSk7CiAgICAgICAgIGluc3Rh
bGwobmV3IFBsdWdpbk1vZHVsZSgpKTsKICAgICAgICAgaW5zdGFsbChuZXcgVXRpbHNNb2R1bGUo
KSk7CisgICAgICAgIGJpbmQoU2RrR3d0V3JhcHBlclRlc3QuY2xhc3MpLmFzRWFnZXJTaW5nbGV0
b24oKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv
d2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Nka190
ZXN0L1Nka0d3dFdyYXBwZXJUZXN0LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dl
YmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZGtfdGVz
dC9TZGtHd3RXcmFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjA1N2RhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZGtf
dGVzdC9TZGtHd3RXcmFwcGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2Ugb3Jn
Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZGtfdGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5E
YXRlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5l
LnNkay5nd3QuY2xpZW50LlNkazsKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xp
ZW50LmFwaS5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsu
Z3d0LmNsaWVudC5hcGkuU3VjY2Vzc0NhbGxiYWNrOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUu
c2RrLmd3dC5jbGllbnQuYXBpLmVudGl0eS5EYXRhQ2VudGVyOworaW1wb3J0IG9yZy5vdmlydC5l
bmdpbmUuc2RrLmd3dC5jbGllbnQuYXBpLmVudGl0eS5EYXRhQ2VudGVyVGVtcGxhdGU7CitpbXBv
cnQgb3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LmNsaWVudC5nb29kaWVzLkl0ZXJhYmxlSnNBcnJh
eTsKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnNkay5nd3QuY2xpZW50Lmdvb2RpZXMuSnNPYmpl
Y3RPdmVybGF5OworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLnJl
c3RhcGkuUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50OworaW1wb3J0IG9yZy5vdmlydC5lbmdp
bmUudWkud2ViYWRtaW4ucGx1Z2luLnJlc3RhcGkuUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50
LlJlc3RBcGlTZXNzaW9uQWNxdWlyZWRIYW5kbGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu
ZXZlbnQuc2hhcmVkLkV2ZW50QnVzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsK
KworcHVibGljIGNsYXNzIFNka0d3dFdyYXBwZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGlj
IGZpbmFsIFJhbmRvbSBSTkQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBASW5qZWN0CisgICAgcHVi
bGljIFNka0d3dFdyYXBwZXJUZXN0KEV2ZW50QnVzIGV2ZW50QnVzKSB7CisgICAgICAgIGV2ZW50
QnVzLmFkZEhhbmRsZXIoUmVzdEFwaVNlc3Npb25BY3F1aXJlZEV2ZW50LmdldFR5cGUoKSwgbmV3
IFJlc3RBcGlTZXNzaW9uQWNxdWlyZWRIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRl
CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3RBcGlTZXNzaW9uQWNxdWlyZWQoUmVzdEFw
aVNlc3Npb25BY3F1aXJlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgcnVuVGVzdCgp
OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQg
cnVuVGVzdCgpIHsKKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uPERhdGFDZW50ZXI+IGRjQ29s
bCA9IFNkay5nZXQoKS5hcGkoKS5nZXREYXRhQ2VudGVycygpOworCisgICAgICAgIGRjQ29sbC5s
aXN0KCkuc3VjY2VzcyhuZXcgU3VjY2Vzc0NhbGxiYWNrPEl0ZXJhYmxlSnNBcnJheTxEYXRhQ2Vu
dGVyPj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lk
IG9uU3VjY2VzcyhJdGVyYWJsZUpzQXJyYXk8RGF0YUNlbnRlcj4gZGNBcnJheSkgeworICAgICAg
ICAgICAgICAgIGZvciAoRGF0YUNlbnRlciBkYyA6IGRjQXJyYXkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgbG9nRGMoZGMsICJMaXN0ZWQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkucnVuKCk7CisKKyAgICAgICAgRGF0YUNlbnRl
clRlbXBsYXRlIGRjVGVtcGxhdGUgPSBEYXRhQ2VudGVyVGVtcGxhdGUuY3JlYXRlKAorICAgICAg
ICAgICAgICAgICJ0ZXN0LWRjLSIgKyBSTkQubmV4dEludCgxMDAwKSwgLy8kTk9OLU5MUy0xJAor
ICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgZGNUZW1wbGF0ZS5zZXREZXNjcmlwdGlv
bigib3JpZ2luYWwtZGVzYyIpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgZGNDb2xsLmFkZChk
Y1RlbXBsYXRlKS5zdWNjZXNzKG5ldyBTdWNjZXNzQ2FsbGJhY2s8RGF0YUNlbnRlcj4oKSB7Cisg
ICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhE
YXRhQ2VudGVyIGFkZGVkRGMpIHsKKyAgICAgICAgICAgICAgICBsb2dEYyhhZGRlZERjLCAiQWRk
ZWQiKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgICAgICAgICAgYWRkZWREYy5zZXREZXNjcmlw
dGlvbigibW9kaWZpZWQtZGVzYyBAICIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7IC8vJE5PTi1O
TFMtMSQKKyAgICAgICAgICAgICAgICBhZGRlZERjLnVwZGF0ZSgpLnN1Y2Nlc3MobmV3IFN1Y2Nl
c3NDYWxsYmFjazxEYXRhQ2VudGVyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRl
CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBEYXRhQ2Vu
dGVyIHVwZGF0ZWREYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGModXBkYXRlZERj
LCAiVXBkYXRlZCIpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVw
ZGF0ZWREYy5kZWxldGUoKS5zdWNjZXNzKG5ldyBTdWNjZXNzQ2FsbGJhY2s8SnNPYmplY3RPdmVy
bGF5PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoSnNPYmplY3RPdmVybGF5
IGRlbGV0ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Rj
KHVwZGF0ZWREYywgIkRlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJ1bigpOworICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkucnVuKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0pLnJ1bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dEYyhEYXRhQ2Vu
dGVyIGRjLCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGxvZyhwcmVmaXggKyAiOiAiICsgZGMu
Z2V0TmFtZSgpICsgIiB3aXRoIGRlc2NyaXB0aW9uOiAiICsgZGMuZ2V0RGVzY3JpcHRpb24oKSk7
IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZl
IHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSAvKi17CisgICAgICAgICR3bmQuY29uc29sZS5sb2co
bWVzc2FnZSk7CisgICAgfS0qLzsKKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v
bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS91aS93
ZWJhZG1pbi9XZWJBZG1pbi5nd3QueG1sIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJh
ZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9XZWJB
ZG1pbi5nd3QueG1sCmluZGV4IDJjMGU2NWMuLmFkNTFlMTcgMTAwNjQ0Ci0tLSBhL2Zyb250ZW5k
L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9vdmlydC9l
bmdpbmUvdWkvd2ViYWRtaW4vV2ViQWRtaW4uZ3d0LnhtbAorKysgYi9mcm9udGVuZC93ZWJhZG1p
bi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvb3ZpcnQvZW5naW5lL3Vp
L3dlYmFkbWluL1dlYkFkbWluLmd3dC54bWwKQEAgLTYsNiArNiw4IEBACiAgICAgPCEtLSBJbmhl
cml0IG9WaXJ0IGNvbW1vbiBHV1QgbW9kdWxlIC0tPgogICAgIDxpbmhlcml0cyBuYW1lPSJvcmcu
b3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5Hd3RDb21tb24iIC8+CiAKKyAgICA8aW5oZXJpdHMgbmFt
ZT0ib3JnLm92aXJ0LmVuZ2luZS5zZGsuZ3d0LlNka0d3dFdyYXBwZXIiIC8+CisKICAgICA8IS0t
IEluaGVyaXQgdGhlIGRlZmF1bHQgR1dUIHRoZW1lIC0tPgogICAgIDxpbmhlcml0cyBuYW1lPSJj
b20uZ29vZ2xlLmd3dC51c2VyLnRoZW1lLnN0YW5kYXJkLlN0YW5kYXJkIiAvPgogCi0tIAoxLjgu
My4xCgo=
------=_Part_26595393_401944553.1403609366320--
10 years, 5 months
[vdsm] Infrastructure design for node (host) devices
by Martin Polednik
Hello,
I'm actively working on getting host device passthrough (pci, usb and scsi)
exposed in VDSM, but I've encountered growing complexity of this feature.
The devices are currently created in the same manner as virtual devices and
their reporting is done via hostDevices list in getCaps. As I implemented
usb and scsi devices, the size of this list grew almost twice - and that is
on a laptop.
Similar problem is with the devices themselves, they are closely tied to host
and currently, engine would have to keep their mapping to VMs, reattach back
loose devices and handle all of this in case of migration.
I would like to hear your opinion on building something like host device pool
in VDSM. The pool would be populated and periodically updated (to handle
hot(un)plugs) and VMs/engine could query it for free/assigned/possibly problematic
devices (which could be reattached by the pool). This has added benefit of
requiring fewer libvirt calls, but a bit more complexity and possibly one thread.
The persistence of the pool on VDSM restart could be kept in config or constructed
from XML.
I'd need new API verbs to allow engine to communicate with the pool,
possibly leaving caps as they are and engine could detect the presence of newer
vdsm by presence of these API verbs. The vmCreate call would remain almost the
same, only with the addition of new device for VMs (where the detach and tracking
routine would be communicated with the pool).
10 years, 5 months
[ANN] oVirt 3.5 Test Day - Tomorrow Jul 1st
by Yedidyah Bar David
Hi all,
Tomorrow Jul 1st we'll have oVirt 3.5.0 test day.
On this day all relevant engineers will be online ready to support
any issues you find during install / operating this new release.
Just make sure you have 1 host or more to test drive the new release.
If you're curious to see how it works, this is your chance.
Thanks again for everyone who will join us tomorrow!
Location
#ovirt irc channel
Please communicate here to allow others to see any issues
What
In this test day you have a license to kill ;)
Follow the documentation to setup your environment, and test drive the new features.
Please remember we expect to see some issues, and anything you come up with will save you when you'll install final release
Remember to try daily tasks you'd usually do in the engine, to see there are no regressions.
Write down the configuration you used (HW, console, etc) in the report etherpad[1].
Documentation
Release notes: http://www.ovirt.org/OVirt_3.4.0_release_notes
Features pages links: http://bit.ly/17qBn6F
If you find errors in the wiki please annotate it as well in report etherpad [1]
Prerequisites / recommendations
Use CentOS or RHEL 6.5 only. 6.4 is unsupported due to various issues (sanlock, libvirt, etc).
Use Fedora 19 or 20.
Latest RPMs
repository to be enabled for testing the release are listed in the release notes page [2].
NEW issues / reports
For any new issue, please update the reports etherpad [1]
Feature owners, please make sure:
your feature is updated and referenced on release page [2].
you have testing instruction for your feature either on test day page [3] or in your feature page.
your team regression testing section is organized and up to date on test day page [3].
[1] http://etherpad.ovirt.org/p/3.5-testday-1
[2] http://www.ovirt.org/OVirt_3.5_Release_Notes
[3] http://www.ovirt.org/OVirt_3.5_TestDay
Thanks.
--
Yedidyah Bar David,
RHEV Integration team
10 years, 5 months
ovirt-3.5 test day: Package oVirt windows guest tools ISO and put it in ovirt repositories
by Einav Cohen
------=_Part_539285_2013995182.1404136603229
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
Hi Lev,
I am assigned to test the feature in $subject as part of the ovirt-3.5 test day.
it says in [1] to "Talk to Lev" (attached).
So I'm talking :)
- in the BZ [2] description, it mentions that it would be nice to (a) have the
windows guest tools ISO pre-populated in the ISO domain, but as a first step -
(b) virtio-win should be RPM packaged and put it in ovirt (yum?) repositories.
IIUC - neither (a) nor (b) were done - the ISO was simply put in
resources.ovirt.org (not RPM packaged or anything like that) - correct?
- which ISO should I use for the test-day? the one that appears in comment #5
in [2] as "master"? "3.5.0 pre release"? something else?
- any particular windows versions that I should test (or, should NOT test)?
- anything else that I should know about this feature? anything in particular
that I should focus on?
----
Regards,
Einav
[1] https://docs.google.com/spreadsheet/ccc?key=0AuAtmJW_VMCRdHJ6N1M3d1F1UTJT...
[2] Bug 1026930 - OVIRT35 - [RFE] Package oVirt windows guest tools ISO and put it in ovirt repositories
[https://bugzilla.redhat.com/show_bug.cgi?id=1026930]
------=_Part_539285_2013995182.1404136603229
Content-Type: image/png; name=TalkToLev.png
Content-Disposition: attachment; filename=TalkToLev.png
Content-Transfer-Encoding: base64
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
/j/GHLygUkMDSgAAAABJRU5ErkJggg==
------=_Part_539285_2013995182.1404136603229--
10 years, 5 months
scale & hooks
by Michal Skrivanek
Hi,
just thinking about the recent stats hook[1] by Dima and scale,
It is a very nice hook and quite useful for the scale testing - ( though when focus is on engine I'd suggest to use FakeVDSM instead to eliminate all the bottlenecks on VDSM side.)
One issue I see - since this is a very high-profile call, every 15s time number of VMs - is with the hook invocation. Currently the hook mechanism always go through the hooks dit and does stat() call to see script is there or not…
it certainly doesn't matter on small scale but when the system is on the edge every IO on local FS cost something….
Would be nice if the hook mechanism is enhanced in general, figure out which hooks are relevant only at the startup and don't waste time passing domainXML every single time when the hook is not there
Thanks,
michal
[1] http://gerrit.ovirt.org/#/c/25927/
10 years, 5 months