cps & contification

Matthew Fluet fluet@CS.Cornell.EDU
Tue, 30 Jan 2001 10:33:06 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-33463914-980868786=:5342
Content-Type: TEXT/PLAIN; charset=US-ASCII


> I have one proposal for further simplification.  I think it is easier to avoid
> defining A' entirely.  Instead, define a predicate Reach: Fun -> Bool so that
> Reach(f) iff there is a path of calls from fm to f.  Then, instead of writing
> A'(f) = Unknown, write Reach(f) and instead of writing A'(f) = Uncalled, write
> not(Reach(f)). 

I like this.  I agree that the reasoning is a little easier.

> I find it easier to reason directly in terms of reach than going through A'.
> Following is a reworking of the framework.  I also simplified the proof of
> Theorem 3 and combined Lemmas 4 and 5.

> Theorem 3: For all f in Fun, there is a path from Root to f in G.
> Proof:
> Either Reach(f) or not(Reach(f).
> 
> If Reach(f), then there is a path of calls from fm to f.  Every g in Fun on
> this path also has Reach(g).  Hence every call on the path corresponds to an
> edge in Edge by fourth or fifth clause.  Since (Root, fm) in Edge, there is a
> path from Root to f in G. 
> 
> If not(Reach(f)), then (Root, f) in Edge by third clause.  Hence there is a path
> from Root to f in G.

In the Reach(f) case, we also have to note that (Root, j) in Edge for all
j in Jump, because some edges of the form (j, g) might be included by the
fifth clause.


> I guess you're working on the implementation as we speak?

Here it is.  I did it as a replacement of the existing new analysis, but
if we really wanted to do comparisons with the two-phase analysis, it
should be simple enough.  


---559023410-33463914-980868786=:5342
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="contify.new.fun"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010130103306.5342E@hoho.cs.cornell.edu>
Content-Description: 

KCogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4NCiAqIFBs
ZWFzZSBzZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4NCiAqKQ0K
KCoNCiAqIFRoaXMgcGFzcyBjb21iaW5lcyB0d28gYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9u
cy4NCiAqDQogKiBUaGUgZmlyc3QgYW5hbHlzaXMsICJjYWxsIGJhc2VkIiBub3RpY2VzIGlmIGEg
dG9wbGV2ZWwgZnVuY3Rpb24gaXMgY2FsbGVkDQogKiAgICAgICAxLiBmcm9tIG9uZSBwbGFjZSBv
dXRzaWRlIGl0c2VsZg0KICogICBhbmQgMi4gYWxsIGNhbGxzIHRvIGl0c2VsZiB3aXRoaW4gaXRz
ZWxmIGFyZSB0YWlsDQogKiBJZiAoMSkgYW5kICgyKSBhcmUgdHJ1ZSwgdGhlbiB0aGF0IGZ1bmN0
aW9uIGNhbiBiZSBtYWRlIGxvY2FsIGF0IHRoZSBwb2ludA0KICogb2YgaXRzIG91dGVyIGNhbGwu
DQogKg0KICogVGhlIHNlY29uZCBhbmFseXNpcyBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBh
cGVyLg0KICogICBMb2NhbCBDUFMgY29udmVyc2lvbiBpbiBhIGRpcmVjdC1zdHlsZSBjb21waWxl
ci4gIEpvaG4gUmVwcHkuDQogKiBJdCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgY29udGludWF0aW9u
cyB0aGF0IGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICBJZg0KICogdGhhdCBzZXQgaXMgYSBz
aW5nbGV0b24sIHRoZW4gdGhlIGZ1bmN0aW9uIGNhbiBiZSBwcmVmaXhlZCBvbnRvIHRoZQ0KICog
Y29udGludWF0aW9uIGl0IGlzIGNhbGxlZCB3aXRoLg0KICopDQoNCmZ1bmN0b3IgQ29udGlmeSAo
UzogQ09OVElGWV9TVFJVQ1RTKTogQ09OVElGWSA9IA0Kc3RydWN0DQoNCm9wZW4gUw0Kb3BlbiBE
ZWMgVHJhbnNmZXINCg0Kc3RydWN0dXJlIEFuYWx5emVSQ29udCA9DQogIHN0cnVjdA0KDQogICAg
KCogUkNvbnQgPSB7VW5jYWxsZWQsIFVua25vd259IFUgRnVuYyBVIEp1bXANCiAgICAgKikNCiAg
ICBzdHJ1Y3R1cmUgUkNvbnQgPQ0KICAgICAgc3RydWN0DQoJZGF0YXR5cGUgdA0KCSAgPSBVbmNh
bGxlZA0KCSAgfCBGdW5jTGFiZWwgb2YgRnVuYy50DQoJICB8IEp1bXBMYWJlbCBvZiBKdW1wLnQN
CgkgIHwgVW5rbm93bg0KDQoJZnVuIHJjb250X2xheW91dCByDQoJICA9IGxldCANCgkgICAgICBv
cGVuIExheW91dA0KCSAgICBpbg0KCSAgICAgIGNhc2Ugcg0KCQlvZiBVbmNhbGxlZCA9PiBzdHIg
IlVuY2FsbGVkIg0KCQkgfCBGdW5jTGFiZWwgZiA9PiBzZXEgW0Z1bmMubGF5b3V0IGZdDQoJCSB8
IEp1bXBMYWJlbCBqID0+IHNlcSBbSnVtcC5sYXlvdXQgal0NCgkJIHwgVW5rbm93biA9PiBzdHIg
IlVua25vd24iDQoJICAgIGVuZA0KDQoJdmFsIHJjb250X2VxdWFscw0KCSAgPSBmbiAoVW5jYWxs
ZWQsIFVuY2FsbGVkKSA9PiB0cnVlDQoJICAgICB8IChGdW5jTGFiZWwgZjEsIEZ1bmNMYWJlbCBm
MikgPT4gRnVuYy5lcXVhbHMoZjEsIGYyKQ0KCSAgICAgfCAoSnVtcExhYmVsIGoxLCBKdW1wTGFi
ZWwgajIpID0+IEp1bXAuZXF1YWxzKGoxLCBqMikNCgkgICAgIHwgKFVua25vd24sIFVua25vd24p
ID0+IHRydWUNCgkgICAgIHwgXyA9PiBmYWxzZQ0KICAgICAgZW5kDQoNCiAgICBzdHJ1Y3R1cmUg
RnVuY0RhdGEgPQ0KICAgICAgc3RydWN0DQoJZGF0YXR5cGUgdCA9IFQgb2Yge3Jjb250OiBSQ29u
dC50IHJlZiwNCgkJCSAgIHJlYWNoOiBib29sIHJlZiwNCgkJCSAgIG5vZGU6IERpcmVjdGVkR3Jh
cGguTm9kZS50IG9wdGlvbiByZWZ9DQoNCglmdW4gbmV3ICgpID0gVCB7cmNvbnQgPSByZWYgUkNv
bnQuVW5jYWxsZWQsDQoJCQlyZWFjaCA9IHJlZiBmYWxzZSwNCgkJCW5vZGUgPSByZWYgTk9ORX0N
Cg0KCWZ1biByY29udCAoVCB7cmNvbnQsIC4uLn0pID0gIXJjb250DQoJZnVuIHJlYWNoIChUIHty
ZWFjaCwgLi4ufSkgPSAhcmVhY2gNCgkgIA0KCXZhbCBsYXlvdXQgPSBSQ29udC5yY29udF9sYXlv
dXQgbyByY29udA0KCXZhbCB0b1N0cmluZyA9IExheW91dC50b1N0cmluZyBvIGxheW91dA0KCSAg
DQoJZnVuIGlzVW5jYWxsZWQgKFQge3Jjb250LCAuLi59KQ0KCSAgPSBjYXNlICFyY29udA0KCSAg
ICAgIG9mIFJDb250LlVuY2FsbGVkID0+IHRydWUNCgkgICAgICAgfCBfID0+IGZhbHNlDQogICAg
ICBlbmQNCg0KICAgIHN0cnVjdHVyZSBKdW1wRGF0YSA9DQogICAgICBzdHJ1Y3QNCglkYXRhdHlw
ZSB0ID0gVCBvZiB7bm9kZTogRGlyZWN0ZWRHcmFwaC5Ob2RlLnQgb3B0aW9uIHJlZn0NCgkgIA0K
CWZ1biBuZXcgKCkgPSBUIHtub2RlID0gcmVmIE5PTkV9DQogICAgICBlbmQNCg0KICAgIGxvY2Fs
DQogICAgICBzdHJ1Y3R1cmUgR3JhcGggPSBEaXJlY3RlZEdyYXBoDQogICAgICBzdHJ1Y3R1cmUg
Tm9kZSA9IEdyYXBoLk5vZGUNCiAgICAgIHN0cnVjdHVyZSBEZnNQYXJhbSA9IEdyYXBoLkRmc1Bh
cmFtDQogICAgaW4NCiAgICAgICgqIERlZmluZSBSZWFjaDogRnVuIC0+IEJvb2wgYXMgZm9sbG93
czoNCiAgICAgICAqICBSZWFjaChmKSBpZmYgdGhlcmUgaXMgYSBwYXRoIG9mIGNhbGxzIGZyb20g
Zm0gdG8gZi4NCiAgICAgICAqDQogICAgICAgKiBQcmVjb25kaXRpb246IGZvcmFsbCBmIGluIEZ1
bmMuIGdldEZ1bmNEYXRhKGYpID0gRnVuY0RhdGEubmV3ICgpDQogICAgICAgKiBQb3N0Y29uZGl0
aW9uOiBGdW5jRGF0YS5yZWFjaCBvIGdldEZ1bmNEYXRhID0gUmVhY2gNCiAgICAgICAqKQ0KICAg
ICAgZnVuIGluaXRSZWFjaCB7cHJvZ3JhbSBhcyBQcm9ncmFtLlQge2Z1bmN0aW9ucywgbWFpbiA9
IGZtLCAuLi59LA0KCQkgICAgIGdldEZ1bmNEYXRhOiBGdW5jLnQgLT4gRnVuY0RhdGEudH0gOiB1
bml0DQoJPSBsZXQNCgkgICAgdmFsIEcgPSBEaXJlY3RlZEdyYXBoLm5ldyAoKQ0KDQoJICAgIGZ1
biBhZGRFZGdlIGVkZ2UNCgkgICAgICA9IGlmIE5vZGUuaGFzRWRnZSBlZGdlDQoJCSAgdGhlbiAo
KQ0KCQkgIGVsc2UgKEdyYXBoLmFkZEVkZ2UgKEcsIGVkZ2UpOyAoKSkNCg0KCSAgICB2YWwge2dl
dCA9IGdldE5vZGVJbmZvIDogTm9kZS50IC0+IEZ1bmMudCwgDQoJCSBzZXQgPSBzZXROb2RlSW5m
b30NCgkgICAgICA9IFByb3BlcnR5LmdldFNldE9uY2UNCgkgICAgICAgIChOb2RlLnBsaXN0LA0K
CQkgUHJvcGVydHkuaW5pdFJhaXNlICgibm9kZUluZm8iLCBOb2RlLmxheW91dCkpDQoNCgkgICAg
ZnVuIGdldEZ1bmNOb2RlIGYNCgkgICAgICA9IGxldA0KCQkgIHZhbCBGdW5jRGF0YS5UIHtub2Rl
LCAuLi59ID0gZ2V0RnVuY0RhdGEgZg0KCQlpbg0KCQkgIGNhc2UgIW5vZGUNCgkJICAgIG9mIFNP
TUUgbiA9PiBuDQoJCSAgICAgfCBOT05FID0+IGxldA0KCQkJCSB2YWwgbiA9IEdyYXBoLm5ld05v
ZGUgRw0KCQkJICAgICAgIGluDQoJCQkJIHNldE5vZGVJbmZvIChuLCBmKTsNCgkJCQkgbm9kZSA6
PSBTT01FIG47DQoJCQkJIG4NCgkJCSAgICAgICBlbmQNCgkJZW5kDQoNCgkgICAgdmFsIF8gDQoJ
ICAgICAgPSBWZWN0b3IuZm9yZWFjaA0KCSAgICAgICAgKGZ1bmN0aW9ucywgDQoJCSBmbiB7bmFt
ZSwgYm9keSwgLi4ufQ0KCQkgID0+IGxldA0KCQkgICAgICAgdmFsIGZfbm9kZSA9IGdldEZ1bmNO
b2RlIG5hbWUNCgkJICAgICBpbg0KCQkgICAgICAgRXhwLmZvcmVhY2hDYWxsDQoJCSAgICAgICAo
Ym9keSwNCgkJCWZuIHtmdW5jLCAuLi59DQoJCQkgPT4gbGV0DQoJCQkgICAgICB2YWwgZ19ub2Rl
ID0gZ2V0RnVuY05vZGUgZnVuYw0KCQkJICAgIGluDQoJCQkgICAgICBhZGRFZGdlIHtmcm9tID0g
Zl9ub2RlLA0KCQkJCSAgICAgICB0byA9IGdfbm9kZX0NCgkJCSAgICBlbmQpDQoJCSAgICAgZW5k
KQ0KDQoJICAgIHZhbCBkZnNfcGFyYW0NCgkgICAgICA9IERmc1BhcmFtLmZpbmlzaE5vZGUNCgkg
ICAgICAgIChmbiBuID0+IGxldA0KCQkJICAgdmFsIEZ1bmNEYXRhLlQge3JlYWNoLCAuLi59IA0K
CQkJICAgICA9IChnZXRGdW5jRGF0YSBvIGdldE5vZGVJbmZvKSBuDQoJCQkgaW4NCgkJCSAgIHJl
YWNoIDo9IHRydWUNCgkJCSBlbmQpDQoJICAgIHZhbCBmbV9ub2RlID0gZ2V0RnVuY05vZGUgZm0N
CgkgIGluDQoJICAgIEdyYXBoLmRmc05vZGVzIChHLCBbZm1fbm9kZV0sIGRmc19wYXJhbSk7DQoJ
ICAgIFZlY3Rvci5mb3JlYWNoKGZ1bmN0aW9ucywNCgkJCSAgIGZuIHtuYW1lLCAuLi59DQoJCQkg
ICAgPT4gbGV0IA0KCQkJCSB2YWwgRnVuY0RhdGEuVCB7bm9kZSwgLi4ufSA9IGdldEZ1bmNEYXRh
IG5hbWUNCgkJCSAgICAgICBpbiANCgkJCQkgbm9kZSA6PSBOT05FDQoJCQkgICAgICAgZW5kKQ0K
CSAgZW5kDQoNCiAgICAgICgqIE5vdyBkZWZpbmUgYSBkaXJlY3RlZCBncmFwaCBHID0gKE5vZGUs
IEVkZ2UpIHdoZXJlDQogICAgICAgKiAgICAgIE5vZGUgPSBKdW1wIFUgRnVuIFUge1Jvb3R9DQog
ICAgICAgKiAgICAgIEVkZ2UgPSB7KFJvb3QsIGZtKX0NCiAgICAgICAqICAgICAgICAgICAgIFUg
eyhSb290LCBqKSB8IGogaW4gSnVtcH0NCiAgICAgICAqICAgICAgICAgICAgIFUgeyhSb290LCBm
KSB8IG5vdChSZWFjaChmKSl9DQogICAgICAgKiAgICAgICAgICAgICBVIHsoZiwgZykgfCAoZiwg
ZykgaW4gVCBhbmQgUmVhY2goZil9DQogICAgICAgKiAgICAgICAgICAgICBVIHsoaiwgZykgfCAo
ZiwgZywgaikgaW4gTiBhbmQgUmVhY2goZil9DQogICAgICAgKg0KICAgICAgICogTGV0IEQgYmUg
dGhlIGRvbWluYXRvciB0cmVlIG9mIEcgcm9vdGVkIGF0IFJvb3QuDQogICAgICAgKiBGb3IgZiBp
biBGdW4sIGxldCBpZG9tKGYpIGJlIHRoZSBwYXJlbnQgb2YgZiBpbiBELg0KICAgICAgICoNCiAg
ICAgICAqIERlZmluZSBhbiBhbmFseXNpcywgQSwgYmFzZWQgb24gQScgYW5kIEQgYXMgZm9sbG93
czoNCiAgICAgICAqICAgICAgQShmKSA9IA0KICAgICAgICogICAgICAgICAgIGlmIGlkb20oZikg
PSBSb290DQogICAgICAgKiAgICAgICAgICAgICB0aGVuIGlmIFJlYWNoKGYpIHRoZW4gVW5rbm93
biBlbHNlIFVuY2FsbGVkDQogICAgICAgKiAgICAgICAgICAgICBlbHNlIHRoZSBhbmNlc3RvciBn
IG9mIGYgaW4gRCBzdWNoIHRoYXQgaWRvbShnKSA9IFJvb3QNCiAgICAgICAqDQogICAgICAgKiBQ
cmVjb25kaXRpb246IGZvcmFsbCBmIGluIEZ1bmMuIGdldEZ1bmNEYXRhKGYpID0gRnVuY0RhdGEu
bmV3ICgpDQogICAgICAgKiAgICAgICAgICAgICAgIGZvcmFsbCBqIGluIEp1bXAuIGdldEp1bXBE
YXRhIGogPSBKdW1wRGF0YS5uZXcgKCkNCiAgICAgICAqIFBvc3Rjb25kaXRpb246IHJjb250IG8g
Z2V0RnVuY0RhdGEgPSBBDQogICAgICAgKikNCiAgICAgIGZ1biBhbmFseXplUkNvbnQge3Byb2dy
YW0gYXMgUHJvZ3JhbS5UIHtmdW5jdGlvbnMsIG1haW4gPSBmbSwgLi4ufSwNCgkJCWdldEZ1bmNE
YXRhOiBGdW5jLnQgLT4gRnVuY0RhdGEudCwNCgkJCWdldEp1bXBEYXRhOiBKdW1wLnQgLT4gSnVt
cERhdGEudH0gOiB1bml0DQoJPSBsZXQNCgkgICAgdmFsIF8gPSBpbml0UmVhY2gge3Byb2dyYW0g
PSBwcm9ncmFtLA0KCQkJICAgICAgIGdldEZ1bmNEYXRhID0gZ2V0RnVuY0RhdGF9DQoNCgkgICAg
dmFsIEcgPSBEaXJlY3RlZEdyYXBoLm5ldyAoKQ0KCSAgICB2YWwgUm9vdCA9IERpcmVjdGVkR3Jh
cGgubmV3Tm9kZSBHDQoNCgkgICAgZnVuIGFkZEVkZ2UgZWRnZQ0KCSAgICAgID0gaWYgTm9kZS5o
YXNFZGdlIGVkZ2UNCgkJICB0aGVuICgpDQoJCSAgZWxzZSAoR3JhcGguYWRkRWRnZSAoRywgZWRn
ZSk7ICgpKQ0KDQoJICAgIGRhdGF0eXBlIHQgPSBGdW5jTm9kZSBvZiBGdW5jLnQNCgkgICAgICAg
ICAgICAgICB8IEp1bXBOb2RlIG9mIEp1bXAudA0KCSAgICB2YWwge2dldCA9IGdldE5vZGVJbmZv
IDogTm9kZS50IC0+IHQsIA0KCQkgc2V0ID0gc2V0Tm9kZUluZm99DQoJICAgICAgPSBQcm9wZXJ0
eS5nZXRTZXRPbmNlDQoJICAgICAgICAoTm9kZS5wbGlzdCwNCgkJIFByb3BlcnR5LmluaXRSYWlz
ZSAoIm5vZGVJbmZvIiwgTm9kZS5sYXlvdXQpKQ0KDQoJICAgIGZ1biBnZXRGdW5jTm9kZSBmDQoJ
ICAgICAgPSBsZXQNCgkJICB2YWwgRnVuY0RhdGEuVCB7bm9kZSwgLi4ufSA9IGdldEZ1bmNEYXRh
IGYNCgkJaW4NCgkJICBjYXNlICFub2RlDQoJCSAgICBvZiBTT01FIG4gPT4gbg0KCQkgICAgIHwg
Tk9ORSA9PiBsZXQNCgkJCQkgdmFsIG4gPSBHcmFwaC5uZXdOb2RlIEcNCgkJCSAgICAgICBpbg0K
CQkJCSBzZXROb2RlSW5mbyAobiwgRnVuY05vZGUgZik7DQoJCQkJIG5vZGUgOj0gU09NRSBuOw0K
CQkJCSBuDQoJCQkgICAgICAgZW5kDQoJCWVuZA0KCSAgICB2YWwgZ2V0RnVuY1JlYWNoID0gKEZ1
bmNEYXRhLnJlYWNoIG8gZ2V0RnVuY0RhdGEpDQoJICAgIGZ1biBnZXRKdW1wTm9kZSBqDQoJICAg
ICAgPSBsZXQNCgkJICB2YWwgSnVtcERhdGEuVCB7bm9kZSwgLi4ufSA9IGdldEp1bXBEYXRhIGoN
CgkJaW4NCgkJICBjYXNlICFub2RlDQoJCSAgICBvZiBTT01FIG4gPT4gbg0KCQkgICAgIHwgTk9O
RSA9PiBsZXQNCgkJCQkgdmFsIG4gPSBHcmFwaC5uZXdOb2RlIEcNCgkJCSAgICAgICBpbg0KCQkJ
CSBzZXROb2RlSW5mbyAobiwgSnVtcE5vZGUgaik7DQoJCQkJIG5vZGUgOj0gU09NRSBuOw0KCQkJ
CSBuDQoJCQkgICAgICAgZW5kDQoJCWVuZA0KDQoJICAgIHZhbCBmbV9ub2RlID0gZ2V0RnVuY05v
ZGUgZm0NCgkgICAgKCogeyhSb290LCBmbSl9ICopDQoJICAgIHZhbCBfID0gYWRkRWRnZSB7ZnJv
bSA9IFJvb3QsIHRvID0gZm1fbm9kZX0NCg0KCSAgICB2YWwgXw0KCSAgICAgID0gVmVjdG9yLmZv
cmVhY2gNCgkgICAgICAgIChmdW5jdGlvbnMsDQoJCSBmbiB7bmFtZSwgYm9keSwgLi4ufQ0KCQkg
ID0+IGxldA0KCQkgICAgICAgdmFsIGZfcmVhY2ggPSBnZXRGdW5jUmVhY2ggbmFtZQ0KCQkgICAg
ICAgdmFsIGZfbm9kZSA9IGdldEZ1bmNOb2RlIG5hbWUNCgkJICAgICBpbg0KCQkgICAgICAgaWYg
Zl9yZWFjaA0KCQkJIHRoZW4gRXhwLmZvcmVhY2hDYWxsDQoJCQkgICAgICAoYm9keSwNCgkJCSAg
ICAgICBmbiB7ZnVuYywgY29udCwgLi4ufQ0KCQkJICAgICAgICA9PiBpZiBnZXRGdW5jUmVhY2gg
ZnVuYw0KCQkJCSAgICAgdGhlbiBsZXQNCgkJCQkJICAgIHZhbCBnX25vZGUgPSBnZXRGdW5jTm9k
ZSBmdW5jDQoJCQkJCSAgaW4NCgkJCQkJICAgIGNhc2UgY29udA0KCQkJCQkgICAgICBvZiBOT05F
DQoJCQkJCSAgICAgICA9PiAoKiB7KGYsIGcpIHwgKGYsIGcpIGluIFQgDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgIGFuZCBSZWFjaChm
KX0gKikNCgkJCQkJCSAgYWRkRWRnZSB7ZnJvbSA9IGZfbm9kZSwNCgkJCQkJCQkgICB0byA9IGdf
bm9kZX0NCgkJCQkJICAgICAgIHwgU09NRSBqDQoJCQkJCSAgICAgICA9PiBsZXQNCgkJCQkJCSAg
ICB2YWwgal9ub2RlID0gZ2V0SnVtcE5vZGUgag0KCQkJCQkJICBpbg0KCQkJCQkJICAgICgqIHso
Um9vdCwgaikgfCBqIGluIEp1bXB9ICopDQoJCQkJCQkgICAgYWRkRWRnZSB7ZnJvbSA9IFJvb3Qs
DQoJCQkJCQkJICAgICB0byA9IGpfbm9kZX07DQoJCQkJCQkgICAgKCogeyhqLCBnKSB8IChmLCBn
LCBqKSBpbiBODQoJCQkJCQkgICAgICogICAgICBhbmQgUmVhY2goZil9ICopDQoJCQkJCQkgICAg
YWRkRWRnZSB7ZnJvbSA9IGpfbm9kZSwNCgkJCQkJCQkgICAgIHRvID0gZ19ub2RlfQ0KCQkJCQkJ
ICBlbmQNCgkJCQkJICBlbmQNCgkJCQkgICAgIGVsc2UgKCkpDQoJCQkgZWxzZSAoKiB7KFJvb3Qs
IGYpIHwgbm90KFJlYWNoKGYpKX0gKikNCgkJCSAgICAgIGFkZEVkZ2Uge2Zyb20gPSBSb290LA0K
CQkJCSAgICAgICB0byA9IGZfbm9kZX0NCgkJICAgICBlbmQpDQoNCgkgICAgdmFsIHtpZG9tfSA9
IEdyYXBoLmRvbWluYXRvcnMge2dyYXBoID0gRywgcm9vdCA9IFJvb3R9DQoJICAgIGZ1biBhbmNl
c3RvciBub2RlDQoJICAgICAgPSBsZXQNCgkJICB2YWwgcGFyZW50ID0gaWRvbSBub2RlDQoJCWlu
DQoJCSAgaWYgTm9kZS5lcXVhbHMocGFyZW50LCBSb290KQ0KCQkgICAgdGhlbiBub2RlDQoJCSAg
ICBlbHNlIGFuY2VzdG9yIHBhcmVudA0KCQllbmQNCgkgIGluDQoJICAgIFZlY3Rvci5mb3JlYWNo
DQoJICAgIChmdW5jdGlvbnMsDQoJICAgICBmbiB7bmFtZSwgLi4ufQ0KCSAgICAgID0+IGxldA0K
CQkgICB2YWwgRnVuY0RhdGEuVCB7cmNvbnQsIHJlYWNoLCBub2RlLCAuLi59ID0gZ2V0RnVuY0Rh
dGEgbmFtZQ0KCQkgICB2YWwgZl9yY29udCA9IHJjb250DQoJCSAgIHZhbCBmX3JlYWNoID0gIXJl
YWNoDQoJCSAgIHZhbCBmX25vZGUgPSB2YWxPZiAoIW5vZGUpDQoJCSBpbg0KCQkgICBpZiBOb2Rl
LmVxdWFscyhpZG9tIGZfbm9kZSwgUm9vdCkNCgkJICAgICB0aGVuIGlmIGZfcmVhY2gNCgkJCSAg
ICB0aGVuIGZfcmNvbnQgOj0gUkNvbnQuVW5rbm93bg0KCQkJICAgIGVsc2UgZl9yY29udCA6PSBS
Q29udC5VbmNhbGxlZA0KCQkgICAgIGVsc2UgbGV0DQoJCQkgICAgdmFsIGxfbm9kZSA9IGFuY2Vz
dG9yIGZfbm9kZQ0KCQkJICAgIHZhbCBsID0gZ2V0Tm9kZUluZm8gbF9ub2RlDQoJCQkgIGluDQoJ
CQkgICAgY2FzZSBnZXROb2RlSW5mbyBsX25vZGUNCgkJCSAgICAgIG9mIEZ1bmNOb2RlIGcgPT4g
Zl9yY29udCA6PSBSQ29udC5GdW5jTGFiZWwgZw0KCQkJICAgICAgIHwgSnVtcE5vZGUgaiA9PiBm
X3Jjb250IDo9IFJDb250Lkp1bXBMYWJlbCBqDQoJCQkgIGVuZA0KCQkgZW5kKQ0KCSAgZW5kDQog
ICAgZW5kDQogIGVuZA0Kc3RydWN0dXJlIFJDb250ID0gQW5hbHl6ZVJDb250LlJDb250DQpzdHJ1
Y3R1cmUgRnVuY0RhdGEgPSBBbmFseXplUkNvbnQuRnVuY0RhdGENCnN0cnVjdHVyZSBKdW1wRGF0
YSA9IEFuYWx5emVSQ29udC5KdW1wRGF0YQ0KDQpzdHJ1Y3R1cmUgQ29udFNldCA9DQogICBzdHJ1
Y3QNCiAgICAgIGRhdGF0eXBlIHNldCA9DQoJIEVtcHR5DQogICAgICAgfCBNYWluQ29udA0KICAg
ICAgIHwgT25lIG9mIEp1bXAudA0KICAgICAgIHwgUmV0dXJuIG9mIEZ1bmMudA0KICAgICAgIHwg
QWxsDQoNCiAgICAgIGZ1biBsYXlvdXRTZXQgcyA9DQoJIGxldCBvcGVuIExheW91dA0KCSBpbiBj
YXNlIHMgb2YNCgkgICAgRW1wdHkgPT4gc3RyICJ7fSINCgkgIHwgTWFpbkNvbnQgPT4gc3RyICJN
YWluQ29udCINCgkgIHwgT25lIGogPT4gc2VxIFtzdHIgInsgIiwgSnVtcC5sYXlvdXQgaiwgc3Ry
ICIgfSJdDQoJICB8IFJldHVybiBmID0+IHNlcSBbc3RyICJ7ICIsIEZ1bmMubGF5b3V0IGYsIHN0
ciAiIH0iXQ0KCSAgfCBBbGwgPT4gc3RyICJBbGwiDQoJIGVuZA0KDQogICAgICBkYXRhdHlwZSB0
ID0gVCBvZiB7c2V0OiBzZXQgcmVmLA0KCQkJIGxlc3NUaGFuOiB0IGxpc3QgcmVmfQ0KDQogICAg
ICBmdW4gc2V0IChUIHtzZXQsIC4uLn0pID0gIXNldA0KDQogICAgICB2YWwgbGF5b3V0ID0gbGF5
b3V0U2V0IG8gc2V0DQogICAgICB2YWwgdG9TdHJpbmcgPSBMYXlvdXQudG9TdHJpbmcgbyBsYXlv
dXQNCg0KICAgICAgZnVuIGlzRW1wdHkgYyA9IChjYXNlIHNldCBjIG9mDQoJCQkgIEVtcHR5ID0+
IHRydWUNCgkJCXwgXyA9PiBmYWxzZSkNCgkgDQogICAgICBmdW4gbmV3ICgpID0gVCB7c2V0ID0g
cmVmIEVtcHR5LA0KCQkgICAgICBsZXNzVGhhbiA9IHJlZiBbXX0NCg0KICAgICAgZnVuIHVwIChU
IHtzZXQsIGxlc3NUaGFufSwgcykgPQ0KCSBsZXQNCgkgICAgZnVuIGRvaXQgcyA9IChzZXQgOj0g
czsgTGlzdC5mb3JlYWNoICghbGVzc1RoYW4sIGZuIGMgPT4gdXAgKGMsIHMpKSkNCgkgaW4gY2Fz
ZSAoIXNldCwgcykgb2YNCgkgICAgKF8sIEVtcHR5KSA9PiAoKQ0KCSAgfCAoQWxsLCBfKSA9PiAo
KQ0KCSAgfCAoRW1wdHksIGspID0+IGRvaXQgaw0KCSAgfCAoTWFpbkNvbnQsIE1haW5Db250KSA9
PiAoKQ0KCSAgfCAoT25lIGosIE9uZSBqJykgPT4gaWYgSnVtcC5lcXVhbHMgKGosIGonKSB0aGVu
ICgpIGVsc2UgZG9pdCBBbGwNCgkgIHwgKFJldHVybiBmLCBSZXR1cm4gZicpID0+IGlmIEZ1bmMu
ZXF1YWxzIChmLCBmJykgdGhlbiAoKSBlbHNlIGRvaXQgQWxsDQoJICB8IF8gPT4gZG9pdCBBbGwN
CgkgZW5kDQoNCiAgICAgIHZhbCB1cCA9IFRyYWNlLnRyYWNlMiAoInVwIiwgbGF5b3V0LCBsYXlv
dXRTZXQsIFVuaXQubGF5b3V0KSB1cA0KDQogICAgICB2YWwgb3AgPD0gPQ0KCSBmbiAoVCB7c2V0
LCBsZXNzVGhhbn0sIGMpID0+DQoJICAgICAgKExpc3QucHVzaCAobGVzc1RoYW4sIGMpDQoJICAg
ICAgIDsgdXAgKGMsICFzZXQpKQ0KCSAgICAgIA0KICAgICAgZnVuIGFkZFJldHVybiAoYywgZikg
PSB1cCAoYywgUmV0dXJuIGYpDQogICAgICBmdW4gYWRkSnVtcCAoYywgaikgPSB1cCAoYywgT25l
IGopDQogICAgICBmdW4gYWRkTWFpbiBjID0gdXAgKGMsIE1haW5Db250KQ0KICAgICAgZnVuIG1h
a2VUb3AgYyA9IHVwIChjLCBBbGwpDQogICBlbmQNCgkgDQpzdHJ1Y3R1cmUgQ2FsbEluZm8gPQ0K
ICAgc3RydWN0DQogICAgICBkYXRhdHlwZSB0ID0NCgkgTm9PdXRlckNhbGxzDQogICAgICAgfCBP
bmVPdXRlckNhbGwNCiAgICAgICB8IE5vdENvbnQNCg0KICAgICAgdmFsIHRvU3RyaW5nID0NCgkg
Zm4gTm9PdXRlckNhbGxzID0+ICJOb091dGVyQ2FsbHMiDQoJICB8IE9uZU91dGVyQ2FsbCA9PiAi
T25lT3V0ZXJDYWxsIg0KCSAgfCBOb3RDb250ID0+ICJOb3RDb250Ig0KDQogICAgICB2YWwgbGF5
b3V0ID0gTGF5b3V0LnN0ciBvIHRvU3RyaW5nDQogICBlbmQNCiAgIA0Kc3RydWN0dXJlIEdyYXBo
ID0gRGlyZWN0ZWRHcmFwaA0Kc3RydWN0dXJlIE5vZGUgPSBHcmFwaC5Ob2RlDQogIA0KZnVuIGNv
bnRpZnkgKHByb2dyYW0gYXMgUHJvZ3JhbS5UIHtkYXRhdHlwZXMsIGdsb2JhbHMsIGZ1bmN0aW9u
cywgbWFpbn0pID0NCiAgIGxldA0KICAgICAgdmFsIHN0cmF0ZWd5ID0gIUNvbnRyb2wuY29udGlm
eVN0cmF0ZWd5DQogICBpbiBjYXNlIHN0cmF0ZWd5IG9mDQogICAgICBDb250cm9sLk5vbmUgPT4g
cHJvZ3JhbQ0KICAgIHwgXyA9PiANCgkgbGV0DQoJICAgIGRhdGF0eXBlICdhIHJlcGxhY2UgPQ0K
CSAgICAgICBOb25lDQoJICAgICB8IE9uZUNhbGwgb2YgJ2ENCgkgICAgIHwgT25lQ29udCBvZiAn
YQ0KCSAgICB2YWwge2dldCA9IGZ1bmNJbmZvOg0KCQkgRnVuYy50IC0+IHsNCgkJCSAgICBjYWxs
ZXJzOiBGdW5jLnQgbGlzdCByZWYsDQoJCQkgICAgY2FsbEluZm86IENhbGxJbmZvLnQgcmVmLA0K
CQkJICAgIGNhblByZWZpeDogYm9vbCByZWYsDQoJCQkgICAgcmNvbnRGdW5jRGF0YTogRnVuY0Rh
dGEudCwNCgkJCSAgICBjb250U2V0OiBDb250U2V0LnQsDQoJCQkgICAgaXNMb2NhbDogYm9vbCBy
ZWYsDQoJCQkgICAgbmVzdGVkOiBGdW5jLnQgbGlzdCByZWYsDQoJCQkgICAgbm9kZTogR3JhcGgu
Tm9kZS50IG9wdGlvbiByZWYsDQoJCQkgICAgcG9zc2libGVQcmVmaXhlczogRnVuYy50IGxpc3Qg
cmVmLA0KCQkJICAgIHByZWZpeGVzOiBGdW5jLnQgbGlzdCBvcHRpb24gcmVmLA0KCQkJICAgIHJl
cGxhY2U6IHthcmdzOiAoVmFyLnQgKiBUeXBlLnQpIHZlY3RvciwNCgkJCQkgICAgICBib2R5OiBF
eHAudCwNCgkJCQkgICAgICBqdW1wOiBKdW1wLnR9IG9wdGlvbiByZWYNCgkJCSAgICB9fSA9DQoJ
ICAgICAgIFByb3BlcnR5LmdldCAoRnVuYy5wbGlzdCwNCgkJCSAgICAgUHJvcGVydHkuaW5pdEZ1
bg0KCQkJICAgICAoZm4gXyA9PiB7Y2FsbGVycyA9IHJlZiBbXSwNCgkJCQkgICAgICAgY2FsbElu
Zm8gPSByZWYgQ2FsbEluZm8uTm9PdXRlckNhbGxzLA0KCQkJCSAgICAgICBjYW5QcmVmaXggPSBy
ZWYgZmFsc2UsDQoJCQkJICAgICAgIHJjb250RnVuY0RhdGEgPSBGdW5jRGF0YS5uZXcgKCksDQoJ
CQkJICAgICAgIGNvbnRTZXQgPSBDb250U2V0Lm5ldyAoKSwNCgkJCQkgICAgICAgaXNMb2NhbCA9
IHJlZiBmYWxzZSwNCgkJCQkgICAgICAgbmVzdGVkID0gcmVmIFtdLA0KCQkJCSAgICAgICBub2Rl
ID0gcmVmIE5PTkUsDQoJCQkJICAgICAgIHBvc3NpYmxlUHJlZml4ZXMgPSByZWYgW10sDQoJCQkJ
ICAgICAgIHByZWZpeGVzID0gcmVmIE5PTkUsDQoJCQkJICAgICAgIHJlcGxhY2UgPSByZWYgTk9O
RX0pKQ0KDQoJICAgIHZhbCB7Z2V0ID0ganVtcEluZm86IEp1bXAudCAtPg0KCQkge3Jjb250SnVt
cERhdGE6IEp1bXBEYXRhLnQsDQoJCSAgcG9zc2libGVQcmVmaXhlczogRnVuYy50IGxpc3QgcmVm
LA0KCQkgIHByZWZpeGVzOiBGdW5jLnQgbGlzdCBvcHRpb24gcmVmfX0gPQ0KCSAgICAgICBQcm9w
ZXJ0eS5nZXQgKEp1bXAucGxpc3QsDQoJCQkgICAgIFByb3BlcnR5LmluaXRGdW4NCgkJCSAgICAg
KGZuIF8gPT4ge3Jjb250SnVtcERhdGEgPSBKdW1wRGF0YS5uZXcgKCksDQoJCQkJICAgICAgIHBv
c3NpYmxlUHJlZml4ZXMgPSByZWYgW10sDQoJCQkJICAgICAgIHByZWZpeGVzID0gcmVmIE5PTkV9
KSkNCg0KKCogZmx1ZXQgKyAqKQ0KCSAgICB2YWwgZ2V0RnVuY0RhdGEgPSAjcmNvbnRGdW5jRGF0
YSBvIGZ1bmNJbmZvDQoJICAgIHZhbCBnZXRKdW1wRGF0YSA9ICNyY29udEp1bXBEYXRhIG8ganVt
cEluZm8NCgkgICAgdmFsIF8gPSBBbmFseXplUkNvbnQuYW5hbHl6ZVJDb250IHtwcm9ncmFtID0g
cHJvZ3JhbSwNCgkJCQkJICAgICAgIGdldEZ1bmNEYXRhID0gZ2V0RnVuY0RhdGEsDQoJCQkJCSAg
ICAgICBnZXRKdW1wRGF0YSA9IGdldEp1bXBEYXRhfQ0KDQoJICAgICgqIENvbXB1dGUgdGhlIGNv
bnRTZXQgYW5kIGNhbGxJbmZvIGZvciBlYWNoIGZ1bmN0aW9uLg0KCSAgICAgKiBUaGUgY29udFNl
dCBpcyBhbiBvdmVyLWFwcHJveGltYXRpb24gdG8gdGhlIHNldCBvZiBjb250aW51YXRpb25zDQoJ
ICAgICAqIHdpdGggd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4NCgkgICAgICogVGhlIGNh
bGxJbmZvIHRlbGxzIGF0IGhvdyBtYW55IHBsYWNlcyBvdXRzaWRlIG9mIGl0c2VsZiBlYWNoDQoJ
ICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4NCgkgICAgICopDQoJICAgIHZhbCBfID0gQ29udFNl
dC5hZGRNYWluICgjY29udFNldCAoZnVuY0luZm8gbWFpbikpDQoJICAgIHZhbCBfID0NCgkgICAg
ICAgVmVjdG9yLmZvcmVhY2gNCgkgICAgICAgKGZ1bmN0aW9ucywgZm4ge25hbWUsIGJvZHksIC4u
Ln0gPT4NCgkJbGV0IHZhbCB7Y2FsbEluZm8sIGNvbnRTZXQgPSBjLCAuLi59ID0gZnVuY0luZm8g
bmFtZQ0KCQlpbiBFeHAuZm9yZWFjaENhbGwNCgkJICAgKGJvZHksIGZuIHtmdW5jLCBjb250LCAu
Li59ID0+DQoJCSAgICBpZiBGdW5jLmVxdWFscyhuYW1lLCBmdW5jKQ0KCQkgICAgICAgdGhlbg0K
CQkJICBjYXNlIGNvbnQgb2YNCgkJCSAgICAgTk9ORSA9PiAoKQ0KCQkJICAgfCBTT01FIF8gPT4g
KGNhbGxJbmZvIDo9IENhbGxJbmZvLk5vdENvbnQNCgkJCQkJOyBDb250U2V0Lm1ha2VUb3AgYykN
CgkJICAgIGVsc2UNCgkJICAgICAgIGxldA0KCQkJICB2YWwge2NhbGxlcnMsIGNhbGxJbmZvID0g
Y2FsbEluZm8nLCBjb250U2V0ID0gYycsIC4uLn0gPQ0KCQkJICAgICBmdW5jSW5mbyBmdW5jDQoJ
CQkgIHZhbCBfID0NCgkJCSAgICAgbGV0DQoJCQkJZGF0YXR5cGUgeiA9IGRhdGF0eXBlIENhbGxJ
bmZvLnQNCgkJCSAgICAgaW4gY2FzZSAhY2FsbEluZm8nIG9mDQoJCQkJTm9PdXRlckNhbGxzID0+
IGNhbGxJbmZvJyA6PSBPbmVPdXRlckNhbGwNCgkJCSAgICAgIHwgT25lT3V0ZXJDYWxsID0+IGNh
bGxJbmZvJyA6PSBOb3RDb250DQoJCQkgICAgICB8IE5vdENvbnQgPT4gKCkNCgkJCSAgICAgZW5k
DQoJCQkgIHZhbCBfID0gTGlzdC5wdXNoIChjYWxsZXJzLCBuYW1lKQ0KCQkgICAgICAgaW4gY2Fz
ZSBjb250IG9mDQoJCQkgIE5PTkUgPT4gQ29udFNldC48PSAoYywgYycpDQoJCQkoKiBDb250U2V0
LmFkZFJldHVybiAoYywgbmFtZSkgKikNCgkJCXwgU09NRSBqID0+IENvbnRTZXQuYWRkSnVtcCAo
YycsIGopDQoJCSAgICAgICBlbmQpDQoJCWVuZCkNCgkgICAgKCogUmVjb3JkIGZvciBlYWNoIGp1
bXAgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIHR1cm5lZCBpbnRvDQoJICAgICAqIGNvbnRp
bnVhdGlvbnMgYXMgaXRzIHByZWZpeGVzLg0KCSAgICAgKiBSZWNvcmQgZm9yIGVhY2ggZnVuY3Rp
b24gdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IHByZWZpeCBpdHMNCgkgICAgICogcmV0dXJuLg0K
CSAgICAgKikNCg0KCSAgICB2YWwgdG9kbyA9IHJlZiBbXQ0KCSAgICB2YWwgXyA9DQoJICAgICAg
IFZlY3Rvci5mb3JlYWNoDQoJICAgICAgIChmdW5jdGlvbnMsIGZuIHtuYW1lLCAuLi59ID0+DQoJ
CWxldA0KCQkgICB2YWwge2NvbnRTZXQsIC4uLn0gPSBmdW5jSW5mbyBuYW1lDQoJCSAgIGZ1biBk
b2l0IChwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykgPQ0KCQkgICAgICBsZXQNCgkJCSB2YWwg
XyA9DQoJCQkgICAgY2FzZSAhcG9zc2libGVQcmVmaXhlcyBvZg0KCQkJICAgICAgIFtdID0+IExp
c3QucHVzaCAodG9kbywNCgkJCQkJCShwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykpDQoJCQkg
ICAgIHwgXyA9PiAoKQ0KCQkgICAgICBpbiBMaXN0LnB1c2ggKHBvc3NpYmxlUHJlZml4ZXMsIG5h
bWUpDQoJCSAgICAgIGVuZA0KDQooKiBmbHVldCArICopDQoJCSAgIGZ1biBkb2l0X25ldyAoKQ0K
CQkgICAgID0gKGNhc2UgRnVuY0RhdGEucmNvbnQgKCNyY29udEZ1bmNEYXRhKGZ1bmNJbmZvIG5h
bWUpKQ0KCQkgICAgICAgICAgb2YgUkNvbnQuRnVuY0xhYmVsIGYNCgkJICAgICAgICAgICA9PiBs
ZXQgDQoJCQkJdmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcywgLi4ufSANCgkJCQkgID0g
ZnVuY0luZm8gZg0KCQkJICAgICAgaW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMp
DQoJCQkgICAgICBlbmQNCgkJICAgICAgICAgICB8IFJDb250Lkp1bXBMYWJlbCBqDQoJCQkgICA9
PiBsZXQgDQoJCQkJdmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcywgLi4ufSANCgkJCQkg
ID0ganVtcEluZm8gag0KCQkJICAgICAgaW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4
ZXMpDQoJCQkgICAgICBlbmQNCgkJCSAgIHwgXyA9PiAoKSkNCg0KKCogZmx1ZXQgKyAqKQ0KCQkg
ICBmdW4gZG9pdF9jb250ICgpDQoJCSAgICAgPSAoY2FzZSBDb250U2V0LnNldCAoI2NvbnRTZXQo
ZnVuY0luZm8gbmFtZSkpIG9mDQoJCQlDb250U2V0Lk9uZSBqID0+IA0KCQkJICAgbGV0IHZhbCB7
cG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMsIC4uLn0gDQoJCQkgICAgICAgICA9IGp1bXBJbmZv
IGoNCgkJCSAgIGluIGRvaXQgKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZpeGVzKQ0KCQkJICAgZW5k
DQoJCSAgICAgIHwgQ29udFNldC5SZXR1cm4gZiA9Pg0KCQkJICAgbGV0IHZhbCB7cG9zc2libGVQ
cmVmaXhlcywgcHJlZml4ZXMsIC4uLn0gDQoJCQkgICAgID0gZnVuY0luZm8gZg0KCQkJICAgaW4g
ZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCQkgICBlbmQNCgkJICAgICAgfCBf
ID0+ICgpKQ0KDQooKiBmbHVldCArICopDQoJCWluIGNhc2Ugc3RyYXRlZ3kgb2YgDQoJCSAgIENv
bnRyb2wuQ29udCA9PiBkb2l0X2NvbnQgKCkNCgkJIHwgQ29udHJvbC5Cb3RoID0+IGRvaXRfY29u
dCAoKQ0KCQkgfCBDb250cm9sLk5ldyA9PiBkb2l0X25ldyAoKQ0KCQkgfCBfID0+ICgpDQoJCWVu
ZCkNCg0KKCogZmx1ZXQgLSAqKQ0KKCoNCgkJICAgdmFsIHtjb250U2V0LCAuLi59ID0gZnVuY0lu
Zm8gbmFtZQ0KCQlpbiBjYXNlIENvbnRTZXQuc2V0IGNvbnRTZXQgb2YNCgkJICAgQ29udFNldC5P
bmUgaiA9PiANCgkJICAgICAgbGV0IHZhbCB7cG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMsIC4u
Ln0gPSBqdW1wSW5mbyBqDQoJCSAgICAgIGluIGRvaXQgKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZp
eGVzKQ0KCQkgICAgICBlbmQNCgkJIHwgQ29udFNldC5SZXR1cm4gZiA9Pg0KCQkgICAgICBsZXQg
dmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcywgLi4ufSA9IGZ1bmNJbmZvIGYNCgkJCSAg
dmFsIF8gPSBwcmludCAiQ29udFNldC5SZXR1cm4gZiINCgkJICAgICAgaW4gZG9pdCAocG9zc2li
bGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCSAgICAgIGVuZA0KCQkgfCBfID0+ICgpDQoJCWVuZCkN
CiopDQoJICAgICgqIFN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIG9mIGEgZ3JvdXAgb2Yg
ZnVuY3Rpb25zLiAqKQ0KCSAgICBmdW4gc2NjcyAoZnM6IEZ1bmMudCBsaXN0KSA9DQoJICAgICAg
IGxldA0KCQkgIHZhbCBnID0gR3JhcGgubmV3ICgpDQoJCSAgdmFsIHtnZXQgPSBub2RlRnVuYywg
c2V0ID0gc2V0Tm9kZUZ1bmN9ID0NCgkJICAgICBQcm9wZXJ0eS5nZXRTZXRPbmNlDQoJCSAgICAg
KE5vZGUucGxpc3QsIFByb3BlcnR5LmluaXRSYWlzZSAoImZ1bmMiLCBOb2RlLmxheW91dCkpDQoJ
CSAgIHZhbCBfID0NCgkJICAgICAgTGlzdC5mb3JlYWNoIChmcywgZm4gZiA9Pg0KCQkJCSAgICBs
ZXQgdmFsIHtub2RlLCAuLi59ID0gZnVuY0luZm8gZg0KCQkJCSAgICAgICB2YWwgbiA9IEdyYXBo
Lm5ld05vZGUgZw0KCQkJCSAgICAgICB2YWwgXyA9IHNldE5vZGVGdW5jIChuLCBmKQ0KCQkJCSAg
ICAgICB2YWwgXyA9IG5vZGUgOj0gU09NRSBuDQoJCQkJICAgIGluICgpDQoJCQkJICAgIGVuZCkN
CgkJICAgKCogQnVpbGQgdGhlIGNhbGwgZ3JhcGguDQoJCSAgICAqIEVkZ2VzIGdvIGZyb20gbm9k
ZXMgdG8gdGhlIGNhbGxlcnMuDQoJCSAgICAqKQ0KCQkgICB2YWwgXyA9DQoJCSAgICAgIExpc3Qu
Zm9yZWFjaA0KCQkgICAgICAoZnMsIGZuIGYgPT4NCgkJICAgICAgIGxldCB2YWwge25vZGUsIGNh
bGxlcnMsIC4uLn0gPSBmdW5jSW5mbyBmDQoJCQkgIHZhbCBmcm9tID0gdmFsT2YgKCFub2RlKQ0K
CQkgICAgICAgaW4gTGlzdC5mb3JlYWNoDQoJCQkgICghY2FsbGVycywgZm4gZicgPT4NCgkJCSAg
IGxldCB2YWwge25vZGUsIC4uLn0gPSBmdW5jSW5mbyBmJw0KCQkJICAgaW4gY2FzZSAhbm9kZSBv
Zg0KCQkJICAgICAgTk9ORSA9PiAoKQ0KCQkJICAgIHwgU09NRSB0byA9Pg0KCQkJCSAoR3JhcGgu
YWRkRWRnZSAoZywge2Zyb20gPSBmcm9tLCB0byA9IHRvfSkNCgkJCQkgIDsgKCkpDQoJCQkgICBl
bmQpDQoJCSAgICAgICBlbmQpDQoJCSAgIHZhbCBfID0gTGlzdC5mb3JlYWNoIChmcywgZm4gZiA9
PiAjbm9kZSAoZnVuY0luZm8gZikgOj0gTk9ORSkNCgkJICAgdmFsIG5zcyA9IEdyYXBoLnN0cm9u
Z2x5Q29ubmVjdGVkQ29tcG9uZW50cyBnDQoJICAgICAgIGluIExpc3QubWFwIChuc3MsIGZuIG5z
ID0+IExpc3QucmV2TWFwIChucywgbm9kZUZ1bmMpKQ0KCSAgICAgICBlbmQNCgkgICAgDQoJICAg
ICgqIEZvciBlYWNoIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIHBy
ZWZpeCBhIGNvbnQsDQoJICAgICAqIGRvIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMg
Y29tcHV0YXRpb24uICBJbiBvcmRlciBmb3IgdGhlDQoJICAgICAqIGZ1bmN0aW9ucyB0byBiZSBj
b250aWZpZWQsIHRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBmdW5jdGlvbiBpbg0KCSAgICAgKiBl
YWNoIGNvbXBvbmVudCB0aGF0IGlzIGNhbGxlZCBmcm9tIG91dHNpZGUuICBUaGlzIGlzIGR1ZSB0
byB0aGUNCgkgICAgICogZmFjdCB0aGF0IG11dHVhbGx5IHJlY3Vyc2l2ZSBjb250aW51YXRpb25z
IGNhbm5vdCBiZSBkaXJlY3RseQ0KCSAgICAgKiBkZWNsYXJlZCBpbiBDUFMgLS0gdGhlIG9ubHkg
d2F5IHRvIGRvIHNvIGlzIHRvIG5lc3Qgb25lIHdpdGhpbiB0aGUNCgkgICAgICogb3RoZXIuICBU
aHVzIG9ubHkgb25lIGNhbiBiZSAiZXhwb3J0ZWQiLg0KCSAgICAgKikNCgkgICAgZXhjZXB0aW9u
IE5vcGUNCgkgICAgKCogc2NjSGVhZHMgcmV0dXJucyB0aGUgaGVhZCBmdW5jdGlvbiBmb3IgZWFj
aCBzY2MgaW4gdGhlIGxpc3Qgb2YNCgkgICAgICogZnVuY3Rpb25zLiAgSXQgcmFpc2VzIE5vcGUg
aWYgdGhlcmUgaXMgYW4gc2NjIHdpdGggbW9yZSB0aGFuIG9uZQ0KCSAgICAgKiBmdW5jdGlvbiBj
YWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBzY2MuDQoJICAgICAqKQ0KCSAgICBmdW4gc2NjSGVhZHMg
KGZzOiBGdW5jLnQgbGlzdCk6IEZ1bmMudCBsaXN0ID0NCgkgICAgICAgTGlzdC5tYXANCgkgICAg
ICAgKHNjY3MgZnMsIGZuIGZzID0+DQoJCWxldA0KCQkgICBmdW4gc2V0TG9jYWwgYiA9DQoJCSAg
ICAgIExpc3QuZm9yZWFjaCAoZnMsIGZuIGYgPT4gI2lzTG9jYWwgKGZ1bmNJbmZvIGYpIDo9IGIp
DQoJCSAgIHZhbCBfID0gc2V0TG9jYWwgdHJ1ZQ0KCQkgICB2YWwgb3V0c2lkZUNhbGxlciA9IHJl
ZiBOT05FDQoJCSAgIHZhbCBfID0NCgkJICAgICAgTGlzdC5mb3JlYWNoDQoJCSAgICAgIChmcywg
Zm4gZiA9Pg0KCQkgICAgICAgbGV0IHZhbCB7Y2FsbGVycywgLi4ufSA9IGZ1bmNJbmZvIGYNCgkJ
ICAgICAgIGluIGlmIExpc3QuZXhpc3RzICghY2FsbGVycywgZm4gZiA9Pg0KCQkJCQkgIG5vdCAo
ISgjaXNMb2NhbCAoZnVuY0luZm8gZikpKSkNCgkJCSAgICAgdGhlbiAoY2FzZSAhb3V0c2lkZUNh
bGxlciBvZg0KCQkJCSAgICAgIFNPTUUgXyA9PiByYWlzZSBOb3BlDQoJCQkJICAgIHwgTk9ORSA9
PiBvdXRzaWRlQ2FsbGVyIDo9IFNPTUUgZikNCgkJCSAgZWxzZSAoKQ0KCQkgICAgICAgZW5kKQ0K
CQkgICB2YWwgXyA9IHNldExvY2FsIGZhbHNlDQoJCWluIGNhc2UgIW91dHNpZGVDYWxsZXIgb2YN
CgkJICAgTk9ORSA9PiBFcnJvci5idWcgIm5vIG91dHNpZGUgY2FsbGVyIg0KCQkgfCBTT01FIGYg
PT4NCgkJICAgICAgbGV0DQoJCQkgdmFsIHtuZXN0ZWQsIC4uLn0gPSBmdW5jSW5mbyBmDQoJCQkg
dmFsIHJlc3QgPSBMaXN0LnJlbW92ZUZpcnN0IChmcywgZm4gZicgPT4NCgkJCQkJCSAgICAgIEZ1
bmMuZXF1YWxzIChmLCBmJykpDQoJCQkgdmFsIF8gPSBuZXN0ZWQgOj0gc2NjSGVhZHMgcmVzdA0K
CQkgICAgICBpbiBmDQoJCSAgICAgIGVuZA0KCQllbmQpDQoJICAgIHZhbCBfID0NCgkgICAgICAg
TGlzdC5mb3JlYWNoDQoJICAgICAgICghdG9kbywgZm4gKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZp
eGVzKSA9Pg0KCQlsZXQNCgkJICAgdmFsIGZzID0gIXBvc3NpYmxlUHJlZml4ZXMNCgkJICAgdmFs
IF8gPSBwcmVmaXhlcyA6PSBTT01FIChzY2NIZWFkcyBmcykNCgkJICAgdmFsIF8gPSBMaXN0LmZv
cmVhY2ggKGZzLCBmbiBmID0+DQoJCQkJCSAjY2FuUHJlZml4IChmdW5jSW5mbyBmKSA6PSB0cnVl
KQ0KCQlpbiAoKQ0KCQllbmQgaGFuZGxlIE5vcGUgPT4gKCkpDQoJICAgICgqIERpYWdub3N0aWNz
LiAqKQ0KCSAgICB2YWwgXyA9DQoJICAgICAgIGlmIHRydWUNCgkJICB0aGVuIA0KCQkgICAgIGxl
dA0KKCogZmx1ZXQgLSAqKQ0KKCogT0xEIERJQUdOT1NUSUNTICopDQooKg0KCQkJdmFsIF8gPQ0K
CQkJICAgUHJvZ3JhbS5sYXlvdXRzDQoJCQkgICAocHJvZ3JhbSwgZm4gbCA9PiANCgkJCSAgICAo
TGF5b3V0Lm91dHB1dCAobCwgT3V0LmVycm9yKQ0KCQkJICAgICA7IE91dC5uZXdsaW5lIE91dC5l
cnJvcikpDQoJCQl2YWwgb2xkID0gcmVmIDANCgkJCXZhbCBuZXcgPSByZWYgMA0KCQkJdmFsIG5l
d05vID0gcmVmIDANCgkJCXZhbCBzYW1lID0gcmVmIDANCgkJCXZhbCBzYW1lTm8gPSByZWYgMA0K
CQkgICAgIGluIFZlY3Rvci5mb3JlYWNoDQoJCQkoZnVuY3Rpb25zLCBmbiB7bmFtZSwgLi4ufSA9
Pg0KCQkJIGxldA0KCQkJICAgIHZhbCB7Y2FsbEluZm8sIGNhblByZWZpeCwgY29udFNldCwgLi4u
fSA9IGZ1bmNJbmZvIG5hbWUNCgkJCSAgICBmdW4gZG9pdCAociwgcykgPQ0KCQkJICAgICAgIChJ
bnQuaW5jIHINCgkJCQk7IGlmIGZhbHNlDQoJCQkJICAgICB0aGVuIHByaW50IChjb25jYXQgW3Ms
ICIgIiwNCgkJCQkJCQkgRnVuYy50b1N0cmluZyBuYW1lLCAiXG4iXSkNCgkJCQkgIGVsc2UgKCkp
DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIENhbGxJbmZvLnQNCgkJCSAgICBkYXRhdHlw
ZSB6ID0gZGF0YXR5cGUgQ29udFNldC5zZXQNCgkJCSBpbiBjYXNlICghY2FsbEluZm8sIENvbnRT
ZXQuc2V0IGNvbnRTZXQpIG9mDQoJCQkgICAgKE9uZU91dGVyQ2FsbCwgT25lIF8pID0+DQoJCQkg
ICAgICAgaWYgIWNhblByZWZpeA0KCQkJCSAgdGhlbiBkb2l0IChzYW1lLCAic2FtZSIpDQoJCQkg
ICAgICAgZWxzZSBkb2l0IChzYW1lTm8sICJzYW1lTm8iKQ0KCQkJICB8IChPbmVPdXRlckNhbGws
IF8pID0+IGRvaXQgKG9sZCwgIm9sZCIpDQoJCQkgIHwgKF8sIE9uZSBfKSA9Pg0KCQkJICAgICAg
IGlmICFjYW5QcmVmaXgNCgkJCQkgIHRoZW4gZG9pdCAobmV3LCAibmV3IikNCgkJCSAgICAgICBl
bHNlIGRvaXQgKG5ld05vLCAibmV3Tm8iKQ0KCQkJICB8IF8gPT4gKCkNCgkJCSBlbmQpDQoJCQk7
IHByaW50IChjb25jYXQNCgkJCQkgWyJudW0gZnVuY3Rpb25zICIsDQoJCQkJICBJbnQudG9TdHJp
bmcgKFZlY3Rvci5sZW5ndGggZnVuY3Rpb25zKSwNCgkJCQkgICIgIHNhbWUgIiwgSW50LnRvU3Ry
aW5nICghc2FtZSksDQoJCQkJICAiICBzYW1lTm8gIiwgSW50LnRvU3RyaW5nICghc2FtZU5vKSwN
CgkJCQkgICIgIG51bSBuZXcgIiwgSW50LnRvU3RyaW5nICghbmV3KSwNCgkJCQkgICIgIG51bSBu
ZXdObyAiLCBJbnQudG9TdHJpbmcgKCFuZXdObyksDQoJCQkJICAiICBudW0gb2xkICIsIEludC50
b1N0cmluZyAoIW9sZCksDQoJCQkJICAiXG4iXSkNCgkJICAgICBlbmQNCiopDQoNCigqIGZsdWV0
ICsgKikNCigqIE5FVyBESUFHTk9TVElDUyAqKQ0KCQkgICAgICAgICgqIHByaW50IG91dCBlbnRp
cmUgY3BzIElMICopDQoJCSAgICAgICAgdmFsIGNwcyA9IGZhbHNlDQoJCQkoKiBwcmludCBvdXQg
dGhlIGNhbGxJbmZvIGZvciBlYWNoIGZ1bmN0aW9uICopDQoJCQkoKiBwcmludCBvdXQgdGhlIHJj
b250IGZvciBlYWNoIGZ1bmN0aW9uICopDQoJCQkoKiBwcmludCBvdXQgdGhlIGNvbnQgc2V0IGZv
ciBlYWNoIGZ1bmN0aW9uICopDQoJCQl2YWwgYW5hbHlzaXMgPSBmYWxzZQ0KCQkJKCogcHJpbnQg
b3V0IGFjdGlvbiAoY29udGlmaWFibGUsIHJlbW92ZWFibGUpICopDQoJCSAgICAgICAgdmFsIGFj
dGlvbiA9IGZhbHNlDQoJCQkoKiBwcmludCBvdXQgdGhlIHRvdGFscyAqKQ0KCQkJdmFsIHRvdGFs
cyA9IHRydWUNCg0KCQkJdmFsIF8NCgkJCSAgPSBpZiBjcHMNCgkJCSAgICAgIHRoZW4gUHJvZ3Jh
bS5sYXlvdXRzDQoJCQkJICAgKHByb2dyYW0sIA0KCQkJCSAgICBmbiBsID0+IChMYXlvdXQub3V0
cHV0IChsLCBPdXQuZXJyb3IpDQoJCQkJCSAgICAgOyBPdXQubmV3bGluZSBPdXQuZXJyb3IpKQ0K
CQkJICAgICAgZWxzZSAoKQ0KDQoJCQl2YWwgY2FsbF9jb250X25ldyA9IHJlZiAwDQoJCQl2YWwg
Y2FsbF9jb250ID0gcmVmIDANCgkJCXZhbCBjYWxsX25ldyA9IHJlZiAwDQoJCQl2YWwgY29udF9u
ZXcgPSByZWYgMA0KCQkJdmFsIGNhbGwgPSByZWYgMA0KCQkJdmFsIGNvbnQgPSByZWYgMA0KCQkJ
dmFsIG5ldyA9IHJlZiAwDQoJCQl2YWwgcmVtX2NvbnRfbmV3ID0gcmVmIDANCgkJCXZhbCByZW1f
Y29udCA9IHJlZiAwDQoJCQl2YWwgcmVtX25ldyA9IHJlZiAwDQoNCgkJICAgICBpbiBWZWN0b3Iu
Zm9yZWFjaA0KCQkJKGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4NCgkJCSBsZXQNCgkJCSAg
ICB2YWwge2NhbGxJbmZvLCBjYW5QcmVmaXgsIA0KCQkJCSBjb250U2V0LCByY29udEZ1bmNEYXRh
LCAuLi59IA0KCQkJICAgICAgPSBmdW5jSW5mbyBuYW1lDQoNCgkJCSAgICB2YWwgXyANCgkJCSAg
ICAgID0gaWYgYW5hbHlzaXMNCgkJCQkgIHRoZW4gcHJpbnQgKGNvbmNhdCBbRnVuYy50b1N0cmlu
ZyBuYW1lLA0KCQkJCQkJICAgICAgIjo6IiwNCgkJCQkJCSAgICAgICIgY2FsbEluZm86ICIsDQoJ
CQkJCQkgICAgICBDYWxsSW5mby50b1N0cmluZw0KCQkJCQkJICAgICAgKCFjYWxsSW5mbyksDQoJ
CQkJCQkgICAgICAiLCBjb250U2V0OiAiLA0KCQkJCQkJICAgICAgQ29udFNldC50b1N0cmluZw0K
CQkJCQkJICAgICAgY29udFNldCwNCgkJCQkJCSAgICAgICIsIHJjb250OiAiLA0KCQkJCQkJICAg
ICAgRnVuY0RhdGEudG9TdHJpbmcNCgkJCQkJCSAgICAgIHJjb250RnVuY0RhdGEsDQoJCQkJCQkg
ICAgICAiXG4iXSkNCgkJCQkgIGVsc2UgKCkNCg0KCQkJICAgIGZ1biBkb2l0IChyLCBzKSA9DQoJ
CQkgICAgICAgKEludC5pbmMgcg0KCQkJCTsgaWYgYWN0aW9uDQoJCQkJICAgICB0aGVuIHByaW50
IChjb25jYXQgW3MsIA0KCQkJCQkJCSAiICIsDQoJCQkJCQkJIEZ1bmMudG9TdHJpbmcgbmFtZSwg
DQoJCQkJCQkJICJcbiJdKQ0KCQkJCSAgZWxzZSAoKSkNCg0KCQkJICAgIGRhdGF0eXBlIHogPSBk
YXRhdHlwZSBDYWxsSW5mby50DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIENvbnRTZXQu
c2V0DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIFJDb250LnQNCg0KCQkJICAgIHZhbCBj
YW5fY2FsbCA9IGNhc2UgIWNhbGxJbmZvDQoJCQkJCSAgICAgb2YgT25lT3V0ZXJDYWxsID0+IHRy
dWUNCgkJCQkJICAgICAgfCBfID0+IGZhbHNlDQoJCQkgICAgdmFsIGNhbl9jb250ID0gY2FzZSBD
b250U2V0LnNldCBjb250U2V0DQoJCQkJCSAgICAgb2YgT25lIF8gPT4gdHJ1ZQ0KCQkJCQkgICAg
ICB8IF8gPT4gZmFsc2UgDQoJCQkgICAgdmFsIGNhbl9yZW1fY29udCA9IGNhc2UgQ29udFNldC5z
ZXQgY29udFNldA0KCQkJCQkJIG9mIEVtcHR5ID0+IHRydWUNCgkJCQkJCSAgfCBfID0+IGZhbHNl
DQoJCQkgICAgdmFsIGNhbl9uZXcgPSBjYXNlIEZ1bmNEYXRhLnJjb250IHJjb250RnVuY0RhdGEN
CgkJCQkJICAgIG9mIEZ1bmNMYWJlbCBfID0+IHRydWUNCgkJCQkJICAgICB8IEp1bXBMYWJlbCBf
ID0+IHRydWUNCgkJCQkJICAgICB8IF8gPT4gZmFsc2UNCgkJCSAgICB2YWwgY2FuX3JlbV9uZXcg
PSBjYXNlIEZ1bmNEYXRhLnJjb250IHJjb250RnVuY0RhdGENCgkJCQkJCW9mIFVuY2FsbGVkID0+
IHRydWUNCgkJCQkJCSB8IF8gPT4gZmFsc2UNCgkJCSBpbiBjYXNlIChjYW5fY2FsbCwgY2FuX2Nv
bnQsIGNhbl9uZXcpDQoJCQkgICAgICBvZiAodHJ1ZSwgdHJ1ZSwgdHJ1ZSkgDQoJCQkgICAgICAg
PT4gZG9pdChjYWxsX2NvbnRfbmV3LCAiY2FsbF9jb250X25ldyIpDQoJCQkgICAgICAgfCAodHJ1
ZSwgdHJ1ZSwgZmFsc2UpIA0KCQkJICAgICAgID0+IGRvaXQoY2FsbF9jb250LCAiY2FsbF9jb250
IikNCgkJCSAgICAgICB8ICh0cnVlLCBmYWxzZSwgdHJ1ZSkgDQoJCQkgICAgICAgPT4gZG9pdChj
YWxsX25ldywgImNhbGxfbmV3IikNCgkJCSAgICAgICB8ICh0cnVlLCBmYWxzZSwgZmFsc2UpIA0K
CQkJICAgICAgID0+IGRvaXQoY2FsbCwgImNhbGwiKQ0KCQkJICAgICAgIHwgKGZhbHNlLCB0cnVl
LCB0cnVlKSANCgkJCSAgICAgICA9PiBkb2l0KGNvbnRfbmV3LCAiY29udF9uZXciKQ0KCQkJICAg
ICAgIHwgKGZhbHNlLCB0cnVlLCBmYWxzZSkgDQoJCQkgICAgICAgPT4gZG9pdChjb250LCAiY29u
dCIpDQoJCQkgICAgICAgfCAoZmFsc2UsIGZhbHNlLCB0cnVlKSANCgkJCSAgICAgICA9PiBkb2l0
KG5ldywgIm5ldyIpDQoJCQkgICAgICAgfCAoZmFsc2UsIGZhbHNlLCBmYWxzZSkgPT4gKCk7DQoJ
CQkgICAgY2FzZSAoY2FuX3JlbV9jb250LCBjYW5fcmVtX25ldykNCgkJCSAgICAgIG9mICh0cnVl
LCB0cnVlKQ0KCQkJICAgICAgID0+IGRvaXQocmVtX2NvbnRfbmV3LCAicmVtX2NvbnRfbmV3IikN
CgkJCSAgICAgICB8ICh0cnVlLCBmYWxzZSkNCgkJCSAgICAgICA9PiBkb2l0KHJlbV9jb250LCAi
cmVtX2NvbnQiKQ0KCQkJICAgICAgIHwgKGZhbHNlLCB0cnVlKQ0KCQkJICAgICAgID0+IGRvaXQo
cmVtX25ldywgInJlbV9uZXciKQ0KCQkJICAgICAgIHwgKGZhbHNlLCBmYWxzZSkgPT4gKCkNCgkJ
CSBlbmQpDQoJCQk7IGlmIHRvdGFscw0KCQkJICAgIHRoZW4gcHJpbnQgKGNvbmNhdA0KCQkJCSBb
ImZ1bmN0aW9uczogIiwNCgkJCQkgIEludC50b1N0cmluZyAoVmVjdG9yLmxlbmd0aCBmdW5jdGlv
bnMpLA0KCQkJCSAgIiAgY2FsbF9jb250X25ldzogIiwgDQoJCQkJICBJbnQudG9TdHJpbmcgKCFj
YWxsX2NvbnRfbmV3KSwNCgkJCQkgICIgIGNhbGxfY29udDogIiwgDQoJCQkJICBJbnQudG9TdHJp
bmcgKCFjYWxsX2NvbnQpLA0KCQkJCSAgIiAgY2FsbF9uZXc6ICIsDQoJCQkJICBJbnQudG9TdHJp
bmcgKCFjYWxsX25ldyksDQoJCQkJICAiICBjb250X25ldzogIiwgDQoJCQkJICBJbnQudG9TdHJp
bmcgKCFjb250X25ldyksDQoJCQkJICAiICBjYWxsOiAiLCANCgkJCQkgIEludC50b1N0cmluZyAo
IWNhbGwpLA0KCQkJCSAgIiAgY29udDogIiwgDQoJCQkJICBJbnQudG9TdHJpbmcgKCFjb250KSwN
CgkJCQkgICIgIG5ldzogIiwgDQoJCQkJICBJbnQudG9TdHJpbmcgKCFuZXcpLA0KCQkJCSAgIiAg
cmVtX2NvbnRfbmV3OiAiLA0KCQkJCSAgSW50LnRvU3RyaW5nICghcmVtX2NvbnRfbmV3KSwNCgkJ
CQkgICIgIHJlbV9jb250OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIXJlbV9jb250KSwNCgkJ
CQkgICIgIHJlbV9uZXc6ICIsIA0KCQkJCSAgSW50LnRvU3RyaW5nICghcmVtX25ldyksDQoJCQkJ
ICAiXG4iXSkNCgkJCSAgICBlbHNlICgpDQoJCSAgICAgZW5kDQoJICAgICAgIGVsc2UgKCkNCgkg
ICAgKCogRm9yIGZ1bmN0aW9ucyB0dXJuZWQgaW50byBjb250aW51YXRpb25zLCByZWNvcmQgdGhl
aXINCgkgICAgICogYXJncywgYm9keSwgYW5kIG5ldyBuYW1lLg0KCSAgICAgKikNCgkgICAgdmFs
IF8gPQ0KCSAgICAgICBWZWN0b3IuZm9yZWFjaA0KCSAgICAgICAoZnVuY3Rpb25zLCBmbiB7bmFt
ZSwgYXJncywgYm9keSwgLi4ufSA9Pg0KCQlsZXQNCgkJICAgdmFsIHtjYWxsSW5mbywgY2FuUHJl
Zml4LCByZXBsYWNlLCAuLi59ID0gZnVuY0luZm8gbmFtZQ0KCQkgICB2YWwgb25lQ2FsbCA9DQoJ
CSAgICAgIGNhc2UgIWNhbGxJbmZvIG9mDQoJCQkgQ2FsbEluZm8uT25lT3V0ZXJDYWxsID0+IHRy
dWUNCgkJICAgICAgIHwgXyA9PiBmYWxzZQ0KCQkgICB2YWwgb25lQ29udCA9ICFjYW5QcmVmaXgN
CgkJaW4gaWYgKGNhc2Ugc3RyYXRlZ3kgb2YNCgkJCSAgQ29udHJvbC5Cb3RoID0+IG9uZUNhbGwg
b3JlbHNlIG9uZUNvbnQNCgkJCXwgQ29udHJvbC5DYWxsID0+IG9uZUNhbGwNCgkJCXwgQ29udHJv
bC5Db250ID0+IG9uZUNvbnQNCigqIGZsdWV0ICsgKikNCgkJCXwgQ29udHJvbC5OZXcgPT4gb25l
Q29udA0KCQkJfCBDb250cm9sLk5vbmUgPT4gZmFsc2UpDQoJCSAgICAgIHRoZW4NCgkJCSByZXBs
YWNlIDo9DQoJCQkgU09NRSB7YXJncyA9IGFyZ3MsDQoJCQkgICAgICAgYm9keSA9IGJvZHksDQoJ
CQkgICAgICAganVtcCA9IEp1bXAubmV3U3RyaW5nIChGdW5jLm9yaWdpbmFsTmFtZSBuYW1lKX0N
CgkJICAgZWxzZSAoKQ0KCQllbmQpDQoJICAgICgqIFdhbGsgb3ZlciBhbGwgZnVuY3Rpb25zLCBy
ZW1vdmluZyB0aG9zZSB0aGF0IGFyZW4ndCB0b3BsZXZlbCwgYW5kDQoJICAgICAqIGRlc2NlbmRp
bmcgdGhvc2UgdGhhdCBhcmUsIGluc2VydGluZyBsb2NhbCBmdW5jdGlvbnMNCgkgICAgICogd2hl
cmUgbmVjZXNzYXJ5Lg0KCSAgICAgKiAgLSB0dXJuIHRhaWwgY2FsbHMgaW50byBub250YWlsIGNh
bGxzDQoJICAgICAqICAtIHR1cm4gcmV0dXJucyBpbnRvIGp1bXBzDQoJICAgICAqKQ0KCSAgICBm
dW4gd2Fsa0V4cCAoZjogRnVuYy50LCBlOiBFeHAudCwgYzogSnVtcC50IG9wdGlvbik6IEV4cC50
ID0NCgkgICAgICAgbGV0DQoJCSAgdmFsIHtkZWNzLCB0cmFuc2Zlcn0gPSBFeHAuZGVzdCBlDQoJ
CSAgdmFsIGRlY3MgPSANCgkJICAgICBMaXN0LmZvbGQNCgkJICAgICAocmV2IGRlY3MsIFtdLCBm
biAoZCwgZHMpID0+DQoJCSAgICAgIGNhc2UgZCBvZg0KCQkJIEJpbmQgXyA9PiBkIDo6IGRzDQoJ
CSAgICAgICB8IEZ1biB7bmFtZSwgYXJncywgYm9keX0gPT4NCgkJCSAgICBGdW4ge25hbWUgPSBu
YW1lLA0KCQkJCSBhcmdzID0gYXJncywNCgkJCQkgYm9keSA9IHdhbGtFeHAgKGYsIGJvZHksIGMp
fQ0KCQkJICAgIDo6IChpZiAoY2FzZSBzdHJhdGVneSBvZg0KCQkJCSAgICAgICBDb250cm9sLkJv
dGggPT4gdHJ1ZQ0KCQkJCSAgICAgfCBDb250cm9sLkNvbnQgPT4gdHJ1ZQ0KKCogZmx1ZXQgKyAq
KQ0KCQkJCSAgICAgfCBDb250cm9sLk5ldyA9PiB0cnVlDQoJCQkJICAgICB8IF8gPT4gZmFsc2Up
DQoJCQkJICAgdGhlbg0KCQkJCSAgICAgIGxldCB2YWwge3ByZWZpeGVzLCAuLi59ID0ganVtcElu
Zm8gbmFtZQ0KCQkJCSAgICAgIGluIGNhc2UgIXByZWZpeGVzIG9mDQoJCQkJCSBOT05FID0+IGRz
DQoJCQkJICAgICAgIHwgU09NRSBmcyA9PiBuZXN0IChmcywgU09NRSBuYW1lLCBkcykNCgkJCQkg
ICAgICBlbmQNCgkJCQllbHNlIGRzKQ0KCQkgICAgICAgfCBIYW5kbGVyUHVzaCBoID0+IEhhbmRs
ZXJQdXNoIGggOjogZHMNCgkJICAgICAgIHwgSGFuZGxlclBvcCA9PiBIYW5kbGVyUG9wIDo6IGRz
KQ0KCQkgIGZ1biBtYWtlIHRyYW5zZmVyID0gRXhwLm1ha2Uge2RlY3MgPSBkZWNzLA0KCQkJCQkJ
dHJhbnNmZXIgPSB0cmFuc2Zlcn0NCgkgICAgICAgaW4NCgkJICBjYXNlIHRyYW5zZmVyIG9mDQoJ
CSAgICAgQ2FsbCB7ZnVuYywgYXJncywgY29udH0gPT4NCgkJCWxldA0KCQkJICAgdmFsIG5ld0Nv
bnQ6IEp1bXAudCBvcHRpb24gPQ0KCQkJICAgICAgY2FzZSBjb250IG9mDQoJCQkJIE5PTkUgPT4g
Yw0KCQkJICAgICAgIHwgU09NRSBfID0+IGNvbnQNCgkJCSAgIHZhbCB7Y2FsbEluZm8sIGNhblBy
ZWZpeCwgcmVwbGFjZSwgLi4ufSA9DQoJCQkgICAgICBmdW5jSW5mbyBmdW5jDQoJCQlpbg0KCQkJ
ICAgY2FzZSAhcmVwbGFjZSBvZg0KCQkJICAgICAgTk9ORSA9Pg0KCQkJCSBtYWtlIChDYWxsIHtm
dW5jID0gZnVuYywNCgkJCQkJICAgICBhcmdzID0gYXJncywNCgkJCQkJICAgICBjb250ID0gbmV3
Q29udH0pDQoJCQkgICAgfCBTT01FIHtqdW1wLCBhcmdzID0gZm9ybWFscywgYm9keX0gPT4NCgkJ
CQkgbGV0DQoJCQkJICAgIHZhbCBkZWNzID0NCgkJCQkgICAgICAgaWYgIWNhbGxJbmZvID0gQ2Fs
bEluZm8uT25lT3V0ZXJDYWxsDQoJCQkJCSAgYW5kYWxzbyBub3QgKEZ1bmMuZXF1YWxzIChmLCBm
dW5jKSkNCgkJCQkJICBhbmRhbHNvIChjYXNlIHN0cmF0ZWd5IG9mDQoJCQkJCQkgICAgICBDb250
cm9sLkJvdGggPT4NCgkJCQkJCQkgbm90ICghY2FuUHJlZml4KQ0KCQkJCQkJICAgIHwgQ29udHJv
bC5DYWxsID0+IHRydWUNCgkJCQkJCSAgICB8IF8gPT4gZmFsc2UpDQoJCQkJCSAgdGhlbg0KCQkJ
CQkgICAgIGRlY3MNCgkJCQkJICAgICBAIFtGdW4ge25hbWUgPSBqdW1wLA0KCQkJCQkJICAgICBh
cmdzID0gZm9ybWFscywNCgkJCQkJCSAgICAgYm9keSA9IHdhbGtFeHAgKGZ1bmMsIGJvZHksDQoJ
CQkJCQkJCSAgICAgbmV3Q29udCl9XQ0KCQkJCQkgICAgICANCgkJCQkgICAgICAgZWxzZSBkZWNz
DQoJCQkJIGluDQoJCQkJICAgIEV4cC5tYWtlDQoJCQkJICAgIHtkZWNzID0gZGVjcywNCgkJCQkg
ICAgIHRyYW5zZmVyID0gSnVtcCB7ZHN0ID0ganVtcCwgYXJncyA9IGFyZ3N9fQ0KCQkJCSBlbmQN
CgkJCWVuZA0KCQkgICB8IFJldHVybiB4cyA9Pg0KCQkJbWFrZSAoY2FzZSBjIG9mDQoJCQkJIE5P
TkUgPT4gdHJhbnNmZXINCgkJCSAgICAgICB8IFNPTUUgYyA9PiBKdW1wIHtkc3QgPSBjLCBhcmdz
ID0geHN9KQ0KCQkgICB8IF8gPT4gbWFrZSB0cmFuc2Zlcg0KCSAgICAgICBlbmQNCgkgICAgYW5k
IG5lc3QgKGZzOiBGdW5jLnQgbGlzdCwNCgkJICAgICAgY29udDogSnVtcC50IG9wdGlvbiwNCgkJ
ICAgICAgZHM6IERlYy50IGxpc3QpOiBEZWMudCBsaXN0ID0NCgkgICAgICAgTGlzdC5mb2xkDQoJ
ICAgICAgIChyZXYgZnMsIGRzLCBmbiAoZiwgZHMpID0+DQoJCWxldA0KCQkgICB2YWwge3JlcGxh
Y2UsIG5lc3RlZCwgcHJlZml4ZXMsIC4uLn0gPSBmdW5jSW5mbyBmDQoJCSAgIHZhbCBmcyA9DQoJ
CSAgICAgIGNhc2UgIXByZWZpeGVzIG9mDQoJCQkgTk9ORSA9PiAhbmVzdGVkDQoJCSAgICAgICB8
IFNPTUUgZnMgPT4gTGlzdC5hcHBlbmRSZXYgKGZzLCAhbmVzdGVkKQ0KCQkgICB2YWwge2p1bXAs
IGFyZ3MsIGJvZHl9ID0gdmFsT2YgKCFyZXBsYWNlKQ0KCQkgICB2YWwge2RlY3MsIHRyYW5zZmVy
fSA9IEV4cC5kZXN0ICh3YWxrRXhwIChmLCBib2R5LCBjb250KSkNCgkJICAgdmFsIGJvZHkgPSBF
eHAubWFrZSB7ZGVjcyA9IG5lc3QgKCFuZXN0ZWQsIGNvbnQsIGRlY3MpLA0KCQkJCQl0cmFuc2Zl
ciA9IHRyYW5zZmVyfQ0KCQlpbiBGdW4ge25hbWUgPSBqdW1wLCBhcmdzID0gYXJncywgYm9keSA9
IGJvZHl9IDo6IGRzDQoJCWVuZCkNCgkgICAgdmFsIHNocmlua0V4cCA9IHNocmlua0V4cCBnbG9i
YWxzDQoJICAgIHZhbCBmdW5jdGlvbnMgPQ0KCSAgICAgICBWZWN0b3IuZnJvbUxpc3QNCgkgICAg
ICAgKFZlY3Rvci5mb2xkcg0KCQkoZnVuY3Rpb25zLCBbXSwgZm4gKHtuYW1lLCBhcmdzLCBib2R5
LCByZXR1cm5zfSwgZnVuY3Rpb25zKSA9Pg0KCQkgbGV0DQoJCSAgICB2YWwge2NvbnRTZXQsIHJj
b250RnVuY0RhdGEsDQoJCQkgcHJlZml4ZXMsIHJlcGxhY2UsIC4uLn0gPSBmdW5jSW5mbyBuYW1l
DQoJCSBpbiBjYXNlICFyZXBsYWNlIG9mDQoJCSAgICBOT05FID0+DQooKiBmbHVldCArICopDQoJ
CSAgICAgIGlmIChjYXNlIHN0cmF0ZWd5DQoJCQkgICAgb2YgQ29udHJvbC5Db250ID0+IENvbnRT
ZXQuaXNFbXB0eSBjb250U2V0DQoJCQkgICAgIHwgQ29udHJvbC5Cb3RoID0+IENvbnRTZXQuaXNF
bXB0eSBjb250U2V0DQoJCQkgICAgIHwgQ29udHJvbC5OZXcgPT4gRnVuY0RhdGEuaXNVbmNhbGxl
ZCByY29udEZ1bmNEYXRhDQoJCQkgICAgIHwgXyA9PiBmYWxzZSkNCigqIGZsdWV0IC0gKikNCigq
DQoJCSAgICAgIGlmIENvbnRTZXQuaXNFbXB0eSBjb250U2V0DQoqKQ0KCQkJICB0aGVuDQoJCQkg
ICAgICgqIERvbid0IGluY2x1ZGUgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhbiBlbXB0eSBjb250DQoJ
CQkgICAgICAqIHNldCwgYmVjYXVzZSB0aGV5IGFyZW4ndCBjYWxsZWQuDQoJCQkgICAgICAqKQ0K
CQkJICAgICBmdW5jdGlvbnMNCgkJICAgICAgIGVsc2UNCgkJCSAgbGV0DQoJCQkgICAgIHZhbCBi
b2R5ID0gd2Fsa0V4cCAobmFtZSwgYm9keSwgTk9ORSkNCgkJCSAgICAgdmFsIGJvZHkgPQ0KCQkJ
CWNhc2UgIXByZWZpeGVzIG9mDQoJCQkJICAgTk9ORSA9PiBib2R5DQoJCQkJIHwgU09NRSBmcyA9
Pg0KCQkJCSAgICAgIGxldCB2YWwge2RlY3MsIHRyYW5zZmVyfSA9IEV4cC5kZXN0IGJvZHkNCgkJ
CQkgICAgICBpbiBFeHAubWFrZSB7ZGVjcyA9IG5lc3QgKGZzLCBOT05FLCBkZWNzKSwNCgkJCQkJ
CSAgIHRyYW5zZmVyID0gdHJhbnNmZXJ9DQoJCQkJICAgICAgZW5kDQoJCQkgICAgIHZhbCBib2R5
ID0gc2hyaW5rRXhwIGJvZHkNCgkJCSAgaW4ge25hbWUgPSBuYW1lLCBhcmdzID0gYXJncywgcmV0
dXJucyA9IHJldHVybnMsDQoJCQkgICAgICBib2R5ID0gYm9keX0NCgkJCSAgZW5kIDo6IGZ1bmN0
aW9ucw0KCQkJCSB8IF8gPT4gZnVuY3Rpb25zDQoJCSBlbmQpKQ0KCSAgICB2YWwgcHJvZ3JhbSA9
DQoJICAgICAgIFByb2dyYW0uVCB7ZGF0YXR5cGVzID0gZGF0YXR5cGVzLA0KCQkJICBnbG9iYWxz
ID0gZ2xvYmFscywNCgkJCSAgZnVuY3Rpb25zID0gZnVuY3Rpb25zLA0KCQkJICBtYWluID0gbWFp
bn0NCgkgICAgdmFsIF8gPSBQcm9ncmFtLmNsZWFyIHByb2dyYW0NCgkgaW4NCgkgICAgcHJvZ3Jh
bQ0KCSBlbmQNCiAgIGVuZA0KDQplbmQNCg==

---559023410-33463914-980868786=:5342--