<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>153564</bug_id>
          
          <creation_ts>2016-01-27 15:21:25 -0800</creation_ts>
          <short_desc>Exits from exceptions shouldn&apos;t jettison code</short_desc>
          <delta_ts>2016-01-29 11:46:33 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>sukolsak</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1159469</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-27 15:21:25 -0800</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159558</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-27 17:59:25 -0800</bug_when>
    <thetext>We can also get rid of some cruft by having the ExitKind
indicate what type of exception OSR exit we&apos;re talking about.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159562</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-27 18:10:47 -0800</bug_when>
    <thetext>looks like this will definitely help performance

Benchmark report for JSRegress on il0204d-dhcp25 (MacBookPro11,3).

VMs tested:
&quot;og&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r195645)
&quot;change&quot; at /Volumes/Data/WK/a/OpenSource/WebKitBuild/Release/jsc (r195645)

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to
get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                   og                      change                                      

getter-richards-try-catch                 1296.7368+-11.5669    ^   1206.6882+-19.2748       ^ definitely 1.0746x faster
raytrace-with-empty-try-catch                7.3843+-0.0815     ?      7.4357+-0.3705        ?
raytrace-with-try-catch                     13.1908+-0.3264     ^     12.1172+-0.4045        ^ definitely 1.0886x faster
richards-empty-try-catch                    56.1763+-0.1751     ?     56.3730+-0.2648        ?
richards-try-catch                         314.1001+-9.7033     ^    288.1630+-1.3862        ^ definitely 1.0900x faster
try-catch-get-by-val-cloned-arguments        8.6644+-0.2921     ?      9.0188+-0.3390        ? might be 1.0409x slower
try-catch-get-by-val-direct-arguments        2.7748+-0.1006     ?      2.7958+-0.1077        ?
try-catch-get-by-val-scoped-arguments        5.2259+-0.1285     ?      5.5866+-0.8754        ? might be 1.0690x slower
v8-raytrace-with-empty-try-catch            63.1979+-0.8866     ?     64.5806+-2.9587        ? might be 1.0219x slower
v8-raytrace-with-try-catch                  83.9681+-3.3076     ^     77.9368+-1.0780        ^ definitely 1.0774x faster

&lt;geometric&gt;                                 32.8874+-0.1316           32.2882+-0.4736          might be 1.0186x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159570</commentid>
    <comment_count>3</comment_count>
      <attachid>270074</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-27 18:52:13 -0800</bug_when>
    <thetext>Created attachment 270074
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159573</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-27 19:07:30 -0800</bug_when>
    <thetext>Attachment 270074 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGOSRExitCompiler.cpp:135:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:120:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
Total errors found: 2 in 24 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159772</commentid>
    <comment_count>5</comment_count>
      <attachid>270074</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-01-28 10:37:17 -0800</bug_when>
    <thetext>Comment on attachment 270074
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=270074&amp;action=review

r=me

&gt; Source/JavaScriptCore/bytecode/ExitKind.cpp:96
&gt; +bool exitKindCausesJettison(ExitKind kind)

I would call this exitKindCanJettison. &quot;causes&quot; made  me think it always causes -- but in fact you have to meet the exit kind requirement and the count requirement before you jettison.

&gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:10254
&gt; +        switch (exceptionType) {
&gt; +        case ExceptionType::JSCall:
&gt; +        case ExceptionType::GetById:
&gt; +        case ExceptionType::PutById:
&gt; +            exitKind = GenericUnwind;
&gt; +            break;
&gt; +        case ExceptionType::LazySlowPath:
&gt; +        case ExceptionType::BinaryOpGenerator:
&gt; +            exitKind = ExceptionCheck;
&gt; +            break;

I don&apos;t love these names for these concepts.

I think it would nicer to go with something that distinguished &quot;I threw the exception&quot; from &quot;my callee threw the exception&quot;.

Maybe: 

LocalException
ChildException

OR

DirectException
IndirectException

OR

Exception
CalleeException</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1160190</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-29 11:31:41 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 270074 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=270074&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/bytecode/ExitKind.cpp:96
&gt; &gt; +bool exitKindCausesJettison(ExitKind kind)
&gt; 
&gt; I would call this exitKindCanJettison. &quot;causes&quot; made  me think it always
&gt; causes -- but in fact you have to meet the exit kind requirement and the
&gt; count requirement before you jettison.
&gt; 
&gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:10254
&gt; &gt; +        switch (exceptionType) {
&gt; &gt; +        case ExceptionType::JSCall:
&gt; &gt; +        case ExceptionType::GetById:
&gt; &gt; +        case ExceptionType::PutById:
&gt; &gt; +            exitKind = GenericUnwind;
&gt; &gt; +            break;
&gt; &gt; +        case ExceptionType::LazySlowPath:
&gt; &gt; +        case ExceptionType::BinaryOpGenerator:
&gt; &gt; +            exitKind = ExceptionCheck;
&gt; &gt; +            break;
&gt; 
&gt; I don&apos;t love these names for these concepts.
&gt; 
&gt; I think it would nicer to go with something that distinguished &quot;I threw the
&gt; exception&quot; from &quot;my callee threw the exception&quot;.
&gt; 
&gt; Maybe: 
&gt; 
&gt; LocalException
&gt; ChildException
&gt; 
&gt; OR
&gt; 
&gt; DirectException
&gt; IndirectException
&gt; 
&gt; OR
&gt; 
&gt; Exception
&gt; CalleeException
I think these names make sense because it hints at our JIT code doing the exception
check versus other JIT code jumping to our JIT code. A callee can throw an exception
without us doing a GenericUnwind exception.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1160191</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-29 11:33:27 -0800</bug_when>
    <thetext>I&apos;m not sure &quot;generic unwind&quot; is the best name in general,
and I think it might make sense to rename those one day
to something more meaningful. But, given that we use genericUnwind,
I think an OSRExit that has kind GenericUnwind indicates that genericUnwind
found our exit machine code and that whatever exception machinery is running 
will jump to our GenericUnwind exit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1160193</commentid>
    <comment_count>8</comment_count>
      <attachid>270074</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-29 11:34:33 -0800</bug_when>
    <thetext>Comment on attachment 270074
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=270074&amp;action=review

&gt;&gt;&gt; Source/JavaScriptCore/bytecode/ExitKind.cpp:96
&gt;&gt;&gt; +bool exitKindCausesJettison(ExitKind kind)
&gt;&gt; 
&gt;&gt; I would call this exitKindCanJettison. &quot;causes&quot; made  me think it always causes -- but in fact you have to meet the exit kind requirement and the count requirement before you jettison.
&gt; 
&gt; I think these names make sense because it hints at our JIT code doing the exception
&gt; check versus other JIT code jumping to our JIT code. A callee can throw an exception
&gt; without us doing a GenericUnwind exception.

I&apos;ll go with &quot;exitKindMayJettison&quot; to better indicate that a threshold has to be reached.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1160195</commentid>
    <comment_count>9</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-29 11:36:22 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; Comment on attachment 270074 [details]
&gt; &gt; patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=270074&amp;action=review
&gt; &gt; 
&gt; &gt; r=me
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/bytecode/ExitKind.cpp:96
&gt; &gt; &gt; +bool exitKindCausesJettison(ExitKind kind)
&gt; &gt; 
&gt; &gt; I would call this exitKindCanJettison. &quot;causes&quot; made  me think it always
&gt; &gt; causes -- but in fact you have to meet the exit kind requirement and the
&gt; &gt; count requirement before you jettison.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:10254
&gt; &gt; &gt; +        switch (exceptionType) {
&gt; &gt; &gt; +        case ExceptionType::JSCall:
&gt; &gt; &gt; +        case ExceptionType::GetById:
&gt; &gt; &gt; +        case ExceptionType::PutById:
&gt; &gt; &gt; +            exitKind = GenericUnwind;
&gt; &gt; &gt; +            break;
&gt; &gt; &gt; +        case ExceptionType::LazySlowPath:
&gt; &gt; &gt; +        case ExceptionType::BinaryOpGenerator:
&gt; &gt; &gt; +            exitKind = ExceptionCheck;
&gt; &gt; &gt; +            break;
&gt; &gt; 
&gt; &gt; I don&apos;t love these names for these concepts.
&gt; &gt; 
&gt; &gt; I think it would nicer to go with something that distinguished &quot;I threw the
&gt; &gt; exception&quot; from &quot;my callee threw the exception&quot;.
&gt; &gt; 
&gt; &gt; Maybe: 
&gt; &gt; 
&gt; &gt; LocalException
&gt; &gt; ChildException

I don&apos;t know what either of these things mean.

&gt; &gt; 
&gt; &gt; OR
&gt; &gt; 
&gt; &gt; DirectException
&gt; &gt; IndirectException

You could argue that genericUnwind is direct because it doesn&apos;t involve a check in generated code.  You could argue that the excetpion check is direct because it doesn&apos;t involve calling genericUnwind.  These names aren&apos;t going to work.

&gt; &gt; 
&gt; &gt; OR
&gt; &gt; 
&gt; &gt; Exception
&gt; &gt; CalleeException

I don&apos;t know what either of these things mean.  All exceptions come from callees.

&gt; I think these names make sense because it hints at our JIT code doing the
&gt; exception
&gt; check versus other JIT code jumping to our JIT code. A callee can throw an
&gt; exception
&gt; without us doing a GenericUnwind exception.

The point of these ExitKinds is to tell you if the exception involved GenericUnwind.  Let&apos;s please use a name that makes this clear.

If we don&apos;t like the name &quot;GenericUnwind&quot; then we should rename that function to something else globally.

Whatever name the &quot;genericUnwind&quot; function has, that&apos;s the name that the ExitKind that corresponds to it should also have.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1160204</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-01-29 11:46:33 -0800</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/195831</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270074</attachid>
            <date>2016-01-27 18:52:13 -0800</date>
            <delta_ts>2016-01-28 10:37:17 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>79359</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTk1NzIyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwMyBA
QAorMjAxNi0wMS0yNyAgU2FhbSBiYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAg
ICBFeGl0cyBmcm9tIGV4Y2VwdGlvbnMgc2hvdWxkbid0IGpldHRpc29uIGNvZGUKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzU2NAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdlIGNyZWF0ZSB0d28gbmV3
IGV4aXQga2luZHMgZm9yIGV4Y2VwdGlvbi1oYW5kbGluZworICAgICAgICBPU1JFeGl0czoKKyAg
ICAgICAgLSBFeGNlcHRpb25DaGVjazogYW4gZXhwbGljaXQgZXhjZXB0aW9uIGNoZWNrIGFmdGVy
IGEgQyBjYWxsLgorICAgICAgICAtIEdlbmVyaWNVbndpbmQ6IGFuIE9TUiBleGl0IGV4ZWN1dGVz
IGJlY2F1c2UgaXQncyBqdW1wZWQgdG8gZnJvbSBnZW5lcmljVW53aW5kLgorCisgICAgICAgIEhh
dmluZyB0aGVzZSB0d28gbmV3IGV4aXQga2luZHMgYWxsb3dzIHVzIHRvIHJlbW92ZSBmaWVsZHMg
ZnJvbQorICAgICAgICB2YXJpb3VzIE9TUkV4aXQgdmFyaWFudHMgdGhhdCBzdG9yZSBib29sZWFu
cyBpbmRpY2F0aW5nCisgICAgICAgIGlmIHRoZSBleGl0IGlzIGFuIGV4Y2VwdGlvbiBoYW5kbGVy
LCBhbmQgaWYgc28sIHdoYXQga2luZAorICAgICAgICBvZiBleGNlcHRpb24gaGFuZGxlci4gTW9z
dCBvZiB0aGlzIHBhdGNoIGlzIGp1c3QgcmVtb3ZpbmcKKyAgICAgICAgdGhvc2Ugb2xkIGZpZWxk
cyBhbmQgYWRkaW5nIG5ldyBlcXVpdmFsZW50IGZ1bmN0aW9ucy4KKworICAgICAgICBUaGlzIHBh
dGNoIGFsc28gaW1wbGVtZW50cyB0aGUgcG9saWN5IHRoYXQgd2Ugc2hvdWxkIG5ldmVyIGNvbnNp
ZGVyIGpldHRpc29uaW5nCisgICAgICAgIGNvZGUgZnJvbSBleGl0cyB0aGF0IGhhcHBlbiBmcm9t
IGFuIGV4Y2VwdGlvbiBjaGVjayB0byBhbiBvcF9jYXRjaCAoaXQgbWlnaHQgYmUgd29ydGgKKyAg
ICAgICAgY29uc2lkZXJpbmcgYSBzaW1pbGFyIHBvbGljeSBmb3IgJ3Rocm93JykuIFdlJ3JlIGNo
b29zaW5nIHRoaXMgcG9saWN5IGJlY2F1c2UKKyAgICAgICAgaXQgd2lsbCBhbG1vc3QgbmV2ZXIg
YmUgbW9yZSBleHBlbnNpdmUsIGluIHRvdGFsLCB0byBleGVjdXRlIHRoZSBPU1IgZXhpdCB0aGFu
CisgICAgICAgIHRvIGV4ZWN1dGUgdGhlIGJhc2VsaW5lIHZhcmlhbnQgb2YgdGhlIGNvZGUuIFdo
ZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biwgd2UgZG8KKyAgICAgICAgcmVhbGx5IGV4cGVuc2l2
ZSB3b3JrLCBsaWtlIGNhbGwgdGhyb3VnaCB0byBnZW5lcmljVW53aW5kLCBhbmQgYWxzbyBjcmVh
dGUgYW4gZXJyb3IKKyAgICAgICAgb2JqZWN0IHdpdGggYSBzdGFjayB0cmFjZS4gVGhlIGNvc3Qg
b2YgT1NSIGV4aXRpbmcgaGVyZSBpcyBzbWFsbCBpbiBjb21wYXJpc29uIHRvCisgICAgICAgIHRo
b3NlIG90aGVyIG9wZXJhdGlvbnMuIEFuZCBwZW5hbGl6aW5nIGEgQ29kZUJsb2NrIGZvciBPU1Ig
ZXhpdGluZyBmcm9tIGFuIGV4Y2VwdGlvbgorICAgICAgICBpcyBzaWxseSBiZWNhdXNlIHRoZSBi
YXNpcyBvZiBvdXIgaW1wbGVtZW50YXRpb24gb2YgZXhjZXB0aW9uIGhhbmRsaW5nIGluIHRoZQor
ICAgICAgICB1cHBlciB0aWVycyBpcyB0byBPU1IgZXhpdCBvbiBhIGNhdWdodCBleGNlcHRpb24u
IFNvIHdlIHVzZWQgdG8gcGVuYWxpemUKKyAgICAgICAgb3Vyc2VsdmVzIGZvciBoYXZpbmcgYW4g
aW1wbGVtZW50YXRpb24gdGhhdCBpcyBjb3JyZWN0IHcuci50IG91ciBkZXNpZ24gZ29hbHMuCisK
KyAgICAgICAgSSd2ZSB2ZXJpZmllZCB0aGlzIGh5cG90aGVzaXMgd2l0aCBvbiB2OC1yYXl0cmFj
ZSBieSBhZGRpbmcgYSBuZXcgCisgICAgICAgIGJlbmNobWFyayB0aGF0IHRocm93cyB3aXRoIHZl
cnkgaGlnaCBmcmVxdWVuY3kuIEltcGxlbWVudGluZworICAgICAgICB0aGlzIHBvbGljeSBvbiB0
aGF0IGJlbmNobWFyayByZXN1bHRzIGluIGFib3V0IGEgNC01JSBzcGVlZCB1cC4KKworICAgICAg
ICAqIGJ5dGVjb2RlL0V4aXRLaW5kLmNwcDoKKyAgICAgICAgKEpTQzo6ZXhpdEtpbmRUb1N0cmlu
Zyk6CisgICAgICAgIChKU0M6OmV4aXRLaW5kQ2F1c2VzSmV0dGlzb24pOgorICAgICAgICAoSlND
OjpleGl0S2luZElzQ291bnRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKiBieXRlY29kZS9FeGl0
S2luZC5oOgorICAgICAgICAqIGRmZy9ERkdKSVRDb2RlLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpKSVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9QcmVzZXJ2ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxs
U2l0ZSk6CisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmNwcDoKKyAgICAgICAgKEpTQzo6
REZHOjpKSVRDb21waWxlcjo6bm90aWNlT1NSRW50cnkpOgorICAgICAgICAoSlNDOjpERkc6OkpJ
VENvbXBpbGVyOjphcHBlbmRFeGNlcHRpb25IYW5kbGluZ09TUkV4aXQpOgorICAgICAgICAoSlND
OjpERkc6OkpJVENvbXBpbGVyOjpleGNlcHRpb25DaGVjayk6CisgICAgICAgIChKU0M6OkRGRzo6
SklUQ29tcGlsZXI6OnJlY29yZENhbGxTaXRlQW5kR2VuZXJhdGVFeGNlcHRpb25IYW5kbGluZ09T
UkV4aXRJZk5lZWRlZCk6CisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6CisgICAgICAg
ICogZGZnL0RGR09TUkV4aXQuY3BwOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXQ6Ok9TUkV4
aXQpOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Lmg6CisgICAgICAgIChKU0M6OkRGRzo6T1NS
RXhpdDo6Y29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUpOgorICAgICAgICAqIGRmZy9E
RkdPU1JFeGl0QmFzZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXRCYXNlOjpPU1JFeGl0
QmFzZSk6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdEJhc2U6OmlzRXhjZXB0aW9uSGFuZGxl
cik6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdEJhc2U6OmlzR2VuZXJpY1Vud2luZEhhbmRs
ZXIpOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXRCYXNlOjpjb25zaWRlckFkZGluZ0FzRnJl
cXVlbnRFeGl0U2l0ZSk6CisgICAgICAgICogZGZnL0RGR09TUkV4aXRDb21waWxlci5jcHA6Cisg
ICAgICAgICogZGZnL0RGR09TUkV4aXRDb21waWxlcjMyXzY0LmNwcDoKKyAgICAgICAgKEpTQzo6
REZHOjpPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KToKKyAgICAgICAgKiBkZmcvREZHT1NS
RXhpdENvbXBpbGVyNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6Ok9TUkV4aXRDb21waWxlcjo6
Y29tcGlsZUV4aXQpOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Q29tcGlsZXJDb21tb24uY3Bw
OgorICAgICAgICAoSlNDOjpERkc6OmhhbmRsZUV4aXRDb3VudHMpOgorICAgICAgICAoSlNDOjpE
Rkc6Om9zcldyaXRlQmFycmllcik6CisgICAgICAgIChKU0M6OkRGRzo6YWRqdXN0QW5kSnVtcFRv
VGFyZ2V0KToKKyAgICAgICAgKiBkZmcvREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmg6CisgICAg
ICAgIChKU0M6OkRGRzo6YWRqdXN0RnJhbWVBbmRTdGFja0luT1NSRXhpdENvbXBpbGVyVGh1bmsp
OgorICAgICAgICAqIGZ0bC9GVExDb21waWxlLmNwcDoKKyAgICAgICAgKEpTQzo6RlRMOjptbUFs
bG9jYXRlRGF0YVNlY3Rpb24pOgorICAgICAgICAqIGZ0bC9GVExFeGl0VGh1bmtHZW5lcmF0b3Iu
Y3BwOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rKToK
KyAgICAgICAgKiBmdGwvRlRMSklUQ29kZS5jcHA6CisgICAgICAgIChKU0M6OkZUTDo6SklUQ29k
ZTo6bGl2ZVJlZ2lzdGVyc1RvUHJlc2VydmVBdEV4Y2VwdGlvbkhhbmRsaW5nQ2FsbFNpdGUpOgor
ICAgICAgICAqIGZ0bC9GVExMb3dlckRGR1RvTExWTS5jcHA6CisgICAgICAgIChKU0M6OkZUTDo6
REZHOjpMb3dlckRGR1RvTExWTTo6Y2FsbENoZWNrKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6
Okxvd2VyREZHVG9MTFZNOjphcHBlbmRPU1JFeGl0QXJndW1lbnRzRm9yUGF0Y2hwb2ludElmV2ls
bENhdGNoRXhjZXB0aW9uKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZN
OjphcHBlbmRPU1JFeGl0KToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZN
OjpibGVzc1NwZWN1bGF0aW9uKToKKyAgICAgICAgKiBmdGwvRlRMT1NSRXhpdC5jcHA6CisgICAg
ICAgIChKU0M6OkZUTDo6T1NSRXhpdERlc2NyaXB0b3I6OmVtaXRPU1JFeGl0KToKKyAgICAgICAg
KEpTQzo6RlRMOjpPU1JFeGl0RGVzY3JpcHRvcjo6ZW1pdE9TUkV4aXRMYXRlcik6CisgICAgICAg
IChKU0M6OkZUTDo6T1NSRXhpdERlc2NyaXB0b3I6OnByZXBhcmVPU1JFeGl0SGFuZGxlKToKKyAg
ICAgICAgKEpTQzo6RlRMOjpPU1JFeGl0OjpPU1JFeGl0KToKKyAgICAgICAgKEpTQzo6RlRMOjpP
U1JFeGl0OjpzcGlsbFJlZ2lzdGVyc1RvU3BpbGxTbG90KToKKyAgICAgICAgKEpTQzo6RlRMOjpP
U1JFeGl0OjpyZWNvdmVyUmVnaXN0ZXJzRnJvbVNwaWxsU2xvdCk6CisgICAgICAgIChKU0M6OkZU
TDo6T1NSRXhpdDo6d2lsbEFycml2ZUF0RXhpdEZyb21JbmRpcmVjdEV4Y2VwdGlvbkNoZWNrKToK
KyAgICAgICAgKEpTQzo6RlRMOjpPU1JFeGl0Ojp3aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUNhbGxP
cGVyYXRpb24pOgorICAgICAgICAoSlNDOjpGVEw6OmV4Y2VwdGlvblR5cGVXaWxsQXJyaXZlQXRP
U1JFeGl0RnJvbUdlbmVyaWNVbndpbmQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGVEw6Ok9T
UkV4aXQ6OndpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCk6IERlbGV0ZWQuCisg
ICAgICAgICogZnRsL0ZUTE9TUkV4aXQuaDoKKyAgICAgICAgKiBmdGwvRlRMT1NSRXhpdENvbXBp
bGVyLmNwcDoKKyAgICAgICAgKEpTQzo6RlRMOjpjb21waWxlU3R1Yik6CisgICAgICAgIChKU0M6
OkZUTDo6Y29tcGlsZUZUTE9TUkV4aXQpOgorICAgICAgICAqIGZ0bC9GVExQYXRjaHBvaW50RXhj
ZXB0aW9uSGFuZGxlLmNwcDoKKyAgICAgICAgKEpTQzo6RlRMOjpQYXRjaHBvaW50RXhjZXB0aW9u
SGFuZGxlOjpzY2hlZHVsZUV4aXRDcmVhdGlvbik6CisgICAgICAgIChKU0M6OkZUTDo6UGF0Y2hw
b2ludEV4Y2VwdGlvbkhhbmRsZTo6c2NoZWR1bGVFeGl0Q3JlYXRpb25Gb3JVbndpbmQpOgorICAg
ICAgICAoSlNDOjpGVEw6OlBhdGNocG9pbnRFeGNlcHRpb25IYW5kbGU6OlBhdGNocG9pbnRFeGNl
cHRpb25IYW5kbGUpOgorICAgICAgICAoSlNDOjpGVEw6OlBhdGNocG9pbnRFeGNlcHRpb25IYW5k
bGU6OmNyZWF0ZUhhbmRsZSk6CisgICAgICAgICogZnRsL0ZUTFBhdGNocG9pbnRFeGNlcHRpb25I
YW5kbGUuaDoKKwogMjAxNi0wMS0yNyAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KIAogICAgICAgICBbSlNDXSBhZGp1c3RGcmFtZUFuZFN0YWNrSW5PU1JFeGl0Q29tcGls
ZXJUaHVuaygpIGNhbiB0cmFzaCB2YWx1ZXMgaW4gRlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvZGUvRXhpdEtpbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29kZS9FeGl0S2luZC5jcHAJKHJldmlzaW9uIDE5NTcyMikKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9FeGl0S2luZC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTg0LDI1ICs4NCwyNyBAQCBjb25zdCBjaGFyKiBleGl0S2luZFRvU3RyaW5nKEV4aXRLaW5kIGtp
CiAgICAgICAgIHJldHVybiAiV2F0Y2hkb2dUaW1lckZpcmVkIjsKICAgICBjYXNlIERlYnVnZ2Vy
RXZlbnQ6CiAgICAgICAgIHJldHVybiAiRGVidWdnZXJFdmVudCI7CisgICAgY2FzZSBFeGNlcHRp
b25DaGVjazoKKyAgICAgICAgcmV0dXJuICJFeGNlcHRpb25DaGVjayI7CisgICAgY2FzZSBHZW5l
cmljVW53aW5kOgorICAgICAgICByZXR1cm4gIkdlbmVyaWNVbndpbmQiOwogICAgIH0KICAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgIHJldHVybiAiVW5rbm93biI7CiB9CiAK
LWJvb2wgZXhpdEtpbmRJc0NvdW50YWJsZShFeGl0S2luZCBraW5kKQorYm9vbCBleGl0S2luZENh
dXNlc0pldHRpc29uKEV4aXRLaW5kIGtpbmQpCiB7CiAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAg
Y2FzZSBFeGl0S2luZFVuc2V0OgotICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgIGNhc2UgQmFkVHlwZToKLSAgICBjYXNlIFVuY291bnRhYmxlOgotICAgIGNhc2UgTG9h
ZEZyb21Ib2xlOiAvLyBBbHJlYWR5IGNvdW50ZWQgZGlyZWN0bHkgYnkgdGhlIGJhc2VsaW5lIEpJ
VC4KLSAgICBjYXNlIFN0b3JlVG9Ib2xlOiAvLyBBbHJlYWR5IGNvdW50ZWQgZGlyZWN0bHkgYnkg
dGhlIGJhc2VsaW5lIEpJVC4KLSAgICBjYXNlIE91dE9mQm91bmRzOiAvLyBBbHJlYWR5IGNvdW50
ZWQgZGlyZWN0bHkgYnkgdGhlIGJhc2VsaW5lIEpJVC4KKyAgICBjYXNlIEV4Y2VwdGlvbkNoZWNr
OgorICAgIGNhc2UgR2VuZXJpY1Vud2luZDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGRl
ZmF1bHQ6CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9IC8vIG5hbWVzcGFjZSBK
U0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9FeGl0S2luZC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9FeGl0S2luZC5oCShyZXZp
c2lvbiAxOTU3MjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvRXhpdEtpbmQu
aAkod29ya2luZyBjb3B5KQpAQCAtNTMsMTEgKzUzLDEzIEBAIGVudW0gRXhpdEtpbmQgOiB1aW50
OF90IHsKICAgICBVbmNvdW50YWJsZSwgLy8gV2UgZXhpdGVkIGZvciBub25lIG9mIHRoZSBhYm92
ZSByZWFzb25zLCBhbmQgd2Ugc2hvdWxkIG5vdCBjb3VudCBpdC4gTW9zdCB1c2VzIG9mIHRoaXMg
c2hvdWxkIGJlIHZpZXdlZCBhcyBhIEZJWE1FLgogICAgIFVuY291bnRhYmxlSW52YWxpZGF0aW9u
LCAvLyBXZSBleGl0ZWQgYmVjYXVzZSB0aGUgY29kZSBibG9jayB3YXMgaW52YWxpZGF0ZWQ7IHRo
aXMgbWVhbnMgdGhhdCB3ZSd2ZSBhbHJlYWR5IGNvdW50ZWQgdGhlIHJlYXNvbnMgd2h5IHRoZSBj
b2RlIGJsb2NrIHdhcyBpbnZhbGlkYXRlZC4KICAgICBXYXRjaGRvZ1RpbWVyRmlyZWQsIC8vIFdl
IGV4aXRlZCBiZWNhdXNlIHdlIG5lZWQgdG8gc2VydmljZSB0aGUgd2F0Y2hkb2cgdGltZXIuCi0g
ICAgRGVidWdnZXJFdmVudCAvLyBXZSBleGl0ZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHNlcnZpY2Ug
dGhlIGRlYnVnZ2VyLgorICAgIERlYnVnZ2VyRXZlbnQsIC8vIFdlIGV4aXRlZCBiZWNhdXNlIHdl
IG5lZWQgdG8gc2VydmljZSB0aGUgZGVidWdnZXIuCisgICAgRXhjZXB0aW9uQ2hlY2ssIC8vIFdl
IGV4aXRlZCBiZWNhdXNlIGEgZGlyZWN0IGV4Y2VwdGlvbiBjaGVjayBzaG93ZWQgdGhhdCB3ZSB0
aHJldyBhbiBleGNlcHRpb24gZnJvbSBhIEMgY2FsbC4KKyAgICBHZW5lcmljVW53aW5kLCAvLyBX
ZSBleGl0ZWQgYmVjYXVzZSBhIHdlIGFycml2ZWQgYXQgdGhpcyBPU1IgZXhpdCBmcm9tIGdlbmVy
aWNVbndpbmQuCiB9OwogCiBjb25zdCBjaGFyKiBleGl0S2luZFRvU3RyaW5nKEV4aXRLaW5kKTsK
LWJvb2wgZXhpdEtpbmRJc0NvdW50YWJsZShFeGl0S2luZCk7Citib29sIGV4aXRLaW5kQ2F1c2Vz
SmV0dGlzb24oRXhpdEtpbmQpOwogCiB9IC8vIG5hbWVzcGFjZSBKU0MKIApJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGUuY3BwCShyZXZpc2lvbiAxOTU3MjIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC05MCw3ICs5MCw3IEBAIHZvaWQgSklUQ29kZTo6cmVjb25zdHJ1Y3QoCiBSZWdpc3RlclNldCBK
SVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9QcmVzZXJ2ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0
ZShDb2RlQmxvY2sqIGNvZGVCbG9jaywgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4KQogewog
ICAgIGZvciAoT1NSRXhpdCYgZXhpdCA6IG9zckV4aXQpIHsKLSAgICAgICAgaWYgKGV4aXQubV9p
c0V4Y2VwdGlvbkhhbmRsZXIgJiYgZXhpdC5tX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4
LmJpdHMoKSA9PSBjYWxsU2l0ZUluZGV4LmJpdHMoKSkgeworICAgICAgICBpZiAoZXhpdC5pc0V4
Y2VwdGlvbkhhbmRsZXIoKSAmJiBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXgu
Yml0cygpID09IGNhbGxTaXRlSW5kZXguYml0cygpKSB7CiAgICAgICAgICAgICBPcGVyYW5kczxW
YWx1ZVJlY292ZXJ5PiB2YWx1ZVJlY292ZXJpZXM7CiAgICAgICAgICAgICByZWNvbnN0cnVjdChj
b2RlQmxvY2ssIGV4aXQubV9jb2RlT3JpZ2luLCBleGl0Lm1fc3RyZWFtSW5kZXgsIHZhbHVlUmVj
b3Zlcmllcyk7CiAgICAgICAgICAgICBSZWdpc3RlclNldCBsaXZlQXRPU1JFeGl0OwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5jcHAJKHJldmlzaW9u
IDE5NTcyMikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC01NDEsMTEgKzU0MSw5IEBAIHZvaWQgSklUQ29tcGlsZXI6Om5v
dGljZU9TUkVudHJ5KEJhc2ljQmwKICAgICBlbnRyeS0+bV9yZXNodWZmbGluZ3Muc2hyaW5rVG9G
aXQoKTsKIH0KIAotdm9pZCBKSVRDb21waWxlcjo6YXBwZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JF
eGl0KHVuc2lnbmVkIGV2ZW50U3RyZWFtSW5kZXgsIENvZGVPcmlnaW4gb3BDYXRjaE9yaWdpbiwg
SGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXIsIENhbGxTaXRlSW5kZXggY2FsbFNpdGUsIE1h
Y3JvQXNzZW1ibGVyOjpKdW1wTGlzdCBqdW1wc1RvRmFpbCkKK3ZvaWQgSklUQ29tcGlsZXI6OmFw
cGVuZEV4Y2VwdGlvbkhhbmRsaW5nT1NSRXhpdChFeGl0S2luZCBraW5kLCB1bnNpZ25lZCBldmVu
dFN0cmVhbUluZGV4LCBDb2RlT3JpZ2luIG9wQ2F0Y2hPcmlnaW4sIEhhbmRsZXJJbmZvKiBleGNl
cHRpb25IYW5kbGVyLCBDYWxsU2l0ZUluZGV4IGNhbGxTaXRlLCBNYWNyb0Fzc2VtYmxlcjo6SnVt
cExpc3QganVtcHNUb0ZhaWwpCiB7Ci0gICAgT1NSRXhpdCBleGl0KFVuY291bnRhYmxlLCBKU1Zh
bHVlUmVncygpLCBncmFwaCgpLm1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGVGb3IobnVsbHB0
ciksIG1fc3BlY3VsYXRpdmUuZ2V0KCksIGV2ZW50U3RyZWFtSW5kZXgpOwotICAgIGV4aXQubV93
aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQgPSBqdW1wc1RvRmFpbC5lbXB0eSgp
OyAvLyBJZiBqdW1wcyBhcmUgZW1wdHksIHdlJ3JlIGdvaW5nIHRvIGp1bXAgaGVyZSBmcm9tIGdl
bmVyaWNVbndpbmQgZnJvbSBhIGNoaWxkIGNhbGwgZnJhbWUuCi0gICAgZXhpdC5tX2lzRXhjZXB0
aW9uSGFuZGxlciA9IHRydWU7CisgICAgT1NSRXhpdCBleGl0KGtpbmQsIEpTVmFsdWVSZWdzKCks
IGdyYXBoKCkubWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZUZvcihudWxscHRyKSwgbV9zcGVj
dWxhdGl2ZS5nZXQoKSwgZXZlbnRTdHJlYW1JbmRleCk7CiAgICAgZXhpdC5tX2NvZGVPcmlnaW4g
PSBvcENhdGNoT3JpZ2luOwogICAgIGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRl
eCA9IGNhbGxTaXRlOwogICAgIE9TUkV4aXRDb21waWxhdGlvbkluZm8mIGV4aXRJbmZvID0gYXBw
ZW5kRXhpdEluZm8oanVtcHNUb0ZhaWwpOwpAQCAtNTgyLDcgKzU4MCw3IEBAIHZvaWQgSklUQ29t
cGlsZXI6OmV4Y2VwdGlvbkNoZWNrKCkKICAgICAgICAgdW5zaWduZWQgc3RyZWFtSW5kZXggPSBt
X3NwZWN1bGF0aXZlLT5tX291dE9mTGluZVN0cmVhbUluZGV4ICE9IFVJTlRfTUFYID8gbV9zcGVj
dWxhdGl2ZS0+bV9vdXRPZkxpbmVTdHJlYW1JbmRleCA6IG1fc3BlY3VsYXRpdmUtPm1fc3RyZWFt
LT5zaXplKCk7CiAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGhhZEV4Y2VwdGlvbiA9IGVt
aXROb25QYXRjaGFibGVFeGNlcHRpb25DaGVjaygpOwogICAgICAgICAvLyBXZSBhc3N1bWUgaGVy
ZSB0aGF0IHRoaXMgaXMgY2FsbGVkIGFmdGVyIGNhbGxPcGVhcnRpb24oKS9hcHBlbmRDYWxsKCkg
aXMgY2FsbGVkLgotICAgICAgICBhcHBlbmRFeGNlcHRpb25IYW5kbGluZ09TUkV4aXQoc3RyZWFt
SW5kZXgsIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIsIG1faml0Q29kZS0+Y29tbW9u
Lmxhc3RDYWxsU2l0ZSgpLCBoYWRFeGNlcHRpb24pOworICAgICAgICBhcHBlbmRFeGNlcHRpb25I
YW5kbGluZ09TUkV4aXQoRXhjZXB0aW9uQ2hlY2ssIHN0cmVhbUluZGV4LCBvcENhdGNoT3JpZ2lu
LCBleGNlcHRpb25IYW5kbGVyLCBtX2ppdENvZGUtPmNvbW1vbi5sYXN0Q2FsbFNpdGUoKSwgaGFk
RXhjZXB0aW9uKTsKICAgICB9IGVsc2UKICAgICAgICAgbV9leGNlcHRpb25DaGVja3MuYXBwZW5k
KGVtaXRFeGNlcHRpb25DaGVjaygpKTsKIH0KQEAgLTU5NCw3ICs1OTIsNyBAQCBDYWxsU2l0ZUlu
ZGV4IEpJVENvbXBpbGVyOjpyZWNvcmRDYWxsU2l0CiAgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRp
b24gPSBtX2dyYXBoLndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKGNhbGxTaXRlQ29k
ZU9yaWdpbiwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9uSGFuZGxlcik7CiAgICAgQ2FsbFNpdGVJ
bmRleCBjYWxsU2l0ZSA9IGFkZENhbGxTaXRlKGNhbGxTaXRlQ29kZU9yaWdpbik7CiAgICAgaWYg
KHdpbGxDYXRjaEV4Y2VwdGlvbikKLSAgICAgICAgYXBwZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JF
eGl0KGV2ZW50U3RyZWFtSW5kZXgsIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIsIGNh
bGxTaXRlKTsKKyAgICAgICAgYXBwZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0KEdlbmVyaWNV
bndpbmQsIGV2ZW50U3RyZWFtSW5kZXgsIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIs
IGNhbGxTaXRlKTsKICAgICByZXR1cm4gY2FsbFNpdGU7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHJldmlzaW9uIDE5NTcyMikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtMjc5LDcgKzI3OSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBsaW5rT1NSRXhpdHMoKTsKICAg
ICB2b2lkIGRpc2Fzc2VtYmxlKExpbmtCdWZmZXImKTsKIAotICAgIHZvaWQgYXBwZW5kRXhjZXB0
aW9uSGFuZGxpbmdPU1JFeGl0KHVuc2lnbmVkIGV2ZW50U3RyZWFtSW5kZXgsIENvZGVPcmlnaW4s
IEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyLCBDYWxsU2l0ZUluZGV4LCBNYWNyb0Fzc2Vt
Ymxlcjo6SnVtcExpc3QganVtcHNUb0ZhaWwgPSBNYWNyb0Fzc2VtYmxlcjo6SnVtcExpc3QoKSk7
CisgICAgdm9pZCBhcHBlbmRFeGNlcHRpb25IYW5kbGluZ09TUkV4aXQoRXhpdEtpbmQsIHVuc2ln
bmVkIGV2ZW50U3RyZWFtSW5kZXgsIENvZGVPcmlnaW4sIEhhbmRsZXJJbmZvKiBleGNlcHRpb25I
YW5kbGVyLCBDYWxsU2l0ZUluZGV4LCBNYWNyb0Fzc2VtYmxlcjo6SnVtcExpc3QganVtcHNUb0Zh
aWwgPSBNYWNyb0Fzc2VtYmxlcjo6SnVtcExpc3QoKSk7CiAKICAgICAvLyBUaGUgZGF0YWZsb3cg
Z3JhcGggY3VycmVudGx5IGJlaW5nIGdlbmVyYXRlZC4KICAgICBHcmFwaCYgbV9ncmFwaDsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkocmV2aXNpb24gMTk1
NzIyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDMsNyArNDMsNiBAQCBPU1JFeGl0OjpPU1JFeGl0KEV4aXRLaW5kIGtpbmQs
IEpTVmFsdWVTCiAgICAgLCBtX3BhdGNoYWJsZUNvZGVPZmZzZXQoMCkKICAgICAsIG1fcmVjb3Zl
cnlJbmRleChyZWNvdmVyeUluZGV4KQogICAgICwgbV9zdHJlYW1JbmRleChzdHJlYW1JbmRleCkK
LSAgICAsIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKGZhbHNlKQogewog
ICAgIGJvb2wgY2FuRXhpdCA9IGppdC0+bV9vcmlnaW4uZXhpdE9LOwogICAgIGlmICghY2FuRXhp
dCAmJiBqaXQtPm1fY3VycmVudE5vZGUpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHT1NSRXhpdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHT1NSRXhpdC5oCShyZXZpc2lvbiAxOTU3MjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR09TUkV4aXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTAwLDcgKzEwMCw2IEBAIHN0cnVj
dCBPU1JFeGl0IDogcHVibGljIE9TUkV4aXRCYXNlIHsKICAgICB2b2lkIGNvcnJlY3RKdW1wKExp
bmtCdWZmZXImKTsKIAogICAgIHVuc2lnbmVkIG1fc3RyZWFtSW5kZXg7Ci0gICAgYm9vbCBtX3dp
bGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCA6IDE7CiAgICAgdm9pZCBjb25zaWRl
ckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZShDb2RlQmxvY2sqIHByb2ZpbGVkQ29kZUJsb2NrKQog
ICAgIHsKICAgICAgICAgT1NSRXhpdEJhc2U6OmNvbnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRT
aXRlKHByb2ZpbGVkQ29kZUJsb2NrLCBFeGl0RnJvbURGRyk7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR09TUkV4aXRCYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0QmFzZS5oCShyZXZpc2lvbiAxOTU3MjIpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQ1LDcgKzQ1LDYgQEAgc3RydWN0IE9TUkV4aXRCYXNlIHsKICAgICAgICAgLCBtX2NvdW50KDAp
CiAgICAgICAgICwgbV9jb2RlT3JpZ2luKG9yaWdpbikKICAgICAgICAgLCBtX2NvZGVPcmlnaW5G
b3JFeGl0UHJvZmlsZShvcmlnaW5Gb3JQcm9maWxlKQotICAgICAgICAsIG1faXNFeGNlcHRpb25I
YW5kbGVyKGZhbHNlKQogICAgIHsKICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbi5pc1NldCgp
KTsKICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlLmlzU2V0KCkpOwpA
QCAtNTgsNyArNTcsMTggQEAgc3RydWN0IE9TUkV4aXRCYXNlIHsKICAgICBDb2RlT3JpZ2luIG1f
Y29kZU9yaWdpbkZvckV4aXRQcm9maWxlOwogICAgIENhbGxTaXRlSW5kZXggbV9leGNlcHRpb25I
YW5kbGVyQ2FsbFNpdGVJbmRleDsKIAotICAgIGJvb2wgbV9pc0V4Y2VwdGlvbkhhbmRsZXIgOiAx
OworICAgIEFMV0FZU19JTkxJTkUgYm9vbCBpc0V4Y2VwdGlvbkhhbmRsZXIoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fa2luZCA9PSBFeGNlcHRpb25DaGVjayB8fCBtX2tpbmQgPT0g
R2VuZXJpY1Vud2luZDsKKyAgICB9CisKKyAgICAvLyBUcnVlIGlmIHRoaXMgZXhpdCBpcyB1c2Vk
IGFzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciB1bndpbmRpbmcuIFRoaXMgaGFwcGVucyB0byBv
bmx5IGJlIHNldCB3aGVuCisgICAgLy8gaXNFeGNlcHRpb25IYW5kbGVyIGlzIHRydWUsIGJ1dCBh
bGwgdGhpcyBhY3R1YWxseSBtZWFucyBpcyB0aGF0IHRoZSBPU1IgZXhpdCB3aWxsIGFzc3VtZSB0
aGF0IHRoZQorICAgIC8vIG1hY2hpbmUgc3RhdGUgaXMgYXMgaXQgd291bGQgYmUgY29taW5nIG91
dCBvZiBnZW5lcmljVW53aW5kLgorICAgIEFMV0FZU19JTkxJTkUgYm9vbCBpc0dlbmVyaWNVbndp
bmRIYW5kbGVyKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2tpbmQgPT0gR2VuZXJp
Y1Vud2luZDsKKyAgICB9CiAKIHByb3RlY3RlZDoKICAgICB2b2lkIGNvbnNpZGVyQWRkaW5nQXNG
cmVxdWVudEV4aXRTaXRlKENvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2ssIEV4aXRpbmdKSVRU
eXBlIGppdFR5cGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRD
b21waWxlcjMyXzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR09TUkV4aXRDb21waWxlcjMyXzY0LmNwcAkocmV2aXNpb24gMTk1NzIyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXIzMl82NC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI0OCw3ICsyNDgsNyBAQCB2b2lkIE9TUkV4aXRDb21waWxlcjo6Y29tcGlsZUV4
aXQoY29uc3QgCiAgICAgbV9qaXQuZW1pdFJlc3RvcmVDYWxsZWVTYXZlcygpOwogICAgIG1faml0
LmVtaXRTYXZlQ2FsbGVlU2F2ZXNGb3IobV9qaXQuYmFzZWxpbmVDb2RlQmxvY2soKSk7CiAKLSAg
ICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICBpZiAoZXhpdC5pc0V4Y2VwdGlv
bkhhbmRsZXIoKSkKICAgICAgICAgbV9qaXQuY29weUNhbGxlZVNhdmVzVG9WTUNhbGxlZVNhdmVz
QnVmZmVyKCk7CiAKICAgICAvLyBEbyBhbGwgZGF0YSBmb3JtYXQgY29udmVyc2lvbnMgYW5kIHN0
b3JlIHRoZSByZXN1bHRzIGludG8gdGhlIHN0YWNrLgpAQCAtMzk3LDcgKzM5Nyw3IEBAIHZvaWQg
T1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICByZWlmeUlubGluZWRDYWxs
RnJhbWVzKG1faml0LCBleGl0KTsKICAgICAKICAgICAvLyBBbmQgZmluaXNoLgotICAgIGFkanVz
dEFuZEp1bXBUb1RhcmdldChtX2ppdCwgZXhpdCwgZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcik7
CisgICAgYWRqdXN0QW5kSnVtcFRvVGFyZ2V0KG1faml0LCBleGl0KTsKIH0KIAogfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkRGRwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JF
eGl0Q29tcGlsZXI2NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHAJKHJldmlzaW9uIDE5NTcyMikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyNjQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yNjEsNyArMjYxLDcgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNv
bnN0IAogICAgIC8vIFRoZSB0YWcgcmVnaXN0ZXJzIGFyZSBuZWVkZWQgdG8gbWF0ZXJpYWxpemUg
cmVjb3ZlcmllcyBiZWxvdy4KICAgICBtX2ppdC5lbWl0TWF0ZXJpYWxpemVUYWdDaGVja1JlZ2lz
dGVycygpOwogCi0gICAgaWYgKGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgaWYgKGV4
aXQuaXNFeGNlcHRpb25IYW5kbGVyKCkpCiAgICAgICAgIG1faml0LmNvcHlDYWxsZWVTYXZlc1Rv
Vk1DYWxsZWVTYXZlc0J1ZmZlcigpOwogCiAgICAgLy8gRG8gYWxsIGRhdGEgZm9ybWF0IGNvbnZl
cnNpb25zIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBpbnRvIHRoZSBzdGFjay4KQEAgLTM4Nyw3ICsz
ODcsNyBAQCB2b2lkIE9TUkV4aXRDb21waWxlcjo6Y29tcGlsZUV4aXQoY29uc3QgCiAgICAgcmVp
ZnlJbmxpbmVkQ2FsbEZyYW1lcyhtX2ppdCwgZXhpdCk7CiAKICAgICAvLyBBbmQgZmluaXNoLgot
ICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChtX2ppdCwgZXhpdCwgZXhpdC5tX2lzRXhjZXB0aW9u
SGFuZGxlcik7CisgICAgYWRqdXN0QW5kSnVtcFRvVGFyZ2V0KG1faml0LCBleGl0KTsKIH0KIAog
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkRGRwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0Q29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyLmNwcAkocmV2aXNpb24gMTk1NzIyKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzEsOCArMTMxLDggQEAgdm9pZCBjb21waWxlT1NSRXhpdChFeGVjU3RhdGUqIGV4
ZWMpCiAgICAgT1NSRXhpdCYgZXhpdCA9IGNvZGVCbG9jay0+aml0Q29kZSgpLT5kZmcoKS0+b3Ny
RXhpdFtleGl0SW5kZXhdOwogICAgIAogICAgIGlmICh2bS0+Y2FsbEZyYW1lRm9yQ2F0Y2gpCi0g
ICAgICAgIEFTU0VSVChleGl0Lm1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5k
KTsKLSAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICAgICAgQVNTRVJUKGV4
aXQubV9raW5kID09IEdlbmVyaWNVbndpbmQpOworICAgIGlmIChleGl0LmlzRXhjZXB0aW9uSGFu
ZGxlcigpKQogICAgICAgICBBU1NFUlQoISF2bS0+ZXhjZXB0aW9uKCkpOwogICAgICAgICAKICAg
ICAKQEAgLTE1MCw3ICsxNTAsNyBAQCB2b2lkIGNvbXBpbGVPU1JFeGl0KEV4ZWNTdGF0ZSogZXhl
YykKICAgICAgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSwgY29kZUJsb2NrKTsKICAgICAgICAgT1NS
RXhpdENvbXBpbGVyIGV4aXRDb21waWxlcihqaXQpOwogCi0gICAgICAgIGlmIChleGl0Lm1fd2ls
bEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKSB7CisgICAgICAgIGlmIChleGl0Lm1f
a2luZCA9PSBHZW5lcmljVW53aW5kKSB7CiAgICAgICAgICAgICAvLyBXZSBhcmUgYWN0aW5nIGFz
IGEgZGVmYWN0byBvcF9jYXRjaCBiZWNhdXNlIHdlIGFycml2ZSBoZXJlIGZyb20gZ2VuZXJpY1Vu
d2luZCgpLgogICAgICAgICAgICAgLy8gU28sIHdlIG11c3QgcmVzdG9yZSBvdXIgY2FsbCBmcmFt
ZSBhbmQgc3RhY2sgcG9pbnRlci4KICAgICAgICAgICAgIGppdC5yZXN0b3JlQ2FsbGVlU2F2ZXNG
cm9tVk1DYWxsZWVTYXZlc0J1ZmZlcigpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0Q29tcGlsZXJDb21tb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmNwcAkocmV2aXNpb24gMTk1
NzIyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXJDb21t
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw5IEBAIG5hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgREZHIHsKIHZvaWQgaGFuZGxlRXhpdENvdW50cyhDQ2FsbEhlbHBlcnMmIGppdCwg
Y29uc3QgT1NSRXhpdEJhc2UmIGV4aXQpCiB7CiAgICAgaml0LmFkZDMyKEFzc2VtYmx5SGVscGVy
czo6VHJ1c3RlZEltbTMyKDEpLCBBc3NlbWJseUhlbHBlcnM6OkFic29sdXRlQWRkcmVzcygmZXhp
dC5tX2NvdW50KSk7CisKKyAgICBpZiAoIWV4aXRLaW5kQ2F1c2VzSmV0dGlzb24oZXhpdC5tX2tp
bmQpKQorICAgICAgICByZXR1cm47CiAgICAgCiAgICAgaml0Lm1vdmUoQXNzZW1ibHlIZWxwZXJz
OjpUcnVzdGVkSW1tUHRyKGppdC5jb2RlQmxvY2soKSksIEdQUkluZm86OnJlZ1QwKTsKICAgICAK
QEAgLTI2NCw3ICsyNjcsNyBAQCBzdGF0aWMgdm9pZCBvc3JXcml0ZUJhcnJpZXIoQ0NhbGxIZWxw
ZXJzCiAgICAgb3duZXJJc1JlbWVtYmVyZWRPckluRWRlbi5saW5rKCZqaXQpOwogfQogCi12b2lk
IGFkanVzdEFuZEp1bXBUb1RhcmdldChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgT1NSRXhpdEJh
c2UmIGV4aXQsIGJvb2wgaXNFeGl0aW5nVG9PcENhdGNoKQordm9pZCBhZGp1c3RBbmRKdW1wVG9U
YXJnZXQoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IE9TUkV4aXRCYXNlJiBleGl0KQogewogICAg
IGppdC5tb3ZlKAogICAgICAgICBBc3NlbWJseUhlbHBlcnM6OlRydXN0ZWRJbW1QdHIoCkBAIC0z
MDIsNyArMzA1LDcgQEAgdm9pZCBhZGp1c3RBbmRKdW1wVG9UYXJnZXQoQ0NhbGxIZWxwZXJzJgog
ICAgIHZvaWQqIGp1bXBUYXJnZXQgPSBjb2RlQmxvY2tGb3JFeGl0LT5qaXRDb2RlKCktPmV4ZWN1
dGFibGVBZGRyZXNzQXRPZmZzZXQobWFwcGluZy0+bV9tYWNoaW5lQ29kZU9mZnNldCk7CiAKICAg
ICBqaXQuYWRkUHRyKEFzc2VtYmx5SGVscGVyczo6VHJ1c3RlZEltbTMyKEpJVDo6c3RhY2tQb2lu
dGVyT2Zmc2V0Rm9yKGNvZGVCbG9ja0ZvckV4aXQpICogc2l6ZW9mKFJlZ2lzdGVyKSksIEdQUklu
Zm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBBc3NlbWJseUhlbHBlcnM6OnN0YWNrUG9pbnRlclJlZ2lz
dGVyKTsKLSAgICBpZiAoaXNFeGl0aW5nVG9PcENhdGNoKSB7CisgICAgaWYgKGV4aXQuaXNFeGNl
cHRpb25IYW5kbGVyKCkpIHsKICAgICAgICAgLy8gU2luY2Ugd2UncmUganVtcGluZyB0byBvcF9j
YXRjaCwgd2UgbmVlZCB0byBzZXQgY2FsbEZyYW1lRm9yQ2F0Y2guCiAgICAgICAgIGppdC5zdG9y
ZVB0cihHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlciwgaml0LnZtKCktPmFkZHJlc3NPZkNhbGxG
cmFtZUZvckNhdGNoKCkpOwogICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXJDb21tb24uaAkocmV2aXNpb24gMTk1NzIyKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXJDb21tb24uaAko
d29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNl
IERGRyB7CiAKIHZvaWQgaGFuZGxlRXhpdENvdW50cyhDQ2FsbEhlbHBlcnMmLCBjb25zdCBPU1JF
eGl0QmFzZSYpOwogdm9pZCByZWlmeUlubGluZWRDYWxsRnJhbWVzKENDYWxsSGVscGVycyYsIGNv
bnN0IE9TUkV4aXRCYXNlJik7Ci12b2lkIGFkanVzdEFuZEp1bXBUb1RhcmdldChDQ2FsbEhlbHBl
cnMmLCBjb25zdCBPU1JFeGl0QmFzZSYsIGJvb2wgaXNFeGl0aW5nVG9PcENhdGNoKTsKK3ZvaWQg
YWRqdXN0QW5kSnVtcFRvVGFyZ2V0KENDYWxsSGVscGVycyYsIGNvbnN0IE9TUkV4aXRCYXNlJik7
CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBKSVRDb2RlVHlwZT4KIHZvaWQgYWRqdXN0RnJhbWVBbmRT
dGFja0luT1NSRXhpdENvbXBpbGVyVGh1bmsoTWFjcm9Bc3NlbWJsZXImIGppdCwgVk0qIHZtLCBK
SVRDb2RlOjpKSVRUeXBlIGppdFR5cGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTENvbXBpbGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwv
RlRMQ29tcGlsZS5jcHAJKHJldmlzaW9uIDE5NTcyMikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMQ29tcGlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ5Miw3ICs0OTIsNyBAQCBz
dGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgIH0KIAogICAg
ICAgICBPU1JFeGl0RGVzY3JpcHRvckltcGwmIGV4aXREZXNjcmlwdG9ySW1wbCA9IHN0YXRlLm9z
ckV4aXREZXNjcmlwdG9ySW1wbHNbaV07Ci0gICAgICAgIGlmIChleGNlcHRpb25UeXBlV2lsbEFy
cml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKGV4aXREZXNjcmlwdG9ySW1wbC5tX2V4Y2Vw
dGlvblR5cGUpKQorICAgICAgICBpZiAoZXhpdERlc2NyaXB0b3JJbXBsLm1fa2luZCA9PSBHZW5l
cmljVW53aW5kKQogICAgICAgICAgICAgZ2VuZXJpY1Vud2luZE9TUkV4aXREZXNjcmlwdG9ycy5h
ZGQoZXhpdERlc2NyaXB0b3IsICZleGl0RGVzY3JpcHRvckltcGwpOwogCiAgICAgICAgIGZvciAo
dW5zaWduZWQgaiA9IGV4aXREZXNjcmlwdG9yLT5tX3ZhbHVlcy5zaXplKCk7IGotLTspCkBAIC01
MDMsNyArNTAzLDcgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAog
ICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaXRlci0+dmFsdWUuc2l6ZSgpOyBqKysp
IHsKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFja21hcFJlY29y
ZEluZGV4ID0gaXRlci0+dmFsdWVbal0uaW5kZXg7Ci0gICAgICAgICAgICAgICAgT1NSRXhpdCBl
eGl0KGV4aXREZXNjcmlwdG9yLCBleGl0RGVzY3JpcHRvckltcGwsIHN0YWNrbWFwUmVjb3JkSW5k
ZXgpOworICAgICAgICAgICAgICAgIE9TUkV4aXQgZXhpdChleGl0RGVzY3JpcHRvciwgZXhpdERl
c2NyaXB0b3JJbXBsLm1fa2luZCwgZXhpdERlc2NyaXB0b3JJbXBsLCBzdGFja21hcFJlY29yZElu
ZGV4KTsKICAgICAgICAgICAgICAgICBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0LmFwcGVuZChleGl0
KTsKICAgICAgICAgICAgICAgICBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXQuYXBwZW5kKE9TUkV4
aXRDb21waWxhdGlvbkluZm8oKSk7CiAgICAgICAgICAgICB9CkBAIC01MjgsNyArNTI4LDcgQEAg
c3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICAgICAgICAg
ICAgICAvLyBhbmQgdGhlIG90aGVyIHRoYXQgd2lsbCBiZSBhcnJpdmVkIGF0IGZyb20gdGhlIGNh
bGxPcGVyYXRpb24gZXhjZXB0aW9uIGhhbmRsZXIgcGF0aC4KICAgICAgICAgICAgICAgICAgICAg
Ly8gVGhpcyBjb2RlIGhlcmUgZ2VuZXJhdGVzIHRoZSBzZWNvbmQgY2FsbE9wZXJhdGlvbiB2YXJp
YW50LgogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFja21hcFJlY29yZEluZGV4ID0g
aXRlci0+dmFsdWVbal0uaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIE9TUkV4aXQgZXhpdChl
eGl0RGVzY3JpcHRvciwgZXhpdERlc2NyaXB0b3JJbXBsLCBzdGFja21hcFJlY29yZEluZGV4KTsK
KyAgICAgICAgICAgICAgICAgICAgT1NSRXhpdCBleGl0KGV4aXREZXNjcmlwdG9yLCBFeGNlcHRp
b25DaGVjaywgZXhpdERlc2NyaXB0b3JJbXBsLCBzdGFja21hcFJlY29yZEluZGV4KTsKICAgICAg
ICAgICAgICAgICAgICAgaWYgKGV4aXREZXNjcmlwdG9ySW1wbC5tX2V4Y2VwdGlvblR5cGUgPT0g
RXhjZXB0aW9uVHlwZTo6R2V0QnlJZCkKICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQubV9l
eGNlcHRpb25UeXBlID0gRXhjZXB0aW9uVHlwZTo6R2V0QnlJZENhbGxPcGVyYXRpb247CiAgICAg
ICAgICAgICAgICAgICAgIGVsc2UKQEAgLTU5MCw3ICs1OTAsNyBAQCBzdGF0aWMgdm9pZCBmaXhG
dW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgICAgICBpbmZvLm1fdGh1bmtBZGRyZXNz
ID0gbGlua0J1ZmZlci0+bG9jYXRpb25PZihpbmZvLm1fdGh1bmtMYWJlbCk7CiAgICAgICAgICAg
ICBleGl0Lm1fcGF0Y2hhYmxlQ29kZU9mZnNldCA9IGxpbmtCdWZmZXItPm9mZnNldE9mKGluZm8u
bV90aHVua0p1bXApOwogCi0gICAgICAgICAgICBpZiAoZXhpdC53aWxsQXJyaXZlQXRPU1JFeGl0
RnJvbUdlbmVyaWNVbndpbmQoKSkgeworICAgICAgICAgICAgaWYgKGV4aXQuaXNHZW5lcmljVW53
aW5kSGFuZGxlcigpKSB7CiAgICAgICAgICAgICAgICAgSGFuZGxlckluZm8gbmV3SGFuZGxlciA9
IGdlbmVyaWNVbndpbmRPU1JFeGl0RGVzY3JpcHRvcnMuZ2V0KGV4aXQubV9kZXNjcmlwdG9yKS0+
bV9iYXNlbGluZUV4Y2VwdGlvbkhhbmRsZXI7CiAgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5z
dGFydCA9IGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleC5iaXRzKCk7CiAgICAg
ICAgICAgICAgICAgbmV3SGFuZGxlci5lbmQgPSBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxT
aXRlSW5kZXguYml0cygpICsgMTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRM
RXhpdFRodW5rR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE5NTcyMikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDksNyArNDksNyBAQCBFeGl0VGh1bmtHZW5lcmF0b3I6On5FeGl0VGh1bmtH
ZW5lcmF0b3IoCiB2b2lkIEV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rKHVuc2lnbmVkIGlu
ZGV4KQogewogICAgIE9TUkV4aXQmIGV4aXQgPSBtX3N0YXRlLmppdENvZGUtPm9zckV4aXRbaW5k
ZXhdOwotICAgIEFTU0VSVF9VTlVTRUQoZXhpdCwgIShleGl0LndpbGxBcnJpdmVBdE9TUkV4aXRG
cm9tR2VuZXJpY1Vud2luZCgpICYmIGV4aXQud2lsbEFycml2ZUF0T1NSRXhpdEZyb21DYWxsT3Bl
cmF0aW9uKCkpKTsKKyAgICBBU1NFUlRfVU5VU0VEKGV4aXQsICEoZXhpdC5pc0dlbmVyaWNVbndp
bmRIYW5kbGVyKCkgJiYgZXhpdC53aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUNhbGxPcGVyYXRpb24o
KSkpOwogICAgIAogICAgIE9TUkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBtX3N0YXRlLmZp
bmFsaXplci0+b3NyRXhpdFtpbmRleF07CiAgICAgaW5mby5tX3RodW5rTGFiZWwgPSBsYWJlbCgp
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKSVRDb2RlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJVENvZGUuY3BwCShyZXZpc2lv
biAxOTU3MjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJVENvZGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNzAsMTUgKzE3MCwxNSBAQCBSZWdpc3RlclNldCBKSVRDb2RlOjps
aXZlUmVnaXN0ZXJzVG9QcmVzCiAjaWYgRlRMX1VTRVNfQjMKICAgICBmb3IgKE9TUkV4aXQmIGV4
aXQgOiBvc3JFeGl0KSB7CiAgICAgICAgIGlmIChleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxT
aXRlSW5kZXguYml0cygpID09IGNhbGxTaXRlSW5kZXguYml0cygpKSB7Ci0gICAgICAgICAgICBS
RUxFQVNFX0FTU0VSVChleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVyKTsKLSAgICAgICAgICAgIFJF
TEVBU0VfQVNTRVJUKGV4aXQubV9pc1Vud2luZEhhbmRsZXIpOworICAgICAgICAgICAgUkVMRUFT
RV9BU1NFUlQoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSk7CisgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVChleGl0LmlzR2VuZXJpY1Vud2luZEhhbmRsZXIoKSk7CiAgICAgICAgICAgICByZXR1
cm4gVmFsdWVSZXA6OnVzZWRSZWdpc3RlcnMoZXhpdC5tX3ZhbHVlUmVwcyk7CiAgICAgICAgIH0K
ICAgICB9CiAjZWxzZSAvLyBGVExfVVNFU19CMwogICAgIGZvciAoT1NSRXhpdCYgZXhpdCA6IG9z
ckV4aXQpIHsKICAgICAgICAgaWYgKGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRl
eC5iaXRzKCkgPT0gY2FsbFNpdGVJbmRleC5iaXRzKCkpIHsKLSAgICAgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpOworICAgICAgICAgICAgUkVMRUFTRV9B
U1NFUlQoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gc3Rh
Y2ttYXBzLnJlY29yZHNbZXhpdC5tX3N0YWNrbWFwUmVjb3JkSW5kZXhdLnVzZWRSZWdpc3RlclNl
dCgpOwogICAgICAgICB9CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExMb3dlckRGR1RvTExWTS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAJKHJldmlzaW9uIDE5NTcyMikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMTG93ZXJERkdUb0xMVk0uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDE4Myw3ICsxMDE4Myw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBib29sIGV4aXRPSyA9
IHRydWU7CiAgICAgICAgICAgICBib29sIGlzRXhjZXB0aW9uSGFuZGxlciA9IHRydWU7CiAgICAg
ICAgICAgICBhcHBlbmRPU1JFeGl0KAotICAgICAgICAgICAgICAgIFVuY291bnRhYmxlLCBub1Zh
bHVlKCksIG51bGxwdHIsIGhhZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25D
aGVjaywgbm9WYWx1ZSgpLCBudWxscHRyLCBoYWRFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAg
bV9vcmlnaW4ud2l0aEZvckV4aXRBbmRFeGl0T0sob3BDYXRjaE9yaWdpbiwgZXhpdE9LKSwgaXNF
eGNlcHRpb25IYW5kbGVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTAy
NDEsNyArMTAyNDEsMjIgQEAgcHJpdmF0ZToKICAgICAgICAgaWYgKCF3aWxsQ2F0Y2hFeGNlcHRp
b24pCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgYXBwZW5kT1NSRXhpdERlc2NyaXB0
b3IoVW5jb3VudGFibGUsIGV4Y2VwdGlvblR5cGUsIG5vVmFsdWUoKSwgbnVsbHB0ciwgbV9vcmln
aW4ud2l0aEZvckV4aXRBbmRFeGl0T0sob3BDYXRjaE9yaWdpbiwgdHJ1ZSkpOworICAgICAgICBF
eGl0S2luZCBleGl0S2luZDsKKyAgICAgICAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7CisgICAg
ICAgIGNhc2UgRXhjZXB0aW9uVHlwZTo6SlNDYWxsOgorICAgICAgICBjYXNlIEV4Y2VwdGlvblR5
cGU6OkdldEJ5SWQ6CisgICAgICAgIGNhc2UgRXhjZXB0aW9uVHlwZTo6UHV0QnlJZDoKKyAgICAg
ICAgICAgIGV4aXRLaW5kID0gR2VuZXJpY1Vud2luZDsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEV4Y2VwdGlvblR5cGU6OkxhenlTbG93UGF0aDoKKyAgICAgICAgY2FzZSBFeGNl
cHRpb25UeXBlOjpCaW5hcnlPcEdlbmVyYXRvcjoKKyAgICAgICAgICAgIGV4aXRLaW5kID0gRXhj
ZXB0aW9uQ2hlY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAg
ICBhcHBlbmRPU1JFeGl0RGVzY3JpcHRvcihleGl0S2luZCwgZXhjZXB0aW9uVHlwZSwgbm9WYWx1
ZSgpLCBudWxscHRyLCBtX29yaWdpbi53aXRoRm9yRXhpdEFuZEV4aXRPSyhvcENhdGNoT3JpZ2lu
LCB0cnVlKSk7CiAgICAgICAgIE9TUkV4aXREZXNjcmlwdG9yKiBleGl0RGVzY3JpcHRvciA9ICZt
X2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlwdG9ycy5sYXN0KCk7CiAgICAgICAgIGV4
aXREZXNjcmlwdG9yLT5tX3N0YWNrbWFwSUQgPSBtX3N0YWNrbWFwSURzIC0gMTsKIApAQCAtMTAz
MTcsNyArMTAzMzIsNyBAQCBwcml2YXRlOgogCiAjaWYgRlRMX1VTRVNfQjMKICAgICAgICAgYmxl
c3NTcGVjdWxhdGlvbigKLSAgICAgICAgICAgIG1fb3V0LnNwZWN1bGF0ZShmYWlsQ29uZGl0aW9u
KSwga2luZCwgbG93VmFsdWUsIGhpZ2hWYWx1ZSwgb3JpZ2luLCBpc0V4Y2VwdGlvbkhhbmRsZXIp
OworICAgICAgICAgICAgbV9vdXQuc3BlY3VsYXRlKGZhaWxDb25kaXRpb24pLCBraW5kLCBsb3dW
YWx1ZSwgaGlnaFZhbHVlLCBvcmlnaW4pOwogI2Vsc2UgLy8gRlRMX1VTRVNfQjMKICAgICAgICAg
T1NSRXhpdERlc2NyaXB0b3IqIGV4aXREZXNjcmlwdG9yID0gYXBwZW5kT1NSRXhpdERlc2NyaXB0
b3Ioa2luZCwgaXNFeGNlcHRpb25IYW5kbGVyID8gRXhjZXB0aW9uVHlwZTo6Q0NhbGxFeGNlcHRp
b24gOiBFeGNlcHRpb25UeXBlOjpOb25lLCBsb3dWYWx1ZSwgaGlnaFZhbHVlLCBvcmlnaW4pOwog
CkBAIC0xMDM0NSw3ICsxMDM2MCw3IEBAIHByaXZhdGU6CiAgICAgfQogCiAjaWYgRlRMX1VTRVNf
QjMKLSAgICB2b2lkIGJsZXNzU3BlY3VsYXRpb24oQ2hlY2tWYWx1ZSogdmFsdWUsIEV4aXRLaW5k
IGtpbmQsIEZvcm1hdHRlZFZhbHVlIGxvd1ZhbHVlLCBOb2RlKiBoaWdoVmFsdWUsIE5vZGVPcmln
aW4gb3JpZ2luLCBib29sIGlzRXhjZXB0aW9uSGFuZGxlciA9IGZhbHNlKQorICAgIHZvaWQgYmxl
c3NTcGVjdWxhdGlvbihDaGVja1ZhbHVlKiB2YWx1ZSwgRXhpdEtpbmQga2luZCwgRm9ybWF0dGVk
VmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTm9kZU9yaWdpbiBvcmlnaW4pCiAgICAg
ewogICAgICAgICBPU1JFeGl0RGVzY3JpcHRvciogZXhpdERlc2NyaXB0b3IgPSBhcHBlbmRPU1JF
eGl0RGVzY3JpcHRvcihsb3dWYWx1ZSwgaGlnaFZhbHVlKTsKICAgICAgICAgCkBAIC0xMDM1NSw3
ICsxMDM3MCw3IEBAIHByaXZhdGU6CiAgICAgICAgIHZhbHVlLT5zZXRHZW5lcmF0b3IoCiAgICAg
ICAgICAgICBbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0
aW9uUGFyYW1zJiBwYXJhbXMpIHsKICAgICAgICAgICAgICAgICBleGl0RGVzY3JpcHRvci0+ZW1p
dE9TUkV4aXQoCi0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSwga2luZCwgb3JpZ2luLCBqaXQs
IHBhcmFtcywgMCwgaXNFeGNlcHRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgKnN0
YXRlLCBraW5kLCBvcmlnaW4sIGppdCwgcGFyYW1zLCAwKTsKICAgICAgICAgICAgIH0pOwogICAg
IH0KICNlbmRpZgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXQuY3Bw
CShyZXZpc2lvbiAxOTU3MjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4
aXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02OSwyMCArNjksMjAgQEAgdm9pZCBPU1JFeGl0RGVz
Y3JpcHRvcjo6dmFsaWRhdGVSZWZlcmVuYwogI2lmIEZUTF9VU0VTX0IzCiBSZWZQdHI8T1NSRXhp
dEhhbmRsZT4gT1NSRXhpdERlc2NyaXB0b3I6OmVtaXRPU1JFeGl0KAogICAgIFN0YXRlJiBzdGF0
ZSwgRXhpdEtpbmQgZXhpdEtpbmQsIGNvbnN0IE5vZGVPcmlnaW4mIG5vZGVPcmlnaW4sIENDYWxs
SGVscGVycyYgaml0LAotICAgIGNvbnN0IFN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYgcGFyYW1z
LCB1bnNpZ25lZCBvZmZzZXQsIGJvb2wgaXNFeGNlcHRpb25IYW5kbGVyKQorICAgIGNvbnN0IFN0
YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYgcGFyYW1zLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAgICAg
UmVmUHRyPE9TUkV4aXRIYW5kbGU+IGhhbmRsZSA9Ci0gICAgICAgIHByZXBhcmVPU1JFeGl0SGFu
ZGxlKHN0YXRlLCBleGl0S2luZCwgbm9kZU9yaWdpbiwgcGFyYW1zLCBvZmZzZXQsIGlzRXhjZXB0
aW9uSGFuZGxlcik7CisgICAgICAgIHByZXBhcmVPU1JFeGl0SGFuZGxlKHN0YXRlLCBleGl0S2lu
ZCwgbm9kZU9yaWdpbiwgcGFyYW1zLCBvZmZzZXQpOwogICAgIGhhbmRsZS0+ZW1pdEV4aXRUaHVu
ayhzdGF0ZSwgaml0KTsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCiBSZWZQdHI8T1NSRXhpdEhh
bmRsZT4gT1NSRXhpdERlc2NyaXB0b3I6OmVtaXRPU1JFeGl0TGF0ZXIoCiAgICAgU3RhdGUmIHN0
YXRlLCBFeGl0S2luZCBleGl0S2luZCwgY29uc3QgTm9kZU9yaWdpbiYgbm9kZU9yaWdpbiwKLSAg
ICBjb25zdCBTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFtcywgdW5zaWduZWQgb2Zmc2V0
LCBib29sIGlzRXhjZXB0aW9uSGFuZGxlcikKKyAgICBjb25zdCBTdGFja21hcEdlbmVyYXRpb25Q
YXJhbXMmIHBhcmFtcywgdW5zaWduZWQgb2Zmc2V0KQogewogICAgIFJlZlB0cjxPU1JFeGl0SGFu
ZGxlPiBoYW5kbGUgPQotICAgICAgICBwcmVwYXJlT1NSRXhpdEhhbmRsZShzdGF0ZSwgZXhpdEtp
bmQsIG5vZGVPcmlnaW4sIHBhcmFtcywgb2Zmc2V0LCBpc0V4Y2VwdGlvbkhhbmRsZXIpOworICAg
ICAgICBwcmVwYXJlT1NSRXhpdEhhbmRsZShzdGF0ZSwgZXhpdEtpbmQsIG5vZGVPcmlnaW4sIHBh
cmFtcywgb2Zmc2V0KTsKICAgICBwYXJhbXMuYWRkTGF0ZVBhdGgoCiAgICAgICAgIFtoYW5kbGUs
ICZzdGF0ZV0gKENDYWxsSGVscGVycyYgaml0KSB7CiAgICAgICAgICAgICBoYW5kbGUtPmVtaXRF
eGl0VGh1bmsoc3RhdGUsIGppdCk7CkBAIC05MiwxMSArOTIsMTEgQEAgUmVmUHRyPE9TUkV4aXRI
YW5kbGU+IE9TUkV4aXREZXNjcmlwdG9yOgogCiBSZWZQdHI8T1NSRXhpdEhhbmRsZT4gT1NSRXhp
dERlc2NyaXB0b3I6OnByZXBhcmVPU1JFeGl0SGFuZGxlKAogICAgIFN0YXRlJiBzdGF0ZSwgRXhp
dEtpbmQgZXhpdEtpbmQsIGNvbnN0IE5vZGVPcmlnaW4mIG5vZGVPcmlnaW4sCi0gICAgY29uc3Qg
U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJiBwYXJhbXMsIHVuc2lnbmVkIG9mZnNldCwgYm9vbCBp
c0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJiBw
YXJhbXMsIHVuc2lnbmVkIG9mZnNldCkKIHsKICAgICB1bnNpZ25lZCBpbmRleCA9IHN0YXRlLmpp
dENvZGUtPm9zckV4aXQuc2l6ZSgpOwogICAgIE9TUkV4aXQmIGV4aXQgPSBzdGF0ZS5qaXRDb2Rl
LT5vc3JFeGl0LmFsbG9jKAotICAgICAgICB0aGlzLCBleGl0S2luZCwgbm9kZU9yaWdpbi5mb3JF
eGl0LCBub2RlT3JpZ2luLnNlbWFudGljLCBpc0V4Y2VwdGlvbkhhbmRsZXIpOworICAgICAgICB0
aGlzLCBleGl0S2luZCwgbm9kZU9yaWdpbi5mb3JFeGl0LCBub2RlT3JpZ2luLnNlbWFudGljKTsK
ICAgICBSZWZQdHI8T1NSRXhpdEhhbmRsZT4gaGFuZGxlID0gYWRvcHRSZWYobmV3IE9TUkV4aXRI
YW5kbGUoaW5kZXgsIGV4aXQpKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSBvZmZzZXQ7IGkgPCBw
YXJhbXMuc2l6ZSgpOyArK2kpCiAgICAgICAgIGV4aXQubV92YWx1ZVJlcHMuYXBwZW5kKHBhcmFt
c1tpXSk7CkBAIC0xMDgsMjMgKzEwOCwyMCBAQCBSZWZQdHI8T1NSRXhpdEhhbmRsZT4gT1NSRXhp
dERlc2NyaXB0b3I6CiAjaWYgRlRMX1VTRVNfQjMKIE9TUkV4aXQ6Ok9TUkV4aXQoCiAgICAgT1NS
RXhpdERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgRXhpdEtpbmQgZXhpdEtpbmQsIENvZGVP
cmlnaW4gY29kZU9yaWdpbiwgQ29kZU9yaWdpbiBjb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGUsCi0g
ICAgYm9vbCBpc0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgRXhpdEtpbmQgZXhpdEtpbmQsIENvZGVP
cmlnaW4gY29kZU9yaWdpbiwgQ29kZU9yaWdpbiBjb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGUpCiAg
ICAgOiBPU1JFeGl0QmFzZShleGl0S2luZCwgY29kZU9yaWdpbiwgY29kZU9yaWdpbkZvckV4aXRQ
cm9maWxlKQogICAgICwgbV9kZXNjcmlwdG9yKGRlc2NyaXB0b3IpCiB7Ci0gICAgbV9pc0V4Y2Vw
dGlvbkhhbmRsZXIgPSBpc0V4Y2VwdGlvbkhhbmRsZXI7CiB9CiAjZWxzZSAvLyBGVExfVVNFU19C
MwogT1NSRXhpdDo6T1NSRXhpdCgKLSAgICBPU1JFeGl0RGVzY3JpcHRvciogZGVzY3JpcHRvciwg
T1NSRXhpdERlc2NyaXB0b3JJbXBsJiBleGl0RGVzY3JpcHRvckltcGwsCisgICAgT1NSRXhpdERl
c2NyaXB0b3IqIGRlc2NyaXB0b3IsIEV4aXRLaW5kIGV4aXRLaW5kLCBPU1JFeGl0RGVzY3JpcHRv
ckltcGwmIGV4aXREZXNjcmlwdG9ySW1wbCwKICAgICB1aW50MzJfdCBzdGFja21hcFJlY29yZElu
ZGV4KQotICAgIDogT1NSRXhpdEJhc2UoZXhpdERlc2NyaXB0b3JJbXBsLm1fa2luZCwgZXhpdERl
c2NyaXB0b3JJbXBsLm1fY29kZU9yaWdpbiwgZXhpdERlc2NyaXB0b3JJbXBsLm1fY29kZU9yaWdp
bkZvckV4aXRQcm9maWxlKQorICAgIDogT1NSRXhpdEJhc2UoZXhpdEtpbmQsIGV4aXREZXNjcmlw
dG9ySW1wbC5tX2NvZGVPcmlnaW4sIGV4aXREZXNjcmlwdG9ySW1wbC5tX2NvZGVPcmlnaW5Gb3JF
eGl0UHJvZmlsZSkKICAgICAsIG1fZGVzY3JpcHRvcihkZXNjcmlwdG9yKQogICAgICwgbV9zdGFj
a21hcFJlY29yZEluZGV4KHN0YWNrbWFwUmVjb3JkSW5kZXgpCiAgICAgLCBtX2V4Y2VwdGlvblR5
cGUoZXhpdERlc2NyaXB0b3JJbXBsLm1fZXhjZXB0aW9uVHlwZSkKIHsKLSAgICBtX2lzRXhjZXB0
aW9uSGFuZGxlciA9IGV4aXREZXNjcmlwdG9ySW1wbC5tX2V4Y2VwdGlvblR5cGUgIT0gRXhjZXB0
aW9uVHlwZTo6Tm9uZTsKIH0KICNlbmRpZiAvLyBGVExfVVNFU19CMwogCkBAIC0xNzgsNyArMTc1
LDcgQEAgdm9pZCBPU1JFeGl0OjpnYXRoZXJSZWdpc3RlcnNUb1NwaWxsRm9yQwogCiB2b2lkIE9T
UkV4aXQ6OnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3QoQ0NhbGxIZWxwZXJzJiBqaXQsIGludDMy
X3Qgc3RhY2tTcGlsbFNsb3QpCiB7Ci0gICAgUkVMRUFTRV9BU1NFUlQod2lsbEFycml2ZUF0T1NS
RXhpdEZyb21HZW5lcmljVW53aW5kKCkgfHwgd2lsbEFycml2ZUF0T1NSRXhpdEZyb21DYWxsT3Bl
cmF0aW9uKCkpOworICAgIFJFTEVBU0VfQVNTRVJUKGlzR2VuZXJpY1Vud2luZEhhbmRsZXIoKSB8
fCB3aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUNhbGxPcGVyYXRpb24oKSk7CiAgICAgdW5zaWduZWQg
Y291bnQgPSAwOwogICAgIGZvciAoR1BSUmVnIHJlZyA9IE1hY3JvQXNzZW1ibGVyOjpmaXJzdFJl
Z2lzdGVyKCk7IHJlZyA8PSBNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCk7IHJlZyA9IE1h
Y3JvQXNzZW1ibGVyOjpuZXh0UmVnaXN0ZXIocmVnKSkgewogICAgICAgICBpZiAocmVnaXN0ZXJz
VG9QcmVzZXJ2ZUZvckNhbGxUaGF0TWlnaHRUaHJvdy5nZXQocmVnKSkgewpAQCAtMTk2LDcgKzE5
Myw3IEBAIHZvaWQgT1NSRXhpdDo6c3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdCgKIAogdm9pZCBP
U1JFeGl0OjpyZWNvdmVyUmVnaXN0ZXJzRnJvbVNwaWxsU2xvdChDQ2FsbEhlbHBlcnMmIGppdCwg
aW50MzJfdCBzdGFja1NwaWxsU2xvdCkKIHsKLSAgICBSRUxFQVNFX0FTU0VSVCh3aWxsQXJyaXZl
QXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQoKSB8fCB3aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUNh
bGxPcGVyYXRpb24oKSk7CisgICAgUkVMRUFTRV9BU1NFUlQoaXNHZW5lcmljVW53aW5kSGFuZGxl
cigpIHx8IHdpbGxBcnJpdmVBdE9TUkV4aXRGcm9tQ2FsbE9wZXJhdGlvbigpKTsKICAgICB1bnNp
Z25lZCBjb3VudCA9IDA7CiAgICAgZm9yIChHUFJSZWcgcmVnID0gTWFjcm9Bc3NlbWJsZXI6OmZp
cnN0UmVnaXN0ZXIoKTsgcmVnIDw9IE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKTsgcmVn
ID0gTWFjcm9Bc3NlbWJsZXI6Om5leHRSZWdpc3RlcihyZWcpKSB7CiAgICAgICAgIGlmIChyZWdp
c3RlcnNUb1ByZXNlcnZlRm9yQ2FsbFRoYXRNaWdodFRocm93LmdldChyZWcpKSB7CkBAIC0yMjks
MjQgKzIyNiw2IEBAIGJvb2wgT1NSRXhpdDo6d2lsbEFycml2ZUF0RXhpdEZyb21JbmRpcmUKICAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi1ib29sIGV4Y2VwdGlvblR5cGVX
aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQoRXhjZXB0aW9uVHlwZSBleGNlcHRp
b25UeXBlKQotewotICAgIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkgewotICAgIGNhc2UgRXhjZXB0
aW9uVHlwZTo6SlNDYWxsOgotICAgIGNhc2UgRXhjZXB0aW9uVHlwZTo6R2V0QnlJZDoKLSAgICBj
YXNlIEV4Y2VwdGlvblR5cGU6OlB1dEJ5SWQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRl
ZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKLX0KLQotYm9vbCBPU1JFeGl0Ojp3aWxsQXJyaXZlQXRPU1JFeGl0RnJv
bUdlbmVyaWNVbndpbmQoKSBjb25zdAotewotICAgIHJldHVybiBleGNlcHRpb25UeXBlV2lsbEFy
cml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKG1fZXhjZXB0aW9uVHlwZSk7Ci19Ci0KIGJv
b2wgT1NSRXhpdDo6d2lsbEFycml2ZUF0T1NSRXhpdEZyb21DYWxsT3BlcmF0aW9uKCkgY29uc3QK
IHsKICAgICBzd2l0Y2ggKG1fZXhjZXB0aW9uVHlwZSkgewpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExPU1JFeGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExPU1JFeGl0LmgJKHJldmlzaW9uIDE5NTcyMikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5oCSh3b3JraW5nIGNvcHkpCkBAIC04MCw4ICs4MCw2IEBA
IGVudW0gY2xhc3MgRXhjZXB0aW9uVHlwZSA6IHVpbnQ4X3QgewogICAgIExhenlTbG93UGF0aCwK
ICAgICBCaW5hcnlPcEdlbmVyYXRvciwKIH07Ci0KLWJvb2wgZXhjZXB0aW9uVHlwZVdpbGxBcnJp
dmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZChFeGNlcHRpb25UeXBlKTsKICNlbmRpZiAvLyAh
RlRMX1VTRVNfQjMKIAogc3RydWN0IE9TUkV4aXREZXNjcmlwdG9yIHsKQEAgLTExNiw3ICsxMTQs
NyBAQCBzdHJ1Y3QgT1NSRXhpdERlc2NyaXB0b3IgewogICAgIC8vIHRoaXMgY2FsbCwgdGhlIE9T
UkV4aXQgaXMgc2ltcGx5IHJlYWR5IHRvIGdvLgogICAgIFJlZlB0cjxPU1JFeGl0SGFuZGxlPiBl
bWl0T1NSRXhpdCgKICAgICAgICAgU3RhdGUmLCBFeGl0S2luZCwgY29uc3QgREZHOjpOb2RlT3Jp
Z2luJiwgQ0NhbGxIZWxwZXJzJiwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYs
Ci0gICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IDAsIGJvb2wgaXNFeGNlcHRpb25IYW5kbGVyID0g
ZmFsc2UpOworICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSAwKTsKIAogICAgIC8vIEluIHNvbWUg
Y2FzZXMgeW91IHdhbnQgYW4gT1NSRXhpdCB0byBjb21lIGludG8gZXhpc3RlbmNlLCBidXQgeW91
IGRvbid0IHdhbnQgdG8gZW1pdCBpdCByaWdodCBub3cuCiAgICAgLy8gVGhpcyB3aWxsIGVtaXQg
dGhlIE9TUiBleGl0IGluIGEgbGF0ZSBwYXRoLiBZb3UgY2FuJ3QgYmUgc3VyZSBleGFjdGx5IHdo
ZW4gdGhhdCB3aWxsIGhhcHBlbiwgYnV0CkBAIC0xMjgsMTQgKzEyNiwxNSBAQCBzdHJ1Y3QgT1NS
RXhpdERlc2NyaXB0b3IgewogICAgIC8vIGV2ZW50dWFsbHkgZ2V0cyBhY2Nlc3MgdG8gaXRzIGxh
YmVsLgogICAgIFJlZlB0cjxPU1JFeGl0SGFuZGxlPiBlbWl0T1NSRXhpdExhdGVyKAogICAgICAg
ICBTdGF0ZSYsIEV4aXRLaW5kLCBjb25zdCBERkc6Ok5vZGVPcmlnaW4mLCBjb25zdCBCMzo6U3Rh
Y2ttYXBHZW5lcmF0aW9uUGFyYW1zJiwKLSAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gMCwgYm9v
bCBpc0V4Y2VwdGlvbkhhbmRsZXIgPSBmYWxzZSk7CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9
IDApOwogCitwcml2YXRlOgogICAgIC8vIFRoaXMgaXMgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2Uu
IEl0IHdpbGwgY3JlYXRlIGEgaGFuZGxlIHJlcHJlc2VudGluZyB0aGUgZGVzaXJlIHRvIGVtaXQg
Y29kZSBmb3IKICAgICAvLyBhbiBPU1IgZXhpdC4gWW91IGNhbiBjYWxsIE9TUkV4aXRIYW5kbGU6
OmVtaXRFeGl0VGh1bmsoKSBvbmNlIHlvdSBoYXZlIGEgcGxhY2UgdG8gZW1pdCBpdC4gTm90ZQog
ICAgIC8vIHRoYXQgdGhlIGFib3ZlIHR3byBBUElzIGFyZSB3cml0dGVuIGluIHRlcm1zIG9mIHRo
aXMgYW5kIE9TUkV4aXRIYW5kbGU6OmVtaXRFeGl0VGh1bmsoKS4KICAgICBSZWZQdHI8T1NSRXhp
dEhhbmRsZT4gcHJlcGFyZU9TUkV4aXRIYW5kbGUoCiAgICAgICAgIFN0YXRlJiwgRXhpdEtpbmQs
IGNvbnN0IERGRzo6Tm9kZU9yaWdpbiYsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJh
bXMmLAotICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSAwLCBib29sIGlzRXhjZXB0aW9uSGFuZGxl
ciA9IGZhbHNlKTsKKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gMCk7CiAjZW5kaWYgLy8gRlRM
X1VTRVNfQjMKIH07CiAKQEAgLTE2MCw5ICsxNTksOSBAQCBzdHJ1Y3QgT1NSRXhpdERlc2NyaXB0
b3JJbXBsIHsKIAogc3RydWN0IE9TUkV4aXQgOiBwdWJsaWMgREZHOjpPU1JFeGl0QmFzZSB7CiAg
ICAgT1NSRXhpdCgKLSAgICAgICAgT1NSRXhpdERlc2NyaXB0b3IqLAorICAgICAgICBPU1JFeGl0
RGVzY3JpcHRvciosIEV4aXRLaW5kLAogI2lmIEZUTF9VU0VTX0IzCi0gICAgICAgIEV4aXRLaW5k
LCBDb2RlT3JpZ2luLCBDb2RlT3JpZ2luIGNvZGVPcmlnaW5Gb3JFeGl0UHJvZmlsZSwgYm9vbCBp
c0V4Y2VwdGlvbkhhbmRsZXIKKyAgICAgICAgQ29kZU9yaWdpbiwgQ29kZU9yaWdpbiBjb2RlT3Jp
Z2luRm9yRXhpdFByb2ZpbGUKICNlbHNlIC8vIEZUTF9VU0VTX0IzCiAgICAgICAgIE9TUkV4aXRE
ZXNjcmlwdG9ySW1wbCYsIHVpbnQzMl90IHN0YWNrbWFwUmVjb3JkSW5kZXgKICNlbmRpZiAvLyBG
VExfVVNFU19CMwpAQCAtMTc0LDEwICsxNzMsNiBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1YmxpYyBE
Rkc6Ok9TUkV4aXRCYXNlCiAgICAgLy8gVGhpcyB0ZWxscyB1cyB3aGVyZSB0byBwbGFjZSBhIGp1
bXAuCiAgICAgQ29kZUxvY2F0aW9uSnVtcCBtX3BhdGNoYWJsZUp1bXA7CiAgICAgVmVjdG9yPEIz
OjpWYWx1ZVJlcD4gbV92YWx1ZVJlcHM7Ci0gICAgLy8gVHJ1ZSBpZiB0aGlzIGV4aXQgaXMgdXNl
ZCBhcyBhbiBleGNlcHRpb24gaGFuZGxlciBmb3IgdW53aW5kaW5nLiBUaGlzIGhhcHBlbnMgdG8g
b25seSBiZSBzZXQgd2hlbgotICAgIC8vIGlzRXhjZXB0aW9uSGFuZGxlciBpcyB0cnVlLCBidXQg
YWxsIHRoaXMgYWN0dWFsbHkgbWVhbnMgaXMgdGhhdCB0aGUgT1NSIGV4aXQgd2lsbCBhc3N1bWUg
dGhhdCB0aGUKLSAgICAvLyBtYWNoaW5lIHN0YXRlIGlzIGFzIGl0IHdvdWxkIGJlIGNvbWluZyBv
dXQgb2YgZ2VuZXJpY1Vud2luZC4KLSAgICBib29sIG1faXNVbndpbmRIYW5kbGVyIHsgZmFsc2Ug
fTsKICNlbHNlIC8vIEZUTF9VU0VTX0IzCiAgICAgLy8gT2Zmc2V0IHdpdGhpbiB0aGUgZXhpdCBz
dHVicyBvZiB0aGUgc3R1YiBmb3IgdGhpcyBleGl0LgogICAgIHVuc2lnbmVkIG1fcGF0Y2hhYmxl
Q29kZU9mZnNldDsKQEAgLTE5OCw3ICsxOTMsNiBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1YmxpYyBE
Rkc6Ok9TUkV4aXRCYXNlCiAgICAgdm9pZCBzcGlsbFJlZ2lzdGVyc1RvU3BpbGxTbG90KENDYWxs
SGVscGVycyYsIGludDMyX3Qgc3RhY2tTcGlsbFNsb3QpOwogICAgIHZvaWQgcmVjb3ZlclJlZ2lz
dGVyc0Zyb21TcGlsbFNsb3QoQ0NhbGxIZWxwZXJzJiBqaXQsIGludDMyX3Qgc3RhY2tTcGlsbFNs
b3QpOwogCi0gICAgYm9vbCB3aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQoKSBj
b25zdDsKICAgICBib29sIHdpbGxBcnJpdmVBdEV4aXRGcm9tSW5kaXJlY3RFeGNlcHRpb25DaGVj
aygpIGNvbnN0OwogICAgIGJvb2wgd2lsbEFycml2ZUF0T1NSRXhpdEZyb21DYWxsT3BlcmF0aW9u
KCkgY29uc3Q7CiAgICAgYm9vbCBuZWVkc1JlZ2lzdGVyUmVjb3ZlcnlPbkdlbmVyaWNVbndpbmRP
U1JFeGl0UGF0aCgpIGNvbnN0OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExP
U1JFeGl0Q29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMT1NSRXhpdENvbXBpbGVyLmNwcAkocmV2aXNpb24gMTk1NzIyKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0Q29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMDcsMTMgKzIwNyw3IEBAIHN0YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogICAgIENDYWxsSGVs
cGVycyBqaXQodm0sIGNvZGVCbG9jayk7CiAKICAgICAvLyBUaGUgZmlyc3QgdGhpbmcgd2UgbmVl
ZCB0byBkbyBpcyByZXN0YWJsaXNoIG91ciBmcmFtZSBpbiB0aGUgY2FzZSBvZiBhbiBleGNlcHRp
b24uCi0gICAgaWYgKAotI2lmIEZUTF9VU0VTX0IzCi0gICAgICAgIGV4aXQubV9pc1Vud2luZEhh
bmRsZXIKLSNlbHNlIC8vIEZUTF9VU0VTX0IzCi0gICAgICAgIGV4aXQud2lsbEFycml2ZUF0T1NS
RXhpdEZyb21HZW5lcmljVW53aW5kKCkKLSNlbmRpZiAvLyBGVExfVVNFU19CMwotICAgICAgICAp
IHsKKyAgICBpZiAoZXhpdC5pc0dlbmVyaWNVbndpbmRIYW5kbGVyKCkpIHsKICAgICAgICAgUkVM
RUFTRV9BU1NFUlQodm0tPmNhbGxGcmFtZUZvckNhdGNoKTsgLy8gVGhlIGZpcnN0IHRpbWUgd2Ug
aGl0IHRoaXMgZXhpdCwgbGlrZSBhdCBhbGwgb3RoZXIgdGltZXMsIHRoaXMgZmllbGQgc2hvdWxk
IGJlIG5vbi1udWxsLgogICAgICAgICBqaXQucmVzdG9yZUNhbGxlZVNhdmVzRnJvbVZNQ2FsbGVl
U2F2ZXNCdWZmZXIoKTsKICAgICAgICAgaml0LmxvYWRQdHIodm0tPmFkZHJlc3NPZkNhbGxGcmFt
ZUZvckNhdGNoKCksIE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3Rlcik7CkBAIC00
ODgsMTkgKzQ4MiwxOSBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigKICAgICBSZWdpc3RlckF0
T2Zmc2V0TGlzdCogYmFzZWxpbmVDYWxsZWVTYXZlcyA9IGJhc2VsaW5lQ29kZUJsb2NrLT5jYWxs
ZWVTYXZlUmVnaXN0ZXJzKCk7CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QqIHZtQ2FsbGVlU2F2
ZXMgPSB2bS0+Z2V0QWxsQ2FsbGVlU2F2ZVJlZ2lzdGVyT2Zmc2V0cygpOwogICAgIFJlZ2lzdGVy
U2V0IHZtQ2FsbGVlU2F2ZXNUb1NraXAgPSBSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKTsK
LSAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICBpZiAoZXhpdC5pc0V4Y2Vw
dGlvbkhhbmRsZXIoKSkKICAgICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1t
UHRyKHZtLT5jYWxsZWVTYXZlUmVnaXN0ZXJzQnVmZmVyKSwgR1BSSW5mbzo6cmVnVDEpOwogCiAg
ICAgZm9yIChSZWcgcmVnID0gUmVnOjpmaXJzdCgpOyByZWcgPD0gUmVnOjpsYXN0KCk7IHJlZyA9
IHJlZy5uZXh0KCkpIHsKICAgICAgICAgaWYgKCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkg
ewotICAgICAgICAgICAgaWYgKGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgICAgICAg
ICBpZiAoZXhpdC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkKICAgICAgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVCghdm1DYWxsZWVTYXZlcy0+ZmluZChyZWcpKTsKICAgICAgICAgICAgIGNvbnRpbnVl
OwogICAgICAgICB9CiAgICAgICAgIHVuc2lnbmVkIHVud2luZEluZGV4ID0gY29kZUJsb2NrLT5j
YWxsZWVTYXZlUmVnaXN0ZXJzKCktPmluZGV4T2YocmVnKTsKICAgICAgICAgUmVnaXN0ZXJBdE9m
ZnNldCogYmFzZWxpbmVSZWdpc3Rlck9mZnNldCA9IGJhc2VsaW5lQ2FsbGVlU2F2ZXMtPmZpbmQo
cmVnKTsKICAgICAgICAgUmVnaXN0ZXJBdE9mZnNldCogdm1DYWxsZWVTYXZlID0gbnVsbHB0cjsg
Ci0gICAgICAgIGlmIChleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVyKQorICAgICAgICBpZiAoZXhp
dC5pc0V4Y2VwdGlvbkhhbmRsZXIoKSkKICAgICAgICAgICAgIHZtQ2FsbGVlU2F2ZSA9IHZtQ2Fs
bGVlU2F2ZXMtPmZpbmQocmVnKTsKIAogICAgICAgICBpZiAocmVnLmlzR1BSKCkpIHsKQEAgLTU0
MCw3ICs1MzQsNyBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigKICAgICAgICAgfQogICAgIH0K
IAotICAgIGlmIChleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVyKSB7CisgICAgaWYgKGV4aXQuaXNF
eGNlcHRpb25IYW5kbGVyKCkpIHsKICAgICAgICAgUmVnaXN0ZXJBdE9mZnNldCogdm1DYWxsZWVT
YXZlID0gdm1DYWxsZWVTYXZlcy0+ZmluZChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIp
OwogICAgICAgICBqaXQuc3RvcmU2NChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIE1h
Y3JvQXNzZW1ibGVyOjpBZGRyZXNzKEdQUkluZm86OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNl
dCgpKSk7CiAKQEAgLTU2NCw3ICs1NTgsNyBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigKICAg
ICAKICAgICBoYW5kbGVFeGl0Q291bnRzKGppdCwgZXhpdCk7CiAgICAgcmVpZnlJbmxpbmVkQ2Fs
bEZyYW1lcyhqaXQsIGV4aXQpOwotICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChqaXQsIGV4aXQs
IGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpOworICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChq
aXQsIGV4aXQpOwogICAgIAogICAgIExpbmtCdWZmZXIgcGF0Y2hCdWZmZXIoKnZtLCBqaXQsIGNv
ZGVCbG9jayk7CiAjaWYgRlRMX1VTRVNfQjMKQEAgLTYyMiwxMyArNjE2LDExIEBAIGV4dGVybiAi
QyIgdm9pZCogY29tcGlsZUZUTE9TUkV4aXQoRXhlY1MKICAgICAgICAgZGF0YUxvZygiICAgIEV4
aXQgc3RhY2ttYXAgSUQ6ICIsIGV4aXQubV9kZXNjcmlwdG9yLT5tX3N0YWNrbWFwSUQsICJcbiIp
OwogI2VuZGlmIC8vICFGVExfVVNFU19CMwogICAgICAgICBkYXRhTG9nKCIgICAgQ3VycmVudCBj
YWxsIHNpdGUgaW5kZXg6ICIsIGV4ZWMtPmNhbGxTaXRlSW5kZXgoKS5iaXRzKCksICJcbiIpOwot
ICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCBpcyBleGNlcHRpb24gaGFuZGxlcjogIiwgZXhpdC5t
X2lzRXhjZXB0aW9uSGFuZGxlciwgIlxuIik7Ci0jaWYgRlRMX1VTRVNfQjMKLSAgICAgICAgZGF0
YUxvZygiICAgIElzIHVud2luZCBoYW5kbGVyOiAiLCBleGl0Lm1faXNVbndpbmRIYW5kbGVyLCAi
XG4iKTsKLSNlbHNlIC8vIEZUTF9VU0VTX0IzCi0gICAgICAgIGRhdGFMb2coIiAgICBXaWxsIGFy
cml2ZSBhdCBleGl0IGZyb20gZ2VuZXJpY1Vud2luZCgpOiAiLCBleGl0LndpbGxBcnJpdmVBdE9T
UkV4aXRGcm9tR2VuZXJpY1Vud2luZCgpLCAiXG4iKTsKKyAgICAgICAgZGF0YUxvZygiICAgIEV4
aXQgaXMgZXhjZXB0aW9uIGhhbmRsZXI6ICIsIGV4aXQuaXNFeGNlcHRpb25IYW5kbGVyKCksICJc
biIpOworICAgICAgICBkYXRhTG9nKCIgICAgSXMgdW53aW5kIGhhbmRsZXI6ICIsIGV4aXQuaXNH
ZW5lcmljVW53aW5kSGFuZGxlcigpLCAiXG4iKTsKKyNpZiAhRlRMX1VTRVNfQjMKICAgICAgICAg
ZGF0YUxvZygiICAgIFdpbGwgYXJyaXZlIGF0IGV4aXQgZnJvbSBsYXp5IHNsb3cgcGF0aDogIiwg
ZXhpdC5tX2V4Y2VwdGlvblR5cGUgPT0gRXhjZXB0aW9uVHlwZTo6TGF6eVNsb3dQYXRoLCAiXG4i
KTsKLSNlbmRpZiAvLyBGVExfVVNFU19CMworI2VuZGlmIC8vICFGVExfVVNFU19CMwogICAgICAg
ICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6ICIsIGV4aXQubV9kZXNjcmlwdG9yLT5tX3ZhbHVl
cywgIlxuIik7CiAjaWYgRlRMX1VTRVNfQjMKICAgICAgICAgZGF0YUxvZygiICAgIFZhbHVlIHJl
cHM6ICIsIGxpc3REdW1wKGV4aXQubV92YWx1ZVJlcHMpLCAiXG4iKTsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMUGF0Y2hwb2ludEV4Y2VwdGlvbkhhbmRsZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExQYXRjaHBvaW50RXhjZXB0aW9u
SGFuZGxlLmNwcAkocmV2aXNpb24gMTk1NzIyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0
bC9GVExQYXRjaHBvaW50RXhjZXB0aW9uSGFuZGxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjks
NyArNjksNyBAQCBSZWZQdHI8RXhjZXB0aW9uVGFyZ2V0PiBQYXRjaHBvaW50RXhjZXB0CiAgICAg
ICAgICAgICBuZXcgRXhjZXB0aW9uVGFyZ2V0KGlzRGVmYXVsdEhhbmRsZXIsIG1fc3RhdGUuZXhj
ZXB0aW9uSGFuZGxlciwgbnVsbHB0cikpOwogICAgIH0KICAgICBib29sIGlzRGVmYXVsdEhhbmRs
ZXIgPSBmYWxzZTsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IEV4Y2VwdGlvblRhcmdldChpc0Rl
ZmF1bHRIYW5kbGVyLCB7IH0sIGNyZWF0ZUhhbmRsZShwYXJhbXMpKSk7CisgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBFeGNlcHRpb25UYXJnZXQoaXNEZWZhdWx0SGFuZGxlciwgeyB9LCBjcmVhdGVI
YW5kbGUoRXhjZXB0aW9uQ2hlY2ssIHBhcmFtcykpKTsKIH0KIAogdm9pZCBQYXRjaHBvaW50RXhj
ZXB0aW9uSGFuZGxlOjpzY2hlZHVsZUV4aXRDcmVhdGlvbkZvclVud2luZCgKQEAgLTc4LDkgKzc4
LDggQEAgdm9pZCBQYXRjaHBvaW50RXhjZXB0aW9uSGFuZGxlOjpzY2hlZHVsZQogICAgIGlmICgh
bV9kZXNjcmlwdG9yKQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgUmVmUHRyPE9TUkV4aXRI
YW5kbGU+IGhhbmRsZSA9IGNyZWF0ZUhhbmRsZShwYXJhbXMpOworICAgIFJlZlB0cjxPU1JFeGl0
SGFuZGxlPiBoYW5kbGUgPSBjcmVhdGVIYW5kbGUoR2VuZXJpY1Vud2luZCwgcGFyYW1zKTsKIAot
ICAgIGhhbmRsZS0+ZXhpdC5tX2lzVW53aW5kSGFuZGxlciA9IHRydWU7CiAgICAgaGFuZGxlLT5l
eGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXggPSBjYWxsU2l0ZUluZGV4OwogCiAg
ICAgSGFuZGxlckluZm8gaGFuZGxlciA9IG1faGFuZGxlcjsKQEAgLTExMCwxMSArMTA5LDEwIEBA
IFBhdGNocG9pbnRFeGNlcHRpb25IYW5kbGU6OlBhdGNocG9pbnRFeGMKIH0KIAogUmVmUHRyPE9T
UkV4aXRIYW5kbGU+IFBhdGNocG9pbnRFeGNlcHRpb25IYW5kbGU6OmNyZWF0ZUhhbmRsZSgKLSAg
ICBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJiBwYXJhbXMpCisgICAgRXhpdEtp
bmQga2luZCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYgcGFyYW1zKQogewot
ICAgIGJvb2wgaXNFeGNlcHRpb25IYW5kbGVyID0gdHJ1ZTsKICAgICByZXR1cm4gbV9kZXNjcmlw
dG9yLT5lbWl0T1NSRXhpdExhdGVyKAotICAgICAgICBtX3N0YXRlLCBVbmNvdW50YWJsZSwgbV9v
cmlnaW4sIHBhcmFtcywgbV9vZmZzZXQsIGlzRXhjZXB0aW9uSGFuZGxlcik7CisgICAgICAgIG1f
c3RhdGUsIGtpbmQsIG1fb3JpZ2luLCBwYXJhbXMsIG1fb2Zmc2V0KTsKIH0KIAogfSB9IC8vIG5h
bWVzcGFjZSBKU0M6OkZUTApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExQYXRj
aHBvaW50RXhjZXB0aW9uSGFuZGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExQYXRjaHBvaW50RXhjZXB0aW9uSGFuZGxlLmgJKHJldmlzaW9uIDE5NTcyMikK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMUGF0Y2hwb2ludEV4Y2VwdGlvbkhhbmRs
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaWYgRU5BQkxFKEZUTF9KSVQp
ICYmIEZUTF9VU0VTX0IzCiAKICNpbmNsdWRlICJERkdOb2RlT3JpZ2luLmgiCisjaW5jbHVkZSAi
RXhpdEtpbmQuaCIKICNpbmNsdWRlICJIYW5kbGVySW5mby5oIgogI2luY2x1ZGUgPHd0Zi9SZWYu
aD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KQEAgLTg4LDcgKzg5LDcg
QEAgcHJpdmF0ZToKICAgICBQYXRjaHBvaW50RXhjZXB0aW9uSGFuZGxlKAogICAgICAgICBTdGF0
ZSYsIE9TUkV4aXREZXNjcmlwdG9yKiwgREZHOjpOb2RlT3JpZ2luLCB1bnNpZ25lZCBvZmZzZXQs
IGNvbnN0IEhhbmRsZXJJbmZvJik7CiAKLSAgICBSZWZQdHI8T1NSRXhpdEhhbmRsZT4gY3JlYXRl
SGFuZGxlKGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKTsKKyAgICBSZWZQdHI8
T1NSRXhpdEhhbmRsZT4gY3JlYXRlSGFuZGxlKEV4aXRLaW5kLCBjb25zdCBCMzo6U3RhY2ttYXBH
ZW5lcmF0aW9uUGFyYW1zJik7CiAKICAgICBTdGF0ZSYgbV9zdGF0ZTsKICAgICBPU1JFeGl0RGVz
Y3JpcHRvciogbV9kZXNjcmlwdG9yOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy92OC1y
YXl0cmFjZS13aXRoLXRyeS1jYXRjaC1oaWdoLWZyZXF1ZW5jeS10aHJvd3MtZXhwZWN0ZWQudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvdjgtcmF5dHJhY2Utd2l0aC10
cnktY2F0Y2gtaGlnaC1mcmVxdWVuY3ktdGhyb3dzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvdjgtcmF5dHJhY2Utd2l0aC10cnktY2F0Y2gtaGln
aC1mcmVxdWVuY3ktdGhyb3dzLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEwIEBACitKU1JlZ3Jlc3MvdjgtcmF5dHJhY2Utd2l0aC10cnktY2F0Y2gtaGlnaC1mcmVxdWVu
Y3ktdGhyb3dzCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIg
bWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2Vw
dGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3Y4LXJheXRyYWNlLXdpdGgtdHJ5
LWNhdGNoLWhpZ2gtZnJlcXVlbmN5LXRocm93cy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3MvdjgtcmF5dHJhY2Utd2l0aC10cnktY2F0Y2gtaGlnaC1mcmVxdWVuY3kt
dGhyb3dzLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3Y4LXJh
eXRyYWNlLXdpdGgtdHJ5LWNhdGNoLWhpZ2gtZnJlcXVlbmN5LXRocm93cy5odG1sCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8v
RFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3Vy
Y2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBz
cmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNy
Yz0ic2NyaXB0LXRlc3RzL3Y4LXJheXRyYWNlLXdpdGgtdHJ5LWNhdGNoLWhpZ2gtZnJlcXVlbmN5
LXRocm93cy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jl
c3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRl
c3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy92OC1yYXl0cmFjZS13aXRoLXRyeS1jYXRjaC1oaWdo
LWZyZXF1ZW5jeS10aHJvd3MuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9zY3JpcHQtdGVzdHMvdjgtcmF5dHJhY2Utd2l0aC10cnktY2F0Y2gtaGlnaC1mcmVxdWVuY3kt
dGhyb3dzLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQt
dGVzdHMvdjgtcmF5dHJhY2Utd2l0aC10cnktY2F0Y2gtaGlnaC1mcmVxdWVuY3ktdGhyb3dzLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEwMSBAQAorLy8gVGhlIHJheSB0cmFjZXIgY29k
ZSBpbiB0aGlzIGZpbGUgaXMgd3JpdHRlbiBieSBBZGFtIEJ1cm1pc3Rlci4gSXQKKy8vIGlzIGF2
YWlsYWJsZSBpbiBpdHMgb3JpZ2luYWwgZm9ybSBmcm9tOgorLy8KKy8vICAgaHR0cDovL2xhYnMu
ZmxvZy5uei5jby9yYXl0cmFjZXIvCisvLworLy8gSXQgaGFzIGJlZW4gbW9kaWZpZWQgc2xpZ2h0
bHkgYnkgR29vZ2xlIHRvIHdvcmsgYXMgYSBzdGFuZGFsb25lCisvLyBiZW5jaG1hcmssIGJ1dCB0
aGUgYWxsIHRoZSBjb21wdXRhdGlvbmFsIGNvZGUgcmVtYWlucworLy8gdW50b3VjaGVkLiBUaGlz
IGZpbGUgYWxzbyBjb250YWlucyBhIGNvcHkgb2YgcGFydHMgb2YgdGhlIFByb3RvdHlwZQorLy8g
SmF2YVNjcmlwdCBmcmFtZXdvcmsgd2hpY2ggaXMgdXNlZCBieSB0aGUgcmF5IHRyYWNlci4KKwor
Ly8gVmFyaWFibGUgdXNlZCB0byBob2xkIGEgbnVtYmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVy
aWZ5IHRoYXQKKy8vIHRoZSBzY2VuZSB3YXMgcmF5IHRyYWNlZCBjb3JyZWN0bHkuCit2YXIgY2hl
Y2tOdW1iZXI7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor
Ly8gVGhlIGZvbGxvd2luZyBpcyBhIGNvcHkgb2YgcGFydHMgb2YgdGhlIFByb3RvdHlwZSBKYXZh
U2NyaXB0IGxpYnJhcnk6CisKKy8vIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywgdmVy
c2lvbiAxLjUuMAorLy8gKGMpIDIwMDUtMjAwNyBTYW0gU3RlcGhlbnNvbgorLy8KKy8vIFByb3Rv
dHlwZSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0
eWxlIGxpY2Vuc2UuCisvLyBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUgd2ViIHNpdGU6
IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0LworCitsZXQgX19leGNlcHRpb25Db3VudGVyID0g
MDsKK2Z1bmN0aW9uIHJhbmRvbUV4Y2VwdGlvbigpIHsKKyAgICBfX2V4Y2VwdGlvbkNvdW50ZXIr
KzsKKyAgICBpZiAoX19leGNlcHRpb25Db3VudGVyICUgMzUgPT09IDApIHsKKyAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJyYW5kbyIpOworICAgIH0KK30KK25vSW5saW5lKHJhbmRvbUV4Y2VwdGlv
bik7CisKK3ZhciBDbGFzcyA9IHsKKyAgICBjcmVhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICBy
ZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRo
aXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgIHJh
bmRvbUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgfQor
ICAgIH0KK307CisKKworT2JqZWN0LmV4dGVuZCA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3Vy
Y2UpIHsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpIHsKKyAgICAgICAgdHJ5IHsK
KyAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07Cisg
ICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAg
ICB9CisgICAgcmV0dXJuIGRlc3RpbmF0aW9uOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
Ky8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgaXMgdGhlIGFj
dHVhbCByYXkgdHJhY2VyIHdyaXR0ZW4gYnkgQWRhbQorLy8gQnVybWlzdGVyLiBJdCdzIGEgY29u
Y2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZpbGVzOgorLy8KKy8vICAgZmxvZy9jb2xvci5q
cworLy8gICBmbG9nL2xpZ2h0LmpzCisvLyAgIGZsb2cvdmVjdG9yLmpzCisvLyAgIGZsb2cvcmF5
LmpzCisvLyAgIGZsb2cvc2NlbmUuanMKKy8vICAgZmxvZy9tYXRlcmlhbC9iYXNlbWF0ZXJpYWwu
anMKKy8vICAgZmxvZy9tYXRlcmlhbC9zb2xpZC5qcworLy8gICBmbG9nL21hdGVyaWFsL2NoZXNz
Ym9hcmQuanMKKy8vICAgZmxvZy9zaGFwZS9iYXNlc2hhcGUuanMKKy8vICAgZmxvZy9zaGFwZS9z
cGhlcmUuanMKKy8vICAgZmxvZy9zaGFwZS9wbGFuZS5qcworLy8gICBmbG9nL2ludGVyc2VjdGlv
bmluZm8uanMKKy8vICAgZmxvZy9jYW1lcmEuanMKKy8vICAgZmxvZy9iYWNrZ3JvdW5kLmpzCisv
LyAgIGZsb2cvZW5naW5lLmpzCisKKworLyogRmFrZSBhIEZsb2cuKiBuYW1lc3BhY2UgKi8KK2lm
KHR5cGVvZihGbG9nKSA9PSAndW5kZWZpbmVkJykgdmFyIEZsb2cgPSB7fTsKK2lmKHR5cGVvZihG
bG9nLlJheVRyYWNlcikgPT0gJ3VuZGVmaW5lZCcpIEZsb2cuUmF5VHJhY2VyID0ge307CisKK0Zs
b2cuUmF5VHJhY2VyLkNvbG9yID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5VHJhY2VyLkNv
bG9yLnByb3RvdHlwZSA9IHsKKyAgICByZWQgOiAwLjAsCisgICAgZ3JlZW4gOiAwLjAsCisgICAg
Ymx1ZSA6IDAuMCwKKworICAgIGluaXRpYWxpemUgOiBmdW5jdGlvbihyLCBnLCBiKSB7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgICBpZighcikgciA9IDAuMDsKKyAgICAgICAgICAgIGlmKCFn
KSBnID0gMC4wOworICAgICAgICAgICAgaWYoIWIpIGIgPSAwLjA7CisKKyAgICAgICAgICAgIHRo
aXMucmVkID0gcjsKKyAgICAgICAgICAgIHRoaXMuZ3JlZW4gPSBnOworICAgICAgICAgICAgdGhp
cy5ibHVlID0gYjsKKyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNh
dGNoKGUpIHsgfQorICAgIH0sCisKKyAgICBhZGQgOiBmdW5jdGlvbihjMSwgYzIpeworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBGbG9nLlJheVRyYWNlci5Db2xv
cigwLDAsMCk7CisKKyAgICAgICAgICAgIHJlc3VsdC5yZWQgPSBjMS5yZWQgKyBjMi5yZWQ7Cisg
ICAgICAgICAgICByZXN1bHQuZ3JlZW4gPSBjMS5ncmVlbiArIGMyLmdyZWVuOworICAgICAgICAg
ICAgcmVzdWx0LmJsdWUgPSBjMS5ibHVlICsgYzIuYmx1ZTsKKworICAgICAgICAgICAgcmFuZG9t
RXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9LAorCisgICAgYWRkU2NhbGFyOiBmdW5jdGlvbihjMSwgcyl7CisgICAgICAg
IHRyeSB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEZsb2cuUmF5VHJhY2VyLkNvbG9y
KDAsMCwwKTsKKworICAgICAgICAgICAgcmVzdWx0LnJlZCA9IGMxLnJlZCArIHM7CisgICAgICAg
ICAgICByZXN1bHQuZ3JlZW4gPSBjMS5ncmVlbiArIHM7CisgICAgICAgICAgICByZXN1bHQuYmx1
ZSA9IGMxLmJsdWUgKyBzOworCisgICAgICAgICAgICByZXN1bHQubGltaXQoKTsKKworICAgICAg
ICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgc3VidHJhY3Q6IGZ1bmN0aW9uKGMxLCBj
Mil7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEZsb2cuUmF5
VHJhY2VyLkNvbG9yKDAsMCwwKTsKKworICAgICAgICAgICAgcmVzdWx0LnJlZCA9IGMxLnJlZCAt
IGMyLnJlZDsKKyAgICAgICAgICAgIHJlc3VsdC5ncmVlbiA9IGMxLmdyZWVuIC0gYzIuZ3JlZW47
CisgICAgICAgICAgICByZXN1bHQuYmx1ZSA9IGMxLmJsdWUgLSBjMi5ibHVlOworCisgICAgICAg
ICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKworICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0sCisKKyAgICBtdWx0aXBseSA6IGZ1bmN0aW9uKGMxLCBj
MikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBGbG9nLlJh
eVRyYWNlci5Db2xvcigwLDAsMCk7CisKKyAgICAgICAgICAgIHJlc3VsdC5yZWQgPSBjMS5yZWQg
KiBjMi5yZWQ7CisgICAgICAgICAgICByZXN1bHQuZ3JlZW4gPSBjMS5ncmVlbiAqIGMyLmdyZWVu
OworICAgICAgICAgICAgcmVzdWx0LmJsdWUgPSBjMS5ibHVlICogYzIuYmx1ZTsKKworICAgICAg
ICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgbXVsdGlwbHlTY2FsYXIgOiBmdW5jdGlv
bihjMSwgZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBG
bG9nLlJheVRyYWNlci5Db2xvcigwLDAsMCk7CisKKyAgICAgICAgICAgIHJlc3VsdC5yZWQgPSBj
MS5yZWQgKiBmOworICAgICAgICAgICAgcmVzdWx0LmdyZWVuID0gYzEuZ3JlZW4gKiBmOworICAg
ICAgICAgICAgcmVzdWx0LmJsdWUgPSBjMS5ibHVlICogZjsKKworICAgICAgICAgICAgcmFuZG9t
RXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9LAorCisgICAgZGl2aWRlRmFjdG9yIDogZnVuY3Rpb24oYzEsIGYpIHsKKyAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgRmxvZy5SYXlUcmFjZXIu
Q29sb3IoMCwwLDApOworCisgICAgICAgICAgICByZXN1bHQucmVkID0gYzEucmVkIC8gZjsKKyAg
ICAgICAgICAgIHJlc3VsdC5ncmVlbiA9IGMxLmdyZWVuIC8gZjsKKyAgICAgICAgICAgIHJlc3Vs
dC5ibHVlID0gYzEuYmx1ZSAvIGY7CisKKyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOwor
ICAgICAgICB9IGNhdGNoKGUpIHsgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwK
KworICAgIGxpbWl0OiBmdW5jdGlvbigpeworICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgIHRo
aXMucmVkID0gKHRoaXMucmVkID4gMC4wKSA/ICggKHRoaXMucmVkID4gMS4wKSA/IDEuMCA6IHRo
aXMucmVkICkgOiAwLjA7CisgICAgICAgICAgICB0aGlzLmdyZWVuID0gKHRoaXMuZ3JlZW4gPiAw
LjApID8gKCAodGhpcy5ncmVlbiA+IDEuMCkgPyAxLjAgOiB0aGlzLmdyZWVuICkgOiAwLjA7Cisg
ICAgICAgICAgICB0aGlzLmJsdWUgPSAodGhpcy5ibHVlID4gMC4wKSA/ICggKHRoaXMuYmx1ZSA+
IDEuMCkgPyAxLjAgOiB0aGlzLmJsdWUgKSA6IDAuMDsKKworICAgICAgICAgICAgcmFuZG9tRXhj
ZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgfSwKKworICAgIGRpc3RhbmNl
IDogZnVuY3Rpb24oY29sb3IpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkID0g
TWF0aC5hYnModGhpcy5yZWQgLSBjb2xvci5yZWQpICsgTWF0aC5hYnModGhpcy5ncmVlbiAtIGNv
bG9yLmdyZWVuKSArIE1hdGguYWJzKHRoaXMuYmx1ZSAtIGNvbG9yLmJsdWUpOworICAgICAgICAg
ICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIHJl
dHVybiBkOworICAgIH0sCisKKyAgICBibGVuZDogZnVuY3Rpb24oYzEsIGMyLCB3KXsKKyAgICAg
ICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgRmxvZy5SYXlUcmFjZXIuQ29s
b3IoMCwwLDApOworICAgICAgICAgICAgcmVzdWx0ID0gRmxvZy5SYXlUcmFjZXIuQ29sb3IucHJv
dG90eXBlLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgRmxvZy5SYXlUcmFjZXIuQ29sb3IucHJv
dG90eXBlLm11bHRpcGx5U2NhbGFyKGMxLCAxIC0gdyksCisgICAgICAgICAgICAgICAgICAgIEZs
b2cuUmF5VHJhY2VyLkNvbG9yLnByb3RvdHlwZS5tdWx0aXBseVNjYWxhcihjMiwgdykKKyAgICAg
ICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAg
ICB9IGNhdGNoKGUpIHsgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0sCisKKyAgICBi
cmlnaHRuZXNzIDogZnVuY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIg
ciA9IE1hdGguZmxvb3IodGhpcy5yZWQqMjU1KTsKKyAgICAgICAgICAgIHZhciBnID0gTWF0aC5m
bG9vcih0aGlzLmdyZWVuKjI1NSk7CisgICAgICAgICAgICB2YXIgYiA9IE1hdGguZmxvb3IodGhp
cy5ibHVlKjI1NSk7CisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBj
YXRjaChlKSB7IH0KKyAgICAgICAgcmV0dXJuIChyICogNzcgKyBnICogMTUwICsgYiAqIDI5KSA+
PiA4OworICAgIH0sCisKKyAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdHJ5
IHsKKyAgICAgICAgICAgIHZhciByID0gTWF0aC5mbG9vcih0aGlzLnJlZCoyNTUpOworICAgICAg
ICAgICAgdmFyIGcgPSBNYXRoLmZsb29yKHRoaXMuZ3JlZW4qMjU1KTsKKyAgICAgICAgICAgIHZh
ciBiID0gTWF0aC5mbG9vcih0aGlzLmJsdWUqMjU1KTsKKyAgICAgICAgICAgIHJhbmRvbUV4Y2Vw
dGlvbigpOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorCisgICAgICAgIHJldHVybiAicmdiKCIr
IHIgKyIsIisgZyArIiwiKyBiICsiKSI7CisgICAgfQorfQorLyogRmFrZSBhIEZsb2cuKiBuYW1l
c3BhY2UgKi8KK2lmKHR5cGVvZihGbG9nKSA9PSAndW5kZWZpbmVkJykgdmFyIEZsb2cgPSB7fTsK
K2lmKHR5cGVvZihGbG9nLlJheVRyYWNlcikgPT0gJ3VuZGVmaW5lZCcpIEZsb2cuUmF5VHJhY2Vy
ID0ge307CisKK0Zsb2cuUmF5VHJhY2VyLkxpZ2h0ID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cu
UmF5VHJhY2VyLkxpZ2h0LnByb3RvdHlwZSA9IHsKKyAgICBwb3NpdGlvbjogbnVsbCwKKyAgICBj
b2xvcjogbnVsbCwKKyAgICBpbnRlbnNpdHk6IDEwLjAsCisKKyAgICBpbml0aWFsaXplIDogZnVu
Y3Rpb24ocG9zLCBjb2xvciwgaW50ZW5zaXR5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAg
ICB0aGlzLnBvc2l0aW9uID0gcG9zOworICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOwor
ICAgICAgICAgICAgdGhpcy5pbnRlbnNpdHkgPSAoaW50ZW5zaXR5ID8gaW50ZW5zaXR5IDogMTAu
MCk7CisKKyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoKGUp
IHsgfQorICAgIH0sCisKKyAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdHJ5
IHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAnTGlnaHQgWycgKyB0aGlzLnBvc2l0aW9uLngg
KyAnLCcgKyB0aGlzLnBvc2l0aW9uLnkgKyAnLCcgKyB0aGlzLnBvc2l0aW9uLnogKyAnXSc7Cisg
ICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisvKiBGYWtlIGEgRmxvZy4qIG5hbWVzcGFj
ZSAqLworaWYodHlwZW9mKEZsb2cpID09ICd1bmRlZmluZWQnKSB2YXIgRmxvZyA9IHt9OworaWYo
dHlwZW9mKEZsb2cuUmF5VHJhY2VyKSA9PSAndW5kZWZpbmVkJykgRmxvZy5SYXlUcmFjZXIgPSB7
fTsKKworRmxvZy5SYXlUcmFjZXIuVmVjdG9yID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5
VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUgPSB7CisgICAgeCA6IDAuMCwKKyAgICB5IDogMC4wLAor
ICAgIHogOiAwLjAsCisKKyAgICBpbml0aWFsaXplIDogZnVuY3Rpb24oeCwgeSwgeikgeworICAg
ICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy54ID0gKHggPyB4IDogMCk7CisgICAgICAgICAg
ICB0aGlzLnkgPSAoeSA/IHkgOiAwKTsKKyAgICAgICAgICAgIHRoaXMueiA9ICh6ID8geiA6IDAp
OworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9
CisgICAgfSwKKworICAgIGNvcHk6IGZ1bmN0aW9uKHZlY3Rvcil7CisgICAgICAgIHRyeSB7Cisg
ICAgICAgICAgICB0aGlzLnggPSB2ZWN0b3IueDsKKyAgICAgICAgICAgIHRoaXMueSA9IHZlY3Rv
ci55OworICAgICAgICAgICAgdGhpcy56ID0gdmVjdG9yLno7CisgICAgICAgICAgICByYW5kb21F
eGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisgICAgbm9ybWFs
aXplIDogZnVuY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgbSA9IHRo
aXMubWFnbml0dWRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEZsb2cuUmF5VHJh
Y2VyLlZlY3Rvcih0aGlzLnggLyBtLCB0aGlzLnkgLyBtLCB0aGlzLnogLyBtKTsKKyAgICAgICAg
ICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0sCisKKyAgICBtYWduaXR1ZGUgOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHRoaXMueCAqIHRoaXMu
eCkgKyAodGhpcy55ICogdGhpcy55KSArICh0aGlzLnogKiB0aGlzLnopKTsKKyAgICAgICAgfSBj
YXRjaChlKSAgeyB9CisgICAgfSwKKworICAgIGNyb3NzIDogZnVuY3Rpb24odykgeworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9nLlJheVRyYWNlci5WZWN0b3IoCisg
ICAgICAgICAgICAgICAgICAgIC10aGlzLnogKiB3LnkgKyB0aGlzLnkgKiB3LnosCisgICAgICAg
ICAgICAgICAgICAgIHRoaXMueiAqIHcueCAtIHRoaXMueCAqIHcueiwKKyAgICAgICAgICAgICAg
ICAgICAgLXRoaXMueSAqIHcueCArIHRoaXMueCAqIHcueSk7CisgICAgICAgIH0gY2F0Y2goZSkg
eyB9CisgICAgfSwKKworICAgIGRvdCA6IGZ1bmN0aW9uKHcpIHsKKyAgICAgICAgdHJ5IHsKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzLnggKiB3LnggKyB0aGlzLnkgKiB3LnkgKyB0aGlzLnogKiB3
Lno7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgfSwKKworICAgIGFkZCA6IGZ1bmN0aW9u
KHYsIHcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmxvZy5SYXlU
cmFjZXIuVmVjdG9yKHcueCArIHYueCwgdy55ICsgdi55LCB3LnogKyB2LnopOworICAgICAgICB9
IGNhdGNoKGUpIHsgfQorICAgIH0sCisKKyAgICBzdWJ0cmFjdCA6IGZ1bmN0aW9uKHYsIHcpIHsK
KyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmKCF3IHx8ICF2KSB0aHJvdyAnVmVjdG9ycyBt
dXN0IGJlIGRlZmluZWQgWycgKyB2ICsgJywnICsgdyArICddJzsKKyAgICAgICAgICAgIHJldHVy
biBuZXcgRmxvZy5SYXlUcmFjZXIuVmVjdG9yKHYueCAtIHcueCwgdi55IC0gdy55LCB2LnogLSB3
LnopOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0sCisKKyAgICBtdWx0aXBseVZlY3Rv
ciA6IGZ1bmN0aW9uKHYsIHcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBu
ZXcgRmxvZy5SYXlUcmFjZXIuVmVjdG9yKHYueCAqIHcueCwgdi55ICogdy55LCB2LnogKiB3Lnop
OworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0sCisKKyAgICBtdWx0aXBseVNjYWxhciA6
IGZ1bmN0aW9uKHYsIHcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcg
RmxvZy5SYXlUcmFjZXIuVmVjdG9yKHYueCAqIHcsIHYueSAqIHcsIHYueiAqIHcpOworICAgICAg
ICB9IGNhdGNoKGUpIHsgfQorICAgIH0sCisKKyAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAnVmVjdG9yIFsnICsgdGhpcy54ICsg
JywnICsgdGhpcy55ICsgJywnICsgdGhpcy56ICsgJ10nOworICAgICAgICB9IGNhdGNoKGUpIHsg
fQorICAgIH0KK30KKy8qIEZha2UgYSBGbG9nLiogbmFtZXNwYWNlICovCitpZih0eXBlb2YoRmxv
ZykgPT0gJ3VuZGVmaW5lZCcpIHZhciBGbG9nID0ge307CitpZih0eXBlb2YoRmxvZy5SYXlUcmFj
ZXIpID09ICd1bmRlZmluZWQnKSBGbG9nLlJheVRyYWNlciA9IHt9OworCitGbG9nLlJheVRyYWNl
ci5SYXkgPSBDbGFzcy5jcmVhdGUoKTsKKworRmxvZy5SYXlUcmFjZXIuUmF5LnByb3RvdHlwZSA9
IHsKKyAgICBwb3NpdGlvbiA6IG51bGwsCisgICAgZGlyZWN0aW9uIDogbnVsbCwKKyAgICBpbml0
aWFsaXplIDogZnVuY3Rpb24ocG9zLCBkaXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAg
IHRoaXMucG9zaXRpb24gPSBwb3M7CisgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcjsK
KyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoKGUpIHsgfQor
ICAgIH0sCisKKyAgICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdHJ5IHsKKyAg
ICAgICAgICAgIHJldHVybiAnUmF5IFsnICsgdGhpcy5wb3NpdGlvbiArICcsJyArIHRoaXMuZGly
ZWN0aW9uICsgJ10nOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0KK30KKy8qIEZha2Ug
YSBGbG9nLiogbmFtZXNwYWNlICovCitpZih0eXBlb2YoRmxvZykgPT0gJ3VuZGVmaW5lZCcpIHZh
ciBGbG9nID0ge307CitpZih0eXBlb2YoRmxvZy5SYXlUcmFjZXIpID09ICd1bmRlZmluZWQnKSBG
bG9nLlJheVRyYWNlciA9IHt9OworCitGbG9nLlJheVRyYWNlci5TY2VuZSA9IENsYXNzLmNyZWF0
ZSgpOworCitGbG9nLlJheVRyYWNlci5TY2VuZS5wcm90b3R5cGUgPSB7CisgICAgY2FtZXJhIDog
bnVsbCwKKyAgICBzaGFwZXMgOiBbXSwKKyAgICBsaWdodHMgOiBbXSwKKyAgICBiYWNrZ3JvdW5k
IDogbnVsbCwKKworICAgIGluaXRpYWxpemUgOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdHJ5IHsK
KyAgICAgICAgICAgIHRoaXMuY2FtZXJhID0gbmV3IEZsb2cuUmF5VHJhY2VyLkNhbWVyYSgKKyAg
ICAgICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLlZlY3RvcigwLDAsLTUpLAorICAg
ICAgICAgICAgICAgICAgICBuZXcgRmxvZy5SYXlUcmFjZXIuVmVjdG9yKDAsMCwxKSwKKyAgICAg
ICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLlZlY3RvcigwLDEsMCkKKyAgICAgICAg
ICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIHRoaXMuc2hhcGVzID0gbmV3IEFycmF5KCk7Cisg
ICAgICAgICAgICB0aGlzLmxpZ2h0cyA9IG5ldyBBcnJheSgpOworICAgICAgICAgICAgdGhpcy5i
YWNrZ3JvdW5kID0gbmV3IEZsb2cuUmF5VHJhY2VyLkJhY2tncm91bmQobmV3IEZsb2cuUmF5VHJh
Y2VyLkNvbG9yKDAsMCwwLjUpLCAwLjIpOworCisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24o
KTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9Cit9CisvKiBGYWtlIGEgRmxvZy4qIG5h
bWVzcGFjZSAqLworaWYodHlwZW9mKEZsb2cpID09ICd1bmRlZmluZWQnKSB2YXIgRmxvZyA9IHt9
OworaWYodHlwZW9mKEZsb2cuUmF5VHJhY2VyKSA9PSAndW5kZWZpbmVkJykgRmxvZy5SYXlUcmFj
ZXIgPSB7fTsKK2lmKHR5cGVvZihGbG9nLlJheVRyYWNlci5NYXRlcmlhbCkgPT0gJ3VuZGVmaW5l
ZCcpIEZsb2cuUmF5VHJhY2VyLk1hdGVyaWFsID0ge307CisKK0Zsb2cuUmF5VHJhY2VyLk1hdGVy
aWFsLkJhc2VNYXRlcmlhbCA9IENsYXNzLmNyZWF0ZSgpOworCitGbG9nLlJheVRyYWNlci5NYXRl
cmlhbC5CYXNlTWF0ZXJpYWwucHJvdG90eXBlID0geworCisgICAgZ2xvc3M6IDIuMCwgICAgICAg
ICAgICAgLy8gWzAuLi5pbmZpbml0eV0gMCA9IG1hdHQKKyAgICB0cmFuc3BhcmVuY3k6IDAuMCwg
ICAgICAvLyAwPW9wYXF1ZQorICAgIHJlZmxlY3Rpb246IDAuMCwgICAgICAgIC8vIFswLi4uaW5m
aW5pdHldIDAgPSBubyByZWZsZWN0aW9uCisgICAgcmVmcmFjdGlvbjogMC41MCwKKyAgICBoYXNU
ZXh0dXJlOiBmYWxzZSwKKworICAgIGluaXRpYWxpemUgOiBmdW5jdGlvbigpIHsKKworICAgIH0s
CisKKyAgICBnZXRDb2xvcjogZnVuY3Rpb24odSwgdil7CisKKyAgICB9LAorCisgICAgd3JhcFVw
OiBmdW5jdGlvbih0KXsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQgPSB0ICUgMi4wOwor
ICAgICAgICAgICAgaWYodCA8IC0xKSB0ICs9IDIuMDsKKyAgICAgICAgICAgIGlmKHQgPj0gMSkg
dCAtPSAyLjA7CisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRj
aChlKSB7IH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfSwKKworICAgIHRvU3RyaW5nIDogZnVu
Y3Rpb24gKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICdNYXRlcmlhbCBb
Z2xvc3M9JyArIHRoaXMuZ2xvc3MgKyAnLCB0cmFuc3BhcmVuY3k9JyArIHRoaXMudHJhbnNwYXJl
bmN5ICsgJywgaGFzVGV4dHVyZT0nICsgdGhpcy5oYXNUZXh0dXJlICsnXSc7CisgICAgICAgIH0g
Y2F0Y2goZSkgeyB9CisgICAgfQorfQorLyogRmFrZSBhIEZsb2cuKiBuYW1lc3BhY2UgKi8KK2lm
KHR5cGVvZihGbG9nKSA9PSAndW5kZWZpbmVkJykgdmFyIEZsb2cgPSB7fTsKK2lmKHR5cGVvZihG
bG9nLlJheVRyYWNlcikgPT0gJ3VuZGVmaW5lZCcpIEZsb2cuUmF5VHJhY2VyID0ge307CisKK0Zs
b2cuUmF5VHJhY2VyLk1hdGVyaWFsLlNvbGlkID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5
VHJhY2VyLk1hdGVyaWFsLlNvbGlkLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQoCisgICAgICAg
IG5ldyBGbG9nLlJheVRyYWNlci5NYXRlcmlhbC5CYXNlTWF0ZXJpYWwoKSwgeworICAgICAgICAg
ICAgaW5pdGlhbGl6ZSA6IGZ1bmN0aW9uKGNvbG9yLCByZWZsZWN0aW9uLCByZWZyYWN0aW9uLCB0
cmFuc3BhcmVuY3ksIGdsb3NzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAg
ICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOworICAgICAgICAgICAgICAgICAgICB0aGlzLnJl
ZmxlY3Rpb24gPSByZWZsZWN0aW9uOworICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcGFy
ZW5jeSA9IHRyYW5zcGFyZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9zcyA9IGds
b3NzOworICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1RleHR1cmUgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBjYXRj
aChlKSB7IH0KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGdldENvbG9yOiBmdW5jdGlv
bih1LCB2KXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdGhpcy5jb2xvcjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdTb2xpZE1hdGVyaWFsIFtn
bG9zcz0nICsgdGhpcy5nbG9zcyArICcsIHRyYW5zcGFyZW5jeT0nICsgdGhpcy50cmFuc3BhcmVu
Y3kgKyAnLCBoYXNUZXh0dXJlPScgKyB0aGlzLmhhc1RleHR1cmUgKyddJzsKKyAgICAgICAgICAg
ICAgICB9IGNhdGNoKGUpIHsgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICk7
CisvKiBGYWtlIGEgRmxvZy4qIG5hbWVzcGFjZSAqLworaWYodHlwZW9mKEZsb2cpID09ICd1bmRl
ZmluZWQnKSB2YXIgRmxvZyA9IHt9OworaWYodHlwZW9mKEZsb2cuUmF5VHJhY2VyKSA9PSAndW5k
ZWZpbmVkJykgRmxvZy5SYXlUcmFjZXIgPSB7fTsKKworRmxvZy5SYXlUcmFjZXIuTWF0ZXJpYWwu
Q2hlc3Nib2FyZCA9IENsYXNzLmNyZWF0ZSgpOworCitGbG9nLlJheVRyYWNlci5NYXRlcmlhbC5D
aGVzc2JvYXJkLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQoCisgICAgICAgIG5ldyBGbG9nLlJh
eVRyYWNlci5NYXRlcmlhbC5CYXNlTWF0ZXJpYWwoKSwgeworICAgICAgICAgICAgY29sb3JFdmVu
OiBudWxsLAorICAgICAgICAgICAgY29sb3JPZGQ6IG51bGwsCisgICAgICAgICAgICBkZW5zaXR5
OiAwLjUsCisKKyAgICAgICAgICAgIGluaXRpYWxpemUgOiBmdW5jdGlvbihjb2xvckV2ZW4sIGNv
bG9yT2RkLCByZWZsZWN0aW9uLCB0cmFuc3BhcmVuY3ksIGdsb3NzLCBkZW5zaXR5KSB7CisgICAg
ICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xvckV2ZW4gPSBj
b2xvckV2ZW47CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sb3JPZGQgPSBjb2xvck9kZDsK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZsZWN0aW9uID0gcmVmbGVjdGlvbjsKKyAgICAg
ICAgICAgICAgICAgICAgdGhpcy50cmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3k7CisgICAgICAg
ICAgICAgICAgICAgIHRoaXMuZ2xvc3MgPSBnbG9zczsKKyAgICAgICAgICAgICAgICAgICAgdGhp
cy5kZW5zaXR5ID0gZGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNUZXh0dXJl
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAg
ICAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGdl
dENvbG9yOiBmdW5jdGlvbih1LCB2KXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAg
ICAgICAgICAgICB2YXIgdCA9IHRoaXMud3JhcFVwKHUgKiB0aGlzLmRlbnNpdHkpICogdGhpcy53
cmFwVXAodiAqIHRoaXMuZGVuc2l0eSk7CisgICAgICAgICAgICAgICAgICAgIHJhbmRvbUV4Y2Vw
dGlvbigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkgeyB9CisKKyAgICAgICAgICAgICAg
ICBpZih0IDwgMC4wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xvckV2ZW47
CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5j
b2xvck9kZDsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHRvU3RyaW5nIDogZnVuY3Rp
b24gKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVy
biAnQ2hlc3NNYXRlcmlhbCBbZ2xvc3M9JyArIHRoaXMuZ2xvc3MgKyAnLCB0cmFuc3BhcmVuY3k9
JyArIHRoaXMudHJhbnNwYXJlbmN5ICsgJywgaGFzVGV4dHVyZT0nICsgdGhpcy5oYXNUZXh0dXJl
ICsnXSc7CisgICAgICAgICAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorKTsKKy8qIEZha2UgYSBGbG9nLiogbmFtZXNwYWNlICovCitpZih0eXBlb2YoRmxv
ZykgPT0gJ3VuZGVmaW5lZCcpIHZhciBGbG9nID0ge307CitpZih0eXBlb2YoRmxvZy5SYXlUcmFj
ZXIpID09ICd1bmRlZmluZWQnKSBGbG9nLlJheVRyYWNlciA9IHt9OworaWYodHlwZW9mKEZsb2cu
UmF5VHJhY2VyLlNoYXBlKSA9PSAndW5kZWZpbmVkJykgRmxvZy5SYXlUcmFjZXIuU2hhcGUgPSB7
fTsKKworRmxvZy5SYXlUcmFjZXIuU2hhcGUuU3BoZXJlID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zs
b2cuUmF5VHJhY2VyLlNoYXBlLlNwaGVyZS5wcm90b3R5cGUgPSB7CisgICAgaW5pdGlhbGl6ZSA6
IGZ1bmN0aW9uKHBvcywgcmFkaXVzLCBtYXRlcmlhbCkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgICAgdGhpcy5yYWRpdXMgPSByYWRpdXM7CisgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0g
cG9zOworICAgICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsOworCisgICAgICAgICAg
ICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisg
ICAgaW50ZXJzZWN0OiBmdW5jdGlvbihyYXkpeworICAgICAgICB0cnkgeworICAgICAgICAgICAg
dmFyIGluZm8gPSBuZXcgRmxvZy5SYXlUcmFjZXIuSW50ZXJzZWN0aW9uSW5mbygpOworICAgICAg
ICAgICAgaW5mby5zaGFwZSA9IHRoaXM7CisKKyAgICAgICAgICAgIHZhciBkc3QgPSBGbG9nLlJh
eVRyYWNlci5WZWN0b3IucHJvdG90eXBlLnN1YnRyYWN0KHJheS5wb3NpdGlvbiwgdGhpcy5wb3Np
dGlvbik7CisKKyAgICAgICAgICAgIHZhciBCID0gZHN0LmRvdChyYXkuZGlyZWN0aW9uKTsKKyAg
ICAgICAgICAgIHZhciBDID0gZHN0LmRvdChkc3QpIC0gKHRoaXMucmFkaXVzICogdGhpcy5yYWRp
dXMpOworICAgICAgICAgICAgdmFyIEQgPSAoQiAqIEIpIC0gQzsKKworICAgICAgICAgICAgaWYo
RCA+IDApeyAvLyBpbnRlcnNlY3Rpb24hCisgICAgICAgICAgICAgICAgaW5mby5pc0hpdCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgaW5mby5kaXN0YW5jZSA9ICgtQikgLSBNYXRoLnNxcnQoRCk7
CisgICAgICAgICAgICAgICAgaW5mby5wb3NpdGlvbiA9IEZsb2cuUmF5VHJhY2VyLlZlY3Rvci5w
cm90b3R5cGUuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgcmF5LnBvc2l0aW9uLAorICAg
ICAgICAgICAgICAgICAgICAgICAgRmxvZy5SYXlUcmFjZXIuVmVjdG9yLnByb3RvdHlwZS5tdWx0
aXBseVNjYWxhcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXkuZGlyZWN0aW9uLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZGlzdGFuY2UKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAg
ICAgIGluZm8ubm9ybWFsID0gRmxvZy5SYXlUcmFjZXIuVmVjdG9yLnByb3RvdHlwZS5zdWJ0cmFj
dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucG9zaXRpb24sCisgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLnBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICApLm5vcm1h
bGl6ZSgpOworCisgICAgICAgICAgICAgICAgaW5mby5jb2xvciA9IHRoaXMubWF0ZXJpYWwuZ2V0
Q29sb3IoMCwwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mby5p
c0hpdCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYW5kb21FeGNlcHRp
b24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAg
fSwKKworICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgICAgcmV0dXJuICdTcGhlcmUgW3Bvc2l0aW9uPScgKyB0aGlzLnBvc2l0aW9uICsgJywgcmFk
aXVzPScgKyB0aGlzLnJhZGl1cyArICddJzsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9
Cit9CisvKiBGYWtlIGEgRmxvZy4qIG5hbWVzcGFjZSAqLworaWYodHlwZW9mKEZsb2cpID09ICd1
bmRlZmluZWQnKSB2YXIgRmxvZyA9IHt9OworaWYodHlwZW9mKEZsb2cuUmF5VHJhY2VyKSA9PSAn
dW5kZWZpbmVkJykgRmxvZy5SYXlUcmFjZXIgPSB7fTsKK2lmKHR5cGVvZihGbG9nLlJheVRyYWNl
ci5TaGFwZSkgPT0gJ3VuZGVmaW5lZCcpIEZsb2cuUmF5VHJhY2VyLlNoYXBlID0ge307CisKK0Zs
b2cuUmF5VHJhY2VyLlNoYXBlLlBsYW5lID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5VHJh
Y2VyLlNoYXBlLlBsYW5lLnByb3RvdHlwZSA9IHsKKyAgICBkOiAwLjAsCisKKyAgICBpbml0aWFs
aXplIDogZnVuY3Rpb24ocG9zLCBkLCBtYXRlcmlhbCkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKKyAgICAgICAgICAgIHRoaXMuZCA9IGQ7CisgICAg
ICAgICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7CisgICAgICAgICAgICByYW5kb21FeGNl
cHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisgICAgaW50ZXJzZWN0
OiBmdW5jdGlvbihyYXkpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGluZm8gPSBu
ZXcgRmxvZy5SYXlUcmFjZXIuSW50ZXJzZWN0aW9uSW5mbygpOworCisgICAgICAgICAgICB2YXIg
VmQgPSB0aGlzLnBvc2l0aW9uLmRvdChyYXkuZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGlmKFZk
ID09IDApIHJldHVybiBpbmZvOyAvLyBubyBpbnRlcnNlY3Rpb24KKworICAgICAgICAgICAgdmFy
IHQgPSAtKHRoaXMucG9zaXRpb24uZG90KHJheS5wb3NpdGlvbikgKyB0aGlzLmQpIC8gVmQ7Cisg
ICAgICAgICAgICBpZih0IDw9IDApIHJldHVybiBpbmZvOworCisgICAgICAgICAgICBpbmZvLnNo
YXBlID0gdGhpczsKKyAgICAgICAgICAgIGluZm8uaXNIaXQgPSB0cnVlOworICAgICAgICAgICAg
aW5mby5wb3NpdGlvbiA9IEZsb2cuUmF5VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUuYWRkKAorICAg
ICAgICAgICAgICAgICAgICByYXkucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIEZsb2cu
UmF5VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUubXVsdGlwbHlTY2FsYXIoCisgICAgICAgICAgICAg
ICAgICAgICAgICByYXkuZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgdAorICAg
ICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAg
ICAgaW5mby5ub3JtYWwgPSB0aGlzLnBvc2l0aW9uOworICAgICAgICAgICAgaW5mby5kaXN0YW5j
ZSA9IHQ7CisKKyAgICAgICAgICAgIGlmKHRoaXMubWF0ZXJpYWwuaGFzVGV4dHVyZSl7CisgICAg
ICAgICAgICAgICAgdmFyIHZVID0gbmV3IEZsb2cuUmF5VHJhY2VyLlZlY3Rvcih0aGlzLnBvc2l0
aW9uLnksIHRoaXMucG9zaXRpb24ueiwgLXRoaXMucG9zaXRpb24ueCk7CisgICAgICAgICAgICAg
ICAgdmFyIHZWID0gdlUuY3Jvc3ModGhpcy5wb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdmFy
IHUgPSBpbmZvLnBvc2l0aW9uLmRvdCh2VSk7CisgICAgICAgICAgICAgICAgdmFyIHYgPSBpbmZv
LnBvc2l0aW9uLmRvdCh2Vik7CisgICAgICAgICAgICAgICAgaW5mby5jb2xvciA9IHRoaXMubWF0
ZXJpYWwuZ2V0Q29sb3IodSx2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgaW5mby5jb2xvciA9IHRoaXMubWF0ZXJpYWwuZ2V0Q29sb3IoMCwwKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkg
eyB9CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0sCisKKyAgICB0b1N0cmluZyA6IGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAnUGxhbmUgWycgKyB0
aGlzLnBvc2l0aW9uICsgJywgZD0nICsgdGhpcy5kICsgJ10nOworICAgICAgICB9IGNhdGNoKGUp
IHsgfQorICAgIH0KK30KKy8qIEZha2UgYSBGbG9nLiogbmFtZXNwYWNlICovCitpZih0eXBlb2Yo
RmxvZykgPT0gJ3VuZGVmaW5lZCcpIHZhciBGbG9nID0ge307CitpZih0eXBlb2YoRmxvZy5SYXlU
cmFjZXIpID09ICd1bmRlZmluZWQnKSBGbG9nLlJheVRyYWNlciA9IHt9OworCitGbG9nLlJheVRy
YWNlci5JbnRlcnNlY3Rpb25JbmZvID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5VHJhY2Vy
LkludGVyc2VjdGlvbkluZm8ucHJvdG90eXBlID0geworICAgIGlzSGl0OiBmYWxzZSwKKyAgICBo
aXRDb3VudDogMCwKKyAgICBzaGFwZTogbnVsbCwKKyAgICBwb3NpdGlvbjogbnVsbCwKKyAgICBu
b3JtYWw6IG51bGwsCisgICAgY29sb3I6IG51bGwsCisgICAgZGlzdGFuY2U6IG51bGwsCisKKyAg
ICBpbml0aWFsaXplIDogZnVuY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0
aGlzLmNvbG9yID0gbmV3IEZsb2cuUmF5VHJhY2VyLkNvbG9yKDAsMCwwKTsKKyAgICAgICAgICAg
IHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0sCisKKyAg
ICB0b1N0cmluZyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJl
dHVybiAnSW50ZXJzZWN0aW9uIFsnICsgdGhpcy5wb3NpdGlvbiArICddJzsKKyAgICAgICAgfSBj
YXRjaChlKSB7IH0KKyAgICB9Cit9CisvKiBGYWtlIGEgRmxvZy4qIG5hbWVzcGFjZSAqLworaWYo
dHlwZW9mKEZsb2cpID09ICd1bmRlZmluZWQnKSB2YXIgRmxvZyA9IHt9OworaWYodHlwZW9mKEZs
b2cuUmF5VHJhY2VyKSA9PSAndW5kZWZpbmVkJykgRmxvZy5SYXlUcmFjZXIgPSB7fTsKKworRmxv
Zy5SYXlUcmFjZXIuQ2FtZXJhID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5VHJhY2VyLkNh
bWVyYS5wcm90b3R5cGUgPSB7CisgICAgcG9zaXRpb246IG51bGwsCisgICAgbG9va0F0OiBudWxs
LAorICAgIGVxdWF0b3I6IG51bGwsCisgICAgdXA6IG51bGwsCisgICAgc2NyZWVuOiBudWxsLAor
CisgICAgaW5pdGlhbGl6ZSA6IGZ1bmN0aW9uKHBvcywgbG9va0F0LCB1cCkgeworICAgICAgICB0
cnkgeworICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKKyAgICAgICAgICAgIHRoaXMu
bG9va0F0ID0gbG9va0F0OworICAgICAgICAgICAgdGhpcy51cCA9IHVwOworICAgICAgICAgICAg
dGhpcy5lcXVhdG9yID0gbG9va0F0Lm5vcm1hbGl6ZSgpLmNyb3NzKHRoaXMudXApOworICAgICAg
ICAgICAgdGhpcy5zY3JlZW4gPSBGbG9nLlJheVRyYWNlci5WZWN0b3IucHJvdG90eXBlLmFkZCh0
aGlzLnBvc2l0aW9uLCB0aGlzLmxvb2tBdCk7CisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24o
KTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisgICAgZ2V0UmF5OiBmdW5jdGlv
bih2eCwgdnkpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHBvcyA9IEZsb2cuUmF5
VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUuc3VidHJhY3QoCisgICAgICAgICAgICAgICAgICAgIHRo
aXMuc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICBGbG9nLlJheVRyYWNlci5WZWN0b3IucHJv
dG90eXBlLnN1YnRyYWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgRmxvZy5SYXlUcmFjZXIu
VmVjdG9yLnByb3RvdHlwZS5tdWx0aXBseVNjYWxhcih0aGlzLmVxdWF0b3IsIHZ4KSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIEZsb2cuUmF5VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUubXVsdGlw
bHlTY2FsYXIodGhpcy51cCwgdnkpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAg
ICAgICAgICAgICAgICk7CisgICAgICAgICAgICBwb3MueSA9IHBvcy55ICogLTE7CisgICAgICAg
ICAgICB2YXIgZGlyID0gRmxvZy5SYXlUcmFjZXIuVmVjdG9yLnByb3RvdHlwZS5zdWJ0cmFjdCgK
KyAgICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0
aW9uCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHZhciByYXkgPSBuZXcg
RmxvZy5SYXlUcmFjZXIuUmF5KHBvcywgZGlyLm5vcm1hbGl6ZSgpKTsKKworICAgICAgICAgICAg
cmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIHJldHVy
biByYXk7CisgICAgfSwKKworICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkgeworICAgICAgICB0
cnkgeworICAgICAgICAgICAgcmV0dXJuICdSYXkgW10nOworICAgICAgICB9IGNhdGNoKGUpIHsg
fQorICAgIH0KK30KKy8qIEZha2UgYSBGbG9nLiogbmFtZXNwYWNlICovCitpZih0eXBlb2YoRmxv
ZykgPT0gJ3VuZGVmaW5lZCcpIHZhciBGbG9nID0ge307CitpZih0eXBlb2YoRmxvZy5SYXlUcmFj
ZXIpID09ICd1bmRlZmluZWQnKSBGbG9nLlJheVRyYWNlciA9IHt9OworCitGbG9nLlJheVRyYWNl
ci5CYWNrZ3JvdW5kID0gQ2xhc3MuY3JlYXRlKCk7CisKK0Zsb2cuUmF5VHJhY2VyLkJhY2tncm91
bmQucHJvdG90eXBlID0geworICAgIGNvbG9yIDogbnVsbCwKKyAgICBhbWJpZW5jZSA6IDAuMCwK
KworICAgIGluaXRpYWxpemUgOiBmdW5jdGlvbihjb2xvciwgYW1iaWVuY2UpIHsKKyAgICAgICAg
dHJ5IHsKKyAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKKyAgICAgICAgICAgIHRoaXMu
YW1iaWVuY2UgPSBhbWJpZW5jZTsKKyAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAg
ICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0KK30KKy8qIEZha2UgYSBGbG9nLiogbmFtZXNwYWNl
ICovCitpZih0eXBlb2YoRmxvZykgPT0gJ3VuZGVmaW5lZCcpIHZhciBGbG9nID0ge307CitpZih0
eXBlb2YoRmxvZy5SYXlUcmFjZXIpID09ICd1bmRlZmluZWQnKSBGbG9nLlJheVRyYWNlciA9IHt9
OworCitGbG9nLlJheVRyYWNlci5FbmdpbmUgPSBDbGFzcy5jcmVhdGUoKTsKKworRmxvZy5SYXlU
cmFjZXIuRW5naW5lLnByb3RvdHlwZSA9IHsKKyAgICBjYW52YXM6IG51bGwsIC8qIDJkIGNvbnRl
eHQgd2UgY2FuIHJlbmRlciB0byAqLworCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9u
cyl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuZXh0
ZW5kKHsKKyAgICAgICAgICAgICAgICBjYW52YXNIZWlnaHQ6IDEwMCwKKyAgICAgICAgICAgICAg
ICBjYW52YXNXaWR0aDogMTAwLAorICAgICAgICAgICAgICAgIHBpeGVsV2lkdGg6IDIsCisgICAg
ICAgICAgICAgICAgcGl4ZWxIZWlnaHQ6IDIsCisgICAgICAgICAgICAgICAgcmVuZGVyRGlmZnVz
ZTogZmFsc2UsCisgICAgICAgICAgICAgICAgcmVuZGVyU2hhZG93czogZmFsc2UsCisgICAgICAg
ICAgICAgICAgcmVuZGVySGlnaGxpZ2h0czogZmFsc2UsCisgICAgICAgICAgICAgICAgcmVuZGVy
UmVmbGVjdGlvbnM6IGZhbHNlLAorICAgICAgICAgICAgICAgIHJheURlcHRoOiAyCisgICAgICAg
ICAgICB9LCBvcHRpb25zIHx8IHt9KTsKKworICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNhbnZh
c0hlaWdodCAvPSB0aGlzLm9wdGlvbnMucGl4ZWxIZWlnaHQ7CisgICAgICAgICAgICB0aGlzLm9w
dGlvbnMuY2FudmFzV2lkdGggLz0gdGhpcy5vcHRpb25zLnBpeGVsV2lkdGg7CisKKyAgICAgICAg
ICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB9IGNhdGNoKGUpIHsgfQorCisgICAgICAg
IC8qIFRPRE86IGR5bmFtaWNhbGx5IGluY2x1ZGUgb3RoZXIgc2NyaXB0cyAqLworICAgIH0sCisK
KyAgICBzZXRQaXhlbDogZnVuY3Rpb24oeCwgeSwgY29sb3IpeworICAgICAgICB0cnkgeworICAg
ICAgICAgICAgdmFyIHB4VywgcHhIOworICAgICAgICAgICAgcHhXID0gdGhpcy5vcHRpb25zLnBp
eGVsV2lkdGg7CisgICAgICAgICAgICBweEggPSB0aGlzLm9wdGlvbnMucGl4ZWxIZWlnaHQ7CisK
KyAgICAgICAgICAgIGlmICh0aGlzLmNhbnZhcykgeworICAgICAgICAgICAgICAgIHRoaXMuY2Fu
dmFzLmZpbGxTdHlsZSA9IGNvbG9yLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGhpcy5j
YW52YXMuZmlsbFJlY3QgKHggKiBweFcsIHkgKiBweEgsIHB4VywgcHhIKTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHggPT09ICB5KSB7CisgICAgICAgICAgICAg
ICAgICAgIGNoZWNrTnVtYmVyICs9IGNvbG9yLmJyaWdodG5lc3MoKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgLy8gcHJpbnQoeCAqIHB4VywgeSAqIHB4SCwgcHhXLCBweEgp
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAg
ICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisgICAgcmVuZGVyU2NlbmU6IGZ1bmN0aW9uKHNj
ZW5lLCBjYW52YXMpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tOdW1iZXIgPSAw
OworICAgICAgICAgICAgLyogR2V0IGNhbnZhcyAqLworICAgICAgICAgICAgaWYgKGNhbnZhcykg
eworICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVs
bDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGNhbnZhc0hlaWdodCA9IHRoaXMu
b3B0aW9ucy5jYW52YXNIZWlnaHQ7CisgICAgICAgICAgICB2YXIgY2FudmFzV2lkdGggPSB0aGlz
Lm9wdGlvbnMuY2FudmFzV2lkdGg7CisKKyAgICAgICAgICAgIGZvcih2YXIgeT0wOyB5IDwgY2Fu
dmFzSGVpZ2h0OyB5KyspeworICAgICAgICAgICAgICAgIGZvcih2YXIgeD0wOyB4IDwgY2FudmFz
V2lkdGg7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgeXAgPSB5ICogMS4wIC8gY2FudmFzSGVpZ2h0ICogMiAtIDE7CisgICAgICAg
ICAgICAgICAgICAgICAgICB2YXIgeHAgPSB4ICogMS4wIC8gY2FudmFzV2lkdGggKiAyIC0gMTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJheSA9IHNjZW5lLmNhbWVyYS5nZXRSYXko
eHAsIHlwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5nZXRQ
aXhlbENvbG9yKHJheSwgc2NlbmUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNl
dFBpeGVsKHgsIHksIGNvbG9yKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tRXhj
ZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgICAgICBp
ZiAoY2hlY2tOdW1iZXIgIT09IDIzMjEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi
U2NlbmUgcmVuZGVyZWQgaW5jb3JyZWN0bHkiKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBn
ZXRQaXhlbENvbG9yOiBmdW5jdGlvbihyYXksIHNjZW5lKXsKKyAgICAgICAgdHJ5IHsKKyAgICAg
ICAgICAgIHZhciBpbmZvID0gdGhpcy50ZXN0SW50ZXJzZWN0aW9uKHJheSwgc2NlbmUsIG51bGwp
OworICAgICAgICAgICAgaWYoaW5mby5pc0hpdCl7CisgICAgICAgICAgICAgICAgdmFyIGNvbG9y
ID0gdGhpcy5yYXlUcmFjZShpbmZvLCByYXksIHNjZW5lLCAwKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2NlbmUuYmFj
a2dyb3VuZC5jb2xvcjsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICB9LAorCisgICAgdGVz
dEludGVyc2VjdGlvbjogZnVuY3Rpb24ocmF5LCBzY2VuZSwgZXhjbHVkZSl7CisgICAgICAgIHRy
eSB7CisgICAgICAgICAgICB2YXIgaGl0cyA9IDA7CisgICAgICAgICAgICB2YXIgYmVzdCA9IG5l
dyBGbG9nLlJheVRyYWNlci5JbnRlcnNlY3Rpb25JbmZvKCk7CisgICAgICAgICAgICBiZXN0LmRp
c3RhbmNlID0gMjAwMDsKKworICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8c2NlbmUuc2hhcGVz
Lmxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAg
ICB2YXIgc2hhcGUgPSBzY2VuZS5zaGFwZXNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYo
c2hhcGUgIT0gZXhjbHVkZSl7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHNo
YXBlLmludGVyc2VjdChyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby5pc0hp
dCAmJiBpbmZvLmRpc3RhbmNlID49IDAgJiYgaW5mby5kaXN0YW5jZSA8IGJlc3QuZGlzdGFuY2Up
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpbmZvOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGhpdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigp
OworICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBiZXN0LmhpdENvdW50ID0gaGl0czsKKworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9u
KCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIHJldHVybiBiZXN0OworICAgIH0s
CisKKyAgICBnZXRSZWZsZWN0aW9uUmF5OiBmdW5jdGlvbihQLE4sVil7CisgICAgICAgIHRyeSB7
CisgICAgICAgICAgICB2YXIgYzEgPSAtTi5kb3QoVik7CisgICAgICAgICAgICB2YXIgUjEgPSBG
bG9nLlJheVRyYWNlci5WZWN0b3IucHJvdG90eXBlLmFkZCgKKyAgICAgICAgICAgICAgICAgICAg
RmxvZy5SYXlUcmFjZXIuVmVjdG9yLnByb3RvdHlwZS5tdWx0aXBseVNjYWxhcihOLCAyKmMxKSwK
KyAgICAgICAgICAgICAgICAgICAgVgorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAg
ICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAg
cmV0dXJuIG5ldyBGbG9nLlJheVRyYWNlci5SYXkoUCwgUjEpOworICAgIH0sCisKKyAgICByYXlU
cmFjZTogZnVuY3Rpb24oaW5mbywgcmF5LCBzY2VuZSwgZGVwdGgpeworICAgICAgICAvLyBDYWxj
IGFtYmllbnQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBjb2xvciA9IEZsb2cuUmF5
VHJhY2VyLkNvbG9yLnByb3RvdHlwZS5tdWx0aXBseVNjYWxhcihpbmZvLmNvbG9yLCBzY2VuZS5i
YWNrZ3JvdW5kLmFtYmllbmNlKTsKKyAgICAgICAgICAgIHZhciBvbGRDb2xvciA9IGNvbG9yOwor
ICAgICAgICAgICAgdmFyIHNoaW5pbmVzcyA9IE1hdGgucG93KDEwLCBpbmZvLnNoYXBlLm1hdGVy
aWFsLmdsb3NzICsgMSk7CisKKyAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPHNjZW5lLmxpZ2h0
cy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIGxpZ2h0ID0gc2NlbmUubGlnaHRzW2ldOworCisgICAgICAgICAgICAgICAgICAgIC8v
IENhbGMgZGlmZnVzZSBsaWdodGluZworICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IEZsb2cu
UmF5VHJhY2VyLlZlY3Rvci5wcm90b3R5cGUuc3VidHJhY3QoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbGlnaHQucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5m
by5wb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubm9ybWFsaXplKCk7CisK
KyAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnJlbmRlckRpZmZ1c2UpeworICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIEwgPSB2LmRvdChpbmZvLm5vcm1hbCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZihMID4gMC4wKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb2xvciA9IEZsb2cuUmF5VHJhY2VyLkNvbG9yLnByb3RvdHlwZS5hZGQoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEZsb2cuUmF5VHJhY2VyLkNvbG9yLnByb3RvdHlwZS5tdWx0aXBseSgKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvbG9yLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2cuUmF5VHJhY2VyLkNvbG9yLnBy
b3RvdHlwZS5tdWx0aXBseVNjYWxhcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbGlnaHQuY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByYW5kb21FeGNl
cHRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHsgfQorCisgICAgICAgICAgICAg
ICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGdyZWF0ZXIgdGhlIGRlcHRoIHRo
ZSBtb3JlIGFjY3VyYXRlIHRoZSBjb2xvdXJzLCBidXQKKyAgICAgICAgICAgICAgICAgICAgLy8g
dGhpcyBpcyBleHBvbmVudGlhbGx5ICghKSBleHBlbnNpdmUKKyAgICAgICAgICAgICAgICAgICAg
aWYoZGVwdGggPD0gdGhpcy5vcHRpb25zLnJheURlcHRoKXsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGNhbGN1bGF0ZSByZWZsZWN0aW9uIHJheQorICAgICAgICAgICAgICAgICAgICAgICAg
aWYodGhpcy5vcHRpb25zLnJlbmRlclJlZmxlY3Rpb25zICYmIGluZm8uc2hhcGUubWF0ZXJpYWwu
cmVmbGVjdGlvbiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdmFyIHJlZmxlY3Rpb25SYXkgPSB0aGlzLmdldFJlZmxlY3Rpb25SYXko
aW5mby5wb3NpdGlvbiwgaW5mby5ub3JtYWwsIHJheS5kaXJlY3Rpb24pOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHZhciByZWZsID0gdGhpcy50ZXN0SW50ZXJzZWN0aW9uKHJlZmxlY3Rp
b25SYXksIHNjZW5lLCBpbmZvLnNoYXBlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChyZWZsLmlzSGl0ICYmIHJlZmwuZGlzdGFuY2UgPiAwKXsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVmbC5jb2xvciA9IHRoaXMucmF5VHJhY2UocmVmbCwgcmVmbGVjdGlv
blJheSwgc2NlbmUsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmbC5jb2xvciA9IHNjZW5l
LmJhY2tncm91bmQuY29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBGbG9nLlJheVRyYWNlci5Db2xvci5wcm90
b3R5cGUuYmxlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmwuY29sb3IsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNoYXBlLm1hdGVyaWFsLnJlZmxlY3Rp
b24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZnJhY3Rpb24KKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9
ICBjYXRjaChlKSB7IH0KKworICAgICAgICAgICAgICAgIC8qIFJlbmRlciBzaGFkb3dzIGFuZCBo
aWdobGlnaHRzICovCisKKyAgICAgICAgICAgICAgICB2YXIgc2hhZG93SW5mbyA9IG5ldyBGbG9n
LlJheVRyYWNlci5JbnRlcnNlY3Rpb25JbmZvKCk7CisKKyAgICAgICAgICAgICAgICBpZih0aGlz
Lm9wdGlvbnMucmVuZGVyU2hhZG93cyl7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFkb3dS
YXkgPSBuZXcgRmxvZy5SYXlUcmFjZXIuUmF5KGluZm8ucG9zaXRpb24sIHYpOworCisgICAgICAg
ICAgICAgICAgICAgIHNoYWRvd0luZm8gPSB0aGlzLnRlc3RJbnRlcnNlY3Rpb24oc2hhZG93UmF5
LCBzY2VuZSwgaW5mby5zaGFwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNoYWRvd0luZm8u
aXNIaXQgJiYgc2hhZG93SW5mby5zaGFwZSAhPSBpbmZvLnNoYXBlIC8qJiYgc2hhZG93SW5mby5z
aGFwZS50eXBlICE9ICdQTEFORScqLyl7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdkEg
PSBGbG9nLlJheVRyYWNlci5Db2xvci5wcm90b3R5cGUubXVsdGlwbHlTY2FsYXIoY29sb3IsIDAu
NSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZEIgPSAoMC41ICogTWF0aC5wb3coc2hh
ZG93SW5mby5zaGFwZS5tYXRlcmlhbC50cmFuc3BhcmVuY3ksIDAuNSkpOworICAgICAgICAgICAg
ICAgICAgICAgICAgY29sb3IgPSBGbG9nLlJheVRyYWNlci5Db2xvci5wcm90b3R5cGUuYWRkU2Nh
bGFyKHZBLGRCKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBob25nIHNwZWN1
bGFyIGhpZ2hsaWdodHMKKyAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnJlbmRl
ckhpZ2hsaWdodHMgJiYgIXNoYWRvd0luZm8uaXNIaXQgJiYgaW5mby5zaGFwZS5tYXRlcmlhbC5n
bG9zcyA+IDApeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEx2ID0gRmxvZy5SYXlUcmFj
ZXIuVmVjdG9yLnByb3RvdHlwZS5zdWJ0cmFjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW5mby5zaGFwZS5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbGlnaHQucG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5ub3Jt
YWxpemUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEUgPSBGbG9nLlJheVRyYWNl
ci5WZWN0b3IucHJvdG90eXBlLnN1YnRyYWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzY2VuZS5jYW1lcmEucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGluZm8uc2hhcGUucG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KS5ub3JtYWxpemUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEggPSBGbG9nLlJh
eVRyYWNlci5WZWN0b3IucHJvdG90eXBlLnN1YnRyYWN0KAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAg
ICAgICAgICAgICB2YXIgZ2xvc3NXZWlnaHQgPSBNYXRoLnBvdyhNYXRoLm1heChpbmZvLm5vcm1h
bC5kb3QoSCksIDApLCBzaGluaW5lc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Ig
PSBGbG9nLlJheVRyYWNlci5Db2xvci5wcm90b3R5cGUuYWRkKAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBGbG9nLlJheVRyYWNlci5Db2xvci5wcm90b3R5cGUubXVsdGlwbHlTY2Fs
YXIobGlnaHQuY29sb3IsIGdsb3NzV2VpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAg
ICAgICAgICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
Y29sb3IubGltaXQoKTsKKworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAg
IH0gY2F0Y2goZSkgeyB9CisgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICB9Cit9OworCisKK2Z1
bmN0aW9uIHJlbmRlclNjZW5lKCl7CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHNjZW5lID0gbmV3
IEZsb2cuUmF5VHJhY2VyLlNjZW5lKCk7CisKKyAgICAgICAgc2NlbmUuY2FtZXJhID0gbmV3IEZs
b2cuUmF5VHJhY2VyLkNhbWVyYSgKKyAgICAgICAgICAgICAgICBuZXcgRmxvZy5SYXlUcmFjZXIu
VmVjdG9yKDAsIDAsIC0xNSksCisgICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLlZl
Y3RvcigtMC4yLCAwLCA1KSwKKyAgICAgICAgICAgICAgICBuZXcgRmxvZy5SYXlUcmFjZXIuVmVj
dG9yKDAsIDEsIDApCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBzY2VuZS5iYWNrZ3Jv
dW5kID0gbmV3IEZsb2cuUmF5VHJhY2VyLkJhY2tncm91bmQoCisgICAgICAgICAgICAgICAgbmV3
IEZsb2cuUmF5VHJhY2VyLkNvbG9yKDAuNSwgMC41LCAwLjUpLAorICAgICAgICAgICAgICAgIDAu
NAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgdmFyIHNwaGVyZSA9IG5ldyBGbG9nLlJh
eVRyYWNlci5TaGFwZS5TcGhlcmUoCisgICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2Vy
LlZlY3RvcigtMS41LCAxLjUsIDIpLAorICAgICAgICAgICAgICAgIDEuNSwKKyAgICAgICAgICAg
ICAgICBuZXcgRmxvZy5SYXlUcmFjZXIuTWF0ZXJpYWwuU29saWQoCisgICAgICAgICAgICAgICAg
ICAgIG5ldyBGbG9nLlJheVRyYWNlci5Db2xvcigwLDAuNSwwLjUpLAorICAgICAgICAgICAgICAg
ICAgICAwLjMsCisgICAgICAgICAgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgICAgICAgICAg
MC4wLAorICAgICAgICAgICAgICAgICAgICAyLjAKKyAgICAgICAgICAgICAgICAgICAgKQorICAg
ICAgICAgICAgICAgICk7CisKKyAgICAgICAgdmFyIHNwaGVyZTEgPSBuZXcgRmxvZy5SYXlUcmFj
ZXIuU2hhcGUuU3BoZXJlKAorICAgICAgICAgICAgICAgIG5ldyBGbG9nLlJheVRyYWNlci5WZWN0
b3IoMSwgMC4yNSwgMSksCisgICAgICAgICAgICAgICAgMC41LAorICAgICAgICAgICAgICAgIG5l
dyBGbG9nLlJheVRyYWNlci5NYXRlcmlhbC5Tb2xpZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3
IEZsb2cuUmF5VHJhY2VyLkNvbG9yKDAuOSwwLjksMC45KSwKKyAgICAgICAgICAgICAgICAgICAg
MC4xLAorICAgICAgICAgICAgICAgICAgICAwLjAsCisgICAgICAgICAgICAgICAgICAgIDAuMCwK
KyAgICAgICAgICAgICAgICAgICAgMS41CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAg
ICAgICAgICApOworCisgICAgICAgIHZhciBwbGFuZSA9IG5ldyBGbG9nLlJheVRyYWNlci5TaGFw
ZS5QbGFuZSgKKyAgICAgICAgICAgICAgICBuZXcgRmxvZy5SYXlUcmFjZXIuVmVjdG9yKDAuMSwg
MC45LCAtMC41KS5ub3JtYWxpemUoKSwKKyAgICAgICAgICAgICAgICAxLjIsCisgICAgICAgICAg
ICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLk1hdGVyaWFsLkNoZXNzYm9hcmQoCisgICAgICAgICAg
ICAgICAgICAgIG5ldyBGbG9nLlJheVRyYWNlci5Db2xvcigxLDEsMSksCisgICAgICAgICAgICAg
ICAgICAgIG5ldyBGbG9nLlJheVRyYWNlci5Db2xvcigwLDAsMCksCisgICAgICAgICAgICAgICAg
ICAgIDAuMiwKKyAgICAgICAgICAgICAgICAgICAgMC4wLAorICAgICAgICAgICAgICAgICAgICAx
LjAsCisgICAgICAgICAgICAgICAgICAgIDAuNworICAgICAgICAgICAgICAgICAgICApCisgICAg
ICAgICAgICAgICAgKTsKKworICAgICAgICBzY2VuZS5zaGFwZXMucHVzaChwbGFuZSk7CisgICAg
ICAgIHNjZW5lLnNoYXBlcy5wdXNoKHNwaGVyZSk7CisgICAgICAgIHNjZW5lLnNoYXBlcy5wdXNo
KHNwaGVyZTEpOworCisgICAgICAgIHZhciBsaWdodCA9IG5ldyBGbG9nLlJheVRyYWNlci5MaWdo
dCgKKyAgICAgICAgICAgICAgICBuZXcgRmxvZy5SYXlUcmFjZXIuVmVjdG9yKDUsIDEwLCAtMSks
CisgICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLkNvbG9yKDAuOCwgMC44LCAwLjgp
CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICB2YXIgbGlnaHQxID0gbmV3IEZsb2cuUmF5
VHJhY2VyLkxpZ2h0KAorICAgICAgICAgICAgICAgIG5ldyBGbG9nLlJheVRyYWNlci5WZWN0b3Io
LTMsIDUsIC0xNSksCisgICAgICAgICAgICAgICAgbmV3IEZsb2cuUmF5VHJhY2VyLkNvbG9yKDAu
OCwgMC44LCAwLjgpLAorICAgICAgICAgICAgICAgIDEwMAorICAgICAgICAgICAgICAgICk7CisK
KyAgICAgICAgc2NlbmUubGlnaHRzLnB1c2gobGlnaHQpOworICAgICAgICBzY2VuZS5saWdodHMu
cHVzaChsaWdodDEpOworCisgICAgICAgIHZhciBpbWFnZVdpZHRoID0gMTAwOyAvLyAkRignaW1h
Z2VXaWR0aCcpOworICAgICAgICB2YXIgaW1hZ2VIZWlnaHQgPSAxMDA7IC8vICRGKCdpbWFnZUhl
aWdodCcpOworICAgICAgICB2YXIgcGl4ZWxTaXplID0gIjUsNSIuc3BsaXQoJywnKTsgLy8gICRG
KCdwaXhlbFNpemUnKS5zcGxpdCgnLCcpOworICAgICAgICB2YXIgcmVuZGVyRGlmZnVzZSA9IHRy
dWU7IC8vICRGKCdyZW5kZXJEaWZmdXNlJyk7CisgICAgICAgIHZhciByZW5kZXJTaGFkb3dzID0g
dHJ1ZTsgLy8gJEYoJ3JlbmRlclNoYWRvd3MnKTsKKyAgICAgICAgdmFyIHJlbmRlckhpZ2hsaWdo
dHMgPSB0cnVlOyAvLyAkRigncmVuZGVySGlnaGxpZ2h0cycpOworICAgICAgICB2YXIgcmVuZGVy
UmVmbGVjdGlvbnMgPSB0cnVlOyAvLyAkRigncmVuZGVyUmVmbGVjdGlvbnMnKTsKKyAgICAgICAg
dmFyIHJheURlcHRoID0gMjsvLyRGKCdyYXlEZXB0aCcpOworCisgICAgICAgIHZhciByYXl0cmFj
ZXIgPSBuZXcgRmxvZy5SYXlUcmFjZXIuRW5naW5lKAorICAgICAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICAgICAgY2FudmFzV2lkdGg6IGltYWdlV2lkdGgsCisgICAgICAgICAgICAgICAg
ICAgIGNhbnZhc0hlaWdodDogaW1hZ2VIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHBpeGVs
V2lkdGg6IHBpeGVsU2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxIZWlnaHQ6IHBp
eGVsU2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgInJlbmRlckRpZmZ1c2UiOiByZW5kZXJE
aWZmdXNlLAorICAgICAgICAgICAgICAgICAgICAicmVuZGVySGlnaGxpZ2h0cyI6IHJlbmRlckhp
Z2hsaWdodHMsCisgICAgICAgICAgICAgICAgICAgICJyZW5kZXJTaGFkb3dzIjogcmVuZGVyU2hh
ZG93cywKKyAgICAgICAgICAgICAgICAgICAgInJlbmRlclJlZmxlY3Rpb25zIjogcmVuZGVyUmVm
bGVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICJyYXlEZXB0aCI6IHJheURlcHRoCisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgcmF5dHJhY2VyLnJl
bmRlclNjZW5lKHNjZW5lLCBudWxsLCAwKTsKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7Cisg
ICAgfSBjYXRjaChlKSB7IH0KK30KKworZm9yICh2YXIgaSA9IDA7IGkgPCA2OyArK2kpCisgICAg
cmVuZGVyU2NlbmUoKTsK
</data>
<flag name="review"
          id="294936"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>