------=_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--