<?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>76285</bug_id>
          
          <creation_ts>2012-01-13 10:18:08 -0800</creation_ts>
          <short_desc>Refactor identifier resolution in BytecodeGenerator</short_desc>
          <delta_ts>2012-05-23 15:19:58 -0700</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>528+ (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="Andy Wingo">wingo</reporter>
          <assigned_to name="Andy Wingo">wingo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>oliver</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>535763</commentid>
    <comment_count>0</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-13 10:18:08 -0800</bug_when>
    <thetext>The patch to be attached will refactor identifier resolution, as suggested in bug 75708 comment 2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>535773</commentid>
    <comment_count>1</comment_count>
      <attachid>122450</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-13 10:33:13 -0800</bug_when>
    <thetext>Created attachment 122450
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>535774</commentid>
    <comment_count>2</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-13 10:34:38 -0800</bug_when>
    <thetext>The attached patch is fairly large, but it shouldn&apos;t change anything semantically.  It passes run-javascriptcore-tests with and without debug.

What do you think, Geoffrey?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>535812</commentid>
    <comment_count>3</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-01-13 11:03:57 -0800</bug_when>
    <thetext>General direction looks good to me. One note for now, before a full review: you&apos;ll want to run run-webkit-tests for correctness testing, and bencher for performance testing, as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536536</commentid>
    <comment_count>4</comment_count>
      <attachid>122631</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-16 07:19:12 -0800</bug_when>
    <thetext>Created attachment 122631
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536537</commentid>
    <comment_count>5</comment_count>
      <attachid>122631</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-16 07:21:26 -0800</bug_when>
    <thetext>Comment on attachment 122631
Patch

This updated patch fixes a bug that run-webkit-tests caught, in which resolve() could return an invalid &quot;type&quot;.

The test results seem OK:


27935 tests ran as expected, 4 didn&apos;t:              


Unexpected flakiness: text diff mismatch (3)
  editing/pasteboard/pasting-empty-html-falls-back-to-text.html = TEXT PASS
  fast/forms/basic-buttons.html = TEXT PASS
  media/video-poster-blocked-by-willsendrequest.html = TEXT PASS


Regressions: Unexpected image mismatch : (1)
  svg/foreignObject/repaint-rect-coordinates.html = IMAGE


I&apos;m assuming those problems have nothing to do with this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536548</commentid>
    <comment_count>6</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-16 07:38:00 -0800</bug_when>
    <thetext>Benchmark report for SunSpider, V8, and Kraken on \c.

VMs tested:
&quot;trunk&quot; at /home/wingo/src/WebKit/WebKitBuild/Release-trunk/Programs/jsc
&quot;refactor&quot; at /home/wingo/src/WebKit/WebKitBuild/Release/Programs/jsc

Collected 12 samples per benchmark/VM, with 4 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.

                                              trunk                  refactor                                    
SunSpider:
   3d-cube                                5.4096+-0.2538          5.1875+-0.2001         might be 1.0428x faster
   3d-morph                               7.6254+-0.3902    ?     7.6515+-0.2127       ?
   3d-raytrace                            8.1438+-0.6973          7.5884+-0.3058         might be 1.0732x faster
   access-binary-trees                    1.7641+-0.1350    ?     1.7677+-0.1208       ?
   access-fannkuch                       10.9894+-0.1674         10.8687+-0.1637         might be 1.0111x faster
   access-nbody                           3.0872+-0.2183    ?     3.1068+-0.4445       ?
   access-nsieve                          2.7876+-0.2191    ?     3.0385+-0.2362       ? might be 1.0900x slower
   bitops-3bit-bits-in-byte               1.5567+-0.2422          1.4197+-0.0994         might be 1.0966x faster
   bitops-bits-in-byte                    2.4268+-0.1596          2.3921+-0.1263         might be 1.0145x faster
   bitops-bitwise-and                     6.4219+-0.2260          6.4202+-0.3489       
   bitops-nsieve-bits                     5.7165+-0.4385          5.4790+-0.1839         might be 1.0433x faster
   controlflow-recursive                  2.0563+-0.1433    ?     2.2568+-0.3584       ? might be 1.0975x slower
   crypto-aes                             6.5085+-0.3982    ?     6.5795+-0.3358       ? might be 1.0109x slower
   crypto-md5                             2.9482+-0.6833          2.3396+-0.1538         might be 1.2601x faster
   crypto-sha1                            2.2550+-0.3891    ?     2.4811+-0.3457       ? might be 1.1002x slower
   date-format-tofte                      9.9916+-0.4122    ?    10.0765+-0.3077       ?
   date-format-xparb                      8.6556+-0.2092    ?     8.7391+-0.3008       ?
   math-cordic                            6.0482+-0.1594          6.0479+-0.1019       
   math-partial-sums                     13.7263+-0.2892    ?    13.9744+-0.3798       ? might be 1.0181x slower
   math-spectral-norm                     2.5806+-0.2523          2.5211+-0.1493         might be 1.0236x faster
   regexp-dna                             7.8237+-0.2436    ?     7.8756+-0.3009       ?
   string-base64                          5.1418+-0.3378    ?     5.3956+-0.2006       ? might be 1.0493x slower
   string-fasta                           7.1104+-0.2327    ?     7.3781+-0.3737       ? might be 1.0376x slower
   string-tagcloud                       10.8687+-0.4135         10.8683+-0.3032       
   string-unpack-code                    17.9470+-0.2351         17.8377+-0.1830       
   string-validate-input                  6.2236+-0.4266          6.1110+-0.4341         might be 1.0184x faster

   &lt;arithmetic&gt; *                         6.3775+-0.1268          6.3616+-0.0999         might be 1.0025x faster
   &lt;geometric&gt;                            5.1820+-0.1233          5.1687+-0.1096         might be 1.0026x faster
   &lt;harmonic&gt;                             4.1174+-0.1305          4.1101+-0.1179         might be 1.0018x faster

                                              trunk                  refactor                                    
V8:
   crypto                                66.6464+-0.5153    ?    67.0794+-0.8050       ?
   deltablue                            146.7019+-1.9685        146.0889+-0.8053       
   earley-boyer                          81.9158+-1.1611         81.6925+-0.8074       
   raytrace                              47.3773+-0.6577    ?    47.5151+-0.6876       ?
   regexp                                82.2627+-0.4184    ?    82.3784+-0.3202       ?
   richards                             113.0822+-0.9629        112.1683+-0.4324       
   splay                                 95.6887+-1.0875    ?    95.9071+-0.5643       ?

   &lt;arithmetic&gt;                          90.5250+-0.5047         90.4042+-0.2401         might be 1.0013x faster
   &lt;geometric&gt; *                         85.6268+-0.4159         85.6057+-0.2542         might be 1.0002x faster
   &lt;harmonic&gt;                            80.8258+-0.3834    ?    80.8900+-0.3075       ? might be 1.0008x slower

                                              trunk                  refactor                                    
Kraken:
   ai-astar                             446.0029+-2.1009        445.8995+-1.2161       
   audio-beat-detection                 174.9487+-0.4722    ?   177.2184+-1.9397       ? might be 1.0130x slower
   audio-dft                            344.4122+-3.4931    ?   350.0982+-4.0717       ? might be 1.0165x slower
   audio-fft                            114.6621+-0.7328    ?   115.1699+-0.9732       ?
   audio-oscillator                     231.6501+-4.1325        231.1128+-3.4095       
   imaging-darkroom                     308.3783+-7.1186    ?   308.7481+-6.3187       ?
   imaging-desaturate                   204.0813+-1.4658        203.4175+-0.6241       
   imaging-gaussian-blur                463.3229+-3.0306        463.0983+-2.4223       
   json-parse-financial                  51.5524+-0.6663         51.1047+-0.1872       
   json-stringify-tinderbox              64.8833+-0.6971         64.2974+-0.5993       
   stanford-crypto-aes                   92.3050+-0.6536         91.8039+-0.4008       
   stanford-crypto-ccm                   92.4999+-0.8191    ?    92.6817+-0.7803       ?
   stanford-crypto-pbkdf2               171.7288+-1.2792    ?   171.8636+-1.0281       ?
   stanford-crypto-sha256-iterative      71.7853+-0.1899         71.7697+-0.5174       

   &lt;arithmetic&gt; *                       202.3009+-1.0974    ?   202.7346+-0.8915       ? might be 1.0021x slower
   &lt;geometric&gt;                          160.1750+-0.7016    ?   160.2683+-0.6107       ? might be 1.0006x slower
   &lt;harmonic&gt;                           126.7766+-0.4536        126.5421+-0.4134         might be 1.0019x faster

                                              trunk                  refactor                                    
All benchmarks:
   &lt;arithmetic&gt;                          77.2703+-0.3683    ?    77.3727+-0.2905       ? might be 1.0013x slower
   &lt;geometric&gt;                           21.8632+-0.3058         21.8357+-0.2655         might be 1.0013x faster
   &lt;harmonic&gt;                             7.2173+-0.2221          7.2049+-0.2004         might be 1.0017x faster

                                              trunk                  refactor                                    
Geomean of preferred means:
   &lt;scaled-result&gt;                       47.9782+-0.3838         47.9703+-0.2887         might be 1.0002x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536550</commentid>
    <comment_count>7</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-16 07:38:52 -0800</bug_when>
    <thetext>In summary, performance-neutral, I think.  I&apos;m ready for a commit! ;-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537093</commentid>
    <comment_count>8</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-17 07:37:11 -0800</bug_when>
    <thetext>Kind ping to Geoffrey :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537774</commentid>
    <comment_count>9</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-18 04:37:58 -0800</bug_when>
    <thetext>Unfortunately, I think that my build in Release-trunk was dynamically linking to the build in Release, so my previous results are bogus.  For some reason bencher is not running at all for me on trunk, with clean source and build trees, so here are some (pretty poor) sunspider and v8 results for this patch:


TEST                   COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:           *1.076x as slow*  157.8ms +/- 0.9%   169.7ms +/- 1.1%     significant

=============================================================================

  3d:                  ??                 23.2ms +/- 3.0%    23.9ms +/- 4.8%     not conclusive: might be *1.028x as slow*
    cube:              ??                  7.1ms +/- 9.7%     7.5ms +/- 15.1%     not conclusive: might be *1.066x as slow*
    morph:             ??                  8.2ms +/- 2.7%     8.5ms +/- 3.7%     not conclusive: might be *1.035x as slow*
    raytrace:          -                   7.9ms +/- 5.6%     7.8ms +/- 4.7% 

  access:              *1.33x as slow*    14.0ms +/- 1.7%    18.7ms +/- 1.2%     significant
    binary-trees:      -                   2.2ms +/- 7.3%     2.1ms +/- 9.4% 
    fannkuch:          *1.81x as slow*     6.1ms +/- 2.3%    11.0ms +/- 1.9%     significant
    nbody:             1.082x as fast      3.2ms +/- 1.8%     2.9ms +/- 4.0%     significant
    nsieve:            ??                  2.6ms +/- 7.7%     2.6ms +/- 5.5%     not conclusive: might be *1.007x as slow*

  bitops:              *1.28x as slow*    11.8ms +/- 2.1%    15.0ms +/- 1.7%     significant
    3bit-bits-in-byte: ??                  1.3ms +/- 4.8%     1.4ms +/- 8.1%     not conclusive: might be *1.068x as slow*
    bits-in-byte:      ??                  2.3ms +/- 3.6%     2.3ms +/- 4.4%     not conclusive: might be *1.023x as slow*
    bitwise-and:       *2.04x as slow*     3.0ms +/- 1.5%     6.1ms +/- 2.0%     significant
    nsieve-bits:       -                   5.2ms +/- 3.5%     5.2ms +/- 2.9% 

  controlflow:         ??                  1.9ms +/- 3.5%     2.0ms +/- 5.0%     not conclusive: might be *1.054x as slow*
    recursive:         ??                  1.9ms +/- 3.5%     2.0ms +/- 5.0%     not conclusive: might be *1.054x as slow*

  crypto:              1.160x as fast     12.6ms +/- 3.4%    10.8ms +/- 4.6%     significant
    aes:               1.22x as fast       8.0ms +/- 5.0%     6.5ms +/- 4.4%     significant
    md5:               1.110x as fast      2.5ms +/- 4.5%     2.3ms +/- 9.4%     significant
    sha1:              -                   2.1ms +/- 2.8%     2.0ms +/- 8.9% 

  date:                *1.069x as slow*   19.6ms +/- 1.7%    20.9ms +/- 3.5%     significant
    format-tofte:      -                  10.5ms +/- 2.3%    10.5ms +/- 2.6% 
    format-xparb:      *1.153x as slow*    9.0ms +/- 2.6%    10.4ms +/- 5.9%     significant

  math:                *1.28x as slow*    17.3ms +/- 1.4%    22.1ms +/- 0.7%     significant
    cordic:            -                   6.3ms +/- 1.9%     6.3ms +/- 4.1% 
    partial-sums:      *1.57x as slow*     8.6ms +/- 1.8%    13.5ms +/- 1.4%     significant
    spectral-norm:     ??                  2.3ms +/- 3.9%     2.3ms +/- 2.9%     not conclusive: might be *1.006x as slow*

  regexp:              -                   8.4ms +/- 2.6%     8.3ms +/- 2.5% 
    dna:               -                   8.4ms +/- 2.6%     8.3ms +/- 2.5% 

  string:              1.025x as fast     49.1ms +/- 0.8%    47.9ms +/- 1.4%     significant
    base64:            *1.116x as slow*    4.5ms +/- 4.4%     5.0ms +/- 3.5%     significant
    fasta:             1.039x as fast      7.3ms +/- 3.0%     7.0ms +/- 2.2%     significant
    tagcloud:          1.075x as fast     12.0ms +/- 1.4%    11.2ms +/- 2.4%     significant
    unpack-code:       1.048x as fast     19.8ms +/- 1.8%    18.9ms +/- 2.2%     significant
    validate-input:    *1.056x as slow*    5.4ms +/- 2.0%     5.8ms +/- 2.5%     significant




TEST              COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:      *1.013x as slow*  700.8ms +/- 0.5%   710.0ms +/- 0.8%     significant

=============================================================================

  v8:             *1.013x as slow*  700.8ms +/- 0.5%   710.0ms +/- 0.8%     significant
    crypto:       1.016x as fast     72.7ms +/- 0.8%    71.5ms +/- 1.5%     significant
    deltablue:    *1.074x as slow*  153.7ms +/- 0.6%   165.0ms +/- 1.3%     significant
    earley-boyer: -                  82.8ms +/- 1.9%    82.3ms +/- 1.6% 
    raytrace:     -                  48.6ms +/- 1.3%    48.2ms +/- 1.2% 
    regexp:       ??                 87.4ms +/- 0.8%    87.9ms +/- 1.2%     not conclusive: might be *1.007x as slow*
    richards:     -                 113.5ms +/- 0.3%   113.1ms +/- 0.8% 
    splay:        -                 142.1ms +/- 1.0%   141.9ms +/- 0.8%</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537775</commentid>
    <comment_count>10</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-18 04:40:48 -0800</bug_when>
    <thetext>The slowdown on fannkuch makes me think that somehow we are not emitting the optimal code.  I&apos;ll look into it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537810</commentid>
    <comment_count>11</comment_count>
      <attachid>122912</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-18 06:10:11 -0800</bug_when>
    <thetext>Created attachment 122912
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537815</commentid>
    <comment_count>12</comment_count>
      <attachid>122912</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-18 06:13:44 -0800</bug_when>
    <thetext>Comment on attachment 122912
Patch

There were some cases in which resolve_global_dynamic was being emitted instead of resolve_global.

With this patch, performance is indeed neutral.

Sunspider results:


TEST                   COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:           -                 155.0ms +/- 0.8%   154.9ms +/- 0.7% 

=============================================================================

  3d:                  -                  24.5ms +/- 4.0%    23.9ms +/- 3.8% 
    cube:              -                   8.3ms +/- 11.9%     7.5ms +/- 12.4% 
    morph:             1.044x as fast      8.6ms +/- 3.0%     8.3ms +/- 2.0%     significant
    raytrace:          *1.076x as slow*    7.5ms +/- 3.7%     8.1ms +/- 2.7%     significant

  access:              ??                 13.4ms +/- 0.9%    13.7ms +/- 2.0%     not conclusive: might be *1.019x as slow*
    binary-trees:      *1.040x as slow*    1.9ms +/- 1.0%     2.0ms +/- 3.8%     significant
    fannkuch:          ??                  5.8ms +/- 1.8%     5.9ms +/- 2.1%     not conclusive: might be *1.008x as slow*
    nbody:             ??                  3.1ms +/- 0.7%     3.2ms +/- 5.3%     not conclusive: might be *1.041x as slow*
    nsieve:            ??                  2.6ms +/- 3.7%     2.6ms +/- 1.9%     not conclusive: might be *1.005x as slow*

  bitops:              -                  11.7ms +/- 1.2%    11.6ms +/- 1.1% 
    3bit-bits-in-byte: -                   1.3ms +/- 5.2%     1.3ms +/- 1.5% 
    bits-in-byte:      -                   2.2ms +/- 3.0%     2.2ms +/- 1.3% 
    bitwise-and:       ??                  3.0ms +/- 0.8%     3.0ms +/- 1.3%     not conclusive: might be *1.006x as slow*
    nsieve-bits:       -                   5.2ms +/- 1.6%     5.1ms +/- 2.3% 

  controlflow:         -                   1.9ms +/- 2.3%     1.9ms +/- 0.8% 
    recursive:         -                   1.9ms +/- 2.3%     1.9ms +/- 0.8% 

  crypto:              1.029x as fast     12.2ms +/- 2.8%    11.9ms +/- 0.5%     significant
    aes:               -                   7.6ms +/- 3.4%     7.4ms +/- 0.9% 
    md5:               -                   2.6ms +/- 7.5%     2.4ms +/- 1.6% 
    sha1:              -                   2.1ms +/- 5.3%     2.1ms +/- 2.2% 

  date:                ??                 19.6ms +/- 2.0%    19.9ms +/- 0.7%     not conclusive: might be *1.016x as slow*
    format-tofte:      ??                 10.5ms +/- 2.1%    10.5ms +/- 0.7%     not conclusive: might be *1.006x as slow*
    format-xparb:      ??                  9.1ms +/- 3.1%     9.4ms +/- 1.7%     not conclusive: might be *1.028x as slow*

  math:                -                  17.1ms +/- 1.4%    17.0ms +/- 1.2% 
    cordic:            ??                  6.2ms +/- 1.7%     6.3ms +/- 1.5%     not conclusive: might be *1.012x as slow*
    partial-sums:      -                   8.5ms +/- 1.5%     8.5ms +/- 1.3% 
    spectral-norm:     -                   2.3ms +/- 4.1%     2.3ms +/- 2.1% 

  regexp:              ??                  8.2ms +/- 1.7%     8.3ms +/- 2.2%     not conclusive: might be *1.008x as slow*
    dna:               ??                  8.2ms +/- 1.7%     8.3ms +/- 2.2%     not conclusive: might be *1.008x as slow*

  string:              *1.007x as slow*   46.4ms +/- 0.5%    46.7ms +/- 0.4%     significant
    base64:            1.023x as fast      4.4ms +/- 1.8%     4.3ms +/- 1.2%     significant
    fasta:             ??                  6.9ms +/- 1.2%     7.0ms +/- 1.4%     not conclusive: might be *1.013x as slow*
    tagcloud:          ??                 11.0ms +/- 1.2%    11.0ms +/- 1.2%     not conclusive: might be *1.002x as slow*
    unpack-code:       ??                 18.6ms +/- 0.7%    18.7ms +/- 0.6%     not conclusive: might be *1.002x as slow*
    validate-input:    *1.051x as slow*    5.4ms +/- 2.5%     5.7ms +/- 1.3%     significant


and v8-v6:


TEST              COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:      -                 692.3ms +/- 0.7%   692.7ms +/- 0.2% 

=============================================================================

  v8:             -                 692.3ms +/- 0.7%   692.7ms +/- 0.2% 
    crypto:       -                  72.2ms +/- 1.1%    72.1ms +/- 0.9% 
    deltablue:    ??                152.0ms +/- 1.2%   153.8ms +/- 0.6%     not conclusive: might be *1.011x as slow*
    earley-boyer: -                  80.5ms +/- 1.1%    80.3ms +/- 0.6% 
    raytrace:     1.018x as fast     48.1ms +/- 1.2%    47.2ms +/- 1.0%     significant
    regexp:       -                  86.5ms +/- 1.1%    86.4ms +/- 0.7% 
    richards:     -                 112.7ms +/- 1.0%   112.6ms +/- 0.4% 
    splay:        -                 140.4ms +/- 1.2%   140.3ms +/- 0.3%</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539237</commentid>
    <comment_count>13</comment_count>
      <attachid>122912</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-01-19 18:53:49 -0800</bug_when>
    <thetext>Comment on attachment 122912
Patch

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

&gt; Source/JavaScriptCore/ChangeLog:1
&gt; +2012-01-13  Andy Wingo  &lt;wingo@igalia.com&gt;

Nice ChangeLog -- I like how you commented about individual changes, and the &quot;why&quot; of them.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:507
&gt; +RegisterID* BytecodeGenerator::registerFor(const ResolveResult&amp; location)

When you have a trivial declaration like this function argument, I usually prefer the naming style &quot;const ClassName&amp; className&quot;. In this case: &quot;const ResolveResult&amp; resolveResult&quot;. That way, the one thing doesn&apos;t have two names. I think that would be better here.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:512
&gt; +    return createLazyRegisterIfNecessary(&amp;registerFor(location.index));

This behavior (creating a lazy register if necessary) should move into BytecodeGenerator::resolve(), since it already has the responsibility of creating the arguments register lazily. It&apos;s nice to have all lazy register allocation in one place. (Eventually, we might even give resolve() the responsibility for emitting opcodes like op_resolve and op_get_scoped_var.)

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1137
&gt; +    ResolveResult ret = { 0, 0, 0, 0 };

All zeroes should be the default constructor for ResolveResult, so it doesn&apos;t have to be specified explicitly.

Notice how here you called the ResolveResult &quot;ret&quot;, while in other places you called it &quot;location&quot;. It would be more uniform to standardize on calling it &quot;resolveResult&quot; everywhere.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1141
&gt; +        ret.type = ResolveResult::ImmutableRegister;
&gt; +        ret.index = m_thisRegister.index();

This data should be private in ResolveResult, with setter functions for the different kinds of resolves. That way, a programmer can&apos;t make the error of setting a type that is internally inconsistent with the other information in the ResolveResult.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1153
&gt; +            if (entry.isReadOnly())
&gt; +                ret.type |= ResolveResult::ImmutableFlag;

This would read better if the ResolveResult flag were named &quot;ReadOnlyFlag&quot;, to match the &quot;ReadOnly&quot; terminology in SymbolTable.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1429
&gt; +RegisterID* BytecodeGenerator::emitGetStaticVar(RegisterID* dst, const ResolveResult&amp; location)

I like how this function turned out.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1438
&gt; +        if (dst == ignoredResult())
&gt; +            return 0;

This would read better, and be slightly more efficient, if you did the early return check before the call to registerFor().

&gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:151
&gt; +    ResolveResult location = generator.resolve(m_ident);
&gt; +    if (RegisterID* local = generator.registerFor(location)) {

I think you could simplify even further by merging ResolveResult and regsiterFor(), like so:

if (RegisterID* local = resolveResult.local()) { // NULL if not a local variable
    // Code for local variable goes here
}

In a way, the existing BytecodeGenerator::registerFor() is a weak primordial version of the behavior we want out of BytecodeGenerator::resolve() + ResolveResult.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539238</commentid>
    <comment_count>14</comment_count>
      <attachid>122912</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-01-19 18:53:50 -0800</bug_when>
    <thetext>Comment on attachment 122912
Patch

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

&gt; Source/JavaScriptCore/ChangeLog:1
&gt; +2012-01-13  Andy Wingo  &lt;wingo@igalia.com&gt;

Nice ChangeLog -- I like how you commented about individual changes, and the &quot;why&quot; of them.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:507
&gt; +RegisterID* BytecodeGenerator::registerFor(const ResolveResult&amp; location)

When you have a trivial declaration like this function argument, I usually prefer the naming style &quot;const ClassName&amp; className&quot;. In this case: &quot;const ResolveResult&amp; resolveResult&quot;. That way, the one thing doesn&apos;t have two names. I think that would be better here.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:512
&gt; +    return createLazyRegisterIfNecessary(&amp;registerFor(location.index));

This behavior (creating a lazy register if necessary) should move into BytecodeGenerator::resolve(), since it already has the responsibility of creating the arguments register lazily. It&apos;s nice to have all lazy register allocation in one place. (Eventually, we might even give resolve() the responsibility for emitting opcodes like op_resolve and op_get_scoped_var.)

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1137
&gt; +    ResolveResult ret = { 0, 0, 0, 0 };

All zeroes should be the default constructor for ResolveResult, so it doesn&apos;t have to be specified explicitly.

Notice how here you called the ResolveResult &quot;ret&quot;, while in other places you called it &quot;location&quot;. It would be more uniform to standardize on calling it &quot;resolveResult&quot; everywhere.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1141
&gt; +        ret.type = ResolveResult::ImmutableRegister;
&gt; +        ret.index = m_thisRegister.index();

This data should be private in ResolveResult, with setter functions for the different kinds of resolves. That way, a programmer can&apos;t make the error of setting a type that is internally inconsistent with the other information in the ResolveResult.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1153
&gt; +            if (entry.isReadOnly())
&gt; +                ret.type |= ResolveResult::ImmutableFlag;

This would read better if the ResolveResult flag were named &quot;ReadOnlyFlag&quot;, to match the &quot;ReadOnly&quot; terminology in SymbolTable.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1429
&gt; +RegisterID* BytecodeGenerator::emitGetStaticVar(RegisterID* dst, const ResolveResult&amp; location)

I like how this function turned out.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1438
&gt; +        if (dst == ignoredResult())
&gt; +            return 0;

This would read better, and be slightly more efficient, if you did the early return check before the call to registerFor().

&gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:151
&gt; +    ResolveResult location = generator.resolve(m_ident);
&gt; +    if (RegisterID* local = generator.registerFor(location)) {

I think you could simplify even further by merging ResolveResult and regsiterFor(), like so:

if (RegisterID* local = resolveResult.local()) { // NULL if not a local variable
    // Code for local variable goes here
}

In a way, the existing BytecodeGenerator::registerFor() is a weak primordial version of the behavior we want out of BytecodeGenerator::resolve() + ResolveResult.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539239</commentid>
    <comment_count>15</comment_count>
      <attachid>122912</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-01-19 18:55:59 -0800</bug_when>
    <thetext>Comment on attachment 122912
Patch

I like how this patch turned out, but I think it will be even better with a round of cleanup before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539463</commentid>
    <comment_count>16</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-20 06:42:13 -0800</bug_when>
    <thetext>Thanks for the review; I&apos;ll post an updated patch on Monday.  Have a lovely weekend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>540650</commentid>
    <comment_count>17</comment_count>
      <attachid>123574</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-23 10:34:30 -0800</bug_when>
    <thetext>Created attachment 123574
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>540654</commentid>
    <comment_count>18</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-23 10:42:54 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; 
&gt; &gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:512
&gt; &gt; +    return createLazyRegisterIfNecessary(&amp;registerFor(location.index));
&gt; 
&gt; This behavior (creating a lazy register if necessary) should move into BytecodeGenerator::resolve(), since it already has the responsibility of creating the arguments register lazily. It&apos;s nice to have all lazy register allocation in one place. (Eventually, we might even give resolve() the responsibility for emitting opcodes like op_resolve and op_get_scoped_var.)

I didn&apos;t do this in my new patch, because I misunderstood what you were saying.  I&apos;ll fix this tomorrow morning if this patch doesn&apos;t go in tonight.

&gt; &gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1137
&gt; &gt; +    ResolveResult ret = { 0, 0, 0, 0 };
&gt; 
&gt; All zeroes should be the default constructor for ResolveResult, so it doesn&apos;t have to be specified explicitly.

I wasn&apos;t sure what the right style here was; please have a look.  (I&apos;m an old C and Scheme hand, and my C++ could use some improvement.)

&gt; &gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1141
&gt; &gt; +        ret.type = ResolveResult::ImmutableRegister;
&gt; &gt; +        ret.index = m_thisRegister.index();
&gt; 
&gt; This data should be private in ResolveResult, with setter functions for the different kinds of resolves. That way, a programmer can&apos;t make the error of setting a type that is internally inconsistent with the other information in the ResolveResult.

It should only be this one function initializing these fields, though I grant that it would be good to make that assumption manifest; a case for a friend class?  Or should I add the panoply of getters and setters?  (Sorry for the naive questions, I still have bad C++ style instincts :)

&gt; &gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:151
&gt; &gt; +    ResolveResult location = generator.resolve(m_ident);
&gt; &gt; +    if (RegisterID* local = generator.registerFor(location)) {
&gt; 
&gt; I think you could simplify even further by merging ResolveResult and regsiterFor(), like so:
&gt; 
&gt; if (RegisterID* local = resolveResult.local()) { // NULL if not a local variable
&gt;     // Code for local variable goes here
&gt; }
&gt; 
&gt; In a way, the existing BytecodeGenerator::registerFor() is a weak primordial version of the behavior we want out of BytecodeGenerator::resolve() + ResolveResult.

You want resolveResult() to hold on to the generator, or have it have a RegisterID* pointer in it?  I&apos;m fine with either; the current code reflects my lack of understanding of the memory ownership of registerid values.

Thanks for the comments,

Andy</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>540997</commentid>
    <comment_count>19</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-01-23 17:08:31 -0800</bug_when>
    <thetext>&gt; &gt; This behavior (creating a lazy register if necessary) should move into BytecodeGenerator::resolve()
&gt; 
&gt; I didn&apos;t do this in my new patch, because I misunderstood what you were saying.  I&apos;ll fix this tomorrow morning if this patch doesn&apos;t go in tonight.

Okiedokie.

&gt; &gt; &gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1137
&gt; &gt; &gt; +    ResolveResult ret = { 0, 0, 0, 0 };
&gt; &gt; 
&gt; &gt; All zeroes should be the default constructor for ResolveResult, so it doesn&apos;t have to be specified explicitly.
&gt; 
&gt; I wasn&apos;t sure what the right style here was; please have a look.  (I&apos;m an old C and Scheme hand, and my C++ could use some improvement.)

+    ResolveResult resolveResult = ResolveResult();

You can write this more succinctly as:

ResolveResult resolveResult;

You need to add a constructor declaration and definition to the ResolveResult class in order for this to do the right thing. Otherwise, you have uninitialized memory. Here&apos;s an example definition:

inline ResolveResult::ResolveResult()
    : m_type(0)
    , m_index(0)
    , m_depth(0)
    , m_globalObject(0)
{
}

&gt; &gt; &gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1141
&gt; &gt; &gt; +        ret.type = ResolveResult::ImmutableRegister;
&gt; &gt; &gt; +        ret.index = m_thisRegister.index();
&gt; &gt; 
&gt; &gt; This data should be private in ResolveResult, with setter functions for the different kinds of resolves. That way, a programmer can&apos;t make the error of setting a type that is internally inconsistent with the other information in the ResolveResult.
&gt; 
&gt; It should only be this one function initializing these fields, though I grant that it would be good to make that assumption manifest; a case for a friend class?  Or should I add the panoply of getters and setters?  (Sorry for the naive questions, I still have bad C++ style instincts :)

I would go either with the panoply of (public) getters and setters with (private) data, or with dedicated &quot;create&quot; functions and private data, making ResolveResult a class instead of a struct. These will help make explicit invariants like &quot;If and only if you have a global resolve, you must set type to ResolveResult::Global and globalObject to a JSGlobalObject*&quot;.

Not better:

resolveResult.setType(ResolveResult::Lexical);
resolveResult.setDepth(depth);
resolveResult.setIndex(entry.getIndex());
return resolveResult;

Better:

return ResolveResult::lexicalResolve(depth, entry.getIndex()); // Now, the client always knows what data to provide, and doesn&apos;t need to know how that data will be encoded.

&gt; &gt; &gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:151
&gt; &gt; &gt; +    ResolveResult location = generator.resolve(m_ident);
&gt; &gt; &gt; +    if (RegisterID* local = generator.registerFor(location)) {
&gt; &gt; 
&gt; &gt; I think you could simplify even further by merging ResolveResult and regsiterFor(), like so:
&gt; &gt; 
&gt; &gt; if (RegisterID* local = resolveResult.local()) { // NULL if not a local variable
&gt; &gt;     // Code for local variable goes here
&gt; &gt; }
&gt; &gt; 
&gt; &gt; In a way, the existing BytecodeGenerator::registerFor() is a weak primordial version of the behavior we want out of BytecodeGenerator::resolve() + ResolveResult.
&gt; 
&gt; You want resolveResult() to hold on to the generator, or have it have a RegisterID* pointer in it?

RegisterID*.

Temporary RegisterIDs require reference counting. RegisterIDs for local variables are &quot;immortal&quot;, and you can refer to them with raw pointers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>541351</commentid>
    <comment_count>20</comment_count>
      <attachid>123742</attachid>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-24 08:38:14 -0800</bug_when>
    <thetext>Created attachment 123742
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>541354</commentid>
    <comment_count>21</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-24 08:40:11 -0800</bug_when>
    <thetext>I believe the newly attached patch has addressed all of your comments, Geoffrey.  Thanks again for the review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>541379</commentid>
    <comment_count>22</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-24 09:17:10 -0800</bug_when>
    <thetext>I don&apos;t know how to interpret this, but here&apos;s the results of run-webkit-tests --gtk:


Unexpected flakiness: text diff mismatch (6)
  editing/pasteboard/pasting-empty-html-falls-back-to-text.html = TEXT PASS
  fast/js/navigator-language.html = TEXT PASS
  http/tests/appcache/abort-cache-ondownloading-resource-404.html = TEXT PASS
  media/video-poster-blocked-by-willsendrequest.html = TEXT PASS
  sputnik/Conformance/15_Native_Objects/15.4_Array/15.4.4/15.4.4.11_Array_prototype_sort/S15.4.4.11_A4_T2.html = TEXT PASS
  sputnik/Conformance/15_Native_Objects/15.4_Array/15.4.4/15.4.4.11_Array_prototype_sort/S15.4.4.11_A4_T3.html = TEXT PASS


Regressions: Unexpected text diff mismatch : (18)
  css3/calc/getComputedStyle-margin-percentage.html = TEXT
  editing/execCommand/insertImage.html = TEXT
  editing/pasteboard/drag-image-to-contenteditable-in-iframe.html = TEXT
  fast/block/float/015.html = TEXT
  fast/borders/rtl-border-05.html = TEXT
  fast/dom/34176.html = TEXT
  fast/dom/inner-text.html = TEXT
  fast/encoding/utf-16-big-endian.html = TEXT
  fast/encoding/utf-16-little-endian.html = TEXT
  fast/events/clear-drag-state.html = TEXT
  fast/events/clear-edit-drag-state.html = TEXT
  fast/hidpi/broken-image-icon-hidpi.html = TEXT
  fast/js/array-functions-non-arrays.html = TEXT
  http/tests/media/video-buffering-repaints-controls.html = TEXT
  sputnik/Conformance/15_Native_Objects/15.4_Array/15.4.4/15.4.4.11_Array_prototype_sort/S15.4.4.11_A3_T1.html = TEXT
  tables/mozilla/bugs/bug2962.html = TEXT
  tables/mozilla/bugs/bug56201.html = TEXT
  tables/mozilla/collapsing_borders/bug41262-3.html = TEXT


Current as of r105717.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542925</commentid>
    <comment_count>23</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-26 00:43:14 -0800</bug_when>
    <thetext>A friendly ping to Geoffrey for review.

Cheers,

Andy</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544959</commentid>
    <comment_count>24</comment_count>
    <who name="Andy Wingo">wingo</who>
    <bug_when>2012-01-30 02:27:02 -0800</bug_when>
    <thetext>Geoffrey, would you mind reviewing this patch?  Thanks!

Andy</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547172</commentid>
    <comment_count>25</comment_count>
      <attachid>123742</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-02-01 10:23:18 -0800</bug_when>
    <thetext>Comment on attachment 123742
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547240</commentid>
    <comment_count>26</comment_count>
      <attachid>123742</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-01 11:37:14 -0800</bug_when>
    <thetext>Comment on attachment 123742
Patch

Clearing flags on attachment: 123742

Committed r106478: &lt;http://trac.webkit.org/changeset/106478&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547241</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-01 11:37:21 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>632102</commentid>
    <comment_count>28</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-05-23 15:19:58 -0700</bug_when>
    <thetext>This has caused bug 87158.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122450</attachid>
            <date>2012-01-13 10:33:13 -0800</date>
            <delta_ts>2012-01-16 07:19:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76285-20120113193311.patch</filename>
            <type>text/plain</type>
            <size>53874</size>
            <attacher name="Andy Wingo">wingo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA0OTQyCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBh
ODhiOTM4ODU0MmE5ODE2MmFjNGY1YmM0YWUwY2Q2MmVmNWJmMWEyLi45NDkzMTI1NTNlYjMwMGRj
YzNkMDE3MDNiMmNjMjg0YjViYmM3YWIxIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0MyBAQAorMjAxMi0wMS0xMyAgQW5keSBXaW5nbyAgPHdpbmdvQGlnYWxpYS5jb20+CisK
KyAgICAgICAgUmVmYWN0b3IgaWRlbnRpZmllciByZXNvbHV0aW9uIGluIEJ5dGVjb2RlR2VuZXJh
dG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OlJlc29sdmVSZXN1
bHQpOiBOZXcgc3RydWN0dXJlLCB0byBkZXNjcmliZSB0aGUgc3RvcmFnZQorICAgICAgICBsb2Nh
dGlvbiBjb3JyZXNwb25kaW5nIHRvIGFuIGlkZW50aWZpZXIgaW4gYSBwcm9ncmFtLgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNpbmcKKyAgICAg
ICAgZmluZFNjb3BlZFByb3BlcnR5LgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6
cmVzb2x2ZUNvbnN0RGVjbCk6IE5ldyBmdW5jdGlvbiwKKyAgICAgICAgZW5jYXBzdWxhdGluZyB3
aGF0IENvbnN0RGVjbE5vZGU6OmVtaXRCeXRlY29kZSB1c2VkIHRvIGRvLgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRpY1Zhcik6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U3RhdGljVmFyKTogTmV3IGZ1bmN0aW9ucywKKyAgICAg
ICAgY29ycmVzcG9uZGluZyB0byB0aGUgb2xkIGVtaXRHZXRTY29wZWRWYXIgYW5kIGVtaXRQdXRT
Y29wZWRWYXIuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcik6
CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZSk6CisgICAgICAg
IChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZUJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KToKKyAgICAgICAgKEpT
Qzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyk6IENoYW5nZSB0byBhY2Nl
cHQgYQorICAgICAgICAibG9jYXRpb24iIGFyZ3VtZW50LiAgVGhpcyBpcyBtb3JlIGNsZWFyLCBh
bmQgcmVkdWNlcyB0aGUgYW1vdW50CisgICAgICAgIG9mIGRvdWJsZSBhbmFseXNpcyBoYXBwZW5p
bmcgYXQgY29tcGlsZS10aW1lLgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4u
Y3BwOgorICAgICAgICAoSlNDOjpSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAg
KEpTQzo6RXZhbEZ1bmN0aW9uQ2FsbE5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6
OkZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpQ
b3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkRlbGV0ZVJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpUeXBlT2ZSZXNvbHZlTm9k
ZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6UHJlZml4UmVzb2x2ZU5vZGU6OmVtaXRC
eXRlY29kZSk6CisgICAgICAgIChKU0M6OlJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKToKKyAgICAgICAgKEpTQzo6QXNzaWduUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6Cisg
ICAgICAgIChKU0M6OkNvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKToKKyAgICAgICAgKEpT
Qzo6Rm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUpOiBSZWZhY3RvciB0byB1c2UgdGhlIG5ldworICAg
ICAgICBSZXNvbHZlUmVzdWx0IHN0cnVjdHVyZS4KKwogMjAxMi0wMS0xMyAgWW91bmdUYWVjayBT
b25nICA8eW91bmd0YWVjay5zb25nQHNhbXN1bmcuY29tPgogCiAgICAgICAgIFtFRkxdIEFkZCBP
d25QdHIgc3BlY2lhbGl6YXRpb24gZm9yIEVpbmFfTW9kdWxlLgpkaWZmIC0tZ2l0IGEvU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAppbmRl
eCBiZmIxNjE4YTYyMDI3YTMzNzMxYzAyOGVkMjEzZGVkYTIzMmY4YWExLi5lMDIyZDhiZjZhNDI3
OGFlMmIzYjZhNzMxYmZmYzI4ODI2ZmU4YzA2IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAorKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcApAQCAtMSw2ICsx
LDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA4IENhbWVyb24gWndhcmljaCA8Y3d6
d2FyaWNoQHV3YXRlcmxvby5jYT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBJZ2FsaWEsIFMuTC4K
ICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNTAzLDQwICs1MDQsMTIgQEAgdm9p
ZCBCeXRlY29kZUdlbmVyYXRvcjo6YWRkUGFyYW1ldGVyKGNvbnN0IElkZW50aWZpZXImIGlkZW50
LCBpbnQgcGFyYW1ldGVySW5kZXgKICAgICBtX2NvZGVCbG9jay0+YWRkUGFyYW1ldGVyKCk7CiB9
CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcihjb25zdCBJZGVu
dGlmaWVyJiBpZGVudCkKK1JlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZv
cihjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbikKIHsKLSAgICBpZiAoaWRlbnQgPT0gcHJv
cGVydHlOYW1lcygpLnRoaXNJZGVudGlmaWVyKQotICAgICAgICByZXR1cm4gJm1fdGhpc1JlZ2lz
dGVyOwotICAgICAgICAKLSAgICBpZiAobV9jb2RlVHlwZSA9PSBHbG9iYWxDb2RlKQotICAgICAg
ICByZXR1cm4gMDsKLQotICAgIGlmICghc2hvdWxkT3B0aW1pemVMb2NhbHMoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gc3ltYm9sVGFibGUoKS5n
ZXQoaWRlbnQuaW1wbCgpKTsKLSAgICBpZiAoZW50cnkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgaWYgKGlkZW50ID09IHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMpCi0gICAg
ICAgIGNyZWF0ZUFyZ3VtZW50c0lmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gY3JlYXRlTGF6
eVJlZ2lzdGVySWZOZWNlc3NhcnkoJnJlZ2lzdGVyRm9yKGVudHJ5LmdldEluZGV4KCkpKTsKLX0K
LQotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmNvbnN0UmVnaXN0ZXJGb3IoY29uc3Qg
SWRlbnRpZmllciYgaWRlbnQpCi17Ci0gICAgaWYgKG1fY29kZVR5cGUgPT0gRXZhbENvZGUpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG1fY29kZVR5cGUgPT0gR2xvYmFsQ29kZSkKKyAg
ICBpZiAoIWxvY2F0aW9uLmlzUmVnaXN0ZXIoKSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBT
eW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gc3ltYm9sVGFibGUoKS5nZXQoaWRlbnQuaW1wbCgpKTsK
LSAgICBpZiAoZW50cnkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJu
IGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRl
eCgpKSk7CisgICAgcmV0dXJuIGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3Rl
ckZvcihsb2NhdGlvbi5pbmRleCkpOwogfQogCiBib29sIEJ5dGVjb2RlR2VuZXJhdG9yOjp3aWxs
UmVzb2x2ZVRvQXJndW1lbnRzKGNvbnN0IElkZW50aWZpZXImIGlkZW50KQpAQCAtMTE1OSw1OSAr
MTEzMiwxMzYgQEAgUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb2FkKFJlZ2lz
dGVySUQqIGRzdCwgSlNWYWx1ZSB2KQogICAgIHJldHVybiBjb25zdGFudElEOwogfQogCi1ib29s
IEJ5dGVjb2RlR2VuZXJhdG9yOjpmaW5kU2NvcGVkUHJvcGVydHkoY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHksIGludCYgaW5kZXgsIHNpemVfdCYgc3RhY2tEZXB0aCwgYm9vbCBmb3JXcml0aW5n
LCBib29sJiByZXF1aXJlc0R5bmFtaWNDaGVja3MsIEpTT2JqZWN0KiYgZ2xvYmFsT2JqZWN0KQor
UmVzb2x2ZVJlc3VsdCBCeXRlY29kZUdlbmVyYXRvcjo6cmVzb2x2ZShjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eSkKIHsKKyAgICBSZXNvbHZlUmVzdWx0IHJldCA9IHsgMCwgMCwgMCwgMCB9Owor
ICAgIAorICAgIGlmIChwcm9wZXJ0eSA9PSBwcm9wZXJ0eU5hbWVzKCkudGhpc0lkZW50aWZpZXIp
IHsKKyAgICAgICAgcmV0LnR5cGUgPSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdpc3RlcjsK
KyAgICAgICAgcmV0LmluZGV4ID0gbV90aGlzUmVnaXN0ZXIuaW5kZXgoKTsKKyAgICAgICAgcmV0
dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJl
IGFsbG9jYXRlZCBpbiBhIHJlZ2lzdGVyLgorICAgIGlmIChtX2NvZGVUeXBlICE9IEdsb2JhbENv
ZGUgJiYgc2hvdWxkT3B0aW1pemVMb2NhbHMoKSkgeworICAgICAgICBTeW1ib2xUYWJsZUVudHJ5
IGVudHJ5ID0gc3ltYm9sVGFibGUoKS5nZXQocHJvcGVydHkuaW1wbCgpKTsKKyAgICAgICAgaWYg
KCFlbnRyeS5pc051bGwoKSkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IHByb3BlcnR5
TmFtZXMoKS5hcmd1bWVudHMpCisgICAgICAgICAgICAgICAgY3JlYXRlQXJndW1lbnRzSWZOZWNl
c3NhcnkoKTsKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI7
CisgICAgICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQorICAgICAgICAgICAgICAgIHJl
dC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OkltbXV0YWJsZUZsYWc7CisgICAgICAgICAgICByZXQu
aW5kZXggPSBlbnRyeS5nZXRJbmRleCgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAg
ICAgfQorICAgIH0KKwogICAgIC8vIENhc2VzIHdoZXJlIHdlIGNhbm5vdCBzdGF0aWNhbGx5IG9w
dGltaXplIHRoZSBsb29rdXAuCiAgICAgaWYgKHByb3BlcnR5ID09IHByb3BlcnR5TmFtZXMoKS5h
cmd1bWVudHMgfHwgIWNhbk9wdGltaXplTm9uTG9jYWxzKCkpIHsKLSAgICAgICAgc3RhY2tEZXB0
aCA9IDA7Ci0gICAgICAgIGluZGV4ID0gbWlzc2luZ1N5bWJvbE1hcmtlcigpOwotCisgICAgICAg
IHJldC5pbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKKyAgICAgICAgcmV0LmRlcHRoID0g
MDsKICAgICAgICAgaWYgKHNob3VsZE9wdGltaXplTG9jYWxzKCkgJiYgbV9jb2RlVHlwZSA9PSBH
bG9iYWxDb2RlKSB7CiAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IG1fc2Nv
cGVDaGFpbi0+YmVnaW4oKTsKLSAgICAgICAgICAgIGdsb2JhbE9iamVjdCA9IGl0ZXItPmdldCgp
OworICAgICAgICAgICAgcmV0LnR5cGUgPSBSZXNvbHZlUmVzdWx0OjpHbG9iYWw7CisgICAgICAg
ICAgICByZXQuZ2xvYmFsT2JqZWN0ID0gaXRlci0+Z2V0KCk7CiAgICAgICAgICAgICBBU1NFUlQo
KCsraXRlcikgPT0gbV9zY29wZUNoYWluLT5lbmQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CiAgICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHNp
emVfdCBkZXB0aCA9IDA7Ci0gICAgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7CiAgICAg
U2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBtX3Njb3BlQ2hhaW4tPmJlZ2luKCk7CiAgICAgU2Nv
cGVDaGFpbkl0ZXJhdG9yIGVuZCA9IG1fc2NvcGVDaGFpbi0+ZW5kKCk7Ci0gICAgZm9yICg7IGl0
ZXIgIT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKKyAgICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsr
aXRlciwgKytyZXQuZGVwdGgpIHsKICAgICAgICAgSlNPYmplY3QqIGN1cnJlbnRTY29wZSA9IGl0
ZXItPmdldCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJsZU9iamVjdCgp
KQorICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJsZU9iamVjdCgpKSB7CisgICAg
ICAgICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CiAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfSAgICAgICAgCiAgICAgICAgIEpTVmFyaWFibGVPYmplY3QqIGN1cnJl
bnRWYXJpYWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFibGVPYmplY3QqPihjdXJyZW50
U2NvcGUpOwogICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gY3VycmVudFZhcmlhYmxl
T2JqZWN0LT5zeW1ib2xUYWJsZSgpLmdldChwcm9wZXJ0eS5pbXBsKCkpOwogCiAgICAgICAgIC8v
IEZvdW5kIHRoZSBwcm9wZXJ0eQogICAgICAgICBpZiAoIWVudHJ5LmlzTnVsbCgpKSB7Ci0gICAg
ICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpICYmIGZvcldyaXRpbmcpIHsKLSAgICAgICAg
ICAgICAgICBzdGFja0RlcHRoID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1pc3NpbmdT
eW1ib2xNYXJrZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoKytpdGVyID09IGVuZCkKLSAgICAg
ICAgICAgICAgICAgICAgZ2xvYmFsT2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OwotICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICgrK2l0ZXIgPT0gZW5k
KSB7CisgICAgICAgICAgICAgICAgcmV0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6SW5kZXhlZEds
b2JhbDsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQorICAgICAgICAg
ICAgICAgICAgICByZXQudHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVGbGFnOworICAg
ICAgICAgICAgICAgIHJldC5nbG9iYWxPYmplY3QgPSBjdXJyZW50U2NvcGU7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6Okxl
eGljYWw7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkKKyAgICAgICAg
ICAgICAgICAgICAgcmV0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlRmxhZzsKKyAg
ICAgICAgICAgICAgICByZXQuZGVwdGggKz0gbV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hh
aW4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YWNrRGVwdGggPSBkZXB0aCArIG1f
Y29kZUJsb2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7Ci0gICAgICAgICAgICBpbmRleCA9IGVu
dHJ5LmdldEluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoKytpdGVyID09IGVuZCkKLSAgICAgICAg
ICAgICAgICBnbG9iYWxPYmplY3QgPSBjdXJyZW50VmFyaWFibGVPYmplY3Q7Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldC5pbmRleCA9IGVudHJ5LmdldEluZGV4KCk7
CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIGJvb2wgc2NvcGVS
ZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICAgICAgaWYgKGN1cnJlbnRWYXJpYWJs
ZU9iamVjdC0+aXNEeW5hbWljU2NvcGUoc2NvcGVSZXF1aXJlc0R5bmFtaWNDaGVja3MpKQorICAg
ICAgICBpZiAoY3VycmVudFZhcmlhYmxlT2JqZWN0LT5pc0R5bmFtaWNTY29wZShzY29wZVJlcXVp
cmVzRHluYW1pY0NoZWNrcykpIHsKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3Vs
dDo6RHluYW1pYzsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICByZXF1aXJlc0R5bmFtaWND
aGVja3MgfD0gc2NvcGVSZXF1aXJlc0R5bmFtaWNDaGVja3M7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHNjb3BlUmVxdWlyZXNEeW5hbWljQ2hlY2tzKQorICAgICAgICAgICAgcmV0LnR5cGUgPSBS
ZXNvbHZlUmVzdWx0OjpEeW5hbWljOwogICAgIH0KKwogICAgIC8vIENhbid0IGxvY2F0ZSB0aGUg
cHJvcGVydHkgYnV0IHdlJ3JlIGFibGUgdG8gYXZvaWQgYSBmZXcgbG9va3Vwcy4KLSAgICBzdGFj
a0RlcHRoID0gZGVwdGggKyBtX2NvZGVCbG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpOwotICAg
IGluZGV4ID0gbWlzc2luZ1N5bWJvbE1hcmtlcigpOwogICAgIEpTT2JqZWN0KiBzY29wZSA9IGl0
ZXItPmdldCgpOwotICAgIGlmICgrK2l0ZXIgPT0gZW5kKQotICAgICAgICBnbG9iYWxPYmplY3Qg
PSBzY29wZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXQuZGVwdGggKz0gbV9jb2RlQmxvY2st
Pm5lZWRzRnVsbFNjb3BlQ2hhaW4oKTsKKyAgICBpZiAoKytpdGVyID09IGVuZCkgeworICAgICAg
ICByZXQudHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpHbG9iYWw7CisgICAgICAgIHJldC5nbG9iYWxP
YmplY3QgPSBzY29wZTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNTRVJUKHJldC50eXBlID09IFJl
c29sdmVSZXN1bHQ6OkR5bmFtaWMpOworICAgIHJldC5pbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJr
ZXIoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitSZXNvbHZlUmVzdWx0IEJ5dGVjb2RlR2VuZXJh
dG9yOjpyZXNvbHZlQ29uc3REZWNsKGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQoreworICAg
IFJlc29sdmVSZXN1bHQgcmV0ID0geyAwLCAwLCAwLCAwIH07CisgICAgCisgICAgLy8gUmVnaXN0
ZXItYWxsb2NhdGVkIGNvbnN0IGRlY2xhcmF0aW9ucy4KKyAgICBpZiAobV9jb2RlVHlwZSAhPSBF
dmFsQ29kZSAmJiBtX2NvZGVUeXBlICE9IEdsb2JhbENvZGUpIHsKKyAgICAgICAgU3ltYm9sVGFi
bGVFbnRyeSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAg
ICAgIGlmICghZW50cnkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2
ZVJlc3VsdDo6UmVnaXN0ZXI7CisgICAgICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQor
ICAgICAgICAgICAgICAgIHJldC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OkltbXV0YWJsZUZsYWc7
CisgICAgICAgICAgICByZXQuaW5kZXggPSBlbnRyeS5nZXRJbmRleCgpOworICAgICAgICAgICAg
cmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnN0IGRlY2xhcmF0aW9u
cyBpbiBldmFsIGNvZGUgb3IgZ2xvYmFsIGNvZGUuCisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0
ZXIgPSBzY29wZUNoYWluKCktPmJlZ2luKCk7CisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9
IHNjb3BlQ2hhaW4oKS0+ZW5kKCk7CisgICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsr
cmV0LmRlcHRoKSB7CisgICAgICAgIEpTT2JqZWN0KiBjdXJyZW50U2NvcGUgPSBpdGVyLT5nZXQo
KTsKKyAgICAgICAgaWYgKCFjdXJyZW50U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBKU1ZhcmlhYmxlT2JqZWN0KiBjdXJyZW50VmFyaWFi
bGVPYmplY3QgPSBzdGF0aWNfY2FzdDxKU1ZhcmlhYmxlT2JqZWN0Kj4oY3VycmVudFNjb3BlKTsK
KyAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdC0+
c3ltYm9sVGFibGUoKS5nZXQocHJvcGVydHkuaW1wbCgpKTsKKyAgICAgICAgaWYgKGVudHJ5Lmlz
TnVsbCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgrK2l0ZXIgPT0gZW5k
KSB7CisgICAgICAgICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkluZGV4ZWRHbG9iYWw7
CisgICAgICAgICAgICByZXQuZ2xvYmFsT2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0Owor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6TGV4
aWNhbDsKKyAgICAgICAgcmV0LmRlcHRoICs9IHNjb3BlRGVwdGgoKTsKKyAgICAgICAgcmV0Lmlu
ZGV4ID0gZW50cnkuZ2V0SW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAg
ICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3VsZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFs
IGJsb2NrLCBpdCB3aWxsIGFzc2lnbgorICAgIC8vIHRvIHRoZSB3cm9uZyBiYXNlIGlmIHByb3Bl
cnR5IGV4aXN0cyBpbiBhbiBpbnRlcnZlbmluZyB3aXRoIHNjb3BlLgorICAgIHJldC50eXBlID0g
UmVzb2x2ZVJlc3VsdDo6RHluYW1pYzsKKyAgICByZXQuaW5kZXggPSBtaXNzaW5nU3ltYm9sTWFy
a2VyKCk7CisgICAgcmV0LmRlcHRoID0gc2NvcGVEZXB0aCgpOworICAgIHJldHVybiByZXQ7CiB9
CiAKIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRDaGVja0hhc0luc3RhbmNlKFJlZ2lzdGVy
SUQqIGJhc2UpCkBAIC0xMjM3LDIwOCArMTI4NywxMzUgQEAgYm9vbCBCeXRlY29kZUdlbmVyYXRv
cjo6c2hvdWxkQXZvaWRSZXNvbHZlR2xvYmFsKCkKICAgICByZXR1cm4gbV9jb2RlQmxvY2stPmds
b2JhbFJlc29sdmVJbmZvQ291bnQoKSA+IG1heEdsb2JhbFJlc29sdmVzICYmICFtX2xhYmVsU2Nv
cGVzLnNpemUoKTsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNv
bHZlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitSZWdpc3Rl
cklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0LCBjb25z
dCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7
Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFs
c2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVkUHJvcGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwg
ZmFsc2UsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiAhZ2xvYmFsT2Jq
ZWN0KSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAg
ZW1pdE9wY29kZShvcF9yZXNvbHZlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRz
dC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChw
cm9wZXJ0eSkpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLSAgICBpZiAoc2hvdWxkQXZv
aWRSZXNvbHZlR2xvYmFsKCkpIHsKLSAgICAgICAgZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICAgICAg
cmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gdHJ1ZTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChn
bG9iYWxPYmplY3QpIHsKLSAgICAgICAgaWYgKGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIo
KSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgICAgICAvLyBEaXJlY3RseSBp
bmRleCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAg
ICAgICByZXR1cm4gZW1pdEdldFNjb3BlZFZhcihkc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2Jq
ZWN0KTsKLSAgICAgICAgfQotCisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkpCisgICAgICAg
IHJldHVybiBlbWl0R2V0U3RhdGljVmFyKGRzdCwgbG9jYXRpb24pOworICAgIAorICAgIGlmIChs
b2NhdGlvbi5pc0dsb2JhbCgpICYmICFzaG91bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgewogI2lm
IEVOQUJMRShKSVQpCiAgICAgICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhp
bnN0cnVjdGlvbnMoKS5zaXplKCkpOwogI2VuZGlmCiAjaWYgRU5BQkxFKElOVEVSUFJFVEVSKQog
ICAgICAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0
aW9ucygpLnNpemUoKSk7CiAjZW5kaWYKLSAgICAgICAgZW1pdE9wY29kZShyZXF1aXJlc0R5bmFt
aWNDaGVja3MgPyBvcF9yZXNvbHZlX2dsb2JhbF9keW5hbWljIDogb3BfcmVzb2x2ZV9nbG9iYWwp
OworICAgICAgICBlbWl0T3Bjb2RlKGxvY2F0aW9uLmlzRHluYW1pYygpID8gb3BfcmVzb2x2ZV9n
bG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFsKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChh
ZGRDb25zdGFudChwcm9wZXJ0eSkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7
CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICAgICAgaWYgKHJlcXVpcmVz
RHluYW1pY0NoZWNrcykKLSAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkZXB0aCk7
CisgICAgICAgIGlmIChsb2NhdGlvbi5pc0R5bmFtaWMoKSkKKyAgICAgICAgICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChsb2NhdGlvbi5kZXB0aCk7CiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAg
fQotCi0gICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAgICAgICAvLyBJZiB3ZSBn
ZXQgaGVyZSB3ZSBoYXZlIGV2YWwgbmVzdGVkIGluc2lkZSBhIHx3aXRofCBqdXN0IGdpdmUgdXAK
LSAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlKTsKKyAgICAgICAgCisgICAgaWYgKGxvY2F0
aW9uLnR5cGUgPT0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYyAmJiBsb2NhdGlvbi5kZXB0aCkgewor
ICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGF0IGxlYXN0IGFibGUgdG8gZHJvcCBhIGZl
dyBzY29wZSBjaGFpbnMgZnJvbSB0aGUKKyAgICAgICAgLy8gbG9va3VwIGNoYWluLCBhbHRob3Vn
aCB3ZSBzdGlsbCBuZWVkIHRvIGhhc2ggZnJvbSB0aGVuIG9uLgorICAgICAgICBlbWl0T3Bjb2Rl
KG9wX3Jlc29sdmVfc2tpcCk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmlu
ZGV4KCkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVy
dHkpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGxvY2F0aW9uLmRlcHRoKTsKICAg
ICAgICAgcmV0dXJuIGRzdDsKICAgICB9CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJv
bE1hcmtlcigpKSB7Ci0gICAgICAgIC8vIERpcmVjdGx5IGluZGV4IHRoZSBwcm9wZXJ0eSBsb29r
dXAgYWNyb3NzIG11bHRpcGxlIHNjb3Blcy4KLSAgICAgICAgcmV0dXJuIGVtaXRHZXRTY29wZWRW
YXIoZHN0LCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7Ci0gICAgfQotCi0gICAgLy8gSW4g
dGhpcyBjYXNlIHdlIGFyZSBhdCBsZWFzdCBhYmxlIHRvIGRyb3AgYSBmZXcgc2NvcGUgY2hhaW5z
IGZyb20gdGhlCi0gICAgLy8gbG9va3VwIGNoYWluLCBhbHRob3VnaCB3ZSBzdGlsbCBuZWVkIHRv
IGhhc2ggZnJvbSB0aGVuIG9uLgotICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZV9za2lwKTsKKyAg
ICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmUpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3Qt
PmluZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0
eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkZXB0aCk7CiAgICAgcmV0dXJuIGRzdDsK
IH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRHZXRTY29wZWRWYXIoUmVn
aXN0ZXJJRCogZHN0LCBzaXplX3QgZGVwdGgsIGludCBpbmRleCwgSlNWYWx1ZSBnbG9iYWxPYmpl
Y3QpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlKFJlZ2lz
dGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5KQogewotICAgIGlmIChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAgaWYgKG1f
bGFzdE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxfdmFyKSB7Ci0gICAgICAgICAgICBpbnQgZHN0
SW5kZXg7Ci0gICAgICAgICAgICBpbnQgc3JjSW5kZXg7Ci0gICAgICAgICAgICByZXRyaWV2ZUxh
c3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IGlmIChkc3RJbmRleCA9PSBpbmRleCAmJiBzcmNJbmRleCA9PSBkc3QtPmluZGV4KCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGRzdDsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXRPcGNvZGUo
b3BfZ2V0X2dsb2JhbF92YXIpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5p
bmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGluZGV4KTsKLSAgICAgICAg
cmV0dXJuIGRzdDsKKyAgICBpZiAobG9jYXRpb24uaXNHbG9iYWwoKSAmJiAhbG9jYXRpb24uaXNE
eW5hbWljKCkpIHsKKyAgICAgICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQorICAgICAg
ICBBU1NFUlQobG9jYXRpb24uZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIGVtaXRMb2Fk
KGRzdCwgSlNWYWx1ZShsb2NhdGlvbi5nbG9iYWxPYmplY3QpKTsKICAgICB9CiAKLSAgICBlbWl0
T3Bjb2RlKG9wX2dldF9zY29wZWRfdmFyKTsKKyAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBh
bGwgOi0oCisgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwogICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRl
eCk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKKyAgICBpbnN0cnVjdGlvbnMo
KS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBl
bmQoZmFsc2UpOwogICAgIHJldHVybiBkc3Q7CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0UHV0U2NvcGVkVmFyKHNpemVfdCBkZXB0aCwgaW50IGluZGV4LCBSZWdpc3Rl
cklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpCitSZWdpc3RlcklEKiBCeXRlY29kZUdl
bmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVz
b2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAg
IGlmIChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAgZW1pdE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zh
cik7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIGluc3Ry
dWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsK
LSAgICB9Ci0gICAgZW1pdE9wY29kZShvcF9wdXRfc2NvcGVkX3Zhcik7Ci0gICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKGluZGV4KTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVwdGgpOwot
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgcmV0dXJuIHZh
bHVlOwotfQorICAgIGlmICghbV9jb2RlQmxvY2stPmlzU3RyaWN0TW9kZSgpKQorICAgICAgICBy
ZXR1cm4gZW1pdFJlc29sdmVCYXNlKGRzdCwgbG9jYXRpb24sIHByb3BlcnR5KTsKIAotUmVnaXN0
ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlQmFzZShSZWdpc3RlcklEKiBkc3Qs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQotewotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0g
ICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBi
b29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGZpbmRTY29wZWRQcm9wZXJ0
eShwcm9wZXJ0eSwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBn
bG9iYWxPYmplY3QpOwotICAgIGlmICghZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0No
ZWNrcykgewotICAgICAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAg
IGVtaXRPcGNvZGUob3BfcmVzb2x2ZV9iYXNlKTsKKyAgICBpZiAobG9jYXRpb24uaXNHbG9iYWwo
KSAmJiAhbG9jYXRpb24uaXNEeW5hbWljKCkpIHsKKyAgICAgICAgLy8gR2xvYmFsIG9iamVjdCBp
cyB0aGUgYmFzZQorICAgICAgICBBU1NFUlQobG9jYXRpb24uZ2xvYmFsT2JqZWN0KTsKKyAgICAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShsb2Nh
dGlvbi5nbG9iYWxPYmplY3QpKTsKKyAgICAgICAgZW1pdE9wY29kZShvcF9lbnN1cmVfcHJvcGVy
dHlfZXhpc3RzKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7
CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwot
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZmFsc2UpOwotICAgICAgICByZXR1cm4gZHN0
OworICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpOwogICAgIH0KIAotICAgIC8vIEdsb2JhbCBv
YmplY3QgaXMgdGhlIGJhc2UKLSAgICByZXR1cm4gZW1pdExvYWQoZHN0LCBKU1ZhbHVlKGdsb2Jh
bE9iamVjdCkpOwotfQotCi1SZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29s
dmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkp
Ci17Ci0gICAgaWYgKCFtX2NvZGVCbG9jay0+aXNTdHJpY3RNb2RlKCkpCi0gICAgICAgIHJldHVy
biBlbWl0UmVzb2x2ZUJhc2UoZHN0LCBwcm9wZXJ0eSk7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsK
LSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAg
IGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgZmluZFNjb3BlZFByb3Bl
cnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3Ms
IGdsb2JhbE9iamVjdCk7Ci0gICAgaWYgKCFnbG9iYWxPYmplY3QgfHwgcmVxdWlyZXNEeW5hbWlj
Q2hlY2tzKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAg
ICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENv
bnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh0cnVlKTsK
LSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gR2xvYmFsIG9iamVjdCBp
cyB0aGUgYmFzZQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBlbWl0TG9hZChkc3Qs
IEpTVmFsdWUoZ2xvYmFsT2JqZWN0KSk7Ci0gICAgZW1pdE9wY29kZShvcF9lbnN1cmVfcHJvcGVy
dHlfZXhpc3RzKTsKKyAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCisgICAgZW1p
dE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3Qt
PmluZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0
eSkpOwotICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KHRydWUpOworICAgIHJldHVybiBkc3Q7CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJh
dG9yOjplbWl0UmVzb2x2ZVdpdGhCYXNlKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVySUQq
IHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0ZWNv
ZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVn
aXN0ZXJJRCogcHJvcERzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElk
ZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgaW50IGlu
ZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVp
cmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmICghZmluZFNjb3BlZFByb3BlcnR5KHBy
b3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2Jh
bE9iamVjdCkgfHwgIWdsb2JhbE9iamVjdCB8fCByZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAg
ICAgICAgLy8gV2UgY2FuJ3Qgb3B0aW1pc2UgYXQgYWxsIDotKAotICAgICAgICBlbWl0T3Bjb2Rl
KG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGJh
c2VEc3QtPmluZGV4KCkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+
aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9w
ZXJ0eSkpOwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9CisgICAgaWYgKGxvY2F0aW9u
LmlzR2xvYmFsKCkgJiYgIWxvY2F0aW9uLmlzRHluYW1pYygpKSB7CisgICAgICAgIC8vIEdsb2Jh
bCBvYmplY3QgaXMgdGhlIGJhc2UKKyAgICAgICAgQVNTRVJUKGxvY2F0aW9uLmdsb2JhbE9iamVj
dCk7CisgICAgICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFsdWUobG9jYXRpb24uZ2xvYmFsT2Jq
ZWN0KSk7CiAKLSAgICBib29sIGZvcmNlR2xvYmFsUmVzb2x2ZSA9IGZhbHNlOworICAgICAgICBp
ZiAobG9jYXRpb24uaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgLy8gRGlyZWN0bHkgaW5kZXgg
dGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgorICAgICAgICAgICAg
ZW1pdEdldFN0YXRpY1Zhcihwcm9wRHN0LCBsb2NhdGlvbik7CisgICAgICAgICAgICByZXR1cm4g
YmFzZURzdDsKKyAgICAgICAgfQogCi0gICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQot
ICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFsdWUoZ2xvYmFsT2JqZWN0KSk7CisgICAgICAgIGlm
IChzaG91bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgeworICAgICAgICAgICAgZW1pdE9wY29kZShv
cF9yZXNvbHZlKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5p
bmRleCgpKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChw
cm9wZXJ0eSkpOworICAgICAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgICAgIH0KIAotICAg
IGlmIChpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIWZvcmNlR2xvYmFsUmVzb2x2
ZSkgewotICAgICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9z
cyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAgIGVtaXRHZXRTY29wZWRWYXIocHJvcERzdCwgZGVw
dGgsIGluZGV4LCBnbG9iYWxPYmplY3QpOwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9
Ci0gICAgaWYgKHNob3VsZEF2b2lkUmVzb2x2ZUdsb2JhbCgpKSB7Ci0gICAgICAgIGVtaXRPcGNv
ZGUob3BfcmVzb2x2ZSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5p
bmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3Bl
cnR5KSk7Ci0gICAgICAgIHJldHVybiBiYXNlRHN0OwotICAgIH0KICNpZiBFTkFCTEUoSklUKQot
ICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhpbnN0cnVjdGlvbnMoKS5zaXpl
KCkpOworICAgICAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rp
b25zKCkuc2l6ZSgpKTsKICNlbmRpZgogI2lmIEVOQUJMRShJTlRFUlBSRVRFUikKLSAgICBtX2Nv
ZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUo
KSk7CisgICAgICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5zdHJ1Y3Rpb24oaW5z
dHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgotICAgIGVtaXRPcGNvZGUocmVxdWlyZXNEeW5h
bWljQ2hlY2tzID8gb3BfcmVzb2x2ZV9nbG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFs
KTsKKyAgICAgICAgZW1pdE9wY29kZShsb2NhdGlvbi5pc0R5bmFtaWMoKSA/IG9wX3Jlc29sdmVf
Z2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2dsb2JhbCk7CisgICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChwcm9wRHN0LT5pbmRleCgpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBw
ZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZCgwKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKDApOworICAgICAgICBpZiAobG9j
YXRpb24uaXNEeW5hbWljKCkpCisgICAgICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9j
YXRpb24uZGVwdGgpOworICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICB9CisKKyAgICBlbWl0
T3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQo
YmFzZURzdC0+aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmlu
ZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkp
OwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBl
bmQoMCk7Ci0gICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKGRlcHRoKTsKICAgICByZXR1cm4gYmFzZURzdDsKIH0KIAotUmVnaXN0ZXJJ
RCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFz
ZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitS
ZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyhSZWdpc3Rl
cklEKiBiYXNlRHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBs
b2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRo
ID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAw
OwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5k
U2NvcGVkUHJvcGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHlu
YW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSB8fCAhZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHlu
YW1pY0NoZWNrcykgeworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpKSB7CisgICAgICAgIGVt
aXRMb2FkKGJhc2VEc3QsIGpzVW5kZWZpbmVkKCkpOworICAgICAgICBlbWl0R2V0U3RhdGljVmFy
KHByb3BEc3QsIGxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgfQorCisg
ICAgaWYgKGxvY2F0aW9uLnR5cGUgPT0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYykgewogICAgICAg
ICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCiAgICAgICAgIGVtaXRPcGNvZGUob3Bf
cmVzb2x2ZV93aXRoX3RoaXMpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYmFzZURz
dC0+aW5kZXgoKSk7CkBAIC0xNDQ3LDM2ICsxNDI0LDc3IEBAIFJlZ2lzdGVySUQqIEJ5dGVjb2Rl
R2VuZXJhdG9yOjplbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lz
dGVyCiAgICAgICAgIHJldHVybiBiYXNlRHN0OwogICAgIH0KIAotICAgIGJvb2wgZm9yY2VHbG9i
YWxSZXNvbHZlID0gZmFsc2U7Ci0KLSAgICAvLyBHbG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCiAg
ICAgZW1pdExvYWQoYmFzZURzdCwganNVbmRlZmluZWQoKSk7CisgICAgcmV0dXJuIGVtaXRSZXNv
bHZlKHByb3BEc3QsIGxvY2F0aW9uLCBwcm9wZXJ0eSk7Cit9CiAKLSAgICBpZiAoaW5kZXggIT0g
bWlzc2luZ1N5bWJvbE1hcmtlcigpICYmICFmb3JjZUdsb2JhbFJlc29sdmUpIHsKLSAgICAgICAg
Ly8gRGlyZWN0bHkgaW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2Nv
cGVzLgotICAgICAgICBlbWl0R2V0U2NvcGVkVmFyKHByb3BEc3QsIGRlcHRoLCBpbmRleCwgZ2xv
YmFsT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CitSZWdpc3RlcklEKiBCeXRlY29k
ZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRpY1ZhcihSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29s
dmVSZXN1bHQmIGxvY2F0aW9uKQoreworICAgIFJlZ2lzdGVySUQqIGxvY2FsID0gMDsKKworICAg
IHN3aXRjaCAobG9jYXRpb24udHlwZSkgeworICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0
ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdpc3RlcjoKKyAgICAgICAg
bG9jYWwgPSByZWdpc3RlckZvcihsb2NhdGlvbik7CisgICAgICAgIGlmIChkc3QgPT0gaWdub3Jl
ZFJlc3VsdCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtb3ZlVG9E
ZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbG9jYWwpOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0
OjpMZXhpY2FsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlTGV4aWNhbDoKKyAg
ICAgICAgZW1pdE9wY29kZShvcF9nZXRfc2NvcGVkX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChkc3QtPmluZGV4KCkpOworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQo
bG9jYXRpb24uaW5kZXgpOworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24u
ZGVwdGgpOworICAgICAgICByZXR1cm4gZHN0OworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJ
bmRleGVkR2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhlZEds
b2JhbDoKKyAgICAgICAgaWYgKG1fbGFzdE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxfdmFyKSB7
CisgICAgICAgICAgICBpbnQgZHN0SW5kZXg7CisgICAgICAgICAgICBpbnQgc3JjSW5kZXg7Cisg
ICAgICAgICAgICByZXRyaWV2ZUxhc3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7CisgICAg
ICAgICAgICBpZiAoZHN0SW5kZXggPT0gbG9jYXRpb24uaW5kZXggJiYgc3JjSW5kZXggPT0gZHN0
LT5pbmRleCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBkc3Q7CisgICAgICAgIH0KKworICAg
ICAgICBlbWl0T3Bjb2RlKG9wX2dldF9nbG9iYWxfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChs
b2NhdGlvbi5pbmRleCk7CisgICAgICAgIHJldHVybiBkc3Q7CisKKyAgICBkZWZhdWx0OgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAg
IGlmIChzaG91bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgewotICAgICAgICBlbWl0T3Bjb2RlKG9w
X3Jlc29sdmUpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+aW5kZXgo
KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkp
OwotICAgICAgICByZXR1cm4gYmFzZURzdDsKK30KKworUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5l
cmF0b3I6OmVtaXRQdXRTdGF0aWNWYXIoY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIFJl
Z2lzdGVySUQqIHZhbHVlKQoreworICAgIHN3aXRjaCAobG9jYXRpb24udHlwZSkgeworICAgIGNh
c2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11
dGFibGVSZWdpc3RlcjoKKyAgICAgICAgcmV0dXJuIG1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQo
cmVnaXN0ZXJGb3IobG9jYXRpb24pLCB2YWx1ZSk7CisKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6
OkxleGljYWw6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVMZXhpY2FsOgorICAg
ICAgICBlbWl0T3Bjb2RlKG9wX3B1dF9zY29wZWRfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGxvY2F0aW9uLmluZGV4KTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGxvY2F0aW9uLmRlcHRoKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHZhbHVlLT5p
bmRleCgpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0
OjpJbmRleGVkR2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhl
ZEdsb2JhbDoKKyAgICAgICAgZW1pdE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7CisgICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChsb2NhdGlvbi5pbmRleCk7CisgICAgICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4gMDsKICAgICB9Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFs
UmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKLSNlbmRpZgotI2lmIEVOQUJMRShJ
TlRFUlBSRVRFUikKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9u
KGluc3RydWN0aW9ucygpLnNpemUoKSk7Ci0jZW5kaWYKLSAgICBlbWl0T3Bjb2RlKHJlcXVpcmVz
RHluYW1pY0NoZWNrcyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2ds
b2JhbCk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwotICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3Ry
dWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0gICAg
aWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGRlcHRoKTsKLSAgICByZXR1cm4gYmFzZURzdDsKIH0KIAogdm9pZCBCeXRlY29kZUdlbmVyYXRv
cjo6ZW1pdE1ldGhvZENoZWNrKCkKQEAgLTIzNjIsNyArMjM4MCw3IEBAIHZvaWQgQnl0ZWNvZGVH
ZW5lcmF0b3I6OnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0NvbXBh
cmVGdW5jdGlvCiAKIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OmlzQXJndW1lbnROdW1iZXIoY29u
c3QgSWRlbnRpZmllciYgaWRlbnQsIGludCBhcmd1bWVudE51bWJlcikKIHsKLSAgICBSZWdpc3Rl
cklEKiByZWdpc3RlcklEID0gcmVnaXN0ZXJGb3IoaWRlbnQpOworICAgIFJlZ2lzdGVySUQqIHJl
Z2lzdGVySUQgPSByZWdpc3RlckZvcihyZXNvbHZlKGlkZW50KSk7CiAgICAgaWYgKCFyZWdpc3Rl
cklEIHx8IHJlZ2lzdGVySUQtPmluZGV4KCkgPj0gMCkKICAgICAgICAgIHJldHVybiAwOwogICAg
IHJldHVybiByZWdpc3RlcklELT5pbmRleCgpID09IENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXQo
YXJndW1lbnROdW1iZXIpOwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCmluZGV4IGNlOGQ4Zjg0MTJmNjg0ZTM5ZmIxMTk3
Y2FlOTA5YWFjMWUxM2E3MTcuLjY1N2NmZGI1ZDgxMjgzMWQxZTViNzMwOGMwZTJlNDBhNTdhMjcx
MTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNv
ZGVHZW5lcmF0b3IuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5
dGVjb2RlR2VuZXJhdG9yLmgKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAy
MDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAo
QykgMjAwOCBDYW1lcm9uIFp3YXJpY2ggPGN3endhcmljaEB1d2F0ZXJsb28uY2E+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgSWdhbGlhLCBTLkwuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKQEAgLTg1LDYgKzg2LDg0IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gcHJvcGVydHlSZWdpc3RlcjsKICAgICB9OwogCisgICAgc3RydWN0IFJlc29sdmVS
ZXN1bHQgeworICAgICAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0
eSBpcyBsb2NhbGx5IGJvdW5kLCBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgUmVnaXN0ZXJG
bGFnID0gMHgxLAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgc2NvcGUg
Y2hhaW4gYXQgcnVudGltZSwgY2hlY2tpbmcgZm9yCisgICAgICAgICAgICAvLyBub24tc3RyaWN0
IGV2YWwgYW5kL29yIGB3aXRoJyBub2Rlcy4KKyAgICAgICAgICAgIER5bmFtaWNGbGFnID0gMHgy
LAorICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IHdhcyByZXNvbHZlZCB0byBhIGRlZmluaXRl
IGxvY2F0aW9uLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGlzIG5vdCBuZWVk
ZWQgYW55IG1vcmUuCisgICAgICAgICAgICBTdGF0aWNGbGFnID0gMHg0LAorICAgICAgICAgICAg
Ly8gT25jZSB3ZSBoYXZlIHRoZSBiYXNlIG9iamVjdCwgdGhlIHByb3BlcnR5IHdpbGwgYmUgbG9j
YXRlZCBhdCBhCisgICAgICAgICAgICAvLyBrbm93biBpbmRleC4KKyAgICAgICAgICAgIEluZGV4
ZWRGbGFnID0gMHg4LAorICAgICAgICAgICAgLy8gU2tpcCBzb21lIG51bWJlciBvZiBvYmplY3Rz
IGluIHRoZSBzY29wZSBjaGFpbiwgZ2l2ZW4gYnkgImRlcHRoIi4KKyAgICAgICAgICAgIFNjb3Bl
RmxhZyA9IDB4MTAsCisgICAgICAgICAgICAvLyBUaGUgcmVzb2x2ZWQgYmluZGluZyBpcyBpbW11
dGFibGUuCisgICAgICAgICAgICBJbW11dGFibGVGbGFnID0gMHgyMCwKKyAgICAgICAgICAgIC8v
IFRoZSBiYXNlIG9iamVjdCBpcyB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEdsb2Jh
bEZsYWcgPSAweDQwCisgICAgICAgIH07CisgICAgICAgIGVudW0gVHlwZSB7CisgICAgICAgICAg
ICAvLyBUaGUgcHJvcGVydHkgaXMgbG9jYWwsIGFuZCBzdG9yZWQgaW4gYSByZWdpc3Rlci4KKyAg
ICAgICAgICAgIFJlZ2lzdGVyID0gUmVnaXN0ZXJGbGFnIHwgU3RhdGljRmxhZywKKyAgICAgICAg
ICAgIC8vIEEgcmVhZC1vbmx5IGxvY2FsLCBjcmVhdGVkIGJ5ICJjb25zdCIuCisgICAgICAgICAg
ICBJbW11dGFibGVSZWdpc3RlciA9IFJlZ2lzdGVyRmxhZyB8IEltbXV0YWJsZUZsYWcgfCBTdGF0
aWNGbGFnLAorICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGlzIHN0YXRpY2FsbHkgc2NvcGVk
IGZyZWUgdmFyaWFibGUuIEl0cyBjb29yZGluYXRlcworICAgICAgICAgICAgLy8gYXJlIGluICJp
bmRleCIgYW5kICJkZXB0aCIuCisgICAgICAgICAgICBMZXhpY2FsID0gSW5kZXhlZEZsYWcgfCBT
Y29wZUZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgTGV4aWNh
bCwgY3JlYXRlZCBieSAiY29uc3QiLgorICAgICAgICAgICAgSW1tdXRhYmxlTGV4aWNhbCA9IElu
ZGV4ZWRGbGFnIHwgU2NvcGVGbGFnIHwgSW1tdXRhYmxlRmxhZyB8IFN0YXRpY0ZsYWcsCisgICAg
ICAgICAgICAvLyBUaGUgcHJvcGVydHkgd2FzIG5vdCBib3VuZCBsZXhpY2FsbHksIHNvIGF0IHJ1
bnRpbWUgd2Ugc2hvdWxkCisgICAgICAgICAgICAvLyBsb29rIGRpcmVjdGx5IGluIHRoZSBnbG9i
YWwgb2JqZWN0LgorICAgICAgICAgICAgR2xvYmFsID0gR2xvYmFsRmxhZywKKyAgICAgICAgICAg
IC8vIExpa2UgR2xvYmFsLCBidXQgd2UgY291bGQgYWN0dWFsbHkgcmVzb2x2ZSB0aGUgcHJvcGVy
dHkgdG8gYQorICAgICAgICAgICAgLy8gRG9udERlbGV0ZSBwcm9wZXJ0eSBpbiB0aGUgZ2xvYmFs
IG9iamVjdCwgZm9yIGluc3RhbmNlLCBhbnkKKyAgICAgICAgICAgIC8vIGJpbmRpbmcgY3JlYXRl
ZCB3aXRoICJ2YXIiIGF0IHRoZSB0b3AgbGV2ZWwuIEF0IHJ1bnRpbWUgd2UnbGwKKyAgICAgICAg
ICAgIC8vIGp1c3QgaW5kZXggaW50byB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIElu
ZGV4ZWRHbG9iYWwgPSBJbmRleGVkRmxhZyB8IEdsb2JhbEZsYWcgfCBTdGF0aWNGbGFnLAorICAg
ICAgICAgICAgLy8gTGlrZSBJbmRleGVkR2xvYmFsLCBidXQgdGhlIHByb3BlcnR5IGlzIGFsc28g
cmVhZC1vbmx5LCBsaWtlIE5hTiwKKyAgICAgICAgICAgIC8vIEluZmluaXR5LCBvciB1bmRlZmlu
ZWQuCisgICAgICAgICAgICBJbW11dGFibGVJbmRleGVkR2xvYmFsID0gSW5kZXhlZEZsYWcgfCBJ
bW11dGFibGVGbGFnIHwgR2xvYmFsRmxhZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBU
aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHksIGR1ZSB0byB0aGUK
KyAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIGB3aXRoJyBibG9ja3MuIEF0IHJ1bnRpbWUgd2Un
bGwgaGF2ZSB0byB3YWxrIHRoZQorICAgICAgICAgICAgLy8gc2NvcGUgY2hhaW4uIFNjb3BlRmxh
ZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCAiZGVwdGgiIHdpbGwKKyAgICAgICAgICAgIC8vIGhv
bGQgc29tZSBudW1iZXIgb2Ygbm9kZXMgdG8gc2tpcCBpbiB0aGUgc2NvcGUgY2hhaW4sIGJlZm9y
ZQorICAgICAgICAgICAgLy8gYmVnaW5uaW5nIHRoZSBzZWFyY2guCisgICAgICAgICAgICBEeW5h
bWljID0gRHluYW1pY0ZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVy
dHkgd2FzIGxvY2F0ZWQgYXMgYSBzdGF0aWNhbGx5IHNjb3BlZCBmcmVlIHZhcmlhYmxlLAorICAg
ICAgICAgICAgLy8gYnV0IHdoaWxlIHRyYXZlcnNpbmcgdGhlIHNjb3BlIGNoYWluLCB0aGVyZSB3
YXMgYW4gaW50ZXJtZWRpYXRlCisgICAgICAgICAgICAvLyBhY3RpdmF0aW9uIHRoYXQgdXNlZCBu
b24tc3RyaWN0IGBldmFsJy4gQXQgcnVudGltZSB3ZSdsbCBoYXZlIHRvCisgICAgICAgICAgICAv
LyBjaGVjayBmb3IgdGhlIGFic2VuY2Ugb2YgdGhpcyBwcm9wZXJ0eSBpbiB0aG9zZSBpbnRlcnZl
bmluZworICAgICAgICAgICAgLy8gc2NvcGVzLgorICAgICAgICAgICAgRHluYW1pY0xleGljYWwg
PSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFnLAorICAgICAgICAgICAgLy8g
TGlrZSBJbW11dGFibGVMZXhpY2FsLCBidXQgd2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0IGBl
dmFsJy4KKyAgICAgICAgICAgIER5bmFtaWNJbW11dGFibGVMZXhpY2FsID0gRHluYW1pY0ZsYWcg
fCBJbmRleGVkRmxhZyB8IFNjb3BlRmxhZyB8IEltbXV0YWJsZUZsYWcsCisgICAgICAgICAgICAv
LyBMaWtlIEdsb2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcgbm9uLXN0cmljdCBgZXZhbCcuIEFz
IHdpdGggCisgICAgICAgICAgICAvLyBEeW5hbWljLCBTY29wZUZsYWcgaXMgc2V0IHRvIGluZGlj
YXRlIHRoYXQgImRlcHRoIiBkb2VzIGluZGVlZAorICAgICAgICAgICAgLy8gc3RvcmUgYSBudW1i
ZXIgb2YgZnJhbWVzIHRvIHNraXAgYmVmb3JlIGRvaW5nIHRoZSBkeW5hbWljIGNoZWNrcy4KKyAg
ICAgICAgICAgIER5bmFtaWNHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEdsb2JhbEZsYWcgfCBTY29w
ZUZsYWcsCisgICAgICAgICAgICAvLyBMaWtlIEluZGV4ZWRHbG9iYWwsIGJ1dCB3aXRoIGludGVy
dmVuaW5nIG5vbi1zdHJpY3QgYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY0luZGV4ZWRHbG9i
YWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgR2xvYmFsRmxhZyB8IFNjb3BlRmxhZywK
KyAgICAgICAgICAgIC8vIExpa2UgSW1tdXRhYmxlSW5kZXhlZEdsb2JhbCwgYnV0IHdpdGggaW50
ZXJ2ZW5pbmcgbm9uLXN0cmljdAorICAgICAgICAgICAgLy8gYGV2YWwnLgorICAgICAgICAgICAg
RHluYW1pY0ltbXV0YWJsZUluZGV4ZWRHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFn
IHwgSW1tdXRhYmxlRmxhZyB8IEdsb2JhbEZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgIH07CisK
KyAgICAgICAgYm9vbCBpc1JlZ2lzdGVyKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIFJlZ2lzdGVy
RmxhZzsgfQorICAgICAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIHR5cGUgJiBE
eW5hbWljRmxhZzsgfQorICAgICAgICBib29sIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gdHlw
ZSAmIFN0YXRpY0ZsYWc7IH0KKyAgICAgICAgYm9vbCBpc0ltbXV0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHR5cGUgJiBJbW11dGFibGVGbGFnOyB9CisgICAgICAgIGJvb2wgaXNHbG9iYWwoKSBjb25z
dCB7IHJldHVybiB0eXBlICYgR2xvYmFsRmxhZzsgfQorCisgICAgICAgIHVuc2lnbmVkIHR5cGU7
CisgICAgICAgIGludCBpbmRleDsgLy8gSW5kZXggaW4gc2NvcGUsIGlmIEluZGV4ZWRGbGFnIGlz
IHNldCwgb3IgaW4gcmVnaXN0ZXJzLCBpZiBSZWdpc3RlckZsYWcgaXMgc2V0LgorICAgICAgICBz
aXplX3QgZGVwdGg7IC8vIERlcHRoIGluIHNjb3BlIGNoYWluLCBpZiBTY29wZUZsYWcgaXMgc2V0
CisgICAgICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3Q7IC8vIElmIEdsb2JhbEZsYWcgaXMgc2V0
LgorICAgIH07CisKICAgICBjbGFzcyBCeXRlY29kZUdlbmVyYXRvciB7CiAgICAgICAgIFdURl9N
QUtFX0ZBU1RfQUxMT0NBVEVEOwogICAgIHB1YmxpYzoKQEAgLTEwNywxMSArMTg2LDYgQEAgbmFt
ZXNwYWNlIEpTQyB7CiAKICAgICAgICAgSlNPYmplY3QqIGdlbmVyYXRlKCk7CiAKLSAgICAgICAg
Ly8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byBhIGxvY2FsIHZhcmlhYmxl
LCBvciAwIGlmIG5vCi0gICAgICAgIC8vIHN1Y2ggcmVnaXN0ZXIgZXhpc3RzLiBSZWdpc3RlcnMg
cmV0dXJuZWQgYnkgcmVnaXN0ZXJGb3IgZG8gbm90Ci0gICAgICAgIC8vIHJlcXVpcmUgZXhwbGlj
aXQgcmVmZXJlbmNlIGNvdW50aW5nLgotICAgICAgICBSZWdpc3RlcklEKiByZWdpc3RlckZvcihj
b25zdCBJZGVudGlmaWVyJik7Ci0KICAgICAgICAgYm9vbCBpc0FyZ3VtZW50TnVtYmVyKGNvbnN0
IElkZW50aWZpZXImLCBpbnQpOwogCiAgICAgICAgIHZvaWQgc2V0SXNOdW1lcmljQ29tcGFyZUZ1
bmN0aW9uKGJvb2wgaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTsKQEAgLTExOSwxNyArMTkzLDE2
IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBib29sIHdpbGxSZXNvbHZlVG9Bcmd1bWVudHMo
Y29uc3QgSWRlbnRpZmllciYpOwogICAgICAgICBSZWdpc3RlcklEKiB1bmNoZWNrZWRSZWdpc3Rl
ckZvckFyZ3VtZW50cygpOwogCi0gICAgICAgIC8vIEJlaGF2ZXMgYXMgcmVnaXN0ZXJGb3IgZG9l
cywgYnV0IGlnbm9yZXMgZHluYW1pYyBzY29wZSBhcworICAgICAgICAvLyBSZXNvbHZlIGFuIGlk
ZW50aWZpZXIsIGdpdmVuIHRoZSBjdXJyZW50IGNvbXBpbGUtdGltZSBzY29wZSBjaGFpbi4KKyAg
ICAgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlKGNvbnN0IElkZW50aWZpZXImKTsKKyAgICAgICAg
Ly8gQmVoYXZlcyBhcyByZXNvbHZlIGRvZXMsIGJ1dCBpZ25vcmVzIGR5bmFtaWMgc2NvcGUgYXMK
ICAgICAgICAgLy8gZHluYW1pYyBzY29wZSBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIGNvbnN0
IGluaXRpYWxpc2F0aW9uCi0gICAgICAgIFJlZ2lzdGVySUQqIGNvbnN0UmVnaXN0ZXJGb3IoY29u
c3QgSWRlbnRpZmllciYpOworICAgICAgICBSZXNvbHZlUmVzdWx0IHJlc29sdmVDb25zdERlY2wo
Y29uc3QgSWRlbnRpZmllciYpOwogCi0gICAgICAgIC8vIFNlYXJjaGVzIHRoZSBzY29wZSBjaGFp
biBpbiBhbiBhdHRlbXB0IHRvICBzdGF0aWNhbGx5IGxvY2F0ZSB0aGUgcmVxdWVzdGVkCi0gICAg
ICAgIC8vIHByb3BlcnR5LiAgUmV0dXJucyBmYWxzZSBpZiBmb3IgYW55IHJlYXNvbiB0aGUgcHJv
cGVydHkgY2Fubm90IGJlIHNhZmVseQotICAgICAgICAvLyBvcHRpbWlzZWQgYXQgYWxsLiAgT3Ro
ZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZSBpbmRleCBhbmQgZGVwdGggb2YgdGhlCi0gICAgICAg
IC8vIFZhcmlhYmxlT2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcHJvcGVydHkuICBJZiB0aGUgcHJv
cGVydHkgY2Fubm90IGJlIGZvdW5kCi0gICAgICAgIC8vIHN0YXRpY2FsbHksIGRlcHRoIHdpbGwg
Y29udGFpbiB0aGUgZGVwdGggb2YgdGhlIHNjb3BlIGNoYWluIHdoZXJlIGR5bmFtaWMKLSAgICAg
ICAgLy8gbG9va3VwIG11c3QgYmVnaW4uCi0gICAgICAgIGJvb2wgZmluZFNjb3BlZFByb3BlcnR5
KGNvbnN0IElkZW50aWZpZXImLCBpbnQmIGluZGV4LCBzaXplX3QmIGRlcHRoLCBib29sIGZvcldy
aXRpbmcsIGJvb2wmIGluY2x1ZGVzRHluYW1pY1Njb3BlcywgSlNPYmplY3QqJiBnbG9iYWxPYmpl
Y3QpOworICAgICAgICAvLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIGEg
bG9jYWwgdmFyaWFibGUsIG9yIDAgaWYgbm8KKyAgICAgICAgLy8gc3VjaCByZWdpc3RlciBleGlz
dHMuIFJlZ2lzdGVycyByZXR1cm5lZCBieSByZWdpc3RlckZvciBkbyBub3QKKyAgICAgICAgLy8g
cmVxdWlyZSBleHBsaWNpdCByZWZlcmVuY2UgY291bnRpbmcuCisgICAgICAgIFJlZ2lzdGVySUQq
IHJlZ2lzdGVyRm9yKGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uKTsKIAogICAgICAgICAv
LyBSZXR1cm5zIHRoZSByZWdpc3RlciBzdG9yaW5nICJ0aGlzIgogICAgICAgICBSZWdpc3RlcklE
KiB0aGlzUmVnaXN0ZXIoKSB7IHJldHVybiAmbV90aGlzUmVnaXN0ZXI7IH0KQEAgLTMwOSwxNCAr
MzgyLDE0IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBSZWdpc3RlcklEKiBlbWl0VHlwZU9m
KFJlZ2lzdGVySUQqIGRzdCwgUmVnaXN0ZXJJRCogc3JjKSB7IHJldHVybiBlbWl0VW5hcnlPcChv
cF90eXBlb2YsIGRzdCwgc3JjKTsgfQogICAgICAgICBSZWdpc3RlcklEKiBlbWl0SW4oUmVnaXN0
ZXJJRCogZHN0LCBSZWdpc3RlcklEKiBwcm9wZXJ0eSwgUmVnaXN0ZXJJRCogYmFzZSkgeyByZXR1
cm4gZW1pdEJpbmFyeU9wKG9wX2luLCBkc3QsIHByb3BlcnR5LCBiYXNlLCBPcGVyYW5kVHlwZXMo
KSk7IH0KIAotICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3Qs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEdl
dFNjb3BlZFZhcihSZWdpc3RlcklEKiBkc3QsIHNpemVfdCBza2lwLCBpbnQgaW5kZXgsIEpTVmFs
dWUgZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFB1dFNjb3BlZFZhcihz
aXplX3Qgc2tpcCwgaW50IGluZGV4LCBSZWdpc3RlcklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9iYWxP
YmplY3QpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0R2V0U3RhdGljVmFyKFJlZ2lzdGVySUQq
IGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24pOworICAgICAgICBSZWdpc3RlcklE
KiBlbWl0UHV0U3RhdGljVmFyKGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uLCBSZWdpc3Rl
cklEKiB2YWx1ZSk7CiAKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmVCYXNlKFJlZ2lz
dGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwotICAgICAgICBSZWdpc3Rl
cklEKiBlbWl0UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBJZGVudGlm
aWVyJiBwcm9wZXJ0eSk7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlV2l0aEJhc2Uo
UmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmll
ciYgcHJvcGVydHkpOwotICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhUaGlzKFJl
Z2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXIm
IHByb3BlcnR5KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCog
ZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJv
cGVydHkpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZUJhc2UoUmVnaXN0ZXJJRCog
ZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJv
cGVydHkpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0
ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmll
ciYgcHJvcGVydHkpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhCYXNlKFJl
Z2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IFJlc29sdmVSZXN1
bHQmIGxvY2F0aW9uLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7CisgICAgICAgIFJlZ2lz
dGVySUQqIGVtaXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJ
RCogcHJvcERzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5KTsKIAogICAgICAgICB2b2lkIGVtaXRNZXRob2RDaGVjaygpOwogCmRpZmYg
LS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5j
cHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAK
aW5kZXggMTMyZjY2NjJhZmJjYzc5NTRhY2U1OTlhNDYwM2Y0ZDkyZTBiODk4ZC4uZDZmMDllOTQ5
NDQzN2M1YTliNWM4MTgyMmU5OTAzZjNmZGVhYzkxYyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCisrKyBiL1NvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcApAQCAtNSw2ICs1LDcgQEAK
ICogIENvcHlyaWdodCAoQykgMjAwNyBDYW1lcm9uIFp3YXJpY2ggKGN3endhcmljaEB1d2F0ZXJs
b28uY2EpCiAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWFrcyBPcmxvdmljaAogKiAgQ29weXJpZ2h0
IChDKSAyMDA3IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgSWdhbGlhLCBTLkwuCiAqCiAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMTQ2LDE0ICsxNDcsMTUg
QEAgYm9vbCBSZXNvbHZlTm9kZTo6aXNQdXJlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Ip
IGNvbnN0CiAKIFJlZ2lzdGVySUQqIFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVH
ZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3Rl
cklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgeworICAgIFJlc29s
dmVSZXN1bHQgbG9jYXRpb24gPSBnZW5lcmF0b3IucmVzb2x2ZShtX2lkZW50KTsKKyAgICBpZiAo
UmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CiAg
ICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAg
IHJldHVybiAwOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZO
ZWVkZWQoZHN0LCBsb2NhbCk7CiAgICAgfQogICAgIAogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVz
c2lvbkluZm8obV9zdGFydE9mZnNldCArIG1faWRlbnQubGVuZ3RoKCksIG1faWRlbnQubGVuZ3Ro
KCksIDApOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJlc29sdmUoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgbV9pZGVudCk7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UmVz
b2x2ZShnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBsb2NhdGlvbiwgbV9pZGVudCk7
CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcnJheU5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDYsNyArMzQ4LDcgQEAgUmVnaXN0
ZXJJRCogRXZhbEZ1bmN0aW9uQ2FsbE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRv
ciYgZ2VuZXJhdG9yLCBSZWcKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRv
ci50ZW1wRGVzdGluYXRpb24oZHN0KTsKICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMo
Z2VuZXJhdG9yLCBtX2FyZ3MpOwogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2
b3QoKSAtIHN0YXJ0T2Zmc2V0KCkgKyA0LCA0LCAwKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJlc29s
dmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBnZW5l
cmF0b3IucHJvcGVydHlOYW1lcygpLmV2YWwpOworICAgIGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdp
dGhUaGlzKGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCksIGZ1bmMuZ2V0KCksIGdlbmVyYXRv
ci5yZXNvbHZlKGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuZXZhbCksIGdlbmVyYXRvci5wcm9w
ZXJ0eU5hbWVzKCkuZXZhbCk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbEV2YWwoZ2Vu
ZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBmdW5jLmdldCgpKSwgZnVuYy5nZXQoKSwgY2Fs
bEFyZ3VtZW50cywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwogfQogCkBA
IC0zNjQsMjAgKzM2NiwxOSBAQCBSZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxWYWx1ZU5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZQogCiBSZWdpc3RlcklE
KiBGdW5jdGlvbkNhbGxSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVmUHRyPFJlZ2lzdGVy
SUQ+IGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7Ci0gICAgICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3Iu
dGVtcERlc3RpbmF0aW9uKGRzdCksIGxvY2FsLmdldCgpKTsKKyAgICBSZXNvbHZlUmVzdWx0IGxv
Y2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJ
RCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1w
RGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOwogICAgICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1
bWVudHMoZ2VuZXJhdG9yLCBtX2FyZ3MpOwogICAgICAgICBnZW5lcmF0b3IuZW1pdExvYWQoY2Fs
bEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIoKSwganNVbmRlZmluZWQoKSk7Ci0gICAgICAgIHJldHVy
biBnZW5lcmF0b3IuZW1pdENhbGwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb25Pcklnbm9yZWQo
ZHN0LCBjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpKSwgZnVuY3Rpb24uZ2V0KCksIGNhbGxB
cmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdu
b3JlZChkc3QsIGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCkpLCBmdW5jLmdldCgpLCBjYWxs
QXJndW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiAgICAgfQog
Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGggPSAwOwotICAgIEpTT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFs
c2U7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHkobV9pZGVudCwgaW5kZXgs
IGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGlu
ZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7
Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29w
ZWRWYXIoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVj
dCk7CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IGZ1bmMgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgIENhbGxBcmd1
bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CisgICAgICAgIGdlbmVyYXRv
ci5lbWl0R2V0U3RhdGljVmFyKGZ1bmMuZ2V0KCksIGxvY2F0aW9uKTsKICAgICAgICAgZ2VuZXJh
dG9yLmVtaXRMb2FkKGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCksIGpzVW5kZWZpbmVkKCkp
OwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3Rp
bmF0aW9uT3JJZ25vcmVkKGRzdCwgZnVuYy5nZXQoKSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVu
dHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICB9CkBAIC0zODUs
OCArMzg2LDkgQEAgUmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLAogICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBmdW5jID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwogICAgIENhbGxBcmd1bWVudHMgY2Fs
bEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CiAgICAgaW50IGlkZW50aWZpZXJTdGFydCA9
IGRpdm90KCkgLSBzdGFydE9mZnNldCgpOworCiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9u
SW5mbyhpZGVudGlmaWVyU3RhcnQgKyBtX2lkZW50Lmxlbmd0aCgpLCBtX2lkZW50Lmxlbmd0aCgp
LCAwKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRo
aXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBtX2lkZW50KTsKKyAgICBnZW5lcmF0b3IuZW1pdFJl
c29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBs
b2NhdGlvbiwgbV9pZGVudCk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0
b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgp
LCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiB9
CiAKQEAgLTU1MCwyNCArNTUyLDIxIEBAIHN0YXRpYyBSZWdpc3RlcklEKiBlbWl0UG9zdEluY09y
RGVjKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAKIFJlZ2lz
dGVySUQqIFBvc3RmaXhSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9j
YWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVy
YXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0
aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCog
bG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChs
b2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7CiAgICAgICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRv
ci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAg
ICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRUb0pTTnVtYmVyKGdlbmVyYXRvci5maW5hbERlc3RpbmF0
aW9uKGRzdCksIGxvY2FsKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJh
dG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiBlbWl0UHJlSW5jT3JEZWMo
Z2VuZXJhdG9yLCBsb2NhbCwgbV9vcGVyYXRvcik7CiAgICAgICAgIHJldHVybiBlbWl0UG9zdElu
Y09yRGVjKGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWws
IG1fb3BlcmF0b3IpOwogICAgIH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRl
cHRoID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVp
cmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFBy
b3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tz
LCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVx
dWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9
IGdlbmVyYXRvci5lbWl0R2V0U2NvcGVkVmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgZGVw
dGgsIGluZGV4LCBnbG9iYWxPYmplY3QpOworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpICYm
ICFsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2
YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0U3RhdGljVmFyKGdlbmVyYXRvci5uZXdUZW1wb3Jhcnko
KSwgbG9jYXRpb24pOwogICAgICAgICBSZWdpc3RlcklEKiBvbGRWYWx1ZTsKICAgICAgICAgaWYg
KGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7CiAgICAgICAgICAgICBvbGRWYWx1
ZSA9IDA7CkBAIC01NzUsMTMgKzU3NCwxMyBAQCBSZWdpc3RlcklEKiBQb3N0Zml4UmVzb2x2ZU5v
ZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpcwogICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09yRGVjKGdl
bmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCksIG1f
b3BlcmF0b3IpOwogICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFy
KGRlcHRoLCBpbmRleCwgdmFsdWUuZ2V0KCksIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVy
YXRvci5lbWl0UHV0U3RhdGljVmFyKGxvY2F0aW9uLCB2YWx1ZS5nZXQoKSk7CiAgICAgICAgIHJl
dHVybiBvbGRWYWx1ZTsKICAgICB9Ci0KKyAgICAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Np
b25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8
UmVnaXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0
b3IubmV3VGVtcG9yYXJ5KCksIHZhbHVlLmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5u
ZXdUZW1wb3JhcnkoKSwgdmFsdWUuZ2V0KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICBSZWdp
c3RlcklEKiBvbGRWYWx1ZTsKICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0
KCkpIHsKICAgICAgICAgb2xkVmFsdWUgPSAwOwpAQCAtNjUzLDExICs2NTIsMTIgQEAgUmVnaXN0
ZXJJRCogUG9zdGZpeEVycm9yTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IsIFJlZ2lzdGUKIAogUmVnaXN0ZXJJRCogRGVsZXRlUmVzb2x2ZU5vZGU6OmVtaXRC
eXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7
Ci0gICAgaWYgKGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkKKyAgICBSZXNvbHZlUmVz
dWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKGdlbmVy
YXRvci5yZWdpc3RlckZvcihsb2NhdGlvbikpCiAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1p
dExvYWQoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgZmFsc2UpOwogCiAgICAgZ2Vu
ZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZz
ZXQoKSk7Ci0gICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2Uo
Z2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBtX2lkZW50KTsKKyAgICBSZWdpc3RlcklE
KiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRE
ZWxldGVCeUlkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgYmFzZSksIGJhc2UsIG1f
aWRlbnQpOwogfQogCkBAIC03MDgsMTMgKzcwOCwxNCBAQCBSZWdpc3RlcklEKiBWb2lkTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dAogCiBSZWdpc3RlcklEKiBUeXBlT2ZSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2Rl
R2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0
ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICBSZXNv
bHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYg
KFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewog
ICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAg
ICByZXR1cm4gMDsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VHlwZU9mKGdlbmVyYXRv
ci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxvY2FsKTsKICAgICB9CiAKLSAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gc2NyYXRjaCA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRl
bXBEZXN0aW5hdGlvbihkc3QpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2Ny
YXRjaCA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlv
bihkc3QpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKHNj
cmF0Y2guZ2V0KCksIHNjcmF0Y2guZ2V0KCksIG1faWRlbnQpOwogICAgIGlmIChkc3QgPT0gZ2Vu
ZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC03MzcsMzIgKzcz
OCwyOCBAQCBSZWdpc3RlcklEKiBUeXBlT2ZWYWx1ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcgogCiBSZWdpc3RlcklEKiBQcmVmaXhSZXNv
bHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lz
dGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVn
aXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJh
dG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJh
dG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9j
YWxDb25zdGFudChtX2lkZW50KSkgewogICAgICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3Iu
aWdub3JlZFJlc3VsdCgpKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAg
UmVmUHRyPFJlZ2lzdGVySUQ+IHIwID0gZ2VuZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRvci5maW5h
bERlc3RpbmF0aW9uKGRzdCksIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpID8gMS4wIDogLTEu
MCk7CiAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRCaW5hcnlPcChvcF9hZGQsIHIw
LmdldCgpLCBsb2NhbCwgcjAuZ2V0KCksIE9wZXJhbmRUeXBlcygpKTsKICAgICAgICAgfQotCiAg
ICAgICAgIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIGxvY2FsLCBtX29wZXJhdG9yKTsKICAg
ICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbG9j
YWwpOwogICAgIH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsK
LSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1p
Y0NoZWNrcyA9IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1f
aWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxP
YmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5h
bWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wRHN0ID0gZ2VuZXJh
dG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBkZXB0
aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkgJiYg
IWxvY2F0aW9uLmlzSW1tdXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHBy
b3BEc3QgPSBnZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIGxvY2F0aW9uKTsKICAgICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwg
cHJvcERzdC5nZXQoKSwgbV9vcGVyYXRvcik7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2Nv
cGVkVmFyKGRlcHRoLCBpbmRleCwgcHJvcERzdC5nZXQoKSwgZ2xvYmFsT2JqZWN0KTsKKyAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0aWNWYXIobG9jYXRpb24sIHByb3BEc3QuZ2V0KCkpOwog
ICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBw
cm9wRHN0LmdldCgpKTsKICAgICB9CiAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZv
KGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsKLSAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVy
YXRvci5uZXdUZW1wb3JhcnkoKSwgcHJvcERzdC5nZXQoKSwgbV9pZGVudCk7CisgICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0
b3IubmV3VGVtcG9yYXJ5KCksIHByb3BEc3QuZ2V0KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAg
ICBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJhdG9yLCBwcm9wRHN0LmdldCgpLCBtX29wZXJhdG9yKTsK
ICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgcHJvcERzdC5n
ZXQoKSk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRz
dCwgcHJvcERzdC5nZXQoKSk7CkBAIC0xMTUwLDEwICsxMTQ3LDExIEBAIHN0YXRpYyBBTFdBWVNf
SU5MSU5FIFJlZ2lzdGVySUQqIGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChCeXRlY29kZUdlbmVy
YXRvciYgZ2VuCiAKIFJlZ2lzdGVySUQqIFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAg
ICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkp
IHsKLSAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAg
ICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisK
KyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRp
b24pKSB7CisgICAgICAgIGlmIChsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKQogICAgICAgICAgICAg
cmV0dXJuIGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5h
bERlc3RpbmF0aW9uKGRzdCksIGxvY2FsLCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlw
ZXMoUmVzdWx0VHlwZTo6dW5rbm93blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigp
KSk7Ci0gICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChnZW5lcmF0b3IubGVmdEhhbmRT
aWRlTmVlZHNDb3B5KG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVy
YXRvcikpKSB7CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpOwpAQCAtMTE2NywyMCArMTE2NSwxNiBAQCBSZWdpc3RlcklEKiBS
ZWFkTW9kaWZ5UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBSZQogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZO
ZWVkZWQoZHN0LCByZXN1bHQpOwogICAgIH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6
ZV90IGRlcHRoID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29s
IHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNj
b3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWlj
Q2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAm
JiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBz
cmMxID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlv
bihkc3QpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlz
U3RhdGljKCkgJiYgIWxvY2F0aW9uLmlzSW1tdXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IudGVt
cERlc3RpbmF0aW9uKGRzdCksIGxvY2F0aW9uKTsKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0
ID0gZW1pdFJlYWRNb2RpZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVz
dGluYXRpb24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRv
ciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3Vs
dERlc2NyaXB0b3IoKSkpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0
aCwgaW5kZXgsIHJlc3VsdCwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQ
dXRTdGF0aWNWYXIobG9jYXRpb24sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAg
ICAgfQogCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IudGVtcERlc3Rp
bmF0aW9uKGRzdCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0g
c3RhcnRPZmZzZXQoKSArIG1faWRlbnQubGVuZ3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwot
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJh
c2UoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBzcmMxLmdldCgpLCBtX2lkZW50KTsKKyAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdl
bmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgc3JjMS5nZXQoKSwgbG9jYXRpb24sIG1faWRlbnQpOwog
ICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0
b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0
KCksIG1fcmlnaHQsIG1fb3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3du
VHlwZSgpLCBtX3JpZ2h0LT5yZXN1bHREZXNjcmlwdG9yKCkpLCB0aGlzKTsKICAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHJlc3VsdCk7CiB9CkBA
IC0xMTg5LDI3ICsxMTgzLDI0IEBAIFJlZ2lzdGVySUQqIFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlCiAKIFJlZ2lzdGVy
SUQqIEFzc2lnblJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdl
bmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9
IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9y
LmlzTG9jYWxDb25zdGFudChtX2lkZW50KSkKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0g
Z2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9jYWwg
PSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2NhdGlv
bi5pc0ltbXV0YWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShk
c3QsIG1fcmlnaHQpOwotICAgICAgICAKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2Vu
ZXJhdG9yLmVtaXROb2RlKGxvY2FsLCBtX3JpZ2h0KTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRv
ci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKICAgICB9CiAKLSAgICBp
bnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAg
ICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgs
IHRydWUsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBt
aXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0NoZWNrcykgeworICAgIGlm
IChsb2NhdGlvbi5pc1N0YXRpYygpICYmICFsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7CiAgICAg
ICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIGRz
dCA9IDA7CiAgICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRz
dCwgbV9yaWdodCk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBp
bmRleCwgdmFsdWUsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3Rh
dGljVmFyKGxvY2F0aW9uLCB2YWx1ZSk7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAK
LSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VG
b3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9y
Lm5ld1RlbXBvcmFyeSgpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiAgICAgaWYgKGRzdCA9PSBnZW5l
cmF0b3IuaWdub3JlZFJlc3VsdCgpKQogICAgICAgICBkc3QgPSAwOwogICAgIFJlZ2lzdGVySUQq
IHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdodCk7CkBAIC0xMjk3LDggKzEy
ODgsMTAgQEAgUmVnaXN0ZXJJRCogQ29tbWFOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5l
cmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHMKIAogUmVnaXN0ZXJJRCogQ29uc3REZWNs
Tm9kZTo6ZW1pdENvZGVTaW5nbGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvcikKIHsKKyAg
ICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmVDb25zdERlY2wobV9p
ZGVudCk7CisKICAgICAvLyBGSVhNRTogVGhpcyBjb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBiZWhh
dmlvciBvZiBjb25zdCBpbiBGaXJlZm94LgotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdl
bmVyYXRvci5jb25zdFJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgaWYgKFJlZ2lzdGVySUQq
IGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAo
IW1faW5pdCkKICAgICAgICAgICAgIHJldHVybiBsb2NhbDsKIApAQCAtMTMwNywyNyArMTMwMCwx
NSBAQCBSZWdpc3RlcklEKiBDb25zdERlY2xOb2RlOjplbWl0Q29kZVNpbmdsZShCeXRlY29kZUdl
bmVyYXRvciYgZ2VuZXJhdG9yKQogCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gbV9p
bml0ID8gZ2VuZXJhdG9yLmVtaXROb2RlKG1faW5pdCkgOiBnZW5lcmF0b3IuZW1pdExvYWQoMCwg
anNVbmRlZmluZWQoKSk7CiAKLSAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGdlbmVyYXRv
ci5zY29wZUNoYWluKCktPmJlZ2luKCk7Ci0gICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGdl
bmVyYXRvci5zY29wZUNoYWluKCktPmVuZCgpOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAg
Zm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKLSAgICAgICAgSlNPYmplY3Qq
IGN1cnJlbnRTY29wZSA9IGl0ZXItPmdldCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+
aXNWYXJpYWJsZU9iamVjdCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEpTVmFy
aWFibGVPYmplY3QqIGN1cnJlbnRWYXJpYWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFi
bGVPYmplY3QqPihjdXJyZW50U2NvcGUpOwotICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5
ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0LT5zeW1ib2xUYWJsZSgpLmdldChtX2lkZW50LmltcGwo
KSk7Ci0gICAgICAgIGlmIChlbnRyeS5pc051bGwoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihnZW5lcmF0b3Iuc2Nv
cGVEZXB0aCgpICsgZGVwdGgsIGVudHJ5LmdldEluZGV4KCksIHZhbHVlLmdldCgpLCBjdXJyZW50
VmFyaWFibGVPYmplY3QtPmlzR2xvYmFsT2JqZWN0KCkgPyBjdXJyZW50VmFyaWFibGVPYmplY3Qg
OiAwKTsKLSAgICB9Ci0KKyAgICBpZiAobG9jYXRpb24uaXNTdGF0aWMoKSkKKyAgICAgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKGxvY2F0aW9uLCB2YWx1ZS5nZXQoKSk7Cisg
ICAgCiAgICAgaWYgKGdlbmVyYXRvci5jb2RlVHlwZSgpICE9IEV2YWxDb2RlKQogICAgICAgICBy
ZXR1cm4gdmFsdWUuZ2V0KCk7CiAKICAgICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3Vs
ZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFsIGJsb2NrLCBpdCB3aWxsIGFzc2lnbgogICAgIC8vIHRv
IHRoZSB3cm9uZyBiYXNlIGlmIG1faWRlbnQgZXhpc3RzIGluIGFuIGludGVydmVuaW5nIHdpdGgg
c2NvcGUuCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29s
dmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKSwgbG9jYXRpb24sIG1faWRlbnQpOwogICAgIHJldHVybiBnZW5lcmF0b3IuZW1p
dFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgdmFsdWUuZ2V0KCkpOwogfQogCkBAIC0xNTk4
LDExICsxNTc5LDEyIEBAIFJlZ2lzdGVySUQqIEZvckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVj
b2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAgICAgYm9vbCBvcHRpbWl6
ZWRGb3JpbkFjY2VzcyA9IGZhbHNlOwogICAgIGlmIChtX2xleHByLT5pc1Jlc29sdmVOb2RlKCkp
IHsKICAgICAgICAgY29uc3QgSWRlbnRpZmllciYgaWRlbnQgPSBzdGF0aWNfY2FzdDxSZXNvbHZl
Tm9kZSo+KG1fbGV4cHIpLT5pZGVudGlmaWVyKCk7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IGdl
bmVyYXRvci5yZWdpc3RlckZvcihpZGVudCk7CisgICAgICAgIFJlc29sdmVSZXN1bHQgbG9jYXRp
b24gPSBnZW5lcmF0b3IucmVzb2x2ZShpZGVudCk7CisgICAgICAgIHByb3BlcnR5TmFtZSA9IGdl
bmVyYXRvci5yZWdpc3RlckZvcihsb2NhdGlvbik7CiAgICAgICAgIGlmICghcHJvcGVydHlOYW1l
KSB7CiAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7
CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvdGVjdCA9IHByb3BlcnR5TmFtZTsK
LSAgICAgICAgICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNl
Rm9yUHV0KGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgaWRlbnQpOworICAgICAgICAgICAgUmVn
aXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9y
Lm5ld1RlbXBvcmFyeSgpLCBsb2NhdGlvbiwgaWRlbnQpOwogCiAgICAgICAgICAgICBnZW5lcmF0
b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgp
KTsKICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLCBpZGVudCwgcHJvcGVy
dHlOYW1lKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122631</attachid>
            <date>2012-01-16 07:19:12 -0800</date>
            <delta_ts>2012-01-18 06:10:03 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76285-20120116161910.patch</filename>
            <type>text/plain</type>
            <size>53907</size>
            <attacher name="Andy Wingo">wingo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1MDQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA1
NjA1ZjVjMjk2YmM3ZjM5OTFkNGNhMzJmYTMzZWIzYzU2YjM1ZDE0Li5iM2M0YmExY2NhNTZkYzQx
MTEzYjkxMDY1YjUyZjM0MTZjZjBjYzc3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0MyBAQAorMjAxMi0wMS0xMyAgQW5keSBXaW5nbyAgPHdpbmdvQGlnYWxpYS5jb20+CisK
KyAgICAgICAgUmVmYWN0b3IgaWRlbnRpZmllciByZXNvbHV0aW9uIGluIEJ5dGVjb2RlR2VuZXJh
dG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OlJlc29sdmVSZXN1
bHQpOiBOZXcgc3RydWN0dXJlLCB0byBkZXNjcmliZSB0aGUgc3RvcmFnZQorICAgICAgICBsb2Nh
dGlvbiBjb3JyZXNwb25kaW5nIHRvIGFuIGlkZW50aWZpZXIgaW4gYSBwcm9ncmFtLgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNpbmcKKyAgICAg
ICAgZmluZFNjb3BlZFByb3BlcnR5LgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6
cmVzb2x2ZUNvbnN0RGVjbCk6IE5ldyBmdW5jdGlvbiwKKyAgICAgICAgZW5jYXBzdWxhdGluZyB3
aGF0IENvbnN0RGVjbE5vZGU6OmVtaXRCeXRlY29kZSB1c2VkIHRvIGRvLgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRpY1Zhcik6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U3RhdGljVmFyKTogTmV3IGZ1bmN0aW9ucywKKyAgICAg
ICAgY29ycmVzcG9uZGluZyB0byB0aGUgb2xkIGVtaXRHZXRTY29wZWRWYXIgYW5kIGVtaXRQdXRT
Y29wZWRWYXIuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcik6
CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZSk6CisgICAgICAg
IChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZUJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KToKKyAgICAgICAgKEpT
Qzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyk6IENoYW5nZSB0byBhY2Nl
cHQgYQorICAgICAgICAibG9jYXRpb24iIGFyZ3VtZW50LiAgVGhpcyBpcyBtb3JlIGNsZWFyLCBh
bmQgcmVkdWNlcyB0aGUgYW1vdW50CisgICAgICAgIG9mIGRvdWJsZSBhbmFseXNpcyBoYXBwZW5p
bmcgYXQgY29tcGlsZS10aW1lLgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4u
Y3BwOgorICAgICAgICAoSlNDOjpSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAg
KEpTQzo6RXZhbEZ1bmN0aW9uQ2FsbE5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6
OkZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpQ
b3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkRlbGV0ZVJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpUeXBlT2ZSZXNvbHZlTm9k
ZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6UHJlZml4UmVzb2x2ZU5vZGU6OmVtaXRC
eXRlY29kZSk6CisgICAgICAgIChKU0M6OlJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKToKKyAgICAgICAgKEpTQzo6QXNzaWduUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6Cisg
ICAgICAgIChKU0M6OkNvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKToKKyAgICAgICAgKEpT
Qzo6Rm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUpOiBSZWZhY3RvciB0byB1c2UgdGhlIG5ldworICAg
ICAgICBSZXNvbHZlUmVzdWx0IHN0cnVjdHVyZS4KKwogMjAxMi0wMS0xNiAgWXVxaWFuZyBYaWFu
ICA8eXVxaWFuZy54aWFuQGludGVsLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXggb24gMzJiaXQg
aWYgdmVyYm9zZSBkZWJ1ZyBpcyBlbmFibGVkIGluIERGRwpkaWZmIC0tZ2l0IGEvU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAppbmRleCBi
ZmIxNjE4YTYyMDI3YTMzNzMxYzAyOGVkMjEzZGVkYTIzMmY4YWExLi5kYWZkMWI4ODgzMTczMDU0
NGQ0OWJhNGNmYmFlYTc0ZTkxYWZmZDVkIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcApAQCAtMSw2ICsxLDcg
QEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA4IENhbWVyb24gWndhcmljaCA8Y3d6d2Fy
aWNoQHV3YXRlcmxvby5jYT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBJZ2FsaWEsIFMuTC4KICAq
CiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNTAzLDQwICs1MDQsMTIgQEAgdm9pZCBC
eXRlY29kZUdlbmVyYXRvcjo6YWRkUGFyYW1ldGVyKGNvbnN0IElkZW50aWZpZXImIGlkZW50LCBp
bnQgcGFyYW1ldGVySW5kZXgKICAgICBtX2NvZGVCbG9jay0+YWRkUGFyYW1ldGVyKCk7CiB9CiAK
LVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcihjb25zdCBJZGVudGlm
aWVyJiBpZGVudCkKK1JlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcihj
b25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbikKIHsKLSAgICBpZiAoaWRlbnQgPT0gcHJvcGVy
dHlOYW1lcygpLnRoaXNJZGVudGlmaWVyKQotICAgICAgICByZXR1cm4gJm1fdGhpc1JlZ2lzdGVy
OwotICAgICAgICAKLSAgICBpZiAobV9jb2RlVHlwZSA9PSBHbG9iYWxDb2RlKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIGlmICghc2hvdWxkT3B0aW1pemVMb2NhbHMoKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gc3ltYm9sVGFibGUoKS5nZXQo
aWRlbnQuaW1wbCgpKTsKLSAgICBpZiAoZW50cnkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgaWYgKGlkZW50ID09IHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMpCi0gICAgICAg
IGNyZWF0ZUFyZ3VtZW50c0lmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gY3JlYXRlTGF6eVJl
Z2lzdGVySWZOZWNlc3NhcnkoJnJlZ2lzdGVyRm9yKGVudHJ5LmdldEluZGV4KCkpKTsKLX0KLQot
UmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmNvbnN0UmVnaXN0ZXJGb3IoY29uc3QgSWRl
bnRpZmllciYgaWRlbnQpCi17Ci0gICAgaWYgKG1fY29kZVR5cGUgPT0gRXZhbENvZGUpCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgaWYgKG1fY29kZVR5cGUgPT0gR2xvYmFsQ29kZSkKKyAgICBp
ZiAoIWxvY2F0aW9uLmlzUmVnaXN0ZXIoKSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBTeW1i
b2xUYWJsZUVudHJ5IGVudHJ5ID0gc3ltYm9sVGFibGUoKS5nZXQoaWRlbnQuaW1wbCgpKTsKLSAg
ICBpZiAoZW50cnkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGNy
ZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRleCgp
KSk7CisgICAgcmV0dXJuIGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZv
cihsb2NhdGlvbi5pbmRleCkpOwogfQogCiBib29sIEJ5dGVjb2RlR2VuZXJhdG9yOjp3aWxsUmVz
b2x2ZVRvQXJndW1lbnRzKGNvbnN0IElkZW50aWZpZXImIGlkZW50KQpAQCAtMTE1OSw1OSArMTEz
MiwxMzcgQEAgUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb2FkKFJlZ2lzdGVy
SUQqIGRzdCwgSlNWYWx1ZSB2KQogICAgIHJldHVybiBjb25zdGFudElEOwogfQogCi1ib29sIEJ5
dGVjb2RlR2VuZXJhdG9yOjpmaW5kU2NvcGVkUHJvcGVydHkoY29uc3QgSWRlbnRpZmllciYgcHJv
cGVydHksIGludCYgaW5kZXgsIHNpemVfdCYgc3RhY2tEZXB0aCwgYm9vbCBmb3JXcml0aW5nLCBi
b29sJiByZXF1aXJlc0R5bmFtaWNDaGVja3MsIEpTT2JqZWN0KiYgZ2xvYmFsT2JqZWN0KQorUmVz
b2x2ZVJlc3VsdCBCeXRlY29kZUdlbmVyYXRvcjo6cmVzb2x2ZShjb25zdCBJZGVudGlmaWVyJiBw
cm9wZXJ0eSkKIHsKKyAgICBSZXNvbHZlUmVzdWx0IHJldCA9IHsgMCwgMCwgMCwgMCB9OworICAg
IAorICAgIGlmIChwcm9wZXJ0eSA9PSBwcm9wZXJ0eU5hbWVzKCkudGhpc0lkZW50aWZpZXIpIHsK
KyAgICAgICAgcmV0LnR5cGUgPSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdpc3RlcjsKKyAg
ICAgICAgcmV0LmluZGV4ID0gbV90aGlzUmVnaXN0ZXIuaW5kZXgoKTsKKyAgICAgICAgcmV0dXJu
IHJldDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGFs
bG9jYXRlZCBpbiBhIHJlZ2lzdGVyLgorICAgIGlmIChtX2NvZGVUeXBlICE9IEdsb2JhbENvZGUg
JiYgc2hvdWxkT3B0aW1pemVMb2NhbHMoKSkgeworICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVu
dHJ5ID0gc3ltYm9sVGFibGUoKS5nZXQocHJvcGVydHkuaW1wbCgpKTsKKyAgICAgICAgaWYgKCFl
bnRyeS5pc051bGwoKSkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IHByb3BlcnR5TmFt
ZXMoKS5hcmd1bWVudHMpCisgICAgICAgICAgICAgICAgY3JlYXRlQXJndW1lbnRzSWZOZWNlc3Nh
cnkoKTsKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI7Cisg
ICAgICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQorICAgICAgICAgICAgICAgIHJldC50
eXBlIHw9IFJlc29sdmVSZXN1bHQ6OkltbXV0YWJsZUZsYWc7CisgICAgICAgICAgICByZXQuaW5k
ZXggPSBlbnRyeS5nZXRJbmRleCgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAg
fQorICAgIH0KKwogICAgIC8vIENhc2VzIHdoZXJlIHdlIGNhbm5vdCBzdGF0aWNhbGx5IG9wdGlt
aXplIHRoZSBsb29rdXAuCiAgICAgaWYgKHByb3BlcnR5ID09IHByb3BlcnR5TmFtZXMoKS5hcmd1
bWVudHMgfHwgIWNhbk9wdGltaXplTm9uTG9jYWxzKCkpIHsKLSAgICAgICAgc3RhY2tEZXB0aCA9
IDA7Ci0gICAgICAgIGluZGV4ID0gbWlzc2luZ1N5bWJvbE1hcmtlcigpOwotCisgICAgICAgIHJl
dC5pbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKKyAgICAgICAgcmV0LmRlcHRoID0gMDsK
ICAgICAgICAgaWYgKHNob3VsZE9wdGltaXplTG9jYWxzKCkgJiYgbV9jb2RlVHlwZSA9PSBHbG9i
YWxDb2RlKSB7CiAgICAgICAgICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IG1fc2NvcGVD
aGFpbi0+YmVnaW4oKTsKLSAgICAgICAgICAgIGdsb2JhbE9iamVjdCA9IGl0ZXItPmdldCgpOwor
ICAgICAgICAgICAgcmV0LnR5cGUgPSBSZXNvbHZlUmVzdWx0OjpHbG9iYWw7CisgICAgICAgICAg
ICByZXQuZ2xvYmFsT2JqZWN0ID0gaXRlci0+Z2V0KCk7CiAgICAgICAgICAgICBBU1NFUlQoKCsr
aXRlcikgPT0gbV9zY29wZUNoYWluLT5lbmQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CiAgICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHNpemVf
dCBkZXB0aCA9IDA7Ci0gICAgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7CiAgICAgU2Nv
cGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBtX3Njb3BlQ2hhaW4tPmJlZ2luKCk7CiAgICAgU2NvcGVD
aGFpbkl0ZXJhdG9yIGVuZCA9IG1fc2NvcGVDaGFpbi0+ZW5kKCk7Ci0gICAgZm9yICg7IGl0ZXIg
IT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKKyAgICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRl
ciwgKytyZXQuZGVwdGgpIHsKICAgICAgICAgSlNPYmplY3QqIGN1cnJlbnRTY29wZSA9IGl0ZXIt
PmdldCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJsZU9iamVjdCgpKQor
ICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJsZU9iamVjdCgpKSB7CisgICAgICAg
ICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CiAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfSAgICAgICAgCiAgICAgICAgIEpTVmFyaWFibGVPYmplY3QqIGN1cnJlbnRW
YXJpYWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFibGVPYmplY3QqPihjdXJyZW50U2Nv
cGUpOwogICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gY3VycmVudFZhcmlhYmxlT2Jq
ZWN0LT5zeW1ib2xUYWJsZSgpLmdldChwcm9wZXJ0eS5pbXBsKCkpOwogCiAgICAgICAgIC8vIEZv
dW5kIHRoZSBwcm9wZXJ0eQogICAgICAgICBpZiAoIWVudHJ5LmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpICYmIGZvcldyaXRpbmcpIHsKLSAgICAgICAgICAg
ICAgICBzdGFja0RlcHRoID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1pc3NpbmdTeW1i
b2xNYXJrZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoKytpdGVyID09IGVuZCkKLSAgICAgICAg
ICAgICAgICAgICAgZ2xvYmFsT2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OwotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldC50eXBlIHw9IFJlc29sdmVS
ZXN1bHQ6OkluZGV4ZWRGbGFnOworICAgICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkK
KyAgICAgICAgICAgICAgICByZXQudHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVGbGFn
OworICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpIHsKKyAgICAgICAgICAgICAgICByZXQu
dHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpHbG9iYWxGbGFnOworICAgICAgICAgICAgICAgIHJldC5n
bG9iYWxPYmplY3QgPSBjdXJyZW50U2NvcGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIHJldC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OlNjb3BlRmxhZzsKKyAgICAgICAg
ICAgICAgICByZXQuZGVwdGggKz0gbV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKTsK
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YWNrRGVwdGggPSBkZXB0aCArIG1fY29kZUJs
b2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7Ci0gICAgICAgICAgICBpbmRleCA9IGVudHJ5Lmdl
dEluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoKytpdGVyID09IGVuZCkKLSAgICAgICAgICAgICAg
ICBnbG9iYWxPYmplY3QgPSBjdXJyZW50VmFyaWFibGVPYmplY3Q7Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghcmV0LmlzRHluYW1pYygpKQorICAgICAgICAgICAg
ICAgIHJldC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OlN0YXRpY0ZsYWc7CisgICAgICAgICAgICBy
ZXQuaW5kZXggPSBlbnRyeS5nZXRJbmRleCgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAg
ICAgICAgfQogICAgICAgICBib29sIHNjb3BlUmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7
Ci0gICAgICAgIGlmIChjdXJyZW50VmFyaWFibGVPYmplY3QtPmlzRHluYW1pY1Njb3BlKHNjb3Bl
UmVxdWlyZXNEeW5hbWljQ2hlY2tzKSkKKyAgICAgICAgaWYgKGN1cnJlbnRWYXJpYWJsZU9iamVj
dC0+aXNEeW5hbWljU2NvcGUoc2NvcGVSZXF1aXJlc0R5bmFtaWNDaGVja3MpKSB7CisgICAgICAg
ICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CiAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgcmVxdWlyZXNEeW5hbWljQ2hlY2tzIHw9IHNjb3BlUmVxdWlyZXNEeW5hbWlj
Q2hlY2tzOworICAgICAgICB9CisgICAgICAgIGlmIChzY29wZVJlcXVpcmVzRHluYW1pY0NoZWNr
cykKKyAgICAgICAgICAgIHJldC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWNGbGFnOwog
ICAgIH0KKwogICAgIC8vIENhbid0IGxvY2F0ZSB0aGUgcHJvcGVydHkgYnV0IHdlJ3JlIGFibGUg
dG8gYXZvaWQgYSBmZXcgbG9va3Vwcy4KLSAgICBzdGFja0RlcHRoID0gZGVwdGggKyBtX2NvZGVC
bG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpOwotICAgIGluZGV4ID0gbWlzc2luZ1N5bWJvbE1h
cmtlcigpOwogICAgIEpTT2JqZWN0KiBzY29wZSA9IGl0ZXItPmdldCgpOwotICAgIGlmICgrK2l0
ZXIgPT0gZW5kKQotICAgICAgICBnbG9iYWxPYmplY3QgPSBzY29wZTsKLSAgICByZXR1cm4gdHJ1
ZTsKKyAgICByZXQuZGVwdGggKz0gbV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKTsK
KyAgICBpZiAoKytpdGVyID09IGVuZCkgeworICAgICAgICByZXQudHlwZSB8PSBSZXNvbHZlUmVz
dWx0OjpHbG9iYWw7CisgICAgICAgIHJldC5nbG9iYWxPYmplY3QgPSBzY29wZTsKKyAgICB9IGVs
c2UKKyAgICAgICAgQVNTRVJUKHJldC50eXBlID09IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWMpOwor
ICAgIHJldC5pbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKKyAgICByZXR1cm4gcmV0Owor
fQorCitSZXNvbHZlUmVzdWx0IEJ5dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlQ29uc3REZWNsKGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5KQoreworICAgIFJlc29sdmVSZXN1bHQgcmV0ID0geyAw
LCAwLCAwLCAwIH07CisgICAgCisgICAgLy8gUmVnaXN0ZXItYWxsb2NhdGVkIGNvbnN0IGRlY2xh
cmF0aW9ucy4KKyAgICBpZiAobV9jb2RlVHlwZSAhPSBFdmFsQ29kZSAmJiBtX2NvZGVUeXBlICE9
IEdsb2JhbENvZGUpIHsKKyAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5bWJvbFRh
YmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAgICAgIGlmICghZW50cnkuaXNOdWxsKCkp
IHsKKyAgICAgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI7CisgICAg
ICAgICAgICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQorICAgICAgICAgICAgICAgIHJldC50eXBl
IHw9IFJlc29sdmVSZXN1bHQ6OkltbXV0YWJsZUZsYWc7CisgICAgICAgICAgICByZXQuaW5kZXgg
PSBlbnRyeS5nZXRJbmRleCgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIENvbnN0IGRlY2xhcmF0aW9ucyBpbiBldmFsIGNvZGUgb3IgZ2xvYmFs
IGNvZGUuCisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBzY29wZUNoYWluKCktPmJlZ2lu
KCk7CisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IHNjb3BlQ2hhaW4oKS0+ZW5kKCk7Cisg
ICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrcmV0LmRlcHRoKSB7CisgICAgICAgIEpT
T2JqZWN0KiBjdXJyZW50U2NvcGUgPSBpdGVyLT5nZXQoKTsKKyAgICAgICAgaWYgKCFjdXJyZW50
U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBKU1ZhcmlhYmxlT2JqZWN0KiBjdXJyZW50VmFyaWFibGVPYmplY3QgPSBzdGF0aWNfY2FzdDxK
U1ZhcmlhYmxlT2JqZWN0Kj4oY3VycmVudFNjb3BlKTsKKyAgICAgICAgU3ltYm9sVGFibGVFbnRy
eSBlbnRyeSA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdC0+c3ltYm9sVGFibGUoKS5nZXQocHJvcGVy
dHkuaW1wbCgpKTsKKyAgICAgICAgaWYgKGVudHJ5LmlzTnVsbCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGlmICgrK2l0ZXIgPT0gZW5kKSB7CisgICAgICAgICAgICByZXQudHlw
ZSA9IFJlc29sdmVSZXN1bHQ6OkluZGV4ZWRHbG9iYWw7CisgICAgICAgICAgICByZXQuZ2xvYmFs
T2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6TGV4aWNhbDsKKyAgICAgICAgcmV0LmRlcHRo
ICs9IHNjb3BlRGVwdGgoKTsKKyAgICAgICAgcmV0LmluZGV4ID0gZW50cnkuZ2V0SW5kZXgoKTsK
KyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogV2hpbGUgdGhpcyBj
b2RlIHNob3VsZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFsIGJsb2NrLCBpdCB3aWxsIGFzc2lnbgor
ICAgIC8vIHRvIHRoZSB3cm9uZyBiYXNlIGlmIHByb3BlcnR5IGV4aXN0cyBpbiBhbiBpbnRlcnZl
bmluZyB3aXRoIHNjb3BlLgorICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYzsK
KyAgICByZXQuaW5kZXggPSBtaXNzaW5nU3ltYm9sTWFya2VyKCk7CisgICAgcmV0LmRlcHRoID0g
c2NvcGVEZXB0aCgpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHZvaWQgQnl0ZWNvZGVHZW5lcmF0
b3I6OmVtaXRDaGVja0hhc0luc3RhbmNlKFJlZ2lzdGVySUQqIGJhc2UpCkBAIC0xMjM3LDIwOCAr
MTI4OCwxMzUgQEAgYm9vbCBCeXRlY29kZUdlbmVyYXRvcjo6c2hvdWxkQXZvaWRSZXNvbHZlR2xv
YmFsKCkKICAgICByZXR1cm4gbV9jb2RlQmxvY2stPmdsb2JhbFJlc29sdmVJbmZvQ291bnQoKSA+
IG1heEdsb2JhbFJlc29sdmVzICYmICFtX2xhYmVsU2NvcGVzLnNpemUoKTsKIH0KIAotUmVnaXN0
ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlKFJlZ2lzdGVySUQqIGRzdCwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6
ZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlv
biwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsK
LSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAg
IGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVk
UHJvcGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1pY0No
ZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiAhZ2xvYmFsT2JqZWN0KSB7Ci0gICAgICAgIC8vIFdlIGNh
bid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlKTsK
LSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICByZXR1
cm4gZHN0OwotICAgIH0KLSAgICBpZiAoc2hvdWxkQXZvaWRSZXNvbHZlR2xvYmFsKCkpIHsKLSAg
ICAgICAgZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICAgICAgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0g
dHJ1ZTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAg
aWYgKGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hl
Y2tzKSB7Ci0gICAgICAgICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVydHkgbG9va3Vw
IGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAgICAgICByZXR1cm4gZW1pdEdldFNjb3Bl
ZFZhcihkc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgfQotCisgICAg
aWYgKGxvY2F0aW9uLmlzU3RhdGljKCkpCisgICAgICAgIHJldHVybiBlbWl0R2V0U3RhdGljVmFy
KGRzdCwgbG9jYXRpb24pOworICAgIAorICAgIGlmIChsb2NhdGlvbi5pc0dsb2JhbCgpICYmICFz
aG91bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgewogI2lmIEVOQUJMRShKSVQpCiAgICAgICAgIG1f
Y29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhpbnN0cnVjdGlvbnMoKS5zaXplKCkpOwog
I2VuZGlmCiAjaWYgRU5BQkxFKElOVEVSUFJFVEVSKQogICAgICAgICBtX2NvZGVCbG9jay0+YWRk
R2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUoKSk7CiAjZW5kaWYK
LSAgICAgICAgZW1pdE9wY29kZShyZXF1aXJlc0R5bmFtaWNDaGVja3MgPyBvcF9yZXNvbHZlX2ds
b2JhbF9keW5hbWljIDogb3BfcmVzb2x2ZV9nbG9iYWwpOworICAgICAgICBlbWl0T3Bjb2RlKGxv
Y2F0aW9uLmlzRHluYW1pYygpID8gb3BfcmVzb2x2ZV9nbG9iYWxfZHluYW1pYyA6IG9wX3Jlc29s
dmVfZ2xvYmFsKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7
CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwog
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7CiAgICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZCgwKTsKLSAgICAgICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkZXB0aCk7CisgICAgICAgIGlmIChsb2NhdGlvbi5p
c0R5bmFtaWMoKSkKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChsb2NhdGlvbi5k
ZXB0aCk7CiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAgfQotCi0gICAgaWYgKHJlcXVpcmVzRHlu
YW1pY0NoZWNrcykgewotICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIGV2YWwgbmVz
dGVkIGluc2lkZSBhIHx3aXRofCBqdXN0IGdpdmUgdXAKLSAgICAgICAgZW1pdE9wY29kZShvcF9y
ZXNvbHZlKTsKKyAgICAgICAgCisgICAgaWYgKGxvY2F0aW9uLnR5cGUgPT0gUmVzb2x2ZVJlc3Vs
dDo6RHluYW1pYyAmJiBsb2NhdGlvbi5kZXB0aCkgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2Ug
d2UgYXJlIGF0IGxlYXN0IGFibGUgdG8gZHJvcCBhIGZldyBzY29wZSBjaGFpbnMgZnJvbSB0aGUK
KyAgICAgICAgLy8gbG9va3VwIGNoYWluLCBhbHRob3VnaCB3ZSBzdGlsbCBuZWVkIHRvIGhhc2gg
ZnJvbSB0aGVuIG9uLgorICAgICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmVfc2tpcCk7CiAgICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgICAgICBpbnN0cnVj
dGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKKyAgICAgICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKGxvY2F0aW9uLmRlcHRoKTsKICAgICAgICAgcmV0dXJuIGRzdDsKICAgICB9
CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpKSB7Ci0gICAgICAgIC8v
IERpcmVjdGx5IGluZGV4IHRoZSBwcm9wZXJ0eSBsb29rdXAgYWNyb3NzIG11bHRpcGxlIHNjb3Bl
cy4KLSAgICAgICAgcmV0dXJuIGVtaXRHZXRTY29wZWRWYXIoZHN0LCBkZXB0aCwgaW5kZXgsIGds
b2JhbE9iamVjdCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFyZSBhdCBsZWFz
dCBhYmxlIHRvIGRyb3AgYSBmZXcgc2NvcGUgY2hhaW5zIGZyb20gdGhlCi0gICAgLy8gbG9va3Vw
IGNoYWluLCBhbHRob3VnaCB3ZSBzdGlsbCBuZWVkIHRvIGhhc2ggZnJvbSB0aGVuIG9uLgotICAg
IGVtaXRPcGNvZGUob3BfcmVzb2x2ZV9za2lwKTsKKyAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmUp
OwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChkZXB0aCk7CiAgICAgcmV0dXJuIGRzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNv
ZGVHZW5lcmF0b3I6OmVtaXRHZXRTY29wZWRWYXIoUmVnaXN0ZXJJRCogZHN0LCBzaXplX3QgZGVw
dGgsIGludCBpbmRleCwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpCitSZWdpc3RlcklEKiBCeXRlY29k
ZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2
ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIGlm
IChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAgaWYgKG1fbGFzdE9wY29kZUlEID09IG9wX3B1dF9n
bG9iYWxfdmFyKSB7Ci0gICAgICAgICAgICBpbnQgZHN0SW5kZXg7Ci0gICAgICAgICAgICBpbnQg
c3JjSW5kZXg7Ci0gICAgICAgICAgICByZXRyaWV2ZUxhc3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJ
bmRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkc3RJbmRleCA9PSBpbmRleCAm
JiBzcmNJbmRleCA9PSBkc3QtPmluZGV4KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRzdDsK
LSAgICAgICAgfQotCi0gICAgICAgIGVtaXRPcGNvZGUob3BfZ2V0X2dsb2JhbF92YXIpOwotICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1
Y3Rpb25zKCkuYXBwZW5kKGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGRzdDsKKyAgICBpZiAobG9j
YXRpb24uaXNHbG9iYWwoKSAmJiAhbG9jYXRpb24uaXNEeW5hbWljKCkpIHsKKyAgICAgICAgLy8g
R2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQorICAgICAgICBBU1NFUlQobG9jYXRpb24uZ2xvYmFs
T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShsb2NhdGlvbi5n
bG9iYWxPYmplY3QpKTsKICAgICB9CiAKLSAgICBlbWl0T3Bjb2RlKG9wX2dldF9zY29wZWRfdmFy
KTsKKyAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCisgICAgZW1pdE9wY29kZShv
cF9yZXNvbHZlX2Jhc2UpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkp
OwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKGRlcHRoKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJv
cGVydHkpKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZmFsc2UpOwogICAgIHJldHVybiBk
c3Q7CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U2NvcGVkVmFy
KHNpemVfdCBkZXB0aCwgaW50IGluZGV4LCBSZWdpc3RlcklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9i
YWxPYmplY3QpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNl
Rm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIGlmIChnbG9iYWxPYmplY3QpIHsKLSAg
ICAgICAgZW1pdE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7Ci0gICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+
aW5kZXgoKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgZW1pdE9wY29kZShv
cF9wdXRfc2NvcGVkX3Zhcik7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGluZGV4KTsKLSAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVwdGgpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQorICAgIGlmICghbV9jb2Rl
QmxvY2stPmlzU3RyaWN0TW9kZSgpKQorICAgICAgICByZXR1cm4gZW1pdFJlc29sdmVCYXNlKGRz
dCwgbG9jYXRpb24sIHByb3BlcnR5KTsKIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6
OmVtaXRSZXNvbHZlQmFzZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3Bl
cnR5KQotewotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBK
U09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNr
cyA9IGZhbHNlOwotICAgIGZpbmRTY29wZWRQcm9wZXJ0eShwcm9wZXJ0eSwgaW5kZXgsIGRlcHRo
LCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpOwotICAgIGlmICgh
Z2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAgICAgICAvLyBXZSBj
YW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZV9i
YXNlKTsKKyAgICBpZiAobG9jYXRpb24uaXNHbG9iYWwoKSAmJiAhbG9jYXRpb24uaXNEeW5hbWlj
KCkpIHsKKyAgICAgICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQorICAgICAgICBBU1NF
UlQobG9jYXRpb24uZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJl
c3VsdCA9IGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShsb2NhdGlvbi5nbG9iYWxPYmplY3QpKTsKKyAg
ICAgICAgZW1pdE9wY29kZShvcF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKICAgICAgICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7CiAgICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQoZmFsc2UpOwotICAgICAgICByZXR1cm4gZHN0OworICAgICAgICByZXR1cm4gcmVzdWx0
LmdldCgpOwogICAgIH0KIAotICAgIC8vIEdsb2JhbCBvYmplY3QgaXMgdGhlIGJhc2UKLSAgICBy
ZXR1cm4gZW1pdExvYWQoZHN0LCBKU1ZhbHVlKGdsb2JhbE9iamVjdCkpOwotfQotCi1SZWdpc3Rl
cklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQq
IGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCi17Ci0gICAgaWYgKCFtX2NvZGVCbG9j
ay0+aXNTdHJpY3RNb2RlKCkpCi0gICAgICAgIHJldHVybiBlbWl0UmVzb2x2ZUJhc2UoZHN0LCBw
cm9wZXJ0eSk7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAg
IEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hl
Y2tzID0gZmFsc2U7Ci0gICAgZmluZFNjb3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVw
dGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2JhbE9iamVjdCk7Ci0gICAgaWYg
KCFnbG9iYWxPYmplY3QgfHwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIC8vIFdl
IGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZl
X2Jhc2UpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAg
ICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAg
ICB9Ci0gICAgCi0gICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiByZXN1bHQgPSBlbWl0TG9hZChkc3QsIEpTVmFsdWUoZ2xvYmFsT2JqZWN0KSk7
Ci0gICAgZW1pdE9wY29kZShvcF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKKyAgICAvLyBXZSBj
YW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCisgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2Up
OwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIHJldHVybiByZXN1bHQu
Z2V0KCk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHRydWUpOworICAgIHJldHVybiBkc3Q7
CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZVdpdGhCYXNl
KFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZl
V2l0aEJhc2UoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3Qg
UmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewot
ICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCog
Z2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNl
OwotICAgIGlmICghZmluZFNjb3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZh
bHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2JhbE9iamVjdCkgfHwgIWdsb2JhbE9iamVj
dCB8fCByZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3Qgb3B0aW1p
c2UgYXQgYWxsIDotKAotICAgICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsK
LSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGJhc2VEc3QtPmluZGV4KCkpOwotICAgICAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3Ry
dWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICByZXR1cm4g
YmFzZURzdDsKLSAgICB9CisgICAgaWYgKGxvY2F0aW9uLmlzR2xvYmFsKCkgJiYgIWxvY2F0aW9u
LmlzRHluYW1pYygpKSB7CisgICAgICAgIC8vIEdsb2JhbCBvYmplY3QgaXMgdGhlIGJhc2UKKyAg
ICAgICAgQVNTRVJUKGxvY2F0aW9uLmdsb2JhbE9iamVjdCk7CisgICAgICAgIGVtaXRMb2FkKGJh
c2VEc3QsIEpTVmFsdWUobG9jYXRpb24uZ2xvYmFsT2JqZWN0KSk7CiAKLSAgICBib29sIGZvcmNl
R2xvYmFsUmVzb2x2ZSA9IGZhbHNlOworICAgICAgICBpZiAobG9jYXRpb24uaXNTdGF0aWMoKSkg
eworICAgICAgICAgICAgLy8gRGlyZWN0bHkgaW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jv
c3MgbXVsdGlwbGUgc2NvcGVzLgorICAgICAgICAgICAgZW1pdEdldFN0YXRpY1Zhcihwcm9wRHN0
LCBsb2NhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICAgICAgfQogCi0g
ICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpT
VmFsdWUoZ2xvYmFsT2JqZWN0KSk7CisgICAgICAgIGlmIChzaG91bGRBdm9pZFJlc29sdmVHbG9i
YWwoKSkgeworICAgICAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlKTsKKyAgICAgICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5pbmRleCgpKTsKKyAgICAgICAgICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOworICAgICAgICAgICAg
cmV0dXJuIGJhc2VEc3Q7CisgICAgICAgIH0KIAotICAgIGlmIChpbmRleCAhPSBtaXNzaW5nU3lt
Ym9sTWFya2VyKCkgJiYgIWZvcmNlR2xvYmFsUmVzb2x2ZSkgewotICAgICAgICAvLyBEaXJlY3Rs
eSBpbmRleCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAg
ICAgIGVtaXRHZXRTY29wZWRWYXIocHJvcERzdCwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3Qp
OwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9Ci0gICAgaWYgKHNob3VsZEF2b2lkUmVz
b2x2ZUdsb2JhbCgpKSB7Ci0gICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZSk7Ci0gICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1
Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIHJldHVybiBi
YXNlRHN0OwotICAgIH0KICNpZiBFTkFCTEUoSklUKQotICAgIG1fY29kZUJsb2NrLT5hZGRHbG9i
YWxSZXNvbHZlSW5mbyhpbnN0cnVjdGlvbnMoKS5zaXplKCkpOworICAgICAgICBtX2NvZGVCbG9j
ay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgog
I2lmIEVOQUJMRShJTlRFUlBSRVRFUikKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2
ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUoKSk7CisgICAgICAgIG1fY29kZUJsb2Nr
LT5hZGRHbG9iYWxSZXNvbHZlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNl
bmRpZgotICAgIGVtaXRPcGNvZGUocmVxdWlyZXNEeW5hbWljQ2hlY2tzID8gb3BfcmVzb2x2ZV9n
bG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFsKTsKKyAgICAgICAgZW1pdE9wY29kZShs
b2NhdGlvbi5pc0R5bmFtaWMoKSA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNv
bHZlX2dsb2JhbCk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5pbmRl
eCgpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5
KSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKKyAgICAgICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKDApOworICAgICAgICBpZiAobG9jYXRpb24uaXNEeW5hbWljKCkpCisgICAg
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24uZGVwdGgpOworICAgICAgICBy
ZXR1cm4gYmFzZURzdDsKKyAgICB9CisKKyAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF9i
YXNlKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYmFzZURzdC0+aW5kZXgoKSk7CiAgICAg
aW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0gICAgaWYgKHJlcXVpcmVz
RHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKICAg
ICByZXR1cm4gYmFzZURzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVt
aXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERz
dCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVy
YXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcklE
KiBwcm9wRHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmll
ciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAw
OwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5h
bWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVkUHJvcGVydHkocHJvcGVydHks
IGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0
KSB8fCAhZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNrcykgeworICAgIGlmIChs
b2NhdGlvbi5pc1N0YXRpYygpKSB7CisgICAgICAgIGVtaXRMb2FkKGJhc2VEc3QsIGpzVW5kZWZp
bmVkKCkpOworICAgICAgICBlbWl0R2V0U3RhdGljVmFyKHByb3BEc3QsIGxvY2F0aW9uKTsKKyAg
ICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgfQorCisgICAgaWYgKGxvY2F0aW9uLnR5cGUgPT0g
UmVzb2x2ZVJlc3VsdDo6RHluYW1pYykgewogICAgICAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBh
dCBhbGwgOi0oCiAgICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZV93aXRoX3RoaXMpOwogICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYmFzZURzdC0+aW5kZXgoKSk7CkBAIC0xNDQ3LDM2
ICsxNDI1LDc3IEBAIFJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZVdp
dGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVyCiAgICAgICAgIHJldHVybiBiYXNl
RHN0OwogICAgIH0KIAotICAgIGJvb2wgZm9yY2VHbG9iYWxSZXNvbHZlID0gZmFsc2U7Ci0KLSAg
ICAvLyBHbG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCiAgICAgZW1pdExvYWQoYmFzZURzdCwganNV
bmRlZmluZWQoKSk7CisgICAgcmV0dXJuIGVtaXRSZXNvbHZlKHByb3BEc3QsIGxvY2F0aW9uLCBw
cm9wZXJ0eSk7Cit9CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYm
ICFmb3JjZUdsb2JhbFJlc29sdmUpIHsKLSAgICAgICAgLy8gRGlyZWN0bHkgaW5kZXggdGhlIHBy
b3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAgICAgICBlbWl0R2V0U2Nv
cGVkVmFyKHByb3BEc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgcmV0
dXJuIGJhc2VEc3Q7CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRp
Y1ZhcihSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uKQorewor
ICAgIFJlZ2lzdGVySUQqIGxvY2FsID0gMDsKKworICAgIHN3aXRjaCAobG9jYXRpb24udHlwZSkg
eworICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVz
dWx0OjpJbW11dGFibGVSZWdpc3RlcjoKKyAgICAgICAgbG9jYWwgPSByZWdpc3RlckZvcihsb2Nh
dGlvbik7CisgICAgICAgIGlmIChkc3QgPT0gaWdub3JlZFJlc3VsdCgpKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwg
bG9jYWwpOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpMZXhpY2FsOgorICAgIGNhc2UgUmVz
b2x2ZVJlc3VsdDo6SW1tdXRhYmxlTGV4aWNhbDoKKyAgICAgICAgZW1pdE9wY29kZShvcF9nZXRf
c2NvcGVkX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkp
OworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24uaW5kZXgpOworICAgICAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24uZGVwdGgpOworICAgICAgICByZXR1cm4g
ZHN0OworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbmRleGVkR2xvYmFsOgorICAgIGNhc2Ug
UmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhlZEdsb2JhbDoKKyAgICAgICAgaWYgKG1fbGFz
dE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxfdmFyKSB7CisgICAgICAgICAgICBpbnQgZHN0SW5k
ZXg7CisgICAgICAgICAgICBpbnQgc3JjSW5kZXg7CisgICAgICAgICAgICByZXRyaWV2ZUxhc3RV
bmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7CisgICAgICAgICAgICBpZiAoZHN0SW5kZXggPT0g
bG9jYXRpb24uaW5kZXggJiYgc3JjSW5kZXggPT0gZHN0LT5pbmRleCgpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBkc3Q7CisgICAgICAgIH0KKworICAgICAgICBlbWl0T3Bjb2RlKG9wX2dldF9n
bG9iYWxfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7
CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChsb2NhdGlvbi5pbmRleCk7CisgICAgICAg
IHJldHVybiBkc3Q7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChzaG91bGRBdm9pZFJlc29sdmVH
bG9iYWwoKSkgewotICAgICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmUpOwotICAgICAgICBpbnN0
cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICByZXR1cm4gYmFzZURz
dDsKK30KKworUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRQdXRTdGF0aWNWYXIo
Y29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIFJlZ2lzdGVySUQqIHZhbHVlKQoreworICAg
IHN3aXRjaCAobG9jYXRpb24udHlwZSkgeworICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0
ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdpc3RlcjoKKyAgICAgICAg
cmV0dXJuIG1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQocmVnaXN0ZXJGb3IobG9jYXRpb24pLCB2
YWx1ZSk7CisKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OkxleGljYWw6CisgICAgY2FzZSBSZXNv
bHZlUmVzdWx0OjpJbW11dGFibGVMZXhpY2FsOgorICAgICAgICBlbWl0T3Bjb2RlKG9wX3B1dF9z
Y29wZWRfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGxvY2F0aW9uLmluZGV4
KTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGxvY2F0aW9uLmRlcHRoKTsKKyAgICAg
ICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgcmV0dXJu
IHZhbHVlOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbmRleGVkR2xvYmFsOgorICAgIGNh
c2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhlZEdsb2JhbDoKKyAgICAgICAgZW1pdE9w
Y29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChs
b2NhdGlvbi5pbmRleCk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5k
ZXgoKSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jaWYgRU5BQkxF
KEpJVCkKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25z
KCkuc2l6ZSgpKTsKLSNlbmRpZgotI2lmIEVOQUJMRShJTlRFUlBSRVRFUikKLSAgICBtX2NvZGVC
bG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUoKSk7
Ci0jZW5kaWYKLSAgICBlbWl0T3Bjb2RlKHJlcXVpcmVzRHluYW1pY0NoZWNrcyA/IG9wX3Jlc29s
dmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2dsb2JhbCk7Ci0gICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChh
ZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0gICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNr
cykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKLSAgICByZXR1cm4gYmFz
ZURzdDsKIH0KIAogdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdE1ldGhvZENoZWNrKCkKQEAg
LTIzNjIsNyArMjM4MSw3IEBAIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OnNldElzTnVtZXJpY0Nv
bXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvCiAKIGJvb2wgQnl0ZWNv
ZGVHZW5lcmF0b3I6OmlzQXJndW1lbnROdW1iZXIoY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIGlu
dCBhcmd1bWVudE51bWJlcikKIHsKLSAgICBSZWdpc3RlcklEKiByZWdpc3RlcklEID0gcmVnaXN0
ZXJGb3IoaWRlbnQpOworICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVySUQgPSByZWdpc3RlckZvcihy
ZXNvbHZlKGlkZW50KSk7CiAgICAgaWYgKCFyZWdpc3RlcklEIHx8IHJlZ2lzdGVySUQtPmluZGV4
KCkgPj0gMCkKICAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiByZWdpc3RlcklELT5pbmRl
eCgpID09IENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXQoYXJndW1lbnROdW1iZXIpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRv
ci5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRv
ci5oCmluZGV4IGNlOGQ4Zjg0MTJmNjg0ZTM5ZmIxMTk3Y2FlOTA5YWFjMWUxM2E3MTcuLjY1N2Nm
ZGI1ZDgxMjgzMWQxZTViNzMwOGMwZTJlNDBhNTdhMjcxMTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgKQEAgLTEs
NiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOCBDYW1lcm9uIFp3YXJpY2gg
PGN3endhcmljaEB1d2F0ZXJsb28uY2E+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSWdhbGlhLCBT
LkwuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTg1LDYgKzg2LDg0IEBAIG5h
bWVzcGFjZSBKU0MgewogICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcGVydHlSZWdpc3Rl
cjsKICAgICB9OwogCisgICAgc3RydWN0IFJlc29sdmVSZXN1bHQgeworICAgICAgICBlbnVtIEZs
YWdzIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyBsb2NhbGx5IGJvdW5kLCBpbiBh
IHJlZ2lzdGVyLgorICAgICAgICAgICAgUmVnaXN0ZXJGbGFnID0gMHgxLAorICAgICAgICAgICAg
Ly8gV2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgc2NvcGUgY2hhaW4gYXQgcnVudGltZSwgY2hlY2tp
bmcgZm9yCisgICAgICAgICAgICAvLyBub24tc3RyaWN0IGV2YWwgYW5kL29yIGB3aXRoJyBub2Rl
cy4KKyAgICAgICAgICAgIER5bmFtaWNGbGFnID0gMHgyLAorICAgICAgICAgICAgLy8gVGhlIHBy
b3BlcnR5IHdhcyByZXNvbHZlZCB0byBhIGRlZmluaXRlIGxvY2F0aW9uLCBhbmQgdGhlCisgICAg
ICAgICAgICAvLyBpZGVudGlmaWVyIGlzIG5vdCBuZWVkZWQgYW55IG1vcmUuCisgICAgICAgICAg
ICBTdGF0aWNGbGFnID0gMHg0LAorICAgICAgICAgICAgLy8gT25jZSB3ZSBoYXZlIHRoZSBiYXNl
IG9iamVjdCwgdGhlIHByb3BlcnR5IHdpbGwgYmUgbG9jYXRlZCBhdCBhCisgICAgICAgICAgICAv
LyBrbm93biBpbmRleC4KKyAgICAgICAgICAgIEluZGV4ZWRGbGFnID0gMHg4LAorICAgICAgICAg
ICAgLy8gU2tpcCBzb21lIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzY29wZSBjaGFpbiwgZ2l2
ZW4gYnkgImRlcHRoIi4KKyAgICAgICAgICAgIFNjb3BlRmxhZyA9IDB4MTAsCisgICAgICAgICAg
ICAvLyBUaGUgcmVzb2x2ZWQgYmluZGluZyBpcyBpbW11dGFibGUuCisgICAgICAgICAgICBJbW11
dGFibGVGbGFnID0gMHgyMCwKKyAgICAgICAgICAgIC8vIFRoZSBiYXNlIG9iamVjdCBpcyB0aGUg
Z2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEdsb2JhbEZsYWcgPSAweDQwCisgICAgICAgIH07
CisgICAgICAgIGVudW0gVHlwZSB7CisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgbG9j
YWwsIGFuZCBzdG9yZWQgaW4gYSByZWdpc3Rlci4KKyAgICAgICAgICAgIFJlZ2lzdGVyID0gUmVn
aXN0ZXJGbGFnIHwgU3RhdGljRmxhZywKKyAgICAgICAgICAgIC8vIEEgcmVhZC1vbmx5IGxvY2Fs
LCBjcmVhdGVkIGJ5ICJjb25zdCIuCisgICAgICAgICAgICBJbW11dGFibGVSZWdpc3RlciA9IFJl
Z2lzdGVyRmxhZyB8IEltbXV0YWJsZUZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8g
VGhlIHByb3BlcnR5IGlzIHN0YXRpY2FsbHkgc2NvcGVkIGZyZWUgdmFyaWFibGUuIEl0cyBjb29y
ZGluYXRlcworICAgICAgICAgICAgLy8gYXJlIGluICJpbmRleCIgYW5kICJkZXB0aCIuCisgICAg
ICAgICAgICBMZXhpY2FsID0gSW5kZXhlZEZsYWcgfCBTY29wZUZsYWcgfCBTdGF0aWNGbGFnLAor
ICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgTGV4aWNhbCwgY3JlYXRlZCBieSAiY29uc3QiLgor
ICAgICAgICAgICAgSW1tdXRhYmxlTGV4aWNhbCA9IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFnIHwg
SW1tdXRhYmxlRmxhZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkg
d2FzIG5vdCBib3VuZCBsZXhpY2FsbHksIHNvIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkCisgICAgICAg
ICAgICAvLyBsb29rIGRpcmVjdGx5IGluIHRoZSBnbG9iYWwgb2JqZWN0LgorICAgICAgICAgICAg
R2xvYmFsID0gR2xvYmFsRmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgR2xvYmFsLCBidXQgd2Ug
Y291bGQgYWN0dWFsbHkgcmVzb2x2ZSB0aGUgcHJvcGVydHkgdG8gYQorICAgICAgICAgICAgLy8g
RG9udERlbGV0ZSBwcm9wZXJ0eSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwgZm9yIGluc3RhbmNlLCBh
bnkKKyAgICAgICAgICAgIC8vIGJpbmRpbmcgY3JlYXRlZCB3aXRoICJ2YXIiIGF0IHRoZSB0b3Ag
bGV2ZWwuIEF0IHJ1bnRpbWUgd2UnbGwKKyAgICAgICAgICAgIC8vIGp1c3QgaW5kZXggaW50byB0
aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEluZGV4ZWRHbG9iYWwgPSBJbmRleGVkRmxh
ZyB8IEdsb2JhbEZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gTGlrZSBJbmRleGVk
R2xvYmFsLCBidXQgdGhlIHByb3BlcnR5IGlzIGFsc28gcmVhZC1vbmx5LCBsaWtlIE5hTiwKKyAg
ICAgICAgICAgIC8vIEluZmluaXR5LCBvciB1bmRlZmluZWQuCisgICAgICAgICAgICBJbW11dGFi
bGVJbmRleGVkR2xvYmFsID0gSW5kZXhlZEZsYWcgfCBJbW11dGFibGVGbGFnIHwgR2xvYmFsRmxh
ZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgY291bGQgbm90IGJl
IHJlc29sdmVkIHN0YXRpY2FsbHksIGR1ZSB0byB0aGUKKyAgICAgICAgICAgIC8vIHByZXNlbmNl
IG9mIGB3aXRoJyBibG9ja3MuIEF0IHJ1bnRpbWUgd2UnbGwgaGF2ZSB0byB3YWxrIHRoZQorICAg
ICAgICAgICAgLy8gc2NvcGUgY2hhaW4uIFNjb3BlRmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhh
dCAiZGVwdGgiIHdpbGwKKyAgICAgICAgICAgIC8vIGhvbGQgc29tZSBudW1iZXIgb2Ygbm9kZXMg
dG8gc2tpcCBpbiB0aGUgc2NvcGUgY2hhaW4sIGJlZm9yZQorICAgICAgICAgICAgLy8gYmVnaW5u
aW5nIHRoZSBzZWFyY2guCisgICAgICAgICAgICBEeW5hbWljID0gRHluYW1pY0ZsYWcgfCBTY29w
ZUZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgd2FzIGxvY2F0ZWQgYXMgYSBzdGF0
aWNhbGx5IHNjb3BlZCBmcmVlIHZhcmlhYmxlLAorICAgICAgICAgICAgLy8gYnV0IHdoaWxlIHRy
YXZlcnNpbmcgdGhlIHNjb3BlIGNoYWluLCB0aGVyZSB3YXMgYW4gaW50ZXJtZWRpYXRlCisgICAg
ICAgICAgICAvLyBhY3RpdmF0aW9uIHRoYXQgdXNlZCBub24tc3RyaWN0IGBldmFsJy4gQXQgcnVu
dGltZSB3ZSdsbCBoYXZlIHRvCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIGFic2VuY2Ug
b2YgdGhpcyBwcm9wZXJ0eSBpbiB0aG9zZSBpbnRlcnZlbmluZworICAgICAgICAgICAgLy8gc2Nv
cGVzLgorICAgICAgICAgICAgRHluYW1pY0xleGljYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRG
bGFnIHwgU2NvcGVGbGFnLAorICAgICAgICAgICAgLy8gTGlrZSBJbW11dGFibGVMZXhpY2FsLCBi
dXQgd2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0IGBldmFsJy4KKyAgICAgICAgICAgIER5bmFt
aWNJbW11dGFibGVMZXhpY2FsID0gRHluYW1pY0ZsYWcgfCBJbmRleGVkRmxhZyB8IFNjb3BlRmxh
ZyB8IEltbXV0YWJsZUZsYWcsCisgICAgICAgICAgICAvLyBMaWtlIEdsb2JhbCwgYnV0IHdpdGgg
aW50ZXJ2ZW5pbmcgbm9uLXN0cmljdCBgZXZhbCcuIEFzIHdpdGggCisgICAgICAgICAgICAvLyBE
eW5hbWljLCBTY29wZUZsYWcgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgImRlcHRoIiBkb2VzIGlu
ZGVlZAorICAgICAgICAgICAgLy8gc3RvcmUgYSBudW1iZXIgb2YgZnJhbWVzIHRvIHNraXAgYmVm
b3JlIGRvaW5nIHRoZSBkeW5hbWljIGNoZWNrcy4KKyAgICAgICAgICAgIER5bmFtaWNHbG9iYWwg
PSBEeW5hbWljRmxhZyB8IEdsb2JhbEZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgICAgICAvLyBM
aWtlIEluZGV4ZWRHbG9iYWwsIGJ1dCB3aXRoIGludGVydmVuaW5nIG5vbi1zdHJpY3QgYGV2YWwn
LgorICAgICAgICAgICAgRHluYW1pY0luZGV4ZWRHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4
ZWRGbGFnIHwgR2xvYmFsRmxhZyB8IFNjb3BlRmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgSW1t
dXRhYmxlSW5kZXhlZEdsb2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcgbm9uLXN0cmljdAorICAg
ICAgICAgICAgLy8gYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY0ltbXV0YWJsZUluZGV4ZWRH
bG9iYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgSW1tdXRhYmxlRmxhZyB8IEdsb2Jh
bEZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBpc1JlZ2lzdGVy
KCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIFJlZ2lzdGVyRmxhZzsgfQorICAgICAgICBib29sIGlz
RHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIHR5cGUgJiBEeW5hbWljRmxhZzsgfQorICAgICAgICBi
b29sIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIFN0YXRpY0ZsYWc7IH0KKyAgICAg
ICAgYm9vbCBpc0ltbXV0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUgJiBJbW11dGFibGVGbGFn
OyB9CisgICAgICAgIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiB0eXBlICYgR2xvYmFs
RmxhZzsgfQorCisgICAgICAgIHVuc2lnbmVkIHR5cGU7CisgICAgICAgIGludCBpbmRleDsgLy8g
SW5kZXggaW4gc2NvcGUsIGlmIEluZGV4ZWRGbGFnIGlzIHNldCwgb3IgaW4gcmVnaXN0ZXJzLCBp
ZiBSZWdpc3RlckZsYWcgaXMgc2V0LgorICAgICAgICBzaXplX3QgZGVwdGg7IC8vIERlcHRoIGlu
IHNjb3BlIGNoYWluLCBpZiBTY29wZUZsYWcgaXMgc2V0CisgICAgICAgIEpTT2JqZWN0KiBnbG9i
YWxPYmplY3Q7IC8vIElmIEdsb2JhbEZsYWcgaXMgc2V0LgorICAgIH07CisKICAgICBjbGFzcyBC
eXRlY29kZUdlbmVyYXRvciB7CiAgICAgICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogICAg
IHB1YmxpYzoKQEAgLTEwNywxMSArMTg2LDYgQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAg
SlNPYmplY3QqIGdlbmVyYXRlKCk7CiAKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIg
Y29ycmVzcG9uZGluZyB0byBhIGxvY2FsIHZhcmlhYmxlLCBvciAwIGlmIG5vCi0gICAgICAgIC8v
IHN1Y2ggcmVnaXN0ZXIgZXhpc3RzLiBSZWdpc3RlcnMgcmV0dXJuZWQgYnkgcmVnaXN0ZXJGb3Ig
ZG8gbm90Ci0gICAgICAgIC8vIHJlcXVpcmUgZXhwbGljaXQgcmVmZXJlbmNlIGNvdW50aW5nLgot
ICAgICAgICBSZWdpc3RlcklEKiByZWdpc3RlckZvcihjb25zdCBJZGVudGlmaWVyJik7Ci0KICAg
ICAgICAgYm9vbCBpc0FyZ3VtZW50TnVtYmVyKGNvbnN0IElkZW50aWZpZXImLCBpbnQpOwogCiAg
ICAgICAgIHZvaWQgc2V0SXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKGJvb2wgaXNOdW1lcmljQ29t
cGFyZUZ1bmN0aW9uKTsKQEAgLTExOSwxNyArMTkzLDE2IEBAIG5hbWVzcGFjZSBKU0MgewogICAg
ICAgICBib29sIHdpbGxSZXNvbHZlVG9Bcmd1bWVudHMoY29uc3QgSWRlbnRpZmllciYpOwogICAg
ICAgICBSZWdpc3RlcklEKiB1bmNoZWNrZWRSZWdpc3RlckZvckFyZ3VtZW50cygpOwogCi0gICAg
ICAgIC8vIEJlaGF2ZXMgYXMgcmVnaXN0ZXJGb3IgZG9lcywgYnV0IGlnbm9yZXMgZHluYW1pYyBz
Y29wZSBhcworICAgICAgICAvLyBSZXNvbHZlIGFuIGlkZW50aWZpZXIsIGdpdmVuIHRoZSBjdXJy
ZW50IGNvbXBpbGUtdGltZSBzY29wZSBjaGFpbi4KKyAgICAgICAgUmVzb2x2ZVJlc3VsdCByZXNv
bHZlKGNvbnN0IElkZW50aWZpZXImKTsKKyAgICAgICAgLy8gQmVoYXZlcyBhcyByZXNvbHZlIGRv
ZXMsIGJ1dCBpZ25vcmVzIGR5bmFtaWMgc2NvcGUgYXMKICAgICAgICAgLy8gZHluYW1pYyBzY29w
ZSBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIGNvbnN0IGluaXRpYWxpc2F0aW9uCi0gICAgICAg
IFJlZ2lzdGVySUQqIGNvbnN0UmVnaXN0ZXJGb3IoY29uc3QgSWRlbnRpZmllciYpOworICAgICAg
ICBSZXNvbHZlUmVzdWx0IHJlc29sdmVDb25zdERlY2woY29uc3QgSWRlbnRpZmllciYpOwogCi0g
ICAgICAgIC8vIFNlYXJjaGVzIHRoZSBzY29wZSBjaGFpbiBpbiBhbiBhdHRlbXB0IHRvICBzdGF0
aWNhbGx5IGxvY2F0ZSB0aGUgcmVxdWVzdGVkCi0gICAgICAgIC8vIHByb3BlcnR5LiAgUmV0dXJu
cyBmYWxzZSBpZiBmb3IgYW55IHJlYXNvbiB0aGUgcHJvcGVydHkgY2Fubm90IGJlIHNhZmVseQot
ICAgICAgICAvLyBvcHRpbWlzZWQgYXQgYWxsLiAgT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRo
ZSBpbmRleCBhbmQgZGVwdGggb2YgdGhlCi0gICAgICAgIC8vIFZhcmlhYmxlT2JqZWN0IHRoYXQg
ZGVmaW5lcyB0aGUgcHJvcGVydHkuICBJZiB0aGUgcHJvcGVydHkgY2Fubm90IGJlIGZvdW5kCi0g
ICAgICAgIC8vIHN0YXRpY2FsbHksIGRlcHRoIHdpbGwgY29udGFpbiB0aGUgZGVwdGggb2YgdGhl
IHNjb3BlIGNoYWluIHdoZXJlIGR5bmFtaWMKLSAgICAgICAgLy8gbG9va3VwIG11c3QgYmVnaW4u
Ci0gICAgICAgIGJvb2wgZmluZFNjb3BlZFByb3BlcnR5KGNvbnN0IElkZW50aWZpZXImLCBpbnQm
IGluZGV4LCBzaXplX3QmIGRlcHRoLCBib29sIGZvcldyaXRpbmcsIGJvb2wmIGluY2x1ZGVzRHlu
YW1pY1Njb3BlcywgSlNPYmplY3QqJiBnbG9iYWxPYmplY3QpOworICAgICAgICAvLyBSZXR1cm5z
IHRoZSByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUsIG9yIDAgaWYg
bm8KKyAgICAgICAgLy8gc3VjaCByZWdpc3RlciBleGlzdHMuIFJlZ2lzdGVycyByZXR1cm5lZCBi
eSByZWdpc3RlckZvciBkbyBub3QKKyAgICAgICAgLy8gcmVxdWlyZSBleHBsaWNpdCByZWZlcmVu
Y2UgY291bnRpbmcuCisgICAgICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVyRm9yKGNvbnN0IFJlc29s
dmVSZXN1bHQmIGxvY2F0aW9uKTsKIAogICAgICAgICAvLyBSZXR1cm5zIHRoZSByZWdpc3RlciBz
dG9yaW5nICJ0aGlzIgogICAgICAgICBSZWdpc3RlcklEKiB0aGlzUmVnaXN0ZXIoKSB7IHJldHVy
biAmbV90aGlzUmVnaXN0ZXI7IH0KQEAgLTMwOSwxNCArMzgyLDE0IEBAIG5hbWVzcGFjZSBKU0Mg
ewogICAgICAgICBSZWdpc3RlcklEKiBlbWl0VHlwZU9mKFJlZ2lzdGVySUQqIGRzdCwgUmVnaXN0
ZXJJRCogc3JjKSB7IHJldHVybiBlbWl0VW5hcnlPcChvcF90eXBlb2YsIGRzdCwgc3JjKTsgfQog
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0SW4oUmVnaXN0ZXJJRCogZHN0LCBSZWdpc3RlcklEKiBw
cm9wZXJ0eSwgUmVnaXN0ZXJJRCogYmFzZSkgeyByZXR1cm4gZW1pdEJpbmFyeU9wKG9wX2luLCBk
c3QsIHByb3BlcnR5LCBiYXNlLCBPcGVyYW5kVHlwZXMoKSk7IH0KIAotICAgICAgICBSZWdpc3Rl
cklEKiBlbWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3Bl
cnR5KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEdldFNjb3BlZFZhcihSZWdpc3RlcklEKiBk
c3QsIHNpemVfdCBza2lwLCBpbnQgaW5kZXgsIEpTVmFsdWUgZ2xvYmFsT2JqZWN0KTsKLSAgICAg
ICAgUmVnaXN0ZXJJRCogZW1pdFB1dFNjb3BlZFZhcihzaXplX3Qgc2tpcCwgaW50IGluZGV4LCBS
ZWdpc3RlcklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpOworICAgICAgICBSZWdpc3Rl
cklEKiBlbWl0R2V0U3RhdGljVmFyKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3Vs
dCYgbG9jYXRpb24pOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UHV0U3RhdGljVmFyKGNvbnN0
IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uLCBSZWdpc3RlcklEKiB2YWx1ZSk7CiAKLSAgICAgICAg
UmVnaXN0ZXJJRCogZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHkpOwotICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZUJhc2VGb3JQ
dXQoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7Ci0gICAgICAg
IFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVn
aXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwotICAgICAgICBS
ZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lz
dGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKKyAgICAgICAgUmVn
aXN0ZXJJRCogZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0
JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOworICAgICAgICBSZWdpc3Rl
cklEKiBlbWl0UmVzb2x2ZUJhc2UoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0
JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOworICAgICAgICBSZWdpc3Rl
cklEKiBlbWl0UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZl
UmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOworICAgICAgICBS
ZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhCYXNlKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lz
dGVySUQqIHByb3BEc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uLCBjb25zdCBJZGVu
dGlmaWVyJiBwcm9wZXJ0eSk7CisgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlV2l0aFRo
aXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgUmVzb2x2
ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKIAogICAgICAg
ICB2b2lkIGVtaXRNZXRob2RDaGVjaygpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAKaW5kZXggMTMyZjY2NjJhZmJjYzc5NTRh
Y2U1OTlhNDYwM2Y0ZDkyZTBiODk4ZC4uZDZmMDllOTQ5NDQzN2M1YTliNWM4MTgyMmU5OTAzZjNm
ZGVhYzkxYyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIv
Tm9kZXNDb2RlZ2VuLmNwcApAQCAtNSw2ICs1LDcgQEAKICogIENvcHlyaWdodCAoQykgMjAwNyBD
YW1lcm9uIFp3YXJpY2ggKGN3endhcmljaEB1d2F0ZXJsb28uY2EpCiAqICBDb3B5cmlnaHQgKEMp
IDIwMDcgTWFrcyBPcmxvdmljaAogKiAgQ29weXJpZ2h0IChDKSAyMDA3IEVyaWMgU2VpZGVsIDxl
cmljQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSWdhbGlhLCBTLkwuCiAqCiAq
ICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCiAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYwpAQCAtMTQ2LDE0ICsxNDcsMTUgQEAgYm9vbCBSZXNvbHZlTm9kZTo6aXNQ
dXJlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0CiAKIFJlZ2lzdGVySUQqIFJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5y
ZWdpc3RlckZvcihtX2lkZW50KSkgeworICAgIFJlc29sdmVSZXN1bHQgbG9jYXRpb24gPSBnZW5l
cmF0b3IucmVzb2x2ZShtX2lkZW50KTsKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5l
cmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJh
dG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1
cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBsb2NhbCk7CiAgICAg
fQogICAgIAogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8obV9zdGFydE9mZnNldCAr
IG1faWRlbnQubGVuZ3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwotICAgIHJldHVybiBnZW5l
cmF0b3IuZW1pdFJlc29sdmUoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbV9pZGVu
dCk7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5lcmF0b3IuZmluYWxEZXN0
aW5hdGlvbihkc3QpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBBcnJheU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCkBAIC0zNDYsNyArMzQ4LDcgQEAgUmVnaXN0ZXJJRCogRXZhbEZ1bmN0aW9uQ2FsbE5v
ZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWcKICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsK
ICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBtX2FyZ3MpOwogICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIHN0YXJ0T2Zmc2V0KCkgKyA0
LCA0LCAwKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRz
LnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBnZW5lcmF0b3IucHJvcGVydHlOYW1lcygpLmV2
YWwpOworICAgIGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhUaGlzKGNhbGxBcmd1bWVudHMudGhp
c1JlZ2lzdGVyKCksIGZ1bmMuZ2V0KCksIGdlbmVyYXRvci5yZXNvbHZlKGdlbmVyYXRvci5wcm9w
ZXJ0eU5hbWVzKCkuZXZhbCksIGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuZXZhbCk7CiAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbEV2YWwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24o
ZHN0LCBmdW5jLmdldCgpKSwgZnVuYy5nZXQoKSwgY2FsbEFyZ3VtZW50cywgZGl2b3QoKSwgc3Rh
cnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwogfQogCkBAIC0zNjQsMjAgKzM2NiwxOSBAQCBSZWdp
c3RlcklEKiBGdW5jdGlvbkNhbGxWYWx1ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZQogCiBSZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxSZXNvbHZlTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKIHsKLSAgICBpZiAoUmVmUHRyPFJlZ2lzdGVySUQ+IGxvY2FsID0gZ2VuZXJhdG9yLnJl
Z2lzdGVyRm9yKG1faWRlbnQpKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jdGlv
biA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGxv
Y2FsLmdldCgpKTsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29s
dmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVn
aXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0g
Z2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbG9jYWwp
OwogICAgICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBtX2FyZ3Mp
OwogICAgICAgICBnZW5lcmF0b3IuZW1pdExvYWQoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIo
KSwganNVbmRlZmluZWQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwoZ2Vu
ZXJhdG9yLmZpbmFsRGVzdGluYXRpb25Pcklnbm9yZWQoZHN0LCBjYWxsQXJndW1lbnRzLnRoaXNS
ZWdpc3RlcigpKSwgZnVuY3Rpb24uZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0
T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2Fs
bChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGNhbGxBcmd1bWVudHMu
dGhpc1JlZ2lzdGVyKCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBzdGFy
dE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiAgICAgfQogCi0gICAgaW50IGluZGV4ID0gMDsKLSAg
ICBzaXplX3QgZGVwdGggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAg
IGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKGdlbmVyYXRvci5m
aW5kU2NvcGVkUHJvcGVydHkobV9pZGVudCwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNE
eW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJr
ZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlz
U3RhdGljKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMgPSBnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgIENhbGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5l
cmF0b3IsIG1fYXJncyk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0R2V0U3RhdGljVmFyKGZ1bmMu
Z2V0KCksIGxvY2F0aW9uKTsKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRMb2FkKGNhbGxBcmd1bWVu
dHMudGhpc1JlZ2lzdGVyKCksIGpzVW5kZWZpbmVkKCkpOwogICAgICAgICByZXR1cm4gZ2VuZXJh
dG9yLmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uT3JJZ25vcmVkKGRzdCwgZnVu
Yy5nZXQoKSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0
KCksIGVuZE9mZnNldCgpKTsKICAgICB9CkBAIC0zODUsOCArMzg2LDkgQEAgUmVnaXN0ZXJJRCog
RnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLAogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLm5ld1Rl
bXBvcmFyeSgpOwogICAgIENhbGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1f
YXJncyk7CiAgICAgaW50IGlkZW50aWZpZXJTdGFydCA9IGRpdm90KCkgLSBzdGFydE9mZnNldCgp
OworCiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhpZGVudGlmaWVyU3RhcnQgKyBt
X2lkZW50Lmxlbmd0aCgpLCBtX2lkZW50Lmxlbmd0aCgpLCAwKTsKLSAgICBnZW5lcmF0b3IuZW1p
dFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgp
LCBtX2lkZW50KTsKKyAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1l
bnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdu
b3JlZChkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZvdCgp
LCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiB9CiAKQEAgLTU1MCwyNCArNTUyLDIxIEBA
IHN0YXRpYyBSZWdpc3RlcklEKiBlbWl0UG9zdEluY09yRGVjKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAKIFJlZ2lzdGVySUQqIFBvc3RmaXhSZXNvbHZlTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJG
b3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQobV9p
ZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUo
bV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0
ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7
CiAgICAgICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCiAgICAg
ICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRU
b0pTTnVtYmVyKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxvY2FsKTsKICAgICAg
ICAgfQotCiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAg
ICAgICAgICAgIHJldHVybiBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJhdG9yLCBsb2NhbCwgbV9vcGVy
YXRvcik7CiAgICAgICAgIHJldHVybiBlbWl0UG9zdEluY09yRGVjKGdlbmVyYXRvciwgZ2VuZXJh
dG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwsIG1fb3BlcmF0b3IpOwogICAgIH0KIAot
ICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09iamVjdCog
Z2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNl
OwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBk
ZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGluZGV4
ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0g
ICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0U2NvcGVk
VmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3Qp
OworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpICYmICFsb2NhdGlvbi5pc0ltbXV0YWJsZSgp
KSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0
U3RhdGljVmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbG9jYXRpb24pOwogICAgICAgICBS
ZWdpc3RlcklEKiBvbGRWYWx1ZTsKICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3Jl
ZFJlc3VsdCgpKSB7CiAgICAgICAgICAgICBvbGRWYWx1ZSA9IDA7CkBAIC01NzUsMTMgKzU3NCwx
MyBAQCBSZWdpc3RlcklEKiBQb3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpcwogICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09yRGVjKGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCksIG1fb3BlcmF0b3IpOwogICAgICAgICB9Ci0g
ICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgdmFsdWUuZ2V0
KCksIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKGxv
Y2F0aW9uLCB2YWx1ZS5nZXQoKSk7CiAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKICAgICB9Ci0K
KyAgICAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zm
c2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUgPSBnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5l
cmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHZhbHVl
LmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRv
ci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgdmFsdWUuZ2V0
KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICBSZWdpc3RlcklEKiBvbGRWYWx1ZTsKICAgICBp
ZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKICAgICAgICAgb2xkVmFsdWUg
PSAwOwpAQCAtNjUzLDExICs2NTIsMTIgQEAgUmVnaXN0ZXJJRCogUG9zdGZpeEVycm9yTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGUKIAogUmVn
aXN0ZXJJRCogRGVsZXRlUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRv
ciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgaWYgKGdlbmVyYXRvci5yZWdp
c3RlckZvcihtX2lkZW50KSkKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9y
LnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKGdlbmVyYXRvci5yZWdpc3RlckZvcihsb2NhdGlv
bikpCiAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZ2VuZXJhdG9yLmZpbmFsRGVz
dGluYXRpb24oZHN0KSwgZmFsc2UpOwogCiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5m
byhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgUmVnaXN0ZXJJRCog
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlv
bihkc3QpLCBtX2lkZW50KTsKKyAgICBSZWdpc3RlcklEKiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRS
ZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGxvY2F0aW9uLCBtX2lk
ZW50KTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXREZWxldGVCeUlkKGdlbmVyYXRvci5maW5h
bERlc3RpbmF0aW9uKGRzdCwgYmFzZSksIGJhc2UsIG1faWRlbnQpOwogfQogCkBAIC03MDgsMTMg
KzcwOCwxNCBAQCBSZWdpc3RlcklEKiBWb2lkTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2Vu
ZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdAogCiBSZWdpc3RlcklEKiBUeXBlT2ZS
ZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJl
Z2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3Iu
cmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2Vu
ZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2Vu
ZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAoZHN0ID09IGdlbmVy
YXRvci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0VHlwZU9mKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCks
IGxvY2FsKTsKICAgICB9CiAKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2NyYXRjaCA9IGdlbmVy
YXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBtX2lk
ZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2NyYXRjaCA9IGdlbmVyYXRvci5lbWl0UmVz
b2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBsb2NhdGlvbiwgbV9pZGVu
dCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKHNjcmF0Y2guZ2V0KCksIHNjcmF0Y2guZ2V0
KCksIG1faWRlbnQpOwogICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkK
ICAgICAgICAgcmV0dXJuIDA7CkBAIC03MzcsMzIgKzczOCwyOCBAQCBSZWdpc3RlcklEKiBUeXBl
T2ZWYWx1ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBS
ZWdpc3RlcgogCiBSZWdpc3RlcklEKiBQcmVmaXhSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5
dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAo
UmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAg
ICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7Cisg
ICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9u
KSkgewogICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFudChtX2lkZW50KSkgewog
ICAgICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQogICAgICAg
ICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHIwID0g
Z2VuZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIChtX29w
ZXJhdG9yID09IE9wUGx1c1BsdXMpID8gMS4wIDogLTEuMCk7CiAgICAgICAgICAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXRCaW5hcnlPcChvcF9hZGQsIHIwLmdldCgpLCBsb2NhbCwgcjAuZ2V0KCks
IE9wZXJhbmRUeXBlcygpKTsKICAgICAgICAgfQotCiAgICAgICAgIGVtaXRQcmVJbmNPckRlYyhn
ZW5lcmF0b3IsIGxvY2FsLCBtX29wZXJhdG9yKTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5t
b3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbG9jYWwpOwogICAgIH0KIAotICAgIGludCBp
bmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2Jq
ZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlm
IChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1
ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3Np
bmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBwcm9wRHN0ID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2Vu
ZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7
CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkgJiYgIWxvY2F0aW9uLmlzSW1tdXRhYmxlKCkp
IHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBnZW5lcmF0b3IuZW1pdEdl
dFN0YXRpY1ZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGxvY2F0aW9uKTsKICAg
ICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwgcHJvcERzdC5nZXQoKSwgbV9vcGVyYXRv
cik7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgcHJv
cERzdC5nZXQoKSwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0
aWNWYXIobG9jYXRpb24sIHByb3BEc3QuZ2V0KCkpOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
Lm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKICAgICB9CiAK
ICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCks
IGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRv
ci50ZW1wRGVzdGluYXRpb24oZHN0KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdl
bmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgcHJv
cERzdC5nZXQoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5l
cmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHByb3BE
c3QuZ2V0KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJh
dG9yLCBwcm9wRHN0LmdldCgpLCBtX29wZXJhdG9yKTsKICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5
SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgcHJvcERzdC5nZXQoKSk7CiAgICAgcmV0dXJuIGdlbmVy
YXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcHJvcERzdC5nZXQoKSk7CkBAIC0x
MTUwLDEwICsxMTQ3LDExIEBAIHN0YXRpYyBBTFdBWVNfSU5MSU5FIFJlZ2lzdGVySUQqIGVtaXRS
ZWFkTW9kaWZ5QXNzaWdubWVudChCeXRlY29kZUdlbmVyYXRvciYgZ2VuCiAKIFJlZ2lzdGVySUQq
IFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwg
PSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRv
ci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9u
ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9j
YWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2Nh
dGlvbi5pc0ltbXV0YWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIGVtaXRSZWFkTW9kaWZ5QXNz
aWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxvY2Fs
LCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlwZXMoUmVzdWx0VHlwZTo6dW5rbm93blR5
cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIH0KICAgICAgICAg
CiAgICAgICAgIGlmIChnZW5lcmF0b3IubGVmdEhhbmRTaWRlTmVlZHNDb3B5KG1fcmlnaHRIYXNB
c3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpKSB7CiAgICAgICAgICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwpAQCAt
MTE2NywyMCArMTE2NSwxNiBAQCBSZWdpc3RlcklEKiBSZWFkTW9kaWZ5UmVzb2x2ZU5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZQogICAgICAgICByZXR1
cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCByZXN1bHQpOwogICAg
IH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09i
amVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9
IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGlu
ZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYm
IGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tz
KSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJhdG9yLmVtaXRHZXRT
Y29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBkZXB0aCwgaW5kZXgsIGds
b2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkgJiYgIWxvY2F0aW9uLmlz
SW1tdXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0
b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGxvY2F0
aW9uKTsKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1pdFJlYWRNb2RpZnlBc3NpZ25t
ZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdldCgp
KSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5
cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwotICAgICAg
ICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgsIHJlc3VsdCwgZ2xvYmFs
T2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0aWNWYXIobG9jYXRpb24sIHJl
c3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCk7CiAgICAgZ2VuZXJh
dG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gc3RhcnRPZmZzZXQoKSArIG1faWRlbnQu
bGVuZ3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBi
YXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2UoZ2VuZXJhdG9yLm5ld1RlbXBvcmFy
eSgpLCBzcmMxLmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9
IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwg
c3JjMS5nZXQoKSwgbG9jYXRpb24sIG1faWRlbnQpOwogICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9
IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3Rp
bmF0aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIG1fcmlnaHQsIG1fb3BlcmF0b3Is
IE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBtX3JpZ2h0LT5yZXN1bHRE
ZXNjcmlwdG9yKCkpLCB0aGlzKTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJh
c2UuZ2V0KCksIG1faWRlbnQsIHJlc3VsdCk7CiB9CkBAIC0xMTg5LDI3ICsxMTgzLDI0IEBAIFJl
Z2lzdGVySUQqIFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2Vu
ZXJhdG9yJiBnZW5lcmF0b3IsIFJlCiAKIFJlZ2lzdGVySUQqIEFzc2lnblJlc29sdmVOb2RlOjpl
bWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0
KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvciht
X2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFudChtX2lkZW50
KSkKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVu
dCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3Io
bG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKQogICAgICAg
ICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmlnaHQpOwotICAgICAgICAK
ICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGxvY2FsLCBt
X3JpZ2h0KTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVl
ZGVkKGRzdCwgcmVzdWx0KTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVf
dCBkZXB0aCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCBy
ZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29w
ZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgsIHRydWUsIHJlcXVpcmVzRHluYW1pY0No
ZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYg
IXJlcXVpcmVzRHluYW1pY0NoZWNrcykgeworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpICYm
ICFsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7CiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9y
Lmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIGRzdCA9IDA7CiAgICAgICAgIFJlZ2lzdGVy
SUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdodCk7Ci0gICAgICAgIGdl
bmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgdmFsdWUsIGdsb2JhbE9iamVj
dCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKGxvY2F0aW9uLCB2YWx1ZSk7
CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRv
ci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBsb2NhdGlv
biwgbV9pZGVudCk7CiAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQog
ICAgICAgICBkc3QgPSAwOwogICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRO
b2RlKGRzdCwgbV9yaWdodCk7CkBAIC0xMjk3LDggKzEyODgsMTAgQEAgUmVnaXN0ZXJJRCogQ29t
bWFOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0
ZXJJRCogZHMKIAogUmVnaXN0ZXJJRCogQ29uc3REZWNsTm9kZTo6ZW1pdENvZGVTaW5nbGUoQnl0
ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvcikKIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9u
ID0gZ2VuZXJhdG9yLnJlc29sdmVDb25zdERlY2wobV9pZGVudCk7CisKICAgICAvLyBGSVhNRTog
VGhpcyBjb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBiZWhhdmlvciBvZiBjb25zdCBpbiBGaXJlZm94
LgotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5jb25zdFJlZ2lzdGVyRm9y
KG1faWRlbnQpKSB7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lz
dGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAoIW1faW5pdCkKICAgICAgICAgICAgIHJl
dHVybiBsb2NhbDsKIApAQCAtMTMwNywyNyArMTMwMCwxNSBAQCBSZWdpc3RlcklEKiBDb25zdERl
Y2xOb2RlOjplbWl0Q29kZVNpbmdsZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yKQogCiAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gbV9pbml0ID8gZ2VuZXJhdG9yLmVtaXROb2Rl
KG1faW5pdCkgOiBnZW5lcmF0b3IuZW1pdExvYWQoMCwganNVbmRlZmluZWQoKSk7CiAKLSAgICBT
Y29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGdlbmVyYXRvci5zY29wZUNoYWluKCktPmJlZ2luKCk7
Ci0gICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGdlbmVyYXRvci5zY29wZUNoYWluKCktPmVu
ZCgpOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0
ZXIsICsrZGVwdGgpIHsKLSAgICAgICAgSlNPYmplY3QqIGN1cnJlbnRTY29wZSA9IGl0ZXItPmdl
dCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJsZU9iamVjdCgpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEpTVmFyaWFibGVPYmplY3QqIGN1cnJlbnRWYXJp
YWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFibGVPYmplY3QqPihjdXJyZW50U2NvcGUp
OwotICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0
LT5zeW1ib2xUYWJsZSgpLmdldChtX2lkZW50LmltcGwoKSk7Ci0gICAgICAgIGlmIChlbnRyeS5p
c051bGwoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHJldHVybiBnZW5lcmF0
b3IuZW1pdFB1dFNjb3BlZFZhcihnZW5lcmF0b3Iuc2NvcGVEZXB0aCgpICsgZGVwdGgsIGVudHJ5
LmdldEluZGV4KCksIHZhbHVlLmdldCgpLCBjdXJyZW50VmFyaWFibGVPYmplY3QtPmlzR2xvYmFs
T2JqZWN0KCkgPyBjdXJyZW50VmFyaWFibGVPYmplY3QgOiAwKTsKLSAgICB9Ci0KKyAgICBpZiAo
bG9jYXRpb24uaXNTdGF0aWMoKSkKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UHV0U3Rh
dGljVmFyKGxvY2F0aW9uLCB2YWx1ZS5nZXQoKSk7CisgICAgCiAgICAgaWYgKGdlbmVyYXRvci5j
b2RlVHlwZSgpICE9IEV2YWxDb2RlKQogICAgICAgICByZXR1cm4gdmFsdWUuZ2V0KCk7CiAKICAg
ICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3VsZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFs
IGJsb2NrLCBpdCB3aWxsIGFzc2lnbgogICAgIC8vIHRvIHRoZSB3cm9uZyBiYXNlIGlmIG1faWRl
bnQgZXhpc3RzIGluIGFuIGludGVydmVuaW5nIHdpdGggc2NvcGUuCi0gICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1w
b3JhcnkoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0
b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbG9jYXRpb24sIG1f
aWRlbnQpOwogICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9p
ZGVudCwgdmFsdWUuZ2V0KCkpOwogfQogCkBAIC0xNTk4LDExICsxNTc5LDEyIEBAIFJlZ2lzdGVy
SUQqIEZvckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Is
IFJlZ2lzdGVySUQqIGRzCiAgICAgYm9vbCBvcHRpbWl6ZWRGb3JpbkFjY2VzcyA9IGZhbHNlOwog
ICAgIGlmIChtX2xleHByLT5pc1Jlc29sdmVOb2RlKCkpIHsKICAgICAgICAgY29uc3QgSWRlbnRp
ZmllciYgaWRlbnQgPSBzdGF0aWNfY2FzdDxSZXNvbHZlTm9kZSo+KG1fbGV4cHIpLT5pZGVudGlm
aWVyKCk7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihpZGVu
dCk7CisgICAgICAgIFJlc29sdmVSZXN1bHQgbG9jYXRpb24gPSBnZW5lcmF0b3IucmVzb2x2ZShp
ZGVudCk7CisgICAgICAgIHByb3BlcnR5TmFtZSA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihsb2Nh
dGlvbik7CiAgICAgICAgIGlmICghcHJvcGVydHlOYW1lKSB7CiAgICAgICAgICAgICBwcm9wZXJ0
eU5hbWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gcHJvdGVjdCA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgIFJlZ2lzdGVySUQq
IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlRm9yUHV0KGdlbmVyYXRvci5uZXdUZW1w
b3JhcnkoKSwgaWRlbnQpOworICAgICAgICAgICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRv
ci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBsb2NhdGlv
biwgaWRlbnQpOwogCiAgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRp
dm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICAgICAgICAgIGdlbmVyYXRv
ci5lbWl0UHV0QnlJZChiYXNlLCBpZGVudCwgcHJvcGVydHlOYW1lKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122912</attachid>
            <date>2012-01-18 06:10:11 -0800</date>
            <delta_ts>2012-01-23 10:34:22 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76285-20120118151009.patch</filename>
            <type>text/plain</type>
            <size>53694</size>
            <attacher name="Andy Wingo">wingo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1MjQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA2
ZjQxY2JjYTUzNTMzYzBlOTgzNjc5MjBjYTRmMTQ2NDhhY2YwYjhmLi5kNGU2NmU3YWJjNDVjNWVl
ZjQwMDIzNWQxMGRlNzRjYjg5YmMyNmM0IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0MyBAQAorMjAxMi0wMS0xMyAgQW5keSBXaW5nbyAgPHdpbmdvQGlnYWxpYS5jb20+CisK
KyAgICAgICAgUmVmYWN0b3IgaWRlbnRpZmllciByZXNvbHV0aW9uIGluIEJ5dGVjb2RlR2VuZXJh
dG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OlJlc29sdmVSZXN1
bHQpOiBOZXcgc3RydWN0dXJlLCB0byBkZXNjcmliZSB0aGUgc3RvcmFnZQorICAgICAgICBsb2Nh
dGlvbiBjb3JyZXNwb25kaW5nIHRvIGFuIGlkZW50aWZpZXIgaW4gYSBwcm9ncmFtLgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNpbmcKKyAgICAg
ICAgZmluZFNjb3BlZFByb3BlcnR5LgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6
cmVzb2x2ZUNvbnN0RGVjbCk6IE5ldyBmdW5jdGlvbiwKKyAgICAgICAgZW5jYXBzdWxhdGluZyB3
aGF0IENvbnN0RGVjbE5vZGU6OmVtaXRCeXRlY29kZSB1c2VkIHRvIGRvLgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRpY1Zhcik6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U3RhdGljVmFyKTogTmV3IGZ1bmN0aW9ucywKKyAgICAg
ICAgY29ycmVzcG9uZGluZyB0byB0aGUgb2xkIGVtaXRHZXRTY29wZWRWYXIgYW5kIGVtaXRQdXRT
Y29wZWRWYXIuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcik6
CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZSk6CisgICAgICAg
IChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZUJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KToKKyAgICAgICAgKEpT
Qzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyk6IENoYW5nZSB0byBhY2Nl
cHQgYQorICAgICAgICAibG9jYXRpb24iIGFyZ3VtZW50LiAgVGhpcyBpcyBtb3JlIGNsZWFyLCBh
bmQgcmVkdWNlcyB0aGUgYW1vdW50CisgICAgICAgIG9mIGRvdWJsZSBhbmFseXNpcyBoYXBwZW5p
bmcgYXQgY29tcGlsZS10aW1lLgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4u
Y3BwOgorICAgICAgICAoSlNDOjpSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAg
KEpTQzo6RXZhbEZ1bmN0aW9uQ2FsbE5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6
OkZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpQ
b3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkRlbGV0ZVJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpUeXBlT2ZSZXNvbHZlTm9k
ZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6UHJlZml4UmVzb2x2ZU5vZGU6OmVtaXRC
eXRlY29kZSk6CisgICAgICAgIChKU0M6OlJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKToKKyAgICAgICAgKEpTQzo6QXNzaWduUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6Cisg
ICAgICAgIChKU0M6OkNvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKToKKyAgICAgICAgKEpT
Qzo6Rm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUpOiBSZWZhY3RvciB0byB1c2UgdGhlIG5ldworICAg
ICAgICBSZXNvbHZlUmVzdWx0IHN0cnVjdHVyZS4KKwogMjAxMi0wMS0xNyAgR2VvZmZyZXkgR2Fy
ZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgogCiAgICAgICAgIEZhY3RvcmVkIG91dCBzb21lIGNvZGUg
aW50byBhIGhlbHBlciBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAKaW5kZXggYmZiMTYxOGE2MjAy
N2EzMzczMWMwMjhlZDIxM2RlZGEyMzJmOGFhMS4uYzIyNzk3YzZlMWY3MTA5MzMwNWJjMzY3NmIy
MDJmNzUwM2MwN2NlNyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21w
aWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAKQEAgLTEsNiArMSw3IEBACiAvKgogICog
Q29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
ICAqIENvcHlyaWdodCAoQykgMjAwOCBDYW1lcm9uIFp3YXJpY2ggPGN3endhcmljaEB1d2F0ZXJs
b28uY2E+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSWdhbGlhLCBTLkwuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTUwMyw0MCArNTA0LDEyIEBAIHZvaWQgQnl0ZWNvZGVHZW5l
cmF0b3I6OmFkZFBhcmFtZXRlcihjb25zdCBJZGVudGlmaWVyJiBpZGVudCwgaW50IHBhcmFtZXRl
ckluZGV4CiAgICAgbV9jb2RlQmxvY2stPmFkZFBhcmFtZXRlcigpOwogfQogCi1SZWdpc3RlcklE
KiBCeXRlY29kZUdlbmVyYXRvcjo6cmVnaXN0ZXJGb3IoY29uc3QgSWRlbnRpZmllciYgaWRlbnQp
CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6cmVnaXN0ZXJGb3IoY29uc3QgUmVzb2x2
ZVJlc3VsdCYgbG9jYXRpb24pCiB7Ci0gICAgaWYgKGlkZW50ID09IHByb3BlcnR5TmFtZXMoKS50
aGlzSWRlbnRpZmllcikKLSAgICAgICAgcmV0dXJuICZtX3RoaXNSZWdpc3RlcjsKLSAgICAgICAg
Ci0gICAgaWYgKG1fY29kZVR5cGUgPT0gR2xvYmFsQ29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICBpZiAoIXNob3VsZE9wdGltaXplTG9jYWxzKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KGlkZW50LmltcGwo
KSk7Ci0gICAgaWYgKGVudHJ5LmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlm
IChpZGVudCA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1lbnRzKQotICAgICAgICBjcmVhdGVBcmd1
bWVudHNJZk5lY2Vzc2FyeSgpOwotCi0gICAgcmV0dXJuIGNyZWF0ZUxhenlSZWdpc3RlcklmTmVj
ZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRleCgpKSk7Ci19Ci0KLVJlZ2lzdGVySUQq
IEJ5dGVjb2RlR2VuZXJhdG9yOjpjb25zdFJlZ2lzdGVyRm9yKGNvbnN0IElkZW50aWZpZXImIGlk
ZW50KQotewotICAgIGlmIChtX2NvZGVUeXBlID09IEV2YWxDb2RlKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIGlmIChtX2NvZGVUeXBlID09IEdsb2JhbENvZGUpCisgICAgaWYgKCFsb2NhdGlv
bi5pc1JlZ2lzdGVyKCkpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgU3ltYm9sVGFibGVFbnRy
eSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KGlkZW50LmltcGwoKSk7Ci0gICAgaWYgKGVudHJ5
LmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBjcmVhdGVMYXp5UmVn
aXN0ZXJJZk5lY2Vzc2FyeSgmcmVnaXN0ZXJGb3IoZW50cnkuZ2V0SW5kZXgoKSkpOworICAgIHJl
dHVybiBjcmVhdGVMYXp5UmVnaXN0ZXJJZk5lY2Vzc2FyeSgmcmVnaXN0ZXJGb3IobG9jYXRpb24u
aW5kZXgpKTsKIH0KIAogYm9vbCBCeXRlY29kZUdlbmVyYXRvcjo6d2lsbFJlc29sdmVUb0FyZ3Vt
ZW50cyhjb25zdCBJZGVudGlmaWVyJiBpZGVudCkKQEAgLTExNTksNTkgKzExMzIsMTM1IEBAIFJl
Z2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0TG9hZChSZWdpc3RlcklEKiBkc3QsIEpT
VmFsdWUgdikKICAgICByZXR1cm4gY29uc3RhbnRJRDsKIH0KIAotYm9vbCBCeXRlY29kZUdlbmVy
YXRvcjo6ZmluZFNjb3BlZFByb3BlcnR5KGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5LCBpbnQm
IGluZGV4LCBzaXplX3QmIHN0YWNrRGVwdGgsIGJvb2wgZm9yV3JpdGluZywgYm9vbCYgcmVxdWly
ZXNEeW5hbWljQ2hlY2tzLCBKU09iamVjdComIGdsb2JhbE9iamVjdCkKK1Jlc29sdmVSZXN1bHQg
Qnl0ZWNvZGVHZW5lcmF0b3I6OnJlc29sdmUoY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7
CisgICAgUmVzb2x2ZVJlc3VsdCByZXQgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAKKyAgICBpZiAo
cHJvcGVydHkgPT0gcHJvcGVydHlOYW1lcygpLnRoaXNJZGVudGlmaWVyKSB7CisgICAgICAgIHJl
dC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlUmVnaXN0ZXI7CisgICAgICAgIHJldC5p
bmRleCA9IG1fdGhpc1JlZ2lzdGVyLmluZGV4KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAg
fQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhbGxvY2F0ZWQgaW4g
YSByZWdpc3Rlci4KKyAgICBpZiAobV9jb2RlVHlwZSAhPSBHbG9iYWxDb2RlICYmIHNob3VsZE9w
dGltaXplTG9jYWxzKCkpIHsKKyAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5bWJv
bFRhYmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAgICAgIGlmICghZW50cnkuaXNOdWxs
KCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1l
bnRzKQorICAgICAgICAgICAgICAgIGNyZWF0ZUFyZ3VtZW50c0lmTmVjZXNzYXJ5KCk7CisgICAg
ICAgICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OlJlZ2lzdGVyOworICAgICAgICAgICAg
aWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkKKyAgICAgICAgICAgICAgICByZXQudHlwZSB8PSBSZXNv
bHZlUmVzdWx0OjpJbW11dGFibGVGbGFnOworICAgICAgICAgICAgcmV0LmluZGV4ID0gZW50cnku
Z2V0SW5kZXgoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisK
ICAgICAvLyBDYXNlcyB3aGVyZSB3ZSBjYW5ub3Qgc3RhdGljYWxseSBvcHRpbWl6ZSB0aGUgbG9v
a3VwLgogICAgIGlmIChwcm9wZXJ0eSA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1lbnRzIHx8ICFj
YW5PcHRpbWl6ZU5vbkxvY2FscygpKSB7Ci0gICAgICAgIHN0YWNrRGVwdGggPSAwOwotICAgICAg
ICBpbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKLQorICAgICAgICByZXQuaW5kZXggPSBt
aXNzaW5nU3ltYm9sTWFya2VyKCk7CisgICAgICAgIHJldC5kZXB0aCA9IDA7CiAgICAgICAgIGlm
IChzaG91bGRPcHRpbWl6ZUxvY2FscygpICYmIG1fY29kZVR5cGUgPT0gR2xvYmFsQ29kZSkgewog
ICAgICAgICAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBtX3Njb3BlQ2hhaW4tPmJlZ2lu
KCk7Ci0gICAgICAgICAgICBnbG9iYWxPYmplY3QgPSBpdGVyLT5nZXQoKTsKKyAgICAgICAgICAg
IHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6R2xvYmFsOworICAgICAgICAgICAgcmV0Lmdsb2Jh
bE9iamVjdCA9IGl0ZXItPmdldCgpOwogICAgICAgICAgICAgQVNTRVJUKCgrK2l0ZXIpID09IG1f
c2NvcGVDaGFpbi0+ZW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0LnR5
cGUgPSBSZXNvbHZlUmVzdWx0OjpEeW5hbWljOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBzaXplX3QgZGVwdGggPSAw
OwotICAgIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwogICAgIFNjb3BlQ2hhaW5JdGVy
YXRvciBpdGVyID0gbV9zY29wZUNoYWluLT5iZWdpbigpOwogICAgIFNjb3BlQ2hhaW5JdGVyYXRv
ciBlbmQgPSBtX3Njb3BlQ2hhaW4tPmVuZCgpOwotICAgIGZvciAoOyBpdGVyICE9IGVuZDsgKytp
dGVyLCArK2RlcHRoKSB7CisgICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrcmV0LmRl
cHRoKSB7CiAgICAgICAgIEpTT2JqZWN0KiBjdXJyZW50U2NvcGUgPSBpdGVyLT5nZXQoKTsKLSAg
ICAgICAgaWYgKCFjdXJyZW50U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkKKyAgICAgICAgaWYg
KCFjdXJyZW50U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkgeworICAgICAgICAgICAgcmV0LnR5
cGUgPSBSZXNvbHZlUmVzdWx0OjpEeW5hbWljOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0gICAgICAgIAogICAgICAgICBKU1ZhcmlhYmxlT2JqZWN0KiBjdXJyZW50VmFyaWFibGVPYmpl
Y3QgPSBzdGF0aWNfY2FzdDxKU1ZhcmlhYmxlT2JqZWN0Kj4oY3VycmVudFNjb3BlKTsKICAgICAg
ICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdC0+c3ltYm9s
VGFibGUoKS5nZXQocHJvcGVydHkuaW1wbCgpKTsKIAogICAgICAgICAvLyBGb3VuZCB0aGUgcHJv
cGVydHkKICAgICAgICAgaWYgKCFlbnRyeS5pc051bGwoKSkgewotICAgICAgICAgICAgaWYgKGVu
dHJ5LmlzUmVhZE9ubHkoKSAmJiBmb3JXcml0aW5nKSB7Ci0gICAgICAgICAgICAgICAgc3RhY2tE
ZXB0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtaXNzaW5nU3ltYm9sTWFya2VyKCk7
Ci0gICAgICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpCi0gICAgICAgICAgICAgICAgICAg
IGdsb2JhbE9iamVjdCA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdDsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXQudHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpJbmRl
eGVkRmxhZzsKKyAgICAgICAgICAgIGlmIChlbnRyeS5pc1JlYWRPbmx5KCkpCisgICAgICAgICAg
ICAgICAgcmV0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlRmxhZzsKKyAgICAgICAg
ICAgIGlmICgrK2l0ZXIgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgcmV0LnR5cGUgfD0gUmVz
b2x2ZVJlc3VsdDo6R2xvYmFsRmxhZzsKKyAgICAgICAgICAgICAgICByZXQuZ2xvYmFsT2JqZWN0
ID0gY3VycmVudFNjb3BlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBy
ZXQudHlwZSB8PSBSZXNvbHZlUmVzdWx0OjpTY29wZUZsYWc7CisgICAgICAgICAgICAgICAgcmV0
LmRlcHRoICs9IG1fY29kZUJsb2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7CiAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBzdGFja0RlcHRoID0gZGVwdGggKyBtX2NvZGVCbG9jay0+bmVlZHNG
dWxsU2NvcGVDaGFpbigpOwotICAgICAgICAgICAgaW5kZXggPSBlbnRyeS5nZXRJbmRleCgpOwot
ICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpCi0gICAgICAgICAgICAgICAgZ2xvYmFsT2Jq
ZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgICAgICBpZiAoIXJldC5pc0R5bmFtaWMoKSkKKyAgICAgICAgICAgICAgICByZXQudHlw
ZSB8PSBSZXNvbHZlUmVzdWx0OjpTdGF0aWNGbGFnOworICAgICAgICAgICAgcmV0LmluZGV4ID0g
ZW50cnkuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAg
ICAgICAgYm9vbCBzY29wZVJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwogICAgICAgICBp
ZiAoY3VycmVudFZhcmlhYmxlT2JqZWN0LT5pc0R5bmFtaWNTY29wZShzY29wZVJlcXVpcmVzRHlu
YW1pY0NoZWNrcykpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmVxdWlyZXNEeW5hbWlj
Q2hlY2tzIHw9IHNjb3BlUmVxdWlyZXNEeW5hbWljQ2hlY2tzOworICAgICAgICBpZiAoc2NvcGVS
ZXF1aXJlc0R5bmFtaWNDaGVja3MpCisgICAgICAgICAgICByZXQudHlwZSB8PSBSZXNvbHZlUmVz
dWx0OjpEeW5hbWljRmxhZzsKICAgICB9CisKICAgICAvLyBDYW4ndCBsb2NhdGUgdGhlIHByb3Bl
cnR5IGJ1dCB3ZSdyZSBhYmxlIHRvIGF2b2lkIGEgZmV3IGxvb2t1cHMuCi0gICAgc3RhY2tEZXB0
aCA9IGRlcHRoICsgbV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKTsKLSAgICBpbmRl
eCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKICAgICBKU09iamVjdCogc2NvcGUgPSBpdGVyLT5n
ZXQoKTsKLSAgICBpZiAoKytpdGVyID09IGVuZCkKLSAgICAgICAgZ2xvYmFsT2JqZWN0ID0gc2Nv
cGU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0LmRlcHRoICs9IG1fY29kZUJsb2NrLT5uZWVk
c0Z1bGxTY29wZUNoYWluKCk7CisgICAgaWYgKCsraXRlciA9PSBlbmQpIHsKKyAgICAgICAgcmV0
LnR5cGUgPSByZXQuaXNEeW5hbWljKCkgPyBSZXNvbHZlUmVzdWx0OjpEeW5hbWljR2xvYmFsIDog
UmVzb2x2ZVJlc3VsdDo6R2xvYmFsOworICAgICAgICByZXQuZ2xvYmFsT2JqZWN0ID0gc2NvcGU7
CisgICAgfSBlbHNlCisgICAgICAgIHJldC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYzsK
KyAgICByZXQuaW5kZXggPSBtaXNzaW5nU3ltYm9sTWFya2VyKCk7CisgICAgcmV0dXJuIHJldDsK
K30KKworUmVzb2x2ZVJlc3VsdCBCeXRlY29kZUdlbmVyYXRvcjo6cmVzb2x2ZUNvbnN0RGVjbChj
b25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKK3sKKyAgICBSZXNvbHZlUmVzdWx0IHJldCA9IHsg
MCwgMCwgMCwgMCB9OworICAgIAorICAgIC8vIFJlZ2lzdGVyLWFsbG9jYXRlZCBjb25zdCBkZWNs
YXJhdGlvbnMuCisgICAgaWYgKG1fY29kZVR5cGUgIT0gRXZhbENvZGUgJiYgbV9jb2RlVHlwZSAh
PSBHbG9iYWxDb2RlKSB7CisgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgZW50cnkgPSBzeW1ib2xU
YWJsZSgpLmdldChwcm9wZXJ0eS5pbXBsKCkpOworICAgICAgICBpZiAoIWVudHJ5LmlzTnVsbCgp
KSB7CisgICAgICAgICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OlJlZ2lzdGVyOworICAg
ICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkKKyAgICAgICAgICAgICAgICByZXQudHlw
ZSB8PSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVGbGFnOworICAgICAgICAgICAgcmV0LmluZGV4
ID0gZW50cnkuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICAvLyBDb25zdCBkZWNsYXJhdGlvbnMgaW4gZXZhbCBjb2RlIG9yIGdsb2Jh
bCBjb2RlLgorICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gc2NvcGVDaGFpbigpLT5iZWdp
bigpOworICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBlbmQgPSBzY29wZUNoYWluKCktPmVuZCgpOwor
ICAgIGZvciAoOyBpdGVyICE9IGVuZDsgKytpdGVyLCArK3JldC5kZXB0aCkgeworICAgICAgICBK
U09iamVjdCogY3VycmVudFNjb3BlID0gaXRlci0+Z2V0KCk7CisgICAgICAgIGlmICghY3VycmVu
dFNjb3BlLT5pc1ZhcmlhYmxlT2JqZWN0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgSlNWYXJpYWJsZU9iamVjdCogY3VycmVudFZhcmlhYmxlT2JqZWN0ID0gc3RhdGljX2Nhc3Q8
SlNWYXJpYWJsZU9iamVjdCo+KGN1cnJlbnRTY29wZSk7CisgICAgICAgIFN5bWJvbFRhYmxlRW50
cnkgZW50cnkgPSBjdXJyZW50VmFyaWFibGVPYmplY3QtPnN5bWJvbFRhYmxlKCkuZ2V0KHByb3Bl
cnR5LmltcGwoKSk7CisgICAgICAgIGlmIChlbnRyeS5pc051bGwoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBpZiAoKytpdGVyID09IGVuZCkgeworICAgICAgICAgICAgcmV0LnR5
cGUgPSBSZXNvbHZlUmVzdWx0OjpJbmRleGVkR2xvYmFsOworICAgICAgICAgICAgcmV0Lmdsb2Jh
bE9iamVjdCA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdDsKKyAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkxleGljYWw7CisgICAgICAgIHJldC5kZXB0
aCArPSBzY29wZURlcHRoKCk7CisgICAgICAgIHJldC5pbmRleCA9IGVudHJ5LmdldEluZGV4KCk7
CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRklYTUU6IFdoaWxlIHRoaXMg
Y29kZSBzaG91bGQgb25seSBiZSBoaXQgaW4gYW4gZXZhbCBibG9jaywgaXQgd2lsbCBhc3NpZ24K
KyAgICAvLyB0byB0aGUgd3JvbmcgYmFzZSBpZiBwcm9wZXJ0eSBleGlzdHMgaW4gYW4gaW50ZXJ2
ZW5pbmcgd2l0aCBzY29wZS4KKyAgICByZXQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7
CisgICAgcmV0LmluZGV4ID0gbWlzc2luZ1N5bWJvbE1hcmtlcigpOworICAgIHJldC5kZXB0aCA9
IHNjb3BlRGVwdGgoKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiB2b2lkIEJ5dGVjb2RlR2VuZXJh
dG9yOjplbWl0Q2hlY2tIYXNJbnN0YW5jZShSZWdpc3RlcklEKiBiYXNlKQpAQCAtMTIzNywyMDgg
KzEyODYsMTM0IEBAIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OnNob3VsZEF2b2lkUmVzb2x2ZUds
b2JhbCgpCiAgICAgcmV0dXJuIG1fY29kZUJsb2NrLT5nbG9iYWxSZXNvbHZlSW5mb0NvdW50KCkg
PiBtYXhHbG9iYWxSZXNvbHZlcyAmJiAhbV9sYWJlbFNjb3Blcy5zaXplKCk7CiB9CiAKLVJlZ2lz
dGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3QsIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6
OmVtaXRSZXNvbHZlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRp
b24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIHNpemVfdCBkZXB0aCA9IDA7
Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAg
ICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmICghZmluZFNjb3Bl
ZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWND
aGVja3MsIGdsb2JhbE9iamVjdCkgJiYgIWdsb2JhbE9iamVjdCkgewotICAgICAgICAvLyBXZSBj
YW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZSk7
Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwotICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKLSAgICAgICAgcmV0
dXJuIGRzdDsKLSAgICB9Ci0gICAgaWYgKHNob3VsZEF2b2lkUmVzb2x2ZUdsb2JhbCgpKSB7Ci0g
ICAgICAgIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgICAgIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9
IHRydWU7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoZ2xvYmFsT2JqZWN0KSB7Ci0gICAgICAg
IGlmIChpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0No
ZWNrcykgewotICAgICAgICAgICAgLy8gRGlyZWN0bHkgaW5kZXggdGhlIHByb3BlcnR5IGxvb2t1
cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAgICAgICAgICAgcmV0dXJuIGVtaXRHZXRTY29w
ZWRWYXIoZHN0LCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7Ci0gICAgICAgIH0KLQorICAg
IGlmIChsb2NhdGlvbi5pc1N0YXRpYygpKQorICAgICAgICByZXR1cm4gZW1pdEdldFN0YXRpY1Zh
cihkc3QsIGxvY2F0aW9uKTsKKyAgICAKKyAgICBpZiAobG9jYXRpb24uaXNHbG9iYWwoKSAmJiAh
c2hvdWxkQXZvaWRSZXNvbHZlR2xvYmFsKCkpIHsKICNpZiBFTkFCTEUoSklUKQogICAgICAgICBt
X2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsK
ICNlbmRpZgogI2lmIEVOQUJMRShJTlRFUlBSRVRFUikKICAgICAgICAgbV9jb2RlQmxvY2stPmFk
ZEdsb2JhbFJlc29sdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMoKS5zaXplKCkpOwogI2VuZGlm
Ci0gICAgICAgIGVtaXRPcGNvZGUocmVxdWlyZXNEeW5hbWljQ2hlY2tzID8gb3BfcmVzb2x2ZV9n
bG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFsKTsKKyAgICAgICAgYm9vbCBkeW5hbWlj
ID0gbG9jYXRpb24uaXNEeW5hbWljKCkgJiYgbG9jYXRpb24uZGVwdGg7CisgICAgICAgIGVtaXRP
cGNvZGUoZHluYW1pYyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2ds
b2JhbCk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKICAgICAg
ICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKDApOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBl
bmQoMCk7Ci0gICAgICAgIGlmIChyZXF1aXJlc0R5bmFtaWNDaGVja3MpCi0gICAgICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVwdGgpOworICAgICAgICBpZiAoZHluYW1pYykKKyAgICAg
ICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChsb2NhdGlvbi5kZXB0aCk7CiAgICAgICAgIHJl
dHVybiBkc3Q7CiAgICAgfQotCi0gICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAg
ICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIGV2YWwgbmVzdGVkIGluc2lkZSBhIHx3aXRo
fCBqdXN0IGdpdmUgdXAKLSAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlKTsKKyAgICAgICAg
CisgICAgaWYgKGxvY2F0aW9uLnR5cGUgPT0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYyAmJiBsb2Nh
dGlvbi5kZXB0aCkgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGF0IGxlYXN0IGFi
bGUgdG8gZHJvcCBhIGZldyBzY29wZSBjaGFpbnMgZnJvbSB0aGUKKyAgICAgICAgLy8gbG9va3Vw
IGNoYWluLCBhbHRob3VnaCB3ZSBzdGlsbCBuZWVkIHRvIGhhc2ggZnJvbSB0aGVuIG9uLgorICAg
ICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmVfc2tpcCk7CiAgICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRk
Q29uc3RhbnQocHJvcGVydHkpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGxvY2F0
aW9uLmRlcHRoKTsKICAgICAgICAgcmV0dXJuIGRzdDsKICAgICB9CiAKLSAgICBpZiAoaW5kZXgg
IT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpKSB7Ci0gICAgICAgIC8vIERpcmVjdGx5IGluZGV4IHRo
ZSBwcm9wZXJ0eSBsb29rdXAgYWNyb3NzIG11bHRpcGxlIHNjb3Blcy4KLSAgICAgICAgcmV0dXJu
IGVtaXRHZXRTY29wZWRWYXIoZHN0LCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7Ci0gICAg
fQotCi0gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFyZSBhdCBsZWFzdCBhYmxlIHRvIGRyb3AgYSBm
ZXcgc2NvcGUgY2hhaW5zIGZyb20gdGhlCi0gICAgLy8gbG9va3VwIGNoYWluLCBhbHRob3VnaCB3
ZSBzdGlsbCBuZWVkIHRvIGhhc2ggZnJvbSB0aGVuIG9uLgotICAgIGVtaXRPcGNvZGUob3BfcmVz
b2x2ZV9za2lwKTsKKyAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmUpOwogICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRD
b25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkZXB0aCk7CiAg
ICAgcmV0dXJuIGRzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRH
ZXRTY29wZWRWYXIoUmVnaXN0ZXJJRCogZHN0LCBzaXplX3QgZGVwdGgsIGludCBpbmRleCwgSlNW
YWx1ZSBnbG9iYWxPYmplY3QpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJl
c29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24s
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIGlmIChnbG9iYWxPYmplY3QpIHsK
LSAgICAgICAgaWYgKG1fbGFzdE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxfdmFyKSB7Ci0gICAg
ICAgICAgICBpbnQgZHN0SW5kZXg7Ci0gICAgICAgICAgICBpbnQgc3JjSW5kZXg7Ci0gICAgICAg
ICAgICByZXRyaWV2ZUxhc3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIGlmIChkc3RJbmRleCA9PSBpbmRleCAmJiBzcmNJbmRleCA9PSBkc3Qt
PmluZGV4KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRzdDsKLSAgICAgICAgfQotCi0gICAg
ICAgIGVtaXRPcGNvZGUob3BfZ2V0X2dsb2JhbF92YXIpOwotICAgICAgICBpbnN0cnVjdGlvbnMo
KS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGlu
ZGV4KTsKLSAgICAgICAgcmV0dXJuIGRzdDsKKyAgICBpZiAobG9jYXRpb24uaXNHbG9iYWwoKSAm
JiAhbG9jYXRpb24uaXNEeW5hbWljKCkpIHsKKyAgICAgICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0
aGUgYmFzZQorICAgICAgICBBU1NFUlQobG9jYXRpb24uZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAg
cmV0dXJuIGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShsb2NhdGlvbi5nbG9iYWxPYmplY3QpKTsKICAg
ICB9CiAKLSAgICBlbWl0T3Bjb2RlKG9wX2dldF9zY29wZWRfdmFyKTsKKyAgICAvLyBXZSBjYW4n
dCBvcHRpbWlzZSBhdCBhbGwgOi0oCisgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwog
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChpbmRleCk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKKyAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKKyAgICBpbnN0
cnVjdGlvbnMoKS5hcHBlbmQoZmFsc2UpOwogICAgIHJldHVybiBkc3Q7CiB9CiAKLVJlZ2lzdGVy
SUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U2NvcGVkVmFyKHNpemVfdCBkZXB0aCwgaW50
IGluZGV4LCBSZWdpc3RlcklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpCitSZWdpc3Rl
cklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQq
IGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHBy
b3BlcnR5KQogewotICAgIGlmIChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAgZW1pdE9wY29kZShv
cF9wdXRfZ2xvYmFsX3Zhcik7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7
Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgICAg
IHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgZW1pdE9wY29kZShvcF9wdXRfc2NvcGVkX3Zhcik7
Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGluZGV4KTsKLSAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQoZGVwdGgpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7
Ci0gICAgcmV0dXJuIHZhbHVlOwotfQorICAgIGlmICghbV9jb2RlQmxvY2stPmlzU3RyaWN0TW9k
ZSgpKQorICAgICAgICByZXR1cm4gZW1pdFJlc29sdmVCYXNlKGRzdCwgbG9jYXRpb24sIHByb3Bl
cnR5KTsKIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlQmFzZShS
ZWdpc3RlcklEKiBkc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQotewotICAgIHNpemVf
dCBkZXB0aCA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2Jq
ZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGZp
bmRTY29wZWRQcm9wZXJ0eShwcm9wZXJ0eSwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNE
eW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpOwotICAgIGlmICghZ2xvYmFsT2JqZWN0IHx8IHJl
cXVpcmVzRHluYW1pY0NoZWNrcykgewotICAgICAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBh
bGwgOi0oCi0gICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZV9iYXNlKTsKKyAgICBpZiAobG9j
YXRpb24uaXNHbG9iYWwoKSAmJiAhbG9jYXRpb24uaXNEeW5hbWljKCkpIHsKKyAgICAgICAgLy8g
R2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQorICAgICAgICBBU1NFUlQobG9jYXRpb24uZ2xvYmFs
T2JqZWN0KTsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGVtaXRMb2FkKGRz
dCwgSlNWYWx1ZShsb2NhdGlvbi5nbG9iYWxPYmplY3QpKTsKKyAgICAgICAgZW1pdE9wY29kZShv
cF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGRzdC0+aW5kZXgoKSk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFu
dChwcm9wZXJ0eSkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZmFsc2UpOwotICAg
ICAgICByZXR1cm4gZHN0OworICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpOwogICAgIH0KIAot
ICAgIC8vIEdsb2JhbCBvYmplY3QgaXMgdGhlIGJhc2UKLSAgICByZXR1cm4gZW1pdExvYWQoZHN0
LCBKU1ZhbHVlKGdsb2JhbE9iamVjdCkpOwotfQotCi1SZWdpc3RlcklEKiBCeXRlY29kZUdlbmVy
YXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHkpCi17Ci0gICAgaWYgKCFtX2NvZGVCbG9jay0+aXNTdHJpY3RNb2RlKCkp
Ci0gICAgICAgIHJldHVybiBlbWl0UmVzb2x2ZUJhc2UoZHN0LCBwcm9wZXJ0eSk7Ci0gICAgc2l6
ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxP
YmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAg
ZmluZFNjb3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJl
c0R5bmFtaWNDaGVja3MsIGdsb2JhbE9iamVjdCk7Ci0gICAgaWYgKCFnbG9iYWxPYmplY3QgfHwg
cmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0
IGFsbCA6LSgKLSAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwotICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0gICAgCi0gICAgLy8g
R2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQg
PSBlbWl0TG9hZChkc3QsIEpTVmFsdWUoZ2xvYmFsT2JqZWN0KSk7Ci0gICAgZW1pdE9wY29kZShv
cF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKKyAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBh
bGwgOi0oCisgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwogICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRD
b25zdGFudChwcm9wZXJ0eSkpOwotICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CisgICAgaW5zdHJ1
Y3Rpb25zKCkuYXBwZW5kKHRydWUpOworICAgIHJldHVybiBkc3Q7CiB9CiAKLVJlZ2lzdGVySUQq
IEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZVdpdGhCYXNlKFJlZ2lzdGVySUQqIGJhc2VE
c3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQorUmVn
aXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJ
RCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9j
YXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIHNpemVfdCBkZXB0aCA9
IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsK
LSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmICghZmluZFNj
b3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFt
aWNDaGVja3MsIGdsb2JhbE9iamVjdCkgfHwgIWdsb2JhbE9iamVjdCB8fCByZXF1aXJlc0R5bmFt
aWNDaGVja3MpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3Qgb3B0aW1pc2UgYXQgYWxsIDotKAotICAg
ICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsKLSAgICAgICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKGJhc2VEc3QtPmluZGV4KCkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQocHJvcERzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChh
ZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9Cisg
ICAgaWYgKGxvY2F0aW9uLmlzR2xvYmFsKCkgJiYgIWxvY2F0aW9uLmlzRHluYW1pYygpKSB7Cisg
ICAgICAgIC8vIEdsb2JhbCBvYmplY3QgaXMgdGhlIGJhc2UKKyAgICAgICAgQVNTRVJUKGxvY2F0
aW9uLmdsb2JhbE9iamVjdCk7CisgICAgICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFsdWUobG9j
YXRpb24uZ2xvYmFsT2JqZWN0KSk7CiAKLSAgICBib29sIGZvcmNlR2xvYmFsUmVzb2x2ZSA9IGZh
bHNlOworICAgICAgICBpZiAobG9jYXRpb24uaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgLy8g
RGlyZWN0bHkgaW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVz
LgorICAgICAgICAgICAgZW1pdEdldFN0YXRpY1Zhcihwcm9wRHN0LCBsb2NhdGlvbik7CisgICAg
ICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICAgICAgfQogCi0gICAgLy8gR2xvYmFsIG9iamVj
dCBpcyB0aGUgYmFzZQotICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFsdWUoZ2xvYmFsT2JqZWN0
KSk7CisgICAgICAgIGlmIChzaG91bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgeworICAgICAgICAg
ICAgZW1pdE9wY29kZShvcF9yZXNvbHZlKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZChwcm9wRHN0LT5pbmRleCgpKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOworICAgICAgICAgICAgcmV0dXJuIGJhc2VEc3Q7Cisg
ICAgICAgIH0KIAotICAgIGlmIChpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIWZv
cmNlR2xvYmFsUmVzb2x2ZSkgewotICAgICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVy
dHkgbG9va3VwIGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAgIGVtaXRHZXRTY29wZWRW
YXIocHJvcERzdCwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3QpOwotICAgICAgICByZXR1cm4g
YmFzZURzdDsKLSAgICB9Ci0gICAgaWYgKHNob3VsZEF2b2lkUmVzb2x2ZUdsb2JhbCgpKSB7Ci0g
ICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZChwcm9wRHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFk
ZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIHJldHVybiBiYXNlRHN0OwotICAgIH0KICNp
ZiBFTkFCTEUoSklUKQotICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhpbnN0
cnVjdGlvbnMoKS5zaXplKCkpOworICAgICAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2
ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgogI2lmIEVOQUJMRShJTlRFUlBS
RVRFUikKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3Ry
dWN0aW9ucygpLnNpemUoKSk7CisgICAgICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZl
SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgotICAgIGVtaXRPcGNv
ZGUocmVxdWlyZXNEeW5hbWljQ2hlY2tzID8gb3BfcmVzb2x2ZV9nbG9iYWxfZHluYW1pYyA6IG9w
X3Jlc29sdmVfZ2xvYmFsKTsKKyAgICAgICAgZW1pdE9wY29kZShvcF9yZXNvbHZlX2dsb2JhbCk7
CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0LT5pbmRleCgpKTsKKyAgICAg
ICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7CisgICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KDApOworICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICB9CisKKyAgICBlbWl0T3Bjb2RlKG9w
X3Jlc29sdmVfd2l0aF9iYXNlKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYmFzZURzdC0+
aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwog
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0g
ICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBw
ZW5kKGRlcHRoKTsKICAgICByZXR1cm4gYmFzZURzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNv
ZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVn
aXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitSZWdpc3RlcklE
KiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNl
RHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwg
Y29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAg
ICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJv
b2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVkUHJv
cGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1pY0NoZWNr
cywgZ2xvYmFsT2JqZWN0KSB8fCAhZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNr
cykgeworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpKSB7CisgICAgICAgIGVtaXRMb2FkKGJh
c2VEc3QsIGpzVW5kZWZpbmVkKCkpOworICAgICAgICBlbWl0R2V0U3RhdGljVmFyKHByb3BEc3Qs
IGxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgfQorCisgICAgaWYgKGxv
Y2F0aW9uLnR5cGUgPT0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYykgewogICAgICAgICAvLyBXZSBj
YW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCiAgICAgICAgIGVtaXRPcGNvZGUob3BfcmVzb2x2ZV93
aXRoX3RoaXMpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYmFzZURzdC0+aW5kZXgo
KSk7CkBAIC0xNDQ3LDM2ICsxNDIyLDc3IEBAIFJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9y
OjplbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVyCiAgICAg
ICAgIHJldHVybiBiYXNlRHN0OwogICAgIH0KIAotICAgIGJvb2wgZm9yY2VHbG9iYWxSZXNvbHZl
ID0gZmFsc2U7Ci0KLSAgICAvLyBHbG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCiAgICAgZW1pdExv
YWQoYmFzZURzdCwganNVbmRlZmluZWQoKSk7CisgICAgcmV0dXJuIGVtaXRSZXNvbHZlKHByb3BE
c3QsIGxvY2F0aW9uLCBwcm9wZXJ0eSk7Cit9CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5
bWJvbE1hcmtlcigpICYmICFmb3JjZUdsb2JhbFJlc29sdmUpIHsKLSAgICAgICAgLy8gRGlyZWN0
bHkgaW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAg
ICAgICBlbWl0R2V0U2NvcGVkVmFyKHByb3BEc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0
KTsKLSAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRv
cjo6ZW1pdEdldFN0YXRpY1ZhcihSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQm
IGxvY2F0aW9uKQoreworICAgIFJlZ2lzdGVySUQqIGxvY2FsID0gMDsKKworICAgIHN3aXRjaCAo
bG9jYXRpb24udHlwZSkgeworICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI6CisgICAg
Y2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdpc3RlcjoKKyAgICAgICAgbG9jYWwgPSBy
ZWdpc3RlckZvcihsb2NhdGlvbik7CisgICAgICAgIGlmIChkc3QgPT0gaWdub3JlZFJlc3VsdCgp
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtb3ZlVG9EZXN0aW5hdGlv
bklmTmVlZGVkKGRzdCwgbG9jYWwpOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpMZXhpY2Fs
OgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlTGV4aWNhbDoKKyAgICAgICAgZW1p
dE9wY29kZShvcF9nZXRfc2NvcGVkX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZChkc3QtPmluZGV4KCkpOworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24u
aW5kZXgpOworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobG9jYXRpb24uZGVwdGgpOwor
ICAgICAgICByZXR1cm4gZHN0OworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbmRleGVkR2xv
YmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhlZEdsb2JhbDoKKyAg
ICAgICAgaWYgKG1fbGFzdE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxfdmFyKSB7CisgICAgICAg
ICAgICBpbnQgZHN0SW5kZXg7CisgICAgICAgICAgICBpbnQgc3JjSW5kZXg7CisgICAgICAgICAg
ICByZXRyaWV2ZUxhc3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7CisgICAgICAgICAgICBp
ZiAoZHN0SW5kZXggPT0gbG9jYXRpb24uaW5kZXggJiYgc3JjSW5kZXggPT0gZHN0LT5pbmRleCgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBkc3Q7CisgICAgICAgIH0KKworICAgICAgICBlbWl0
T3Bjb2RlKG9wX2dldF9nbG9iYWxfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGRzdC0+aW5kZXgoKSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChsb2NhdGlvbi5p
bmRleCk7CisgICAgICAgIHJldHVybiBkc3Q7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChzaG91
bGRBdm9pZFJlc29sdmVHbG9iYWwoKSkgewotICAgICAgICBlbWl0T3Bjb2RlKG9wX3Jlc29sdmUp
OwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+aW5kZXgoKSk7Ci0gICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAg
ICByZXR1cm4gYmFzZURzdDsKK30KKworUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVt
aXRQdXRTdGF0aWNWYXIoY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIFJlZ2lzdGVySUQq
IHZhbHVlKQoreworICAgIHN3aXRjaCAobG9jYXRpb24udHlwZSkgeworICAgIGNhc2UgUmVzb2x2
ZVJlc3VsdDo6UmVnaXN0ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVSZWdp
c3RlcjoKKyAgICAgICAgcmV0dXJuIG1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQocmVnaXN0ZXJG
b3IobG9jYXRpb24pLCB2YWx1ZSk7CisKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OkxleGljYWw6
CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbW11dGFibGVMZXhpY2FsOgorICAgICAgICBlbWl0
T3Bjb2RlKG9wX3B1dF9zY29wZWRfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGxvY2F0aW9uLmluZGV4KTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGxvY2F0aW9u
LmRlcHRoKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHZhbHVlLT5pbmRleCgpKTsK
KyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpJbmRleGVk
R2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6SW1tdXRhYmxlSW5kZXhlZEdsb2JhbDoK
KyAgICAgICAgZW1pdE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7CisgICAgICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChsb2NhdGlvbi5pbmRleCk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZCh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIGRlZmF1
bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKICAg
ICB9Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUlu
Zm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKLSNlbmRpZgotI2lmIEVOQUJMRShJTlRFUlBSRVRF
UikKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0
aW9ucygpLnNpemUoKSk7Ci0jZW5kaWYKLSAgICBlbWl0T3Bjb2RlKHJlcXVpcmVzRHluYW1pY0No
ZWNrcyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2dsb2JhbCk7Ci0g
ICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0gICAgaWYgKHJlcXVp
cmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsK
LSAgICByZXR1cm4gYmFzZURzdDsKIH0KIAogdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdE1l
dGhvZENoZWNrKCkKQEAgLTIzNjIsNyArMjM3OCw3IEBAIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6
OnNldElzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlv
CiAKIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OmlzQXJndW1lbnROdW1iZXIoY29uc3QgSWRlbnRp
ZmllciYgaWRlbnQsIGludCBhcmd1bWVudE51bWJlcikKIHsKLSAgICBSZWdpc3RlcklEKiByZWdp
c3RlcklEID0gcmVnaXN0ZXJGb3IoaWRlbnQpOworICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVySUQg
PSByZWdpc3RlckZvcihyZXNvbHZlKGlkZW50KSk7CiAgICAgaWYgKCFyZWdpc3RlcklEIHx8IHJl
Z2lzdGVySUQtPmluZGV4KCkgPj0gMCkKICAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiBy
ZWdpc3RlcklELT5pbmRleCgpID09IENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXQoYXJndW1lbnRO
dW1iZXIpOwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5oCmluZGV4IGNlOGQ4Zjg0MTJmNjg0ZTM5ZmIxMTk3Y2FlOTA5YWFj
MWUxM2E3MTcuLjY1N2NmZGI1ZDgxMjgzMWQxZTViNzMwOGMwZTJlNDBhNTdhMjcxMTcgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0
b3IuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2Vu
ZXJhdG9yLmgKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOCBD
YW1lcm9uIFp3YXJpY2ggPGN3endhcmljaEB1d2F0ZXJsb28uY2E+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgSWdhbGlhLCBTLkwuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTg1
LDYgKzg2LDg0IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
cHJvcGVydHlSZWdpc3RlcjsKICAgICB9OwogCisgICAgc3RydWN0IFJlc29sdmVSZXN1bHQgewor
ICAgICAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyBsb2Nh
bGx5IGJvdW5kLCBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgUmVnaXN0ZXJGbGFnID0gMHgx
LAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgc2NvcGUgY2hhaW4gYXQg
cnVudGltZSwgY2hlY2tpbmcgZm9yCisgICAgICAgICAgICAvLyBub24tc3RyaWN0IGV2YWwgYW5k
L29yIGB3aXRoJyBub2Rlcy4KKyAgICAgICAgICAgIER5bmFtaWNGbGFnID0gMHgyLAorICAgICAg
ICAgICAgLy8gVGhlIHByb3BlcnR5IHdhcyByZXNvbHZlZCB0byBhIGRlZmluaXRlIGxvY2F0aW9u
LCBhbmQgdGhlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGlzIG5vdCBuZWVkZWQgYW55IG1v
cmUuCisgICAgICAgICAgICBTdGF0aWNGbGFnID0gMHg0LAorICAgICAgICAgICAgLy8gT25jZSB3
ZSBoYXZlIHRoZSBiYXNlIG9iamVjdCwgdGhlIHByb3BlcnR5IHdpbGwgYmUgbG9jYXRlZCBhdCBh
CisgICAgICAgICAgICAvLyBrbm93biBpbmRleC4KKyAgICAgICAgICAgIEluZGV4ZWRGbGFnID0g
MHg4LAorICAgICAgICAgICAgLy8gU2tpcCBzb21lIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBz
Y29wZSBjaGFpbiwgZ2l2ZW4gYnkgImRlcHRoIi4KKyAgICAgICAgICAgIFNjb3BlRmxhZyA9IDB4
MTAsCisgICAgICAgICAgICAvLyBUaGUgcmVzb2x2ZWQgYmluZGluZyBpcyBpbW11dGFibGUuCisg
ICAgICAgICAgICBJbW11dGFibGVGbGFnID0gMHgyMCwKKyAgICAgICAgICAgIC8vIFRoZSBiYXNl
IG9iamVjdCBpcyB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEdsb2JhbEZsYWcgPSAw
eDQwCisgICAgICAgIH07CisgICAgICAgIGVudW0gVHlwZSB7CisgICAgICAgICAgICAvLyBUaGUg
cHJvcGVydHkgaXMgbG9jYWwsIGFuZCBzdG9yZWQgaW4gYSByZWdpc3Rlci4KKyAgICAgICAgICAg
IFJlZ2lzdGVyID0gUmVnaXN0ZXJGbGFnIHwgU3RhdGljRmxhZywKKyAgICAgICAgICAgIC8vIEEg
cmVhZC1vbmx5IGxvY2FsLCBjcmVhdGVkIGJ5ICJjb25zdCIuCisgICAgICAgICAgICBJbW11dGFi
bGVSZWdpc3RlciA9IFJlZ2lzdGVyRmxhZyB8IEltbXV0YWJsZUZsYWcgfCBTdGF0aWNGbGFnLAor
ICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGlzIHN0YXRpY2FsbHkgc2NvcGVkIGZyZWUgdmFy
aWFibGUuIEl0cyBjb29yZGluYXRlcworICAgICAgICAgICAgLy8gYXJlIGluICJpbmRleCIgYW5k
ICJkZXB0aCIuCisgICAgICAgICAgICBMZXhpY2FsID0gSW5kZXhlZEZsYWcgfCBTY29wZUZsYWcg
fCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgTGV4aWNhbCwgY3JlYXRl
ZCBieSAiY29uc3QiLgorICAgICAgICAgICAgSW1tdXRhYmxlTGV4aWNhbCA9IEluZGV4ZWRGbGFn
IHwgU2NvcGVGbGFnIHwgSW1tdXRhYmxlRmxhZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAv
LyBUaGUgcHJvcGVydHkgd2FzIG5vdCBib3VuZCBsZXhpY2FsbHksIHNvIGF0IHJ1bnRpbWUgd2Ug
c2hvdWxkCisgICAgICAgICAgICAvLyBsb29rIGRpcmVjdGx5IGluIHRoZSBnbG9iYWwgb2JqZWN0
LgorICAgICAgICAgICAgR2xvYmFsID0gR2xvYmFsRmxhZywKKyAgICAgICAgICAgIC8vIExpa2Ug
R2xvYmFsLCBidXQgd2UgY291bGQgYWN0dWFsbHkgcmVzb2x2ZSB0aGUgcHJvcGVydHkgdG8gYQor
ICAgICAgICAgICAgLy8gRG9udERlbGV0ZSBwcm9wZXJ0eSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwg
Zm9yIGluc3RhbmNlLCBhbnkKKyAgICAgICAgICAgIC8vIGJpbmRpbmcgY3JlYXRlZCB3aXRoICJ2
YXIiIGF0IHRoZSB0b3AgbGV2ZWwuIEF0IHJ1bnRpbWUgd2UnbGwKKyAgICAgICAgICAgIC8vIGp1
c3QgaW5kZXggaW50byB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEluZGV4ZWRHbG9i
YWwgPSBJbmRleGVkRmxhZyB8IEdsb2JhbEZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAg
Ly8gTGlrZSBJbmRleGVkR2xvYmFsLCBidXQgdGhlIHByb3BlcnR5IGlzIGFsc28gcmVhZC1vbmx5
LCBsaWtlIE5hTiwKKyAgICAgICAgICAgIC8vIEluZmluaXR5LCBvciB1bmRlZmluZWQuCisgICAg
ICAgICAgICBJbW11dGFibGVJbmRleGVkR2xvYmFsID0gSW5kZXhlZEZsYWcgfCBJbW11dGFibGVG
bGFnIHwgR2xvYmFsRmxhZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVy
dHkgY291bGQgbm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHksIGR1ZSB0byB0aGUKKyAgICAgICAg
ICAgIC8vIHByZXNlbmNlIG9mIGB3aXRoJyBibG9ja3MuIEF0IHJ1bnRpbWUgd2UnbGwgaGF2ZSB0
byB3YWxrIHRoZQorICAgICAgICAgICAgLy8gc2NvcGUgY2hhaW4uIFNjb3BlRmxhZyBpcyBzZXQg
dG8gaW5kaWNhdGUgdGhhdCAiZGVwdGgiIHdpbGwKKyAgICAgICAgICAgIC8vIGhvbGQgc29tZSBu
dW1iZXIgb2Ygbm9kZXMgdG8gc2tpcCBpbiB0aGUgc2NvcGUgY2hhaW4sIGJlZm9yZQorICAgICAg
ICAgICAgLy8gYmVnaW5uaW5nIHRoZSBzZWFyY2guCisgICAgICAgICAgICBEeW5hbWljID0gRHlu
YW1pY0ZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgd2FzIGxv
Y2F0ZWQgYXMgYSBzdGF0aWNhbGx5IHNjb3BlZCBmcmVlIHZhcmlhYmxlLAorICAgICAgICAgICAg
Ly8gYnV0IHdoaWxlIHRyYXZlcnNpbmcgdGhlIHNjb3BlIGNoYWluLCB0aGVyZSB3YXMgYW4gaW50
ZXJtZWRpYXRlCisgICAgICAgICAgICAvLyBhY3RpdmF0aW9uIHRoYXQgdXNlZCBub24tc3RyaWN0
IGBldmFsJy4gQXQgcnVudGltZSB3ZSdsbCBoYXZlIHRvCisgICAgICAgICAgICAvLyBjaGVjayBm
b3IgdGhlIGFic2VuY2Ugb2YgdGhpcyBwcm9wZXJ0eSBpbiB0aG9zZSBpbnRlcnZlbmluZworICAg
ICAgICAgICAgLy8gc2NvcGVzLgorICAgICAgICAgICAgRHluYW1pY0xleGljYWwgPSBEeW5hbWlj
RmxhZyB8IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFnLAorICAgICAgICAgICAgLy8gTGlrZSBJbW11
dGFibGVMZXhpY2FsLCBidXQgd2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0IGBldmFsJy4KKyAg
ICAgICAgICAgIER5bmFtaWNJbW11dGFibGVMZXhpY2FsID0gRHluYW1pY0ZsYWcgfCBJbmRleGVk
RmxhZyB8IFNjb3BlRmxhZyB8IEltbXV0YWJsZUZsYWcsCisgICAgICAgICAgICAvLyBMaWtlIEds
b2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcgbm9uLXN0cmljdCBgZXZhbCcuIEFzIHdpdGggCisg
ICAgICAgICAgICAvLyBEeW5hbWljLCBTY29wZUZsYWcgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQg
ImRlcHRoIiBkb2VzIGluZGVlZAorICAgICAgICAgICAgLy8gc3RvcmUgYSBudW1iZXIgb2YgZnJh
bWVzIHRvIHNraXAgYmVmb3JlIGRvaW5nIHRoZSBkeW5hbWljIGNoZWNrcy4KKyAgICAgICAgICAg
IER5bmFtaWNHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEdsb2JhbEZsYWcgfCBTY29wZUZsYWcsCisg
ICAgICAgICAgICAvLyBMaWtlIEluZGV4ZWRHbG9iYWwsIGJ1dCB3aXRoIGludGVydmVuaW5nIG5v
bi1zdHJpY3QgYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY0luZGV4ZWRHbG9iYWwgPSBEeW5h
bWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgR2xvYmFsRmxhZyB8IFNjb3BlRmxhZywKKyAgICAgICAg
ICAgIC8vIExpa2UgSW1tdXRhYmxlSW5kZXhlZEdsb2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcg
bm9uLXN0cmljdAorICAgICAgICAgICAgLy8gYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY0lt
bXV0YWJsZUluZGV4ZWRHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgSW1tdXRh
YmxlRmxhZyB8IEdsb2JhbEZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgIH07CisKKyAgICAgICAg
Ym9vbCBpc1JlZ2lzdGVyKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIFJlZ2lzdGVyRmxhZzsgfQor
ICAgICAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIHR5cGUgJiBEeW5hbWljRmxh
ZzsgfQorICAgICAgICBib29sIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIFN0YXRp
Y0ZsYWc7IH0KKyAgICAgICAgYm9vbCBpc0ltbXV0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUg
JiBJbW11dGFibGVGbGFnOyB9CisgICAgICAgIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVy
biB0eXBlICYgR2xvYmFsRmxhZzsgfQorCisgICAgICAgIHVuc2lnbmVkIHR5cGU7CisgICAgICAg
IGludCBpbmRleDsgLy8gSW5kZXggaW4gc2NvcGUsIGlmIEluZGV4ZWRGbGFnIGlzIHNldCwgb3Ig
aW4gcmVnaXN0ZXJzLCBpZiBSZWdpc3RlckZsYWcgaXMgc2V0LgorICAgICAgICBzaXplX3QgZGVw
dGg7IC8vIERlcHRoIGluIHNjb3BlIGNoYWluLCBpZiBTY29wZUZsYWcgaXMgc2V0CisgICAgICAg
IEpTT2JqZWN0KiBnbG9iYWxPYmplY3Q7IC8vIElmIEdsb2JhbEZsYWcgaXMgc2V0LgorICAgIH07
CisKICAgICBjbGFzcyBCeXRlY29kZUdlbmVyYXRvciB7CiAgICAgICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOwogICAgIHB1YmxpYzoKQEAgLTEwNywxMSArMTg2LDYgQEAgbmFtZXNwYWNlIEpT
QyB7CiAKICAgICAgICAgSlNPYmplY3QqIGdlbmVyYXRlKCk7CiAKLSAgICAgICAgLy8gUmV0dXJu
cyB0aGUgcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byBhIGxvY2FsIHZhcmlhYmxlLCBvciAwIGlm
IG5vCi0gICAgICAgIC8vIHN1Y2ggcmVnaXN0ZXIgZXhpc3RzLiBSZWdpc3RlcnMgcmV0dXJuZWQg
YnkgcmVnaXN0ZXJGb3IgZG8gbm90Ci0gICAgICAgIC8vIHJlcXVpcmUgZXhwbGljaXQgcmVmZXJl
bmNlIGNvdW50aW5nLgotICAgICAgICBSZWdpc3RlcklEKiByZWdpc3RlckZvcihjb25zdCBJZGVu
dGlmaWVyJik7Ci0KICAgICAgICAgYm9vbCBpc0FyZ3VtZW50TnVtYmVyKGNvbnN0IElkZW50aWZp
ZXImLCBpbnQpOwogCiAgICAgICAgIHZvaWQgc2V0SXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKGJv
b2wgaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTsKQEAgLTExOSwxNyArMTkzLDE2IEBAIG5hbWVz
cGFjZSBKU0MgewogICAgICAgICBib29sIHdpbGxSZXNvbHZlVG9Bcmd1bWVudHMoY29uc3QgSWRl
bnRpZmllciYpOwogICAgICAgICBSZWdpc3RlcklEKiB1bmNoZWNrZWRSZWdpc3RlckZvckFyZ3Vt
ZW50cygpOwogCi0gICAgICAgIC8vIEJlaGF2ZXMgYXMgcmVnaXN0ZXJGb3IgZG9lcywgYnV0IGln
bm9yZXMgZHluYW1pYyBzY29wZSBhcworICAgICAgICAvLyBSZXNvbHZlIGFuIGlkZW50aWZpZXIs
IGdpdmVuIHRoZSBjdXJyZW50IGNvbXBpbGUtdGltZSBzY29wZSBjaGFpbi4KKyAgICAgICAgUmVz
b2x2ZVJlc3VsdCByZXNvbHZlKGNvbnN0IElkZW50aWZpZXImKTsKKyAgICAgICAgLy8gQmVoYXZl
cyBhcyByZXNvbHZlIGRvZXMsIGJ1dCBpZ25vcmVzIGR5bmFtaWMgc2NvcGUgYXMKICAgICAgICAg
Ly8gZHluYW1pYyBzY29wZSBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIGNvbnN0IGluaXRpYWxp
c2F0aW9uCi0gICAgICAgIFJlZ2lzdGVySUQqIGNvbnN0UmVnaXN0ZXJGb3IoY29uc3QgSWRlbnRp
ZmllciYpOworICAgICAgICBSZXNvbHZlUmVzdWx0IHJlc29sdmVDb25zdERlY2woY29uc3QgSWRl
bnRpZmllciYpOwogCi0gICAgICAgIC8vIFNlYXJjaGVzIHRoZSBzY29wZSBjaGFpbiBpbiBhbiBh
dHRlbXB0IHRvICBzdGF0aWNhbGx5IGxvY2F0ZSB0aGUgcmVxdWVzdGVkCi0gICAgICAgIC8vIHBy
b3BlcnR5LiAgUmV0dXJucyBmYWxzZSBpZiBmb3IgYW55IHJlYXNvbiB0aGUgcHJvcGVydHkgY2Fu
bm90IGJlIHNhZmVseQotICAgICAgICAvLyBvcHRpbWlzZWQgYXQgYWxsLiAgT3RoZXJ3aXNlIGl0
IHdpbGwgcmV0dXJuIHRoZSBpbmRleCBhbmQgZGVwdGggb2YgdGhlCi0gICAgICAgIC8vIFZhcmlh
YmxlT2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcHJvcGVydHkuICBJZiB0aGUgcHJvcGVydHkgY2Fu
bm90IGJlIGZvdW5kCi0gICAgICAgIC8vIHN0YXRpY2FsbHksIGRlcHRoIHdpbGwgY29udGFpbiB0
aGUgZGVwdGggb2YgdGhlIHNjb3BlIGNoYWluIHdoZXJlIGR5bmFtaWMKLSAgICAgICAgLy8gbG9v
a3VwIG11c3QgYmVnaW4uCi0gICAgICAgIGJvb2wgZmluZFNjb3BlZFByb3BlcnR5KGNvbnN0IElk
ZW50aWZpZXImLCBpbnQmIGluZGV4LCBzaXplX3QmIGRlcHRoLCBib29sIGZvcldyaXRpbmcsIGJv
b2wmIGluY2x1ZGVzRHluYW1pY1Njb3BlcywgSlNPYmplY3QqJiBnbG9iYWxPYmplY3QpOworICAg
ICAgICAvLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIGEgbG9jYWwgdmFy
aWFibGUsIG9yIDAgaWYgbm8KKyAgICAgICAgLy8gc3VjaCByZWdpc3RlciBleGlzdHMuIFJlZ2lz
dGVycyByZXR1cm5lZCBieSByZWdpc3RlckZvciBkbyBub3QKKyAgICAgICAgLy8gcmVxdWlyZSBl
eHBsaWNpdCByZWZlcmVuY2UgY291bnRpbmcuCisgICAgICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVy
Rm9yKGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uKTsKIAogICAgICAgICAvLyBSZXR1cm5z
IHRoZSByZWdpc3RlciBzdG9yaW5nICJ0aGlzIgogICAgICAgICBSZWdpc3RlcklEKiB0aGlzUmVn
aXN0ZXIoKSB7IHJldHVybiAmbV90aGlzUmVnaXN0ZXI7IH0KQEAgLTMwOSwxNCArMzgyLDE0IEBA
IG5hbWVzcGFjZSBKU0MgewogICAgICAgICBSZWdpc3RlcklEKiBlbWl0VHlwZU9mKFJlZ2lzdGVy
SUQqIGRzdCwgUmVnaXN0ZXJJRCogc3JjKSB7IHJldHVybiBlbWl0VW5hcnlPcChvcF90eXBlb2Ys
IGRzdCwgc3JjKTsgfQogICAgICAgICBSZWdpc3RlcklEKiBlbWl0SW4oUmVnaXN0ZXJJRCogZHN0
LCBSZWdpc3RlcklEKiBwcm9wZXJ0eSwgUmVnaXN0ZXJJRCogYmFzZSkgeyByZXR1cm4gZW1pdEJp
bmFyeU9wKG9wX2luLCBkc3QsIHByb3BlcnR5LCBiYXNlLCBPcGVyYW5kVHlwZXMoKSk7IH0KIAot
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0IElk
ZW50aWZpZXImIHByb3BlcnR5KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEdldFNjb3BlZFZh
cihSZWdpc3RlcklEKiBkc3QsIHNpemVfdCBza2lwLCBpbnQgaW5kZXgsIEpTVmFsdWUgZ2xvYmFs
T2JqZWN0KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFB1dFNjb3BlZFZhcihzaXplX3Qgc2tp
cCwgaW50IGluZGV4LCBSZWdpc3RlcklEKiB2YWx1ZSwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpOwor
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0R2V0U3RhdGljVmFyKFJlZ2lzdGVySUQqIGRzdCwgY29u
c3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24pOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UHV0
U3RhdGljVmFyKGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0aW9uLCBSZWdpc3RlcklEKiB2YWx1
ZSk7CiAKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRz
dCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwotICAgICAgICBSZWdpc3RlcklEKiBlbWl0
UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBJZGVudGlmaWVyJiBwcm9w
ZXJ0eSk7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJ
RCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHkpOwotICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQq
IGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5
KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0LCBjb25z
dCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwor
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZUJhc2UoUmVnaXN0ZXJJRCogZHN0LCBjb25z
dCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwor
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0ZXJJRCogZHN0
LCBjb25zdCBSZXNvbHZlUmVzdWx0JiBsb2NhdGlvbiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHkpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhCYXNlKFJlZ2lzdGVySUQq
IGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIGxvY2F0
aW9uLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7CisgICAgICAgIFJlZ2lzdGVySUQqIGVt
aXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERz
dCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgbG9jYXRpb24sIGNvbnN0IElkZW50aWZpZXImIHByb3Bl
cnR5KTsKIAogICAgICAgICB2b2lkIGVtaXRNZXRob2RDaGVjaygpOwogCmRpZmYgLS1naXQgYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAKaW5kZXggMTMy
ZjY2NjJhZmJjYzc5NTRhY2U1OTlhNDYwM2Y0ZDkyZTBiODk4ZC4uZDZmMDllOTQ5NDQzN2M1YTli
NWM4MTgyMmU5OTAzZjNmZGVhYzkxYyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcApAQCAtNSw2ICs1LDcgQEAKICogIENvcHly
aWdodCAoQykgMjAwNyBDYW1lcm9uIFp3YXJpY2ggKGN3endhcmljaEB1d2F0ZXJsb28uY2EpCiAq
ICBDb3B5cmlnaHQgKEMpIDIwMDcgTWFrcyBPcmxvdmljaAogKiAgQ29weXJpZ2h0IChDKSAyMDA3
IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSWdh
bGlhLCBTLkwuCiAqCiAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMTQ2LDE0ICsxNDcsMTUgQEAgYm9vbCBS
ZXNvbHZlTm9kZTo6aXNQdXJlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0CiAK
IFJlZ2lzdGVySUQqIFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2Nh
bCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgeworICAgIFJlc29sdmVSZXN1bHQg
bG9jYXRpb24gPSBnZW5lcmF0b3IucmVzb2x2ZShtX2lkZW50KTsKKyAgICBpZiAoUmVnaXN0ZXJJ
RCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CiAgICAgICAgIGlm
IChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiAw
OwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0
LCBsb2NhbCk7CiAgICAgfQogICAgIAogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8o
bV9zdGFydE9mZnNldCArIG1faWRlbnQubGVuZ3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwot
ICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJlc29sdmUoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0KSwgbV9pZGVudCk7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5l
cmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiB9CiAKIC8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcnJheU5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDYsNyArMzQ4LDcgQEAgUmVnaXN0ZXJJRCogRXZh
bEZ1bmN0aW9uQ2FsbE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJh
dG9yLCBSZWcKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci50ZW1wRGVz
dGluYXRpb24oZHN0KTsKICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9y
LCBtX2FyZ3MpOwogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIHN0
YXJ0T2Zmc2V0KCkgKyA0LCA0LCAwKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhp
cyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBnZW5lcmF0b3IucHJv
cGVydHlOYW1lcygpLmV2YWwpOworICAgIGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhUaGlzKGNh
bGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCksIGZ1bmMuZ2V0KCksIGdlbmVyYXRvci5yZXNvbHZl
KGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuZXZhbCksIGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVz
KCkuZXZhbCk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbEV2YWwoZ2VuZXJhdG9yLmZp
bmFsRGVzdGluYXRpb24oZHN0LCBmdW5jLmdldCgpKSwgZnVuYy5nZXQoKSwgY2FsbEFyZ3VtZW50
cywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwogfQogCkBAIC0zNjQsMjAg
KzM2NiwxOSBAQCBSZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxWYWx1ZU5vZGU6OmVtaXRCeXRlY29k
ZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZQogCiBSZWdpc3RlcklEKiBGdW5jdGlv
bkNhbGxSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0
b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVmUHRyPFJlZ2lzdGVySUQ+IGxvY2Fs
ID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdp
c3RlcklEPiBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IudGVtcERlc3Rp
bmF0aW9uKGRzdCksIGxvY2FsLmdldCgpKTsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0g
Z2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwg
PSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIFJlZlB0cjxSZWdp
c3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRp
b24oZHN0KSwgbG9jYWwpOwogICAgICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2Vu
ZXJhdG9yLCBtX2FyZ3MpOwogICAgICAgICBnZW5lcmF0b3IuZW1pdExvYWQoY2FsbEFyZ3VtZW50
cy50aGlzUmVnaXN0ZXIoKSwganNVbmRlZmluZWQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0
b3IuZW1pdENhbGwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb25Pcklnbm9yZWQoZHN0LCBjYWxs
QXJndW1lbnRzLnRoaXNSZWdpc3RlcigpKSwgZnVuY3Rpb24uZ2V0KCksIGNhbGxBcmd1bWVudHMs
IGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICAgICAgcmV0dXJuIGdl
bmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdub3JlZChkc3Qs
IGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRz
LCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiAgICAgfQogCi0gICAgaW50
IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxP
YmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAg
aWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHkobV9pZGVudCwgaW5kZXgsIGRlcHRoLCBm
YWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1p
c3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2Vu
ZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAg
aWYgKGxvY2F0aW9uLmlzU3RhdGljKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1
bmMgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgIENhbGxBcmd1bWVudHMgY2Fs
bEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0R2V0
U3RhdGljVmFyKGZ1bmMuZ2V0KCksIGxvY2F0aW9uKTsKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRM
b2FkKGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCksIGpzVW5kZWZpbmVkKCkpOwogICAgICAg
ICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uT3JJ
Z25vcmVkKGRzdCwgZnVuYy5nZXQoKSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90
KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICB9CkBAIC0zODUsOCArMzg2LDkg
QEAgUmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRl
Y29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLAogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0g
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwogICAgIENhbGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50
cyhnZW5lcmF0b3IsIG1fYXJncyk7CiAgICAgaW50IGlkZW50aWZpZXJTdGFydCA9IGRpdm90KCkg
LSBzdGFydE9mZnNldCgpOworCiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhpZGVu
dGlmaWVyU3RhcnQgKyBtX2lkZW50Lmxlbmd0aCgpLCBtX2lkZW50Lmxlbmd0aCgpLCAwKTsKLSAg
ICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3Rl
cigpLCBmdW5jLmdldCgpLCBtX2lkZW50KTsKKyAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRo
VGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBsb2NhdGlvbiwg
bV9pZGVudCk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJn
dW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiB9CiAKQEAgLTU1
MCwyNCArNTUyLDIxIEBAIHN0YXRpYyBSZWdpc3RlcklEKiBlbWl0UG9zdEluY09yRGVjKEJ5dGVj
b2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAKIFJlZ2lzdGVySUQqIFBv
c3RmaXhSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0
b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5l
cmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xv
Y2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2Vu
ZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBn
ZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2NhdGlvbi5p
c0ltbXV0YWJsZSgpKSB7CiAgICAgICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVk
UmVzdWx0KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXRUb0pTTnVtYmVyKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCks
IGxvY2FsKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9y
ZWRSZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJhdG9y
LCBsb2NhbCwgbV9vcGVyYXRvcik7CiAgICAgICAgIHJldHVybiBlbWl0UG9zdEluY09yRGVjKGdl
bmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwsIG1fb3BlcmF0
b3IpOwogICAgIH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsK
LSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1p
Y0NoZWNrcyA9IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1f
aWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxP
YmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5h
bWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRv
ci5lbWl0R2V0U2NvcGVkVmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgZGVwdGgsIGluZGV4
LCBnbG9iYWxPYmplY3QpOworICAgIGlmIChsb2NhdGlvbi5pc1N0YXRpYygpICYmICFsb2NhdGlv
bi5pc0ltbXV0YWJsZSgpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdl
bmVyYXRvci5lbWl0R2V0U3RhdGljVmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbG9jYXRp
b24pOwogICAgICAgICBSZWdpc3RlcklEKiBvbGRWYWx1ZTsKICAgICAgICAgaWYgKGRzdCA9PSBn
ZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7CiAgICAgICAgICAgICBvbGRWYWx1ZSA9IDA7CkBA
IC01NzUsMTMgKzU3NCwxMyBAQCBSZWdpc3RlcklEKiBQb3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRC
eXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpcwogICAgICAgICB9IGVs
c2UgewogICAgICAgICAgICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09yRGVjKGdlbmVyYXRvciwg
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCksIG1fb3BlcmF0b3Ip
OwogICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBp
bmRleCwgdmFsdWUuZ2V0KCksIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0
UHV0U3RhdGljVmFyKGxvY2F0aW9uLCB2YWx1ZS5nZXQoKSk7CiAgICAgICAgIHJldHVybiBvbGRW
YWx1ZTsKICAgICB9Ci0KKyAgICAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRp
dm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJ
RD4gdmFsdWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVy
SUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCksIHZhbHVlLmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3Jh
cnkoKSwgdmFsdWUuZ2V0KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICBSZWdpc3RlcklEKiBv
bGRWYWx1ZTsKICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKICAg
ICAgICAgb2xkVmFsdWUgPSAwOwpAQCAtNjUzLDExICs2NTIsMTIgQEAgUmVnaXN0ZXJJRCogUG9z
dGZpeEVycm9yTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Is
IFJlZ2lzdGUKIAogUmVnaXN0ZXJJRCogRGVsZXRlUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShC
eXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgaWYg
KGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0
aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKGdlbmVyYXRvci5yZWdp
c3RlckZvcihsb2NhdGlvbikpCiAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZ2Vu
ZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgZmFsc2UpOwogCiAgICAgZ2VuZXJhdG9yLmVt
aXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0g
ICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9y
LnRlbXBEZXN0aW5hdGlvbihkc3QpLCBtX2lkZW50KTsKKyAgICBSZWdpc3RlcklEKiBiYXNlID0g
Z2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCks
IGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXREZWxldGVCeUlk
KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgYmFzZSksIGJhc2UsIG1faWRlbnQpOwog
fQogCkBAIC03MDgsMTMgKzcwOCwxNCBAQCBSZWdpc3RlcklEKiBWb2lkTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdAogCiBSZWdp
c3RlcklEKiBUeXBlT2ZSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9j
YWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0
IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVy
SUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBp
ZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAgICByZXR1cm4g
MDsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VHlwZU9mKGdlbmVyYXRvci5maW5hbERl
c3RpbmF0aW9uKGRzdCksIGxvY2FsKTsKICAgICB9CiAKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
c2NyYXRjaCA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5h
dGlvbihkc3QpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2NyYXRjaCA9IGdl
bmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBs
b2NhdGlvbiwgbV9pZGVudCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKHNjcmF0Y2guZ2V0
KCksIHNjcmF0Y2guZ2V0KCksIG1faWRlbnQpOwogICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmln
bm9yZWRSZXN1bHQoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC03MzcsMzIgKzczOCwyOCBAQCBS
ZWdpc3RlcklEKiBUeXBlT2ZWYWx1ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRv
ciYgZ2VuZXJhdG9yLCBSZWdpc3RlcgogCiBSZWdpc3RlcklEKiBQcmVmaXhSZXNvbHZlTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3Io
bV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29s
dmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lz
dGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFu
dChtX2lkZW50KSkgewogICAgICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJl
c3VsdCgpKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IHIwID0gZ2VuZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0
aW9uKGRzdCksIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpID8gMS4wIDogLTEuMCk7CiAgICAg
ICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRCaW5hcnlPcChvcF9hZGQsIHIwLmdldCgpLCBs
b2NhbCwgcjAuZ2V0KCksIE9wZXJhbmRUeXBlcygpKTsKICAgICAgICAgfQotCiAgICAgICAgIGVt
aXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIGxvY2FsLCBtX29wZXJhdG9yKTsKICAgICAgICAgcmV0
dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbG9jYWwpOwogICAg
IH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09i
amVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9
IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGlu
ZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpICYm
IGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWlyZXNEeW5hbWljQ2hlY2tz
KSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wRHN0ID0gZ2VuZXJhdG9yLmVtaXRH
ZXRTY29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBkZXB0aCwgaW5kZXgs
IGdsb2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkgJiYgIWxvY2F0aW9u
LmlzSW1tdXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBn
ZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCks
IGxvY2F0aW9uKTsKICAgICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwgcHJvcERzdC5n
ZXQoKSwgbV9vcGVyYXRvcik7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRl
cHRoLCBpbmRleCwgcHJvcERzdC5nZXQoKSwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJh
dG9yLmVtaXRQdXRTdGF0aWNWYXIobG9jYXRpb24sIHByb3BEc3QuZ2V0KCkpOwogICAgICAgICBy
ZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0Lmdl
dCgpKTsKICAgICB9CiAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCks
IHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJv
cERzdCA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsKLSAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKSwgcHJvcERzdC5nZXQoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVy
SUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCksIHByb3BEc3QuZ2V0KCksIGxvY2F0aW9uLCBtX2lkZW50KTsKICAgICBlbWl0UHJl
SW5jT3JEZWMoZ2VuZXJhdG9yLCBwcm9wRHN0LmdldCgpLCBtX29wZXJhdG9yKTsKICAgICBnZW5l
cmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgcHJvcERzdC5nZXQoKSk7CiAg
ICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcHJvcERz
dC5nZXQoKSk7CkBAIC0xMTUwLDEwICsxMTQ3LDExIEBAIHN0YXRpYyBBTFdBWVNfSU5MSU5FIFJl
Z2lzdGVySUQqIGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
CiAKIFJlZ2lzdGVySUQqIFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVj
b2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVn
aXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAg
ICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAgICBSZXNvbHZl
UmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAo
UmVnaXN0ZXJJRCAqbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7Cisg
ICAgICAgIGlmIChsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIGVt
aXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0
aW9uKGRzdCksIGxvY2FsLCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlwZXMoUmVzdWx0
VHlwZTo6dW5rbm93blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigpKSk7Ci0gICAg
ICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChnZW5lcmF0b3IubGVmdEhhbmRTaWRlTmVlZHND
b3B5KG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpKSB7
CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLm5ld1Rl
bXBvcmFyeSgpOwpAQCAtMTE2NywyMCArMTE2NSwxNiBAQCBSZWdpc3RlcklEKiBSZWFkTW9kaWZ5
UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBS
ZQogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0
LCByZXN1bHQpOwogICAgIH0KIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRo
ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJlcXVpcmVz
RHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3Bl
cnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBn
bG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVxdWly
ZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2Vu
ZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBk
ZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgaWYgKGxvY2F0aW9uLmlzU3RhdGljKCkg
JiYgIWxvY2F0aW9uLmlzSW1tdXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHNyYzEgPSBnZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIGxvY2F0aW9uKTsKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1pdFJl
YWRNb2RpZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24o
ZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFu
ZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0
b3IoKSkpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgs
IHJlc3VsdCwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0aWNW
YXIobG9jYXRpb24sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRz
dCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gc3RhcnRPZmZz
ZXQoKSArIG1faWRlbnQubGVuZ3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwotICAgIFJlZlB0
cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2UoZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpLCBzcmMxLmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5u
ZXdUZW1wb3JhcnkoKSwgc3JjMS5nZXQoKSwgbG9jYXRpb24sIG1faWRlbnQpOwogICAgIFJlZ2lz
dGVySUQqIHJlc3VsdCA9IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVy
YXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIG1fcmln
aHQsIG1fb3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBt
X3JpZ2h0LT5yZXN1bHREZXNjcmlwdG9yKCkpLCB0aGlzKTsKICAgICByZXR1cm4gZ2VuZXJhdG9y
LmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHJlc3VsdCk7CiB9CkBAIC0xMTg5LDI3
ICsxMTgzLDI0IEBAIFJlZ2lzdGVySUQqIFJlYWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlCiAKIFJlZ2lzdGVySUQqIEFzc2ln
blJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRv
ci5yZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxD
b25zdGFudChtX2lkZW50KSkKKyAgICBSZXNvbHZlUmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9y
LnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9jYWwgPSBnZW5lcmF0
b3IucmVnaXN0ZXJGb3IobG9jYXRpb24pKSB7CisgICAgICAgIGlmIChsb2NhdGlvbi5pc0ltbXV0
YWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmln
aHQpOwotICAgICAgICAKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVt
aXROb2RlKGxvY2FsLCBtX3JpZ2h0KTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9E
ZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXgg
PSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9
IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2Vu
ZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgsIHRydWUsIHJl
cXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3lt
Ym9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0NoZWNrcykgeworICAgIGlmIChsb2NhdGlv
bi5pc1N0YXRpYygpICYmICFsb2NhdGlvbi5pc0ltbXV0YWJsZSgpKSB7CiAgICAgICAgIGlmIChk
c3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIGRzdCA9IDA7CiAg
ICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdo
dCk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgdmFs
dWUsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKGxv
Y2F0aW9uLCB2YWx1ZSk7CiAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKLSAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2Vu
ZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpLCBsb2NhdGlvbiwgbV9pZGVudCk7CiAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdu
b3JlZFJlc3VsdCgpKQogICAgICAgICBkc3QgPSAwOwogICAgIFJlZ2lzdGVySUQqIHZhbHVlID0g
Z2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdodCk7CkBAIC0xMjk3LDggKzEyODgsMTAgQEAg
UmVnaXN0ZXJJRCogQ29tbWFOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdl
bmVyYXRvciwgUmVnaXN0ZXJJRCogZHMKIAogUmVnaXN0ZXJJRCogQ29uc3REZWNsTm9kZTo6ZW1p
dENvZGVTaW5nbGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvcikKIHsKKyAgICBSZXNvbHZl
UmVzdWx0IGxvY2F0aW9uID0gZ2VuZXJhdG9yLnJlc29sdmVDb25zdERlY2wobV9pZGVudCk7CisK
ICAgICAvLyBGSVhNRTogVGhpcyBjb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBiZWhhdmlvciBvZiBj
b25zdCBpbiBGaXJlZm94LgotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5j
b25zdFJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0g
Z2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGxvY2F0aW9uKSkgewogICAgICAgICBpZiAoIW1faW5pdCkK
ICAgICAgICAgICAgIHJldHVybiBsb2NhbDsKIApAQCAtMTMwNywyNyArMTMwMCwxNSBAQCBSZWdp
c3RlcklEKiBDb25zdERlY2xOb2RlOjplbWl0Q29kZVNpbmdsZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yKQogCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gbV9pbml0ID8gZ2Vu
ZXJhdG9yLmVtaXROb2RlKG1faW5pdCkgOiBnZW5lcmF0b3IuZW1pdExvYWQoMCwganNVbmRlZmlu
ZWQoKSk7CiAKLSAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IGdlbmVyYXRvci5zY29wZUNo
YWluKCktPmJlZ2luKCk7Ci0gICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IGdlbmVyYXRvci5z
Y29wZUNoYWluKCktPmVuZCgpOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgZm9yICg7IGl0
ZXIgIT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKLSAgICAgICAgSlNPYmplY3QqIGN1cnJlbnRT
Y29wZSA9IGl0ZXItPmdldCgpOwotICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJs
ZU9iamVjdCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEpTVmFyaWFibGVPYmpl
Y3QqIGN1cnJlbnRWYXJpYWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFibGVPYmplY3Qq
PihjdXJyZW50U2NvcGUpOwotICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gY3VycmVu
dFZhcmlhYmxlT2JqZWN0LT5zeW1ib2xUYWJsZSgpLmdldChtX2lkZW50LmltcGwoKSk7Ci0gICAg
ICAgIGlmIChlbnRyeS5pc051bGwoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAg
IHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihnZW5lcmF0b3Iuc2NvcGVEZXB0aCgp
ICsgZGVwdGgsIGVudHJ5LmdldEluZGV4KCksIHZhbHVlLmdldCgpLCBjdXJyZW50VmFyaWFibGVP
YmplY3QtPmlzR2xvYmFsT2JqZWN0KCkgPyBjdXJyZW50VmFyaWFibGVPYmplY3QgOiAwKTsKLSAg
ICB9Ci0KKyAgICBpZiAobG9jYXRpb24uaXNTdGF0aWMoKSkKKyAgICAgICAgcmV0dXJuIGdlbmVy
YXRvci5lbWl0UHV0U3RhdGljVmFyKGxvY2F0aW9uLCB2YWx1ZS5nZXQoKSk7CisgICAgCiAgICAg
aWYgKGdlbmVyYXRvci5jb2RlVHlwZSgpICE9IEV2YWxDb2RlKQogICAgICAgICByZXR1cm4gdmFs
dWUuZ2V0KCk7CiAKICAgICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3VsZCBvbmx5IGJl
IGhpdCBpbiBhbiBldmFsIGJsb2NrLCBpdCB3aWxsIGFzc2lnbgogICAgIC8vIHRvIHRoZSB3cm9u
ZyBiYXNlIGlmIG1faWRlbnQgZXhpc3RzIGluIGFuIGludGVydmVuaW5nIHdpdGggc2NvcGUuCi0g
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdl
bmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3Jhcnko
KSwgbG9jYXRpb24sIG1faWRlbnQpOwogICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQo
YmFzZS5nZXQoKSwgbV9pZGVudCwgdmFsdWUuZ2V0KCkpOwogfQogCkBAIC0xNTk4LDExICsxNTc5
LDEyIEBAIFJlZ2lzdGVySUQqIEZvckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAgICAgYm9vbCBvcHRpbWl6ZWRGb3JpbkFj
Y2VzcyA9IGZhbHNlOwogICAgIGlmIChtX2xleHByLT5pc1Jlc29sdmVOb2RlKCkpIHsKICAgICAg
ICAgY29uc3QgSWRlbnRpZmllciYgaWRlbnQgPSBzdGF0aWNfY2FzdDxSZXNvbHZlTm9kZSo+KG1f
bGV4cHIpLT5pZGVudGlmaWVyKCk7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IGdlbmVyYXRvci5y
ZWdpc3RlckZvcihpZGVudCk7CisgICAgICAgIFJlc29sdmVSZXN1bHQgbG9jYXRpb24gPSBnZW5l
cmF0b3IucmVzb2x2ZShpZGVudCk7CisgICAgICAgIHByb3BlcnR5TmFtZSA9IGdlbmVyYXRvci5y
ZWdpc3RlckZvcihsb2NhdGlvbik7CiAgICAgICAgIGlmICghcHJvcGVydHlOYW1lKSB7CiAgICAg
ICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7CiAgICAgICAg
ICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvdGVjdCA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAg
ICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlRm9yUHV0KGdl
bmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgaWRlbnQpOworICAgICAgICAgICAgUmVnaXN0ZXJJRCog
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VGb3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpLCBsb2NhdGlvbiwgaWRlbnQpOwogCiAgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdEV4
cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICAg
ICAgICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLCBpZGVudCwgcHJvcGVydHlOYW1lKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>123574</attachid>
            <date>2012-01-23 10:34:30 -0800</date>
            <delta_ts>2012-01-24 08:38:06 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76285-20120123193428.patch</filename>
            <type>text/plain</type>
            <size>55889</size>
            <attacher name="Andy Wingo">wingo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1NjMxCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA1
OWQ5ZjQ2YWM0YTZiOWI1MGM1MDAzMTMxOGQ1MTQzNjc4OTJiZTM3Li41MWQxNjNhMzQwOGU4N2Jm
MTliMjRjOTNjYTcwZmRlZTIxYjMzN2Y5IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0MyBAQAorMjAxMi0wMS0yMyAgQW5keSBXaW5nbyAgPHdpbmdvQGlnYWxpYS5jb20+CisK
KyAgICAgICAgUmVmYWN0b3IgaWRlbnRpZmllciByZXNvbHV0aW9uIGluIEJ5dGVjb2RlR2VuZXJh
dG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OlJlc29sdmVSZXN1
bHQpOiBOZXcgc3RydWN0dXJlLCB0byBkZXNjcmliZSB0aGUgc3RvcmFnZQorICAgICAgICBsb2Nh
dGlvbiBjb3JyZXNwb25kaW5nIHRvIGFuIGlkZW50aWZpZXIgaW4gYSBwcm9ncmFtLgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlKTogTmV3IGZ1bmN0aW9uLCByZXBsYWNpbmcKKyAgICAg
ICAgZmluZFNjb3BlZFByb3BlcnR5LgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6
cmVzb2x2ZUNvbnN0RGVjbCk6IE5ldyBmdW5jdGlvbiwKKyAgICAgICAgZW5jYXBzdWxhdGluZyB3
aGF0IENvbnN0RGVjbE5vZGU6OmVtaXRCeXRlY29kZSB1c2VkIHRvIGRvLgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRpY1Zhcik6CisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0U3RhdGljVmFyKTogTmV3IGZ1bmN0aW9ucywKKyAgICAg
ICAgY29ycmVzcG9uZGluZyB0byB0aGUgb2xkIGVtaXRHZXRTY29wZWRWYXIgYW5kIGVtaXRQdXRT
Y29wZWRWYXIuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpyZWdpc3RlckZvcik6
CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZSk6CisgICAgICAg
IChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZUJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlRm9yUHV0KToKKyAgICAgICAgKEpT
Qzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyk6IENoYW5nZSB0byBhY2Nl
cHQgYQorICAgICAgICAicmVzb2x2ZVJlc3VsdCIgYXJndW1lbnQuICBUaGlzIGlzIG1vcmUgY2xl
YXIsIGFuZCByZWR1Y2VzIHRoZQorICAgICAgICBhbW91bnQgb2YgZG91YmxlIGFuYWx5c2lzIGhh
cHBlbmluZyBhdCBjb21waWxlLXRpbWUuCisgICAgICAgICogYnl0ZWNvbXBpbGVyL05vZGVzQ29k
ZWdlbi5jcHA6CisgICAgICAgIChKU0M6OlJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAg
ICAgICAoSlNDOjpFdmFsRnVuY3Rpb25DYWxsTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAg
KEpTQzo6RnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChK
U0M6OlBvc3RmaXhSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6RGVs
ZXRlUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OlR5cGVPZlJlc29s
dmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpQcmVmaXhSZXNvbHZlTm9kZTo6
ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6UmVhZE1vZGlmeVJlc29sdmVOb2RlOjplbWl0
Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpBc3NpZ25SZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2Rl
KToKKyAgICAgICAgKEpTQzo6Q29uc3REZWNsTm9kZTo6ZW1pdENvZGVTaW5nbGUpOgorICAgICAg
ICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRlY29kZSk6IFJlZmFjdG9yIHRvIHVzZSB0aGUgbmV3
CisgICAgICAgIFJlc29sdmVSZXN1bHQgc3RydWN0dXJlLgorCiAyMDEyLTAxLTIzICBDYXJsb3Mg
R2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAgICAgICBVbnJldmlld2Vk
LiBGaXggbWFrZSBkaXN0Y2hlY2suCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCmluZGV4IDYzMTI5MGViOTc2NmZk
MGJlZTI4NjI5ODVlNTliZDJlZjZjNDgwNWYuLjhjOGNkZGM1MmM2NzUyZTc5Y2M3MjE3YTRkMGU4
NjkwZTA1MTM1YmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGls
ZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENv
cHlyaWdodCAoQykgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDggQ2FtZXJvbiBad2FyaWNoIDxjd3p3YXJpY2hAdXdhdGVybG9v
LmNhPgorICogQ29weXJpZ2h0IChDKSAyMDEyIElnYWxpYSwgUy5MLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCkBAIC01MDMsNDAgKzUwNCwxMiBAQCB2b2lkIEJ5dGVjb2RlR2VuZXJh
dG9yOjphZGRQYXJhbWV0ZXIoY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIGludCBwYXJhbWV0ZXJJ
bmRleAogICAgIG1fY29kZUJsb2NrLT5hZGRQYXJhbWV0ZXIoKTsKIH0KIAotUmVnaXN0ZXJJRCog
Qnl0ZWNvZGVHZW5lcmF0b3I6OnJlZ2lzdGVyRm9yKGNvbnN0IElkZW50aWZpZXImIGlkZW50KQor
UmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OnJlZ2lzdGVyRm9yKGNvbnN0IFJlc29sdmVS
ZXN1bHQmIHJlc29sdmVSZXN1bHQpCiB7Ci0gICAgaWYgKGlkZW50ID09IHByb3BlcnR5TmFtZXMo
KS50aGlzSWRlbnRpZmllcikKLSAgICAgICAgcmV0dXJuICZtX3RoaXNSZWdpc3RlcjsKLSAgICAg
ICAgCi0gICAgaWYgKG1fY29kZVR5cGUgPT0gR2xvYmFsQ29kZSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICBpZiAoIXNob3VsZE9wdGltaXplTG9jYWxzKCkpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KGlkZW50Lmlt
cGwoKSk7Ci0gICAgaWYgKGVudHJ5LmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IGlmIChpZGVudCA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1lbnRzKQotICAgICAgICBjcmVhdGVB
cmd1bWVudHNJZk5lY2Vzc2FyeSgpOwotCi0gICAgcmV0dXJuIGNyZWF0ZUxhenlSZWdpc3Rlcklm
TmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRleCgpKSk7Ci19Ci0KLVJlZ2lzdGVy
SUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpjb25zdFJlZ2lzdGVyRm9yKGNvbnN0IElkZW50aWZpZXIm
IGlkZW50KQotewotICAgIGlmIChtX2NvZGVUeXBlID09IEV2YWxDb2RlKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIGlmIChtX2NvZGVUeXBlID09IEdsb2JhbENvZGUpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KGlk
ZW50LmltcGwoKSk7Ci0gICAgaWYgKGVudHJ5LmlzTnVsbCgpKQorICAgIGlmICghcmVzb2x2ZVJl
c3VsdC5pc1JlZ2lzdGVyKCkpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgcmV0dXJuIGNyZWF0
ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRleCgpKSk7
CisgICAgcmV0dXJuIGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihy
ZXNvbHZlUmVzdWx0LmluZGV4KSk7CiB9CiAKIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OndpbGxS
ZXNvbHZlVG9Bcmd1bWVudHMoY29uc3QgSWRlbnRpZmllciYgaWRlbnQpCkBAIC0xMTcwLDU5ICsx
MTQzLDEzNSBAQCBSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvYWQoUmVnaXN0
ZXJJRCogZHN0LCBKU1ZhbHVlIHYpCiAgICAgcmV0dXJuIGNvbnN0YW50SUQ7CiB9CiAKLWJvb2wg
Qnl0ZWNvZGVHZW5lcmF0b3I6OmZpbmRTY29wZWRQcm9wZXJ0eShjb25zdCBJZGVudGlmaWVyJiBw
cm9wZXJ0eSwgaW50JiBpbmRleCwgc2l6ZV90JiBzdGFja0RlcHRoLCBib29sIGZvcldyaXRpbmcs
IGJvb2wmIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgSlNPYmplY3QqJiBnbG9iYWxPYmplY3QpCitS
ZXNvbHZlUmVzdWx0IEJ5dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlKGNvbnN0IElkZW50aWZpZXIm
IHByb3BlcnR5KQogeworICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZVJlc3VsdCA9IFJlc29sdmVS
ZXN1bHQoKTsKKyAgICAKKyAgICBpZiAocHJvcGVydHkgPT0gcHJvcGVydHlOYW1lcygpLnRoaXNJ
ZGVudGlmaWVyKSB7CisgICAgICAgIHJlc29sdmVSZXN1bHQudHlwZSA9IFJlc29sdmVSZXN1bHQ6
OlJlYWRPbmx5UmVnaXN0ZXI7CisgICAgICAgIHJlc29sdmVSZXN1bHQuaW5kZXggPSBtX3RoaXNS
ZWdpc3Rlci5pbmRleCgpOworICAgICAgICByZXR1cm4gcmVzb2x2ZVJlc3VsdDsKKyAgICB9CisK
KyAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGFsbG9jYXRlZCBpbiBhIHJl
Z2lzdGVyLgorICAgIGlmIChtX2NvZGVUeXBlICE9IEdsb2JhbENvZGUgJiYgc2hvdWxkT3B0aW1p
emVMb2NhbHMoKSkgeworICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gc3ltYm9sVGFi
bGUoKS5nZXQocHJvcGVydHkuaW1wbCgpKTsKKyAgICAgICAgaWYgKCFlbnRyeS5pc051bGwoKSkg
eworICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMp
CisgICAgICAgICAgICAgICAgY3JlYXRlQXJndW1lbnRzSWZOZWNlc3NhcnkoKTsKKyAgICAgICAg
ICAgIHJlc29sdmVSZXN1bHQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OlJlZ2lzdGVyOworICAgICAg
ICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkKKyAgICAgICAgICAgICAgICByZXNvbHZlUmVz
dWx0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6UmVhZE9ubHlGbGFnOworICAgICAgICAgICAgcmVz
b2x2ZVJlc3VsdC5pbmRleCA9IGVudHJ5LmdldEluZGV4KCk7CisgICAgICAgICAgICByZXR1cm4g
cmVzb2x2ZVJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIENhc2VzIHdoZXJlIHdl
IGNhbm5vdCBzdGF0aWNhbGx5IG9wdGltaXplIHRoZSBsb29rdXAuCiAgICAgaWYgKHByb3BlcnR5
ID09IHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMgfHwgIWNhbk9wdGltaXplTm9uTG9jYWxzKCkp
IHsKLSAgICAgICAgc3RhY2tEZXB0aCA9IDA7Ci0gICAgICAgIGluZGV4ID0gbWlzc2luZ1N5bWJv
bE1hcmtlcigpOwotCisgICAgICAgIHJlc29sdmVSZXN1bHQuaW5kZXggPSBtaXNzaW5nU3ltYm9s
TWFya2VyKCk7CisgICAgICAgIHJlc29sdmVSZXN1bHQuZGVwdGggPSAwOwogICAgICAgICBpZiAo
c2hvdWxkT3B0aW1pemVMb2NhbHMoKSAmJiBtX2NvZGVUeXBlID09IEdsb2JhbENvZGUpIHsKICAg
ICAgICAgICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gbV9zY29wZUNoYWluLT5iZWdpbigp
OwotICAgICAgICAgICAgZ2xvYmFsT2JqZWN0ID0gaXRlci0+Z2V0KCk7CisgICAgICAgICAgICBy
ZXNvbHZlUmVzdWx0LnR5cGUgPSBSZXNvbHZlUmVzdWx0OjpHbG9iYWw7CisgICAgICAgICAgICBy
ZXNvbHZlUmVzdWx0Lmdsb2JhbE9iamVjdCA9IGl0ZXItPmdldCgpOwogICAgICAgICAgICAgQVNT
RVJUKCgrK2l0ZXIpID09IG1fc2NvcGVDaGFpbi0+ZW5kKCkpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYzsK
ICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiByZXNvbHZl
UmVzdWx0OwogICAgIH0KIAotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgcmVxdWlyZXNEeW5h
bWljQ2hlY2tzID0gZmFsc2U7CiAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBtX3Njb3Bl
Q2hhaW4tPmJlZ2luKCk7CiAgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IG1fc2NvcGVDaGFp
bi0+ZW5kKCk7Ci0gICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKKyAg
ICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlciwgKytyZXNvbHZlUmVzdWx0LmRlcHRoKSB7CiAg
ICAgICAgIEpTT2JqZWN0KiBjdXJyZW50U2NvcGUgPSBpdGVyLT5nZXQoKTsKLSAgICAgICAgaWYg
KCFjdXJyZW50U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkKKyAgICAgICAgaWYgKCFjdXJyZW50
U2NvcGUtPmlzVmFyaWFibGVPYmplY3QoKSkgeworICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC50
eXBlID0gUmVzb2x2ZVJlc3VsdDo6RHluYW1pYzsKICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9ICAgICAgICAKICAgICAgICAgSlNWYXJpYWJsZU9iamVjdCogY3VycmVudFZhcmlhYmxlT2Jq
ZWN0ID0gc3RhdGljX2Nhc3Q8SlNWYXJpYWJsZU9iamVjdCo+KGN1cnJlbnRTY29wZSk7CiAgICAg
ICAgIFN5bWJvbFRhYmxlRW50cnkgZW50cnkgPSBjdXJyZW50VmFyaWFibGVPYmplY3QtPnN5bWJv
bFRhYmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CiAKICAgICAgICAgLy8gRm91bmQgdGhlIHBy
b3BlcnR5CiAgICAgICAgIGlmICghZW50cnkuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmIChl
bnRyeS5pc1JlYWRPbmx5KCkgJiYgZm9yV3JpdGluZykgewotICAgICAgICAgICAgICAgIHN0YWNr
RGVwdGggPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gbWlzc2luZ1N5bWJvbE1hcmtlcigp
OwotICAgICAgICAgICAgICAgIGlmICgrK2l0ZXIgPT0gZW5kKQotICAgICAgICAgICAgICAgICAg
ICBnbG9iYWxPYmplY3QgPSBjdXJyZW50VmFyaWFibGVPYmplY3Q7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC50eXBlIHw9IFJlc29sdmVS
ZXN1bHQ6OkluZGV4ZWRGbGFnOworICAgICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSkK
KyAgICAgICAgICAgICAgICByZXNvbHZlUmVzdWx0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6UmVh
ZE9ubHlGbGFnOworICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpIHsKKyAgICAgICAgICAg
ICAgICByZXNvbHZlUmVzdWx0LnR5cGUgfD0gUmVzb2x2ZVJlc3VsdDo6R2xvYmFsRmxhZzsKKyAg
ICAgICAgICAgICAgICByZXNvbHZlUmVzdWx0Lmdsb2JhbE9iamVjdCA9IGN1cnJlbnRTY29wZTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC50eXBl
IHw9IFJlc29sdmVSZXN1bHQ6OlNjb3BlRmxhZzsKKyAgICAgICAgICAgICAgICByZXNvbHZlUmVz
dWx0LmRlcHRoICs9IG1fY29kZUJsb2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7CiAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBzdGFja0RlcHRoID0gZGVwdGggKyBtX2NvZGVCbG9jay0+bmVl
ZHNGdWxsU2NvcGVDaGFpbigpOwotICAgICAgICAgICAgaW5kZXggPSBlbnRyeS5nZXRJbmRleCgp
OwotICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpCi0gICAgICAgICAgICAgICAgZ2xvYmFs
T2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgICAgICBpZiAoIXJlc29sdmVSZXN1bHQuaXNEeW5hbWljKCkpCisgICAgICAgICAg
ICAgICAgcmVzb2x2ZVJlc3VsdC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6OlN0YXRpY0ZsYWc7Cisg
ICAgICAgICAgICByZXNvbHZlUmVzdWx0LmluZGV4ID0gZW50cnkuZ2V0SW5kZXgoKTsKKyAgICAg
ICAgICAgIHJldHVybiByZXNvbHZlUmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIGJvb2wgc2Nv
cGVSZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKICAgICAgICAgaWYgKGN1cnJlbnRWYXJp
YWJsZU9iamVjdC0+aXNEeW5hbWljU2NvcGUoc2NvcGVSZXF1aXJlc0R5bmFtaWNDaGVja3MpKQog
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHJlcXVpcmVzRHluYW1pY0NoZWNrcyB8PSBzY29w
ZVJlcXVpcmVzRHluYW1pY0NoZWNrczsKKyAgICAgICAgaWYgKHNjb3BlUmVxdWlyZXNEeW5hbWlj
Q2hlY2tzKQorICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC50eXBlIHw9IFJlc29sdmVSZXN1bHQ6
OkR5bmFtaWNGbGFnOwogICAgIH0KKwogICAgIC8vIENhbid0IGxvY2F0ZSB0aGUgcHJvcGVydHkg
YnV0IHdlJ3JlIGFibGUgdG8gYXZvaWQgYSBmZXcgbG9va3Vwcy4KLSAgICBzdGFja0RlcHRoID0g
ZGVwdGggKyBtX2NvZGVCbG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpOwotICAgIGluZGV4ID0g
bWlzc2luZ1N5bWJvbE1hcmtlcigpOwogICAgIEpTT2JqZWN0KiBzY29wZSA9IGl0ZXItPmdldCgp
OwotICAgIGlmICgrK2l0ZXIgPT0gZW5kKQotICAgICAgICBnbG9iYWxPYmplY3QgPSBzY29wZTsK
LSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXNvbHZlUmVzdWx0LmRlcHRoICs9IG1fY29kZUJsb2Nr
LT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7CisgICAgaWYgKCsraXRlciA9PSBlbmQpIHsKKyAgICAg
ICAgcmVzb2x2ZVJlc3VsdC50eXBlID0gcmVzb2x2ZVJlc3VsdC5pc0R5bmFtaWMoKSA/IFJlc29s
dmVSZXN1bHQ6OkR5bmFtaWNHbG9iYWwgOiBSZXNvbHZlUmVzdWx0OjpHbG9iYWw7CisgICAgICAg
IHJlc29sdmVSZXN1bHQuZ2xvYmFsT2JqZWN0ID0gc2NvcGU7CisgICAgfSBlbHNlCisgICAgICAg
IHJlc29sdmVSZXN1bHQudHlwZSA9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWM7CisgICAgcmVzb2x2
ZVJlc3VsdC5pbmRleCA9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKTsKKyAgICByZXR1cm4gcmVzb2x2
ZVJlc3VsdDsKK30KKworUmVzb2x2ZVJlc3VsdCBCeXRlY29kZUdlbmVyYXRvcjo6cmVzb2x2ZUNv
bnN0RGVjbChjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKK3sKKyAgICBSZXNvbHZlUmVzdWx0
IHJlc29sdmVSZXN1bHQgPSBSZXNvbHZlUmVzdWx0KCk7CisgICAgCisgICAgLy8gUmVnaXN0ZXIt
YWxsb2NhdGVkIGNvbnN0IGRlY2xhcmF0aW9ucy4KKyAgICBpZiAobV9jb2RlVHlwZSAhPSBFdmFs
Q29kZSAmJiBtX2NvZGVUeXBlICE9IEdsb2JhbENvZGUpIHsKKyAgICAgICAgU3ltYm9sVGFibGVF
bnRyeSBlbnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAgICAg
IGlmICghZW50cnkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIHJlc29sdmVSZXN1bHQudHlwZSA9
IFJlc29sdmVSZXN1bHQ6OlJlZ2lzdGVyOworICAgICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9u
bHkoKSkKKyAgICAgICAgICAgICAgICByZXNvbHZlUmVzdWx0LnR5cGUgfD0gUmVzb2x2ZVJlc3Vs
dDo6UmVhZE9ubHlGbGFnOworICAgICAgICAgICAgcmVzb2x2ZVJlc3VsdC5pbmRleCA9IGVudHJ5
LmdldEluZGV4KCk7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVJlc3VsdDsKKyAgICAgICAg
fQorICAgIH0KKworICAgIC8vIENvbnN0IGRlY2xhcmF0aW9ucyBpbiBldmFsIGNvZGUgb3IgZ2xv
YmFsIGNvZGUuCisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGl0ZXIgPSBzY29wZUNoYWluKCktPmJl
Z2luKCk7CisgICAgU2NvcGVDaGFpbkl0ZXJhdG9yIGVuZCA9IHNjb3BlQ2hhaW4oKS0+ZW5kKCk7
CisgICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIsICsrcmVzb2x2ZVJlc3VsdC5kZXB0aCkg
eworICAgICAgICBKU09iamVjdCogY3VycmVudFNjb3BlID0gaXRlci0+Z2V0KCk7CisgICAgICAg
IGlmICghY3VycmVudFNjb3BlLT5pc1ZhcmlhYmxlT2JqZWN0KCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgSlNWYXJpYWJsZU9iamVjdCogY3VycmVudFZhcmlhYmxlT2JqZWN0ID0g
c3RhdGljX2Nhc3Q8SlNWYXJpYWJsZU9iamVjdCo+KGN1cnJlbnRTY29wZSk7CisgICAgICAgIFN5
bWJvbFRhYmxlRW50cnkgZW50cnkgPSBjdXJyZW50VmFyaWFibGVPYmplY3QtPnN5bWJvbFRhYmxl
KCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAgICAgIGlmIChlbnRyeS5pc051bGwoKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKytpdGVyID09IGVuZCkgeworICAgICAg
ICAgICAgcmVzb2x2ZVJlc3VsdC50eXBlID0gUmVzb2x2ZVJlc3VsdDo6SW5kZXhlZEdsb2JhbDsK
KyAgICAgICAgICAgIHJlc29sdmVSZXN1bHQuZ2xvYmFsT2JqZWN0ID0gY3VycmVudFZhcmlhYmxl
T2JqZWN0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlc29sdmVSZXN1bHQudHlwZSA9
IFJlc29sdmVSZXN1bHQ6OkxleGljYWw7CisgICAgICAgIHJlc29sdmVSZXN1bHQuZGVwdGggKz0g
c2NvcGVEZXB0aCgpOworICAgICAgICByZXNvbHZlUmVzdWx0LmluZGV4ID0gZW50cnkuZ2V0SW5k
ZXgoKTsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVSZXN1bHQ7CisgICAgfQorCisgICAgLy8gRklY
TUU6IFdoaWxlIHRoaXMgY29kZSBzaG91bGQgb25seSBiZSBoaXQgaW4gYW4gZXZhbCBibG9jaywg
aXQgd2lsbCBhc3NpZ24KKyAgICAvLyB0byB0aGUgd3JvbmcgYmFzZSBpZiBwcm9wZXJ0eSBleGlz
dHMgaW4gYW4gaW50ZXJ2ZW5pbmcgd2l0aCBzY29wZS4KKyAgICByZXNvbHZlUmVzdWx0LnR5cGUg
PSBSZXNvbHZlUmVzdWx0OjpEeW5hbWljOworICAgIHJlc29sdmVSZXN1bHQuaW5kZXggPSBtaXNz
aW5nU3ltYm9sTWFya2VyKCk7CisgICAgcmVzb2x2ZVJlc3VsdC5kZXB0aCA9IHNjb3BlRGVwdGgo
KTsKKyAgICByZXR1cm4gcmVzb2x2ZVJlc3VsdDsKIH0KIAogdm9pZCBCeXRlY29kZUdlbmVyYXRv
cjo6ZW1pdENoZWNrSGFzSW5zdGFuY2UoUmVnaXN0ZXJJRCogYmFzZSkKQEAgLTEyNDgsMjE5ICsx
Mjk3LDE0NSBAQCBib29sIEJ5dGVjb2RlR2VuZXJhdG9yOjpzaG91bGRBdm9pZFJlc29sdmVHbG9i
YWwoKQogICAgIHJldHVybiBtX2NvZGVCbG9jay0+Z2xvYmFsUmVzb2x2ZUluZm9Db3VudCgpID4g
bWF4R2xvYmFsUmVzb2x2ZXMgJiYgIW1fbGFiZWxTY29wZXMuc2l6ZSgpOwogfQogCi1SZWdpc3Rl
cklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0LCBjb25z
dCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKK1JlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpl
bWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIHJlc29sdmVS
ZXN1bHQsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIHNpemVfdCBkZXB0aCA9
IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsK
LSAgICBib29sIHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGlmICghZmluZFNj
b3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFt
aWNDaGVja3MsIGdsb2JhbE9iamVjdCkgJiYgIWdsb2JhbE9iamVjdCkgewotICAgICAgICAvLyBX
ZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmls
ZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChh
ZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJv
ZmlsZSk7Ci0gICAgICAgIHJldHVybiBkc3Q7Ci0gICAgfQotICAgIGlmIChzaG91bGRBdm9pZFJl
c29sdmVHbG9iYWwoKSkgewotICAgICAgICBnbG9iYWxPYmplY3QgPSAwOwotICAgICAgICByZXF1
aXJlc0R5bmFtaWNDaGVja3MgPSB0cnVlOwotICAgIH0KLSAgICAgICAgCi0gICAgaWYgKGdsb2Jh
bE9iamVjdCkgewotICAgICAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYm
ICFyZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgICAgIC8vIERpcmVjdGx5IGluZGV4
IHRoZSBwcm9wZXJ0eSBsb29rdXAgYWNyb3NzIG11bHRpcGxlIHNjb3Blcy4KLSAgICAgICAgICAg
IHJldHVybiBlbWl0R2V0U2NvcGVkVmFyKGRzdCwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3Qp
OwotICAgICAgICB9Ci0KKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRpYygpKQorICAgICAg
ICByZXR1cm4gZW1pdEdldFN0YXRpY1Zhcihkc3QsIHJlc29sdmVSZXN1bHQpOworICAgIAorICAg
IGlmIChyZXNvbHZlUmVzdWx0LmlzR2xvYmFsKCkgJiYgIXNob3VsZEF2b2lkUmVzb2x2ZUdsb2Jh
bCgpKSB7CiAjaWYgRU5BQkxFKEpJVCkKICAgICAgICAgbV9jb2RlQmxvY2stPmFkZEdsb2JhbFJl
c29sdmVJbmZvKGluc3RydWN0aW9ucygpLnNpemUoKSk7CiAjZW5kaWYKICNpZiBFTkFCTEUoSU5U
RVJQUkVURVIpCiAgICAgICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5zdHJ1Y3Rp
b24oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgotICAgICAgICBWYWx1ZVByb2ZpbGUq
IHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUocmVxdWlyZXNEeW5hbWljQ2hlY2tzID8gb3Bf
cmVzb2x2ZV9nbG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFsKTsKKyAgICAgICAgYm9v
bCBkeW5hbWljID0gcmVzb2x2ZVJlc3VsdC5pc0R5bmFtaWMoKSAmJiByZXNvbHZlUmVzdWx0LmRl
cHRoOworICAgICAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUo
ZHluYW1pYyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2dsb2JhbCk7
CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKICAgICAgICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKDApOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7
Ci0gICAgICAgIGlmIChyZXF1aXJlc0R5bmFtaWNDaGVja3MpCi0gICAgICAgICAgICBpbnN0cnVj
dGlvbnMoKS5hcHBlbmQoZGVwdGgpOworICAgICAgICBpZiAoZHluYW1pYykKKyAgICAgICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChyZXNvbHZlUmVzdWx0LmRlcHRoKTsKICAgICAgICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUpOwogICAgICAgICByZXR1cm4gZHN0OwogICAgIH0K
LQotICAgIGlmIChyZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgLy8gSWYgd2UgZ2V0
IGhlcmUgd2UgaGF2ZSBldmFsIG5lc3RlZCBpbnNpZGUgYSB8d2l0aHwganVzdCBnaXZlIHVwCi0g
ICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNv
bHZlKTsKKyAgICAgICAgCisgICAgaWYgKHJlc29sdmVSZXN1bHQudHlwZSA9PSBSZXNvbHZlUmVz
dWx0OjpEeW5hbWljICYmIHJlc29sdmVSZXN1bHQuZGVwdGgpIHsKKyAgICAgICAgLy8gSW4gdGhp
cyBjYXNlIHdlIGFyZSBhdCBsZWFzdCBhYmxlIHRvIGRyb3AgYSBmZXcgc2NvcGUgY2hhaW5zIGZy
b20gdGhlCisgICAgICAgIC8vIGxvb2t1cCBjaGFpbiwgYWx0aG91Z2ggd2Ugc3RpbGwgbmVlZCB0
byBoYXNoIGZyb20gdGhlbiBvbi4KKyAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1p
dFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfc2tpcCk7CiAgICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChkc3QtPmluZGV4KCkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRk
Q29uc3RhbnQocHJvcGVydHkpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHJlc29s
dmVSZXN1bHQuZGVwdGgpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7
CiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAgfQogCi0gICAgaWYgKGluZGV4ICE9IG1pc3NpbmdT
eW1ib2xNYXJrZXIoKSkgewotICAgICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVydHkg
bG9va3VwIGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAgIHJldHVybiBlbWl0R2V0U2Nv
cGVkVmFyKGRzdCwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3QpOwotICAgIH0KLQotICAgIC8v
IEluIHRoaXMgY2FzZSB3ZSBhcmUgYXQgbGVhc3QgYWJsZSB0byBkcm9wIGEgZmV3IHNjb3BlIGNo
YWlucyBmcm9tIHRoZQotICAgIC8vIGxvb2t1cCBjaGFpbiwgYWx0aG91Z2ggd2Ugc3RpbGwgbmVl
ZCB0byBoYXNoIGZyb20gdGhlbiBvbi4KLSAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0
UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2ZV9za2lwKTsKKyAgICBWYWx1ZVByb2ZpbGUqIHByb2Zp
bGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2ZSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKGRzdC0+aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0
YW50KHByb3BlcnR5KSk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7CiAgICAgcmV0dXJuIGRzdDsKIH0KIAotUmVn
aXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRHZXRTY29wZWRWYXIoUmVnaXN0ZXJJRCog
ZHN0LCBzaXplX3QgZGVwdGgsIGludCBpbmRleCwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpCitSZWdp
c3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRz
dCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgcmVzb2x2ZVJlc3VsdCwgY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHkpCiB7Ci0gICAgaWYgKGdsb2JhbE9iamVjdCkgewotICAgICAgICBpZiAobV9sYXN0
T3Bjb2RlSUQgPT0gb3BfcHV0X2dsb2JhbF92YXIpIHsKLSAgICAgICAgICAgIGludCBkc3RJbmRl
eDsKLSAgICAgICAgICAgIGludCBzcmNJbmRleDsKLSAgICAgICAgICAgIHJldHJpZXZlTGFzdFVu
YXJ5T3AoZHN0SW5kZXgsIHNyY0luZGV4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYg
KGRzdEluZGV4ID09IGluZGV4ICYmIHNyY0luZGV4ID09IGRzdC0+aW5kZXgoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZHN0OwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVQcm9maWxlKiBw
cm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX2dldF9nbG9iYWxfdmFyKTsKLSAgICAgICAg
aW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxl
KTsKLSAgICAgICAgcmV0dXJuIGRzdDsKKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc0dsb2JhbCgp
ICYmICFyZXNvbHZlUmVzdWx0LmlzRHluYW1pYygpKSB7CisgICAgICAgIC8vIEdsb2JhbCBvYmpl
Y3QgaXMgdGhlIGJhc2UKKyAgICAgICAgQVNTRVJUKHJlc29sdmVSZXN1bHQuZ2xvYmFsT2JqZWN0
KTsKKyAgICAgICAgcmV0dXJuIGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShyZXNvbHZlUmVzdWx0Lmds
b2JhbE9iamVjdCkpOwogICAgIH0KIAotICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQ
cm9maWxlZE9wY29kZShvcF9nZXRfc2NvcGVkX3Zhcik7CisgICAgLy8gV2UgY2FuJ3Qgb3B0aW1p
c2UgYXQgYWxsIDotKAorICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9w
Y29kZShvcF9yZXNvbHZlX2Jhc2UpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmlu
ZGV4KCkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7Ci0gICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKGRlcHRoKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3Rh
bnQocHJvcGVydHkpKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZmFsc2UpOwogICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxlKTsKICAgICByZXR1cm4gZHN0OwogfQogCi1SZWdp
c3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFB1dFNjb3BlZFZhcihzaXplX3QgZGVwdGgs
IGludCBpbmRleCwgUmVnaXN0ZXJJRCogdmFsdWUsIEpTVmFsdWUgZ2xvYmFsT2JqZWN0KQorUmVn
aXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlQmFzZUZvclB1dChSZWdpc3Rl
cklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIHJlc29sdmVSZXN1bHQsIGNvbnN0IElkZW50
aWZpZXImIHByb3BlcnR5KQogewotICAgIGlmIChnbG9iYWxPYmplY3QpIHsKLSAgICAgICAgZW1p
dE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZChpbmRleCk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7
Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgZW1pdE9wY29kZShvcF9wdXRfc2Nv
cGVkX3Zhcik7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGluZGV4KTsKLSAgICBpbnN0cnVj
dGlvbnMoKS5hcHBlbmQoZGVwdGgpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+
aW5kZXgoKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQorICAgIGlmICghbV9jb2RlQmxvY2stPmlz
U3RyaWN0TW9kZSgpKQorICAgICAgICByZXR1cm4gZW1pdFJlc29sdmVCYXNlKGRzdCwgcmVzb2x2
ZVJlc3VsdCwgcHJvcGVydHkpOwogCi1SZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1p
dFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkp
Ci17Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2Jq
ZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0g
ZmFsc2U7Ci0gICAgZmluZFNjb3BlZFByb3BlcnR5KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZh
bHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2JhbE9iamVjdCk7Ci0gICAgaWYgKCFnbG9i
YWxPYmplY3QgfHwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0
IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1p
dFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfYmFzZSk7CisgICAgaWYgKHJlc29sdmVSZXN1bHQu
aXNHbG9iYWwoKSAmJiAhcmVzb2x2ZVJlc3VsdC5pc0R5bmFtaWMoKSkgeworICAgICAgICAvLyBH
bG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCisgICAgICAgIEFTU0VSVChyZXNvbHZlUmVzdWx0Lmds
b2JhbE9iamVjdCk7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBlbWl0TG9h
ZChkc3QsIEpTVmFsdWUocmVzb2x2ZVJlc3VsdC5nbG9iYWxPYmplY3QpKTsKKyAgICAgICAgZW1p
dE9wY29kZShvcF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChh
ZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZmFs
c2UpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7Ci0gICAgICAgIHJl
dHVybiBkc3Q7CisgICAgICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CiAgICAgfQogCi0gICAgLy8g
R2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIHJldHVybiBlbWl0TG9hZChkc3QsIEpTVmFs
dWUoZ2xvYmFsT2JqZWN0KSk7Ci19Ci0KLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpl
bWl0UmVzb2x2ZUJhc2VGb3JQdXQoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBJZGVudGlmaWVyJiBw
cm9wZXJ0eSkKLXsKLSAgICBpZiAoIW1fY29kZUJsb2NrLT5pc1N0cmljdE1vZGUoKSkKLSAgICAg
ICAgcmV0dXJuIGVtaXRSZXNvbHZlQmFzZShkc3QsIHByb3BlcnR5KTsKLSAgICBzaXplX3QgZGVw
dGggPSAwOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9
IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBmaW5kU2Nv
cGVkUHJvcGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1p
Y0NoZWNrcywgZ2xvYmFsT2JqZWN0KTsKLSAgICBpZiAoIWdsb2JhbE9iamVjdCB8fCByZXF1aXJl
c0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3Qgb3B0aW1pc2UgYXQgYWxsIDot
KAotICAgICAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUob3Bf
cmVzb2x2ZV9iYXNlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgo
KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkp
OwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQodHJ1ZSk7Ci0gICAgICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChwcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIFJlZlB0cjxSZWdpc3RlcklE
PiByZXN1bHQgPSBlbWl0TG9hZChkc3QsIEpTVmFsdWUoZ2xvYmFsT2JqZWN0KSk7Ci0gICAgZW1p
dE9wY29kZShvcF9lbnN1cmVfcHJvcGVydHlfZXhpc3RzKTsKKyAgICAvLyBXZSBjYW4ndCBvcHRp
bWlzZSBhdCBhbGwgOi0oCisgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVk
T3Bjb2RlKG9wX3Jlc29sdmVfYmFzZSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+
aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5
KSk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXQoKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQo
dHJ1ZSk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUpOworICAgIHJldHVybiBk
c3Q7CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZVdpdGhC
YXNlKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50
aWZpZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNv
bHZlV2l0aEJhc2UoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29u
c3QgUmVzb2x2ZVJlc3VsdCYgcmVzb2x2ZVJlc3VsdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpT
T2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tz
ID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVkUHJvcGVydHkocHJvcGVydHksIGluZGV4LCBk
ZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSB8fCAhZ2xv
YmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAgICAgICAvLyBXZSBjYW4n
dCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVt
aXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlX3dpdGhfYmFzZSk7Ci0gICAgICAgIGluc3RydWN0
aW9ucygpLmFwcGVuZChiYXNlRHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQo
YWRkQ29uc3RhbnQocHJvcGVydHkpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHBy
b2ZpbGUpOwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9CisgICAgaWYgKHJlc29sdmVS
ZXN1bHQuaXNHbG9iYWwoKSAmJiAhcmVzb2x2ZVJlc3VsdC5pc0R5bmFtaWMoKSkgeworICAgICAg
ICAvLyBHbG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCisgICAgICAgIEFTU0VSVChyZXNvbHZlUmVz
dWx0Lmdsb2JhbE9iamVjdCk7CisgICAgICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFsdWUocmVz
b2x2ZVJlc3VsdC5nbG9iYWxPYmplY3QpKTsKIAotICAgIGJvb2wgZm9yY2VHbG9iYWxSZXNvbHZl
ID0gZmFsc2U7CisgICAgICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkpIHsKKyAgICAg
ICAgICAgIC8vIERpcmVjdGx5IGluZGV4IHRoZSBwcm9wZXJ0eSBsb29rdXAgYWNyb3NzIG11bHRp
cGxlIHNjb3Blcy4KKyAgICAgICAgICAgIGVtaXRHZXRTdGF0aWNWYXIocHJvcERzdCwgcmVzb2x2
ZVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICAgICAgfQogCi0gICAg
Ly8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQotICAgIGVtaXRMb2FkKGJhc2VEc3QsIEpTVmFs
dWUoZ2xvYmFsT2JqZWN0KSk7CisgICAgICAgIGlmIChzaG91bGRBdm9pZFJlc29sdmVHbG9iYWwo
KSkgeworICAgICAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bj
b2RlKG9wX3Jlc29sdmUpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BE
c3QtPmluZGV4KCkpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0
YW50KHByb3BlcnR5KSk7CisgICAgICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmls
ZSk7CisgICAgICAgICAgICByZXR1cm4gYmFzZURzdDsKKyAgICAgICAgfQogCi0gICAgaWYgKGlu
ZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhZm9yY2VHbG9iYWxSZXNvbHZlKSB7Ci0g
ICAgICAgIC8vIERpcmVjdGx5IGluZGV4IHRoZSBwcm9wZXJ0eSBsb29rdXAgYWNyb3NzIG11bHRp
cGxlIHNjb3Blcy4KLSAgICAgICAgZW1pdEdldFNjb3BlZFZhcihwcm9wRHN0LCBkZXB0aCwgaW5k
ZXgsIGdsb2JhbE9iamVjdCk7Ci0gICAgICAgIHJldHVybiBiYXNlRHN0OwotICAgIH0KLSAgICBp
ZiAoc2hvdWxkQXZvaWRSZXNvbHZlR2xvYmFsKCkpIHsKLSAgICAgICAgVmFsdWVQcm9maWxlKiBw
cm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmUpOworI2lmIEVOQUJMRShKSVQp
CisgICAgICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhpbnN0cnVjdGlvbnMo
KS5zaXplKCkpOworI2VuZGlmCisjaWYgRU5BQkxFKElOVEVSUFJFVEVSKQorICAgICAgICBtX2Nv
ZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUo
KSk7CisjZW5kaWYKKyAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVk
T3Bjb2RlKG9wX3Jlc29sdmVfZ2xvYmFsKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KHByb3BEc3QtPmluZGV4KCkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29u
c3RhbnQocHJvcGVydHkpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKDApOworICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZChwcm9maWxlKTsKICAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CiAgICAgfQotI2lmIEVOQUJM
RShKSVQpCi0gICAgbV9jb2RlQmxvY2stPmFkZEdsb2JhbFJlc29sdmVJbmZvKGluc3RydWN0aW9u
cygpLnNpemUoKSk7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoSU5URVJQUkVURVIpCi0gICAgbV9jb2Rl
QmxvY2stPmFkZEdsb2JhbFJlc29sdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMoKS5zaXplKCkp
OwotI2VuZGlmCi0gICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2Rl
KHJlcXVpcmVzRHluYW1pY0NoZWNrcyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9y
ZXNvbHZlX2dsb2JhbCk7CisKKworCisKKyAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0
UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2ZV93aXRoX2Jhc2UpOworICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChiYXNlRHN0LT5pbmRleCgpKTsKICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJv
cERzdC0+aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHBy
b3BlcnR5KSk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKDApOwotICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZCgwKTsKLSAgICBpZiAocmVxdWlyZXNEeW5hbWljQ2hlY2tzKQotICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVwdGgpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChw
cm9maWxlKTsKICAgICByZXR1cm4gYmFzZURzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVH
ZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0
ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCitSZWdpc3RlcklEKiBC
eXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0
LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0JiByZXNvbHZlUmVzdWx0
LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKIHsKLSAgICBzaXplX3QgZGVwdGggPSAwOwot
ICAgIGludCBpbmRleCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAg
Ym9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoIWZpbmRTY29wZWRQ
cm9wZXJ0eShwcm9wZXJ0eSwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hl
Y2tzLCBnbG9iYWxPYmplY3QpIHx8ICFnbG9iYWxPYmplY3QgfHwgcmVxdWlyZXNEeW5hbWljQ2hl
Y2tzKSB7CisgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNTdGF0aWMoKSkgeworICAgICAgICBlbWl0
TG9hZChiYXNlRHN0LCBqc1VuZGVmaW5lZCgpKTsKKyAgICAgICAgZW1pdEdldFN0YXRpY1Zhcihw
cm9wRHN0LCByZXNvbHZlUmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgfQor
CisgICAgaWYgKHJlc29sdmVSZXN1bHQudHlwZSA9PSBSZXNvbHZlUmVzdWx0OjpEeW5hbWljKSB7
CiAgICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKICAgICAgICAgVmFsdWVQ
cm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF90aGlz
KTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGJhc2VEc3QtPmluZGV4KCkpOwpAQCAt
MTQ3MCwzOCArMTQ0NSw3OCBAQCBSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJl
c29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcgogICAgICAgICByZXR1
cm4gYmFzZURzdDsKICAgICB9CiAKLSAgICBib29sIGZvcmNlR2xvYmFsUmVzb2x2ZSA9IGZhbHNl
OwotCi0gICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQogICAgIGVtaXRMb2FkKGJhc2VE
c3QsIGpzVW5kZWZpbmVkKCkpOworICAgIHJldHVybiBlbWl0UmVzb2x2ZShwcm9wRHN0LCByZXNv
bHZlUmVzdWx0LCBwcm9wZXJ0eSk7Cit9CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJv
bE1hcmtlcigpICYmICFmb3JjZUdsb2JhbFJlc29sdmUpIHsKLSAgICAgICAgLy8gRGlyZWN0bHkg
aW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAgICAg
ICBlbWl0R2V0U2NvcGVkVmFyKHByb3BEc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsK
LSAgICAgICAgcmV0dXJuIGJhc2VEc3Q7Ci0gICAgfQotICAgIGlmIChzaG91bGRBdm9pZFJlc29s
dmVHbG9iYWwoKSkgewotICAgICAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmls
ZWRPcGNvZGUob3BfcmVzb2x2ZSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9w
RHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50
KHByb3BlcnR5KSk7CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRp
Y1ZhcihSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIHJlc29sdmVSZXN1bHQp
Cit7CisgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gMDsKKworICAgIHN3aXRjaCAocmVzb2x2
ZVJlc3VsdC50eXBlKSB7CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpSZWdpc3RlcjoKKyAgICBj
YXNlIFJlc29sdmVSZXN1bHQ6OlJlYWRPbmx5UmVnaXN0ZXI6CisgICAgICAgIGlmIChkc3QgPT0g
aWdub3JlZFJlc3VsdCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBt
b3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVnaXN0ZXJGb3IocmVzb2x2ZVJlc3VsdCkp
OworCisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpMZXhpY2FsOgorICAgIGNhc2UgUmVzb2x2ZVJl
c3VsdDo6UmVhZE9ubHlMZXhpY2FsOgorICAgICAgICBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bj
b2RlKG9wX2dldF9zY29wZWRfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRz
dC0+aW5kZXgoKSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChyZXNvbHZlUmVzdWx0
LmluZGV4KTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHJlc29sdmVSZXN1bHQuZGVw
dGgpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7Ci0gICAgICAgIHJl
dHVybiBiYXNlRHN0OworICAgICAgICByZXR1cm4gZHN0OworCisgICAgY2FzZSBSZXNvbHZlUmVz
dWx0OjpJbmRleGVkR2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVhZE9ubHlJbmRl
eGVkR2xvYmFsOgorICAgICAgICBpZiAobV9sYXN0T3Bjb2RlSUQgPT0gb3BfcHV0X2dsb2JhbF92
YXIpIHsKKyAgICAgICAgICAgIGludCBkc3RJbmRleDsKKyAgICAgICAgICAgIGludCBzcmNJbmRl
eDsKKyAgICAgICAgICAgIHJldHJpZXZlTGFzdFVuYXJ5T3AoZHN0SW5kZXgsIHNyY0luZGV4KTsK
KyAgICAgICAgICAgIGlmIChkc3RJbmRleCA9PSByZXNvbHZlUmVzdWx0LmluZGV4ICYmIHNyY0lu
ZGV4ID09IGRzdC0+aW5kZXgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZHN0OworICAgICAg
ICB9CisKKyAgICAgICAgcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9nZXRfZ2xvYmFs
X3Zhcik7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOworICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5pbmRleCk7CisgICAgICAg
IGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIGRzdDsKKwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9Cit9CisKK1JlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UHV0
U3RhdGljVmFyKGNvbnN0IFJlc29sdmVSZXN1bHQmIHJlc29sdmVSZXN1bHQsIFJlZ2lzdGVySUQq
IHZhbHVlKQoreworICAgIHN3aXRjaCAocmVzb2x2ZVJlc3VsdC50eXBlKSB7CisgICAgY2FzZSBS
ZXNvbHZlUmVzdWx0OjpSZWdpc3RlcjoKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OlJlYWRPbmx5
UmVnaXN0ZXI6CisgICAgICAgIHJldHVybiBtb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKHJlZ2lz
dGVyRm9yKHJlc29sdmVSZXN1bHQpLCB2YWx1ZSk7CisKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6
OkxleGljYWw6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpSZWFkT25seUxleGljYWw6CisgICAg
ICAgIGVtaXRPcGNvZGUob3BfcHV0X3Njb3BlZF92YXIpOworICAgICAgICBpbnN0cnVjdGlvbnMo
KS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5pbmRleCk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZChyZXNvbHZlUmVzdWx0LmRlcHRoKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgY2FzZSBSZXNv
bHZlUmVzdWx0OjpJbmRleGVkR2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVhZE9u
bHlJbmRleGVkR2xvYmFsOgorICAgICAgICBlbWl0T3Bjb2RlKG9wX3B1dF9nbG9iYWxfdmFyKTsK
KyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHJlc29sdmVSZXN1bHQuaW5kZXgpOworICAg
ICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQodmFsdWUtPmluZGV4KCkpOworICAgICAgICByZXR1
cm4gdmFsdWU7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotI2lmIEVOQUJMRShKSVQpCi0gICAgbV9jb2RlQmxv
Y2stPmFkZEdsb2JhbFJlc29sdmVJbmZvKGluc3RydWN0aW9ucygpLnNpemUoKSk7Ci0jZW5kaWYK
LSNpZiBFTkFCTEUoSU5URVJQUkVURVIpCi0gICAgbV9jb2RlQmxvY2stPmFkZEdsb2JhbFJlc29s
dmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMoKS5zaXplKCkpOwotI2VuZGlmCi0gICAgVmFsdWVQ
cm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKHJlcXVpcmVzRHluYW1pY0NoZWNr
cyA/IG9wX3Jlc29sdmVfZ2xvYmFsX2R5bmFtaWMgOiBvcF9yZXNvbHZlX2dsb2JhbCk7Ci0gICAg
aW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BEc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChhZGRDb25zdGFudChwcm9wZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoMCk7Ci0gICAgaWYgKHJlcXVpcmVz
RHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKLSAg
ICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7Ci0gICAgcmV0dXJuIGJhc2VEc3Q7CiB9
CiAKIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRNZXRob2RDaGVjaygpCkBAIC0yMzkyLDcg
KzI0MDcsNyBAQCB2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjpzZXRJc051bWVyaWNDb21wYXJlRnVu
Y3Rpb24oYm9vbCBpc051bWVyaWNDb21wYXJlRnVuY3RpbwogCiBib29sIEJ5dGVjb2RlR2VuZXJh
dG9yOjppc0FyZ3VtZW50TnVtYmVyKGNvbnN0IElkZW50aWZpZXImIGlkZW50LCBpbnQgYXJndW1l
bnROdW1iZXIpCiB7Ci0gICAgUmVnaXN0ZXJJRCogcmVnaXN0ZXJJRCA9IHJlZ2lzdGVyRm9yKGlk
ZW50KTsKKyAgICBSZWdpc3RlcklEKiByZWdpc3RlcklEID0gcmVnaXN0ZXJGb3IocmVzb2x2ZShp
ZGVudCkpOwogICAgIGlmICghcmVnaXN0ZXJJRCB8fCByZWdpc3RlcklELT5pbmRleCgpID49IDAp
CiAgICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gcmVnaXN0ZXJJRC0+aW5kZXgoKSA9PSBD
YWxsRnJhbWU6OmFyZ3VtZW50T2Zmc2V0KGFyZ3VtZW50TnVtYmVyKTsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaCBiL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAppbmRl
eCA1OWQ3NzZlOTA2YzE2NTgzOTg4ODY5Yjg1M2FlZjQyNzJkNTU3Y2ZjLi40ZDc1OGExOWI1NjNk
YzRhZDNhZWEwNDA0YjZmZjM1NDk1ZWNlN2Q4IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgKKysrIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCkBAIC0xLDYgKzEsNyBA
QAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ2FtZXJvbiBad2FyaWNoIDxjd3p3YXJp
Y2hAdXdhdGVybG9vLmNhPgorICogQ29weXJpZ2h0IChDKSAyMDEyIElnYWxpYSwgUy5MLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC04NSw2ICs4Niw4NCBAQCBuYW1lc3BhY2Ug
SlNDIHsKICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BlcnR5UmVnaXN0ZXI7CiAgICAg
fTsKIAorICAgIHN0cnVjdCBSZXNvbHZlUmVzdWx0IHsKKyAgICAgICAgZW51bSBGbGFncyB7Cisg
ICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgbG9jYWxseSBib3VuZCwgaW4gYSByZWdpc3Rl
ci4KKyAgICAgICAgICAgIFJlZ2lzdGVyRmxhZyA9IDB4MSwKKyAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gdHJhdmVyc2UgdGhlIHNjb3BlIGNoYWluIGF0IHJ1bnRpbWUsIGNoZWNraW5nIGZvcgor
ICAgICAgICAgICAgLy8gbm9uLXN0cmljdCBldmFsIGFuZC9vciBgd2l0aCcgbm9kZXMuCisgICAg
ICAgICAgICBEeW5hbWljRmxhZyA9IDB4MiwKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSB3
YXMgcmVzb2x2ZWQgdG8gYSBkZWZpbml0ZSBsb2NhdGlvbiwgYW5kIHRoZQorICAgICAgICAgICAg
Ly8gaWRlbnRpZmllciBpcyBub3QgbmVlZGVkIGFueSBtb3JlLgorICAgICAgICAgICAgU3RhdGlj
RmxhZyA9IDB4NCwKKyAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSB0aGUgYmFzZSBvYmplY3Qs
IHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGxvY2F0ZWQgYXQgYQorICAgICAgICAgICAgLy8ga25vd24g
aW5kZXguCisgICAgICAgICAgICBJbmRleGVkRmxhZyA9IDB4OCwKKyAgICAgICAgICAgIC8vIFNr
aXAgc29tZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2NvcGUgY2hhaW4sIGdpdmVuIGJ5ICJk
ZXB0aCIuCisgICAgICAgICAgICBTY29wZUZsYWcgPSAweDEwLAorICAgICAgICAgICAgLy8gVGhl
IHJlc29sdmVkIGJpbmRpbmcgaXMgaW1tdXRhYmxlLgorICAgICAgICAgICAgUmVhZE9ubHlGbGFn
ID0gMHgyMCwKKyAgICAgICAgICAgIC8vIFRoZSBiYXNlIG9iamVjdCBpcyB0aGUgZ2xvYmFsIG9i
amVjdC4KKyAgICAgICAgICAgIEdsb2JhbEZsYWcgPSAweDQwCisgICAgICAgIH07CisgICAgICAg
IGVudW0gVHlwZSB7CisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgbG9jYWwsIGFuZCBz
dG9yZWQgaW4gYSByZWdpc3Rlci4KKyAgICAgICAgICAgIFJlZ2lzdGVyID0gUmVnaXN0ZXJGbGFn
IHwgU3RhdGljRmxhZywKKyAgICAgICAgICAgIC8vIEEgcmVhZC1vbmx5IGxvY2FsLCBjcmVhdGVk
IGJ5ICJjb25zdCIuCisgICAgICAgICAgICBSZWFkT25seVJlZ2lzdGVyID0gUmVnaXN0ZXJGbGFn
IHwgUmVhZE9ubHlGbGFnIHwgU3RhdGljRmxhZywKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0
eSBpcyBzdGF0aWNhbGx5IHNjb3BlZCBmcmVlIHZhcmlhYmxlLiBJdHMgY29vcmRpbmF0ZXMKKyAg
ICAgICAgICAgIC8vIGFyZSBpbiAiaW5kZXgiIGFuZCAiZGVwdGgiLgorICAgICAgICAgICAgTGV4
aWNhbCA9IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFnIHwgU3RhdGljRmxhZywKKyAgICAgICAgICAg
IC8vIEEgcmVhZC1vbmx5IExleGljYWwsIGNyZWF0ZWQgYnkgImNvbnN0Ii4KKyAgICAgICAgICAg
IFJlYWRPbmx5TGV4aWNhbCA9IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFnIHwgUmVhZE9ubHlGbGFn
IHwgU3RhdGljRmxhZywKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSB3YXMgbm90IGJvdW5k
IGxleGljYWxseSwgc28gYXQgcnVudGltZSB3ZSBzaG91bGQKKyAgICAgICAgICAgIC8vIGxvb2sg
ZGlyZWN0bHkgaW4gdGhlIGdsb2JhbCBvYmplY3QuCisgICAgICAgICAgICBHbG9iYWwgPSBHbG9i
YWxGbGFnLAorICAgICAgICAgICAgLy8gTGlrZSBHbG9iYWwsIGJ1dCB3ZSBjb3VsZCBhY3R1YWxs
eSByZXNvbHZlIHRoZSBwcm9wZXJ0eSB0byBhCisgICAgICAgICAgICAvLyBEb250RGVsZXRlIHBy
b3BlcnR5IGluIHRoZSBnbG9iYWwgb2JqZWN0LCBmb3IgaW5zdGFuY2UsIGFueQorICAgICAgICAg
ICAgLy8gYmluZGluZyBjcmVhdGVkIHdpdGggInZhciIgYXQgdGhlIHRvcCBsZXZlbC4gQXQgcnVu
dGltZSB3ZSdsbAorICAgICAgICAgICAgLy8ganVzdCBpbmRleCBpbnRvIHRoZSBnbG9iYWwgb2Jq
ZWN0LgorICAgICAgICAgICAgSW5kZXhlZEdsb2JhbCA9IEluZGV4ZWRGbGFnIHwgR2xvYmFsRmxh
ZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBMaWtlIEluZGV4ZWRHbG9iYWwsIGJ1dCB0
aGUgcHJvcGVydHkgaXMgYWxzbyByZWFkLW9ubHksIGxpa2UgTmFOLAorICAgICAgICAgICAgLy8g
SW5maW5pdHksIG9yIHVuZGVmaW5lZC4KKyAgICAgICAgICAgIFJlYWRPbmx5SW5kZXhlZEdsb2Jh
bCA9IEluZGV4ZWRGbGFnIHwgUmVhZE9ubHlGbGFnIHwgR2xvYmFsRmxhZyB8IFN0YXRpY0ZsYWcs
CisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlc29sdmVkIHN0YXRp
Y2FsbHksIGR1ZSB0byB0aGUKKyAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIGB3aXRoJyBibG9j
a3MuIEF0IHJ1bnRpbWUgd2UnbGwgaGF2ZSB0byB3YWxrIHRoZQorICAgICAgICAgICAgLy8gc2Nv
cGUgY2hhaW4uIFNjb3BlRmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCAiZGVwdGgiIHdpbGwK
KyAgICAgICAgICAgIC8vIGhvbGQgc29tZSBudW1iZXIgb2Ygbm9kZXMgdG8gc2tpcCBpbiB0aGUg
c2NvcGUgY2hhaW4sIGJlZm9yZQorICAgICAgICAgICAgLy8gYmVnaW5uaW5nIHRoZSBzZWFyY2gu
CisgICAgICAgICAgICBEeW5hbWljID0gRHluYW1pY0ZsYWcgfCBTY29wZUZsYWcsCisgICAgICAg
ICAgICAvLyBUaGUgcHJvcGVydHkgd2FzIGxvY2F0ZWQgYXMgYSBzdGF0aWNhbGx5IHNjb3BlZCBm
cmVlIHZhcmlhYmxlLAorICAgICAgICAgICAgLy8gYnV0IHdoaWxlIHRyYXZlcnNpbmcgdGhlIHNj
b3BlIGNoYWluLCB0aGVyZSB3YXMgYW4gaW50ZXJtZWRpYXRlCisgICAgICAgICAgICAvLyBhY3Rp
dmF0aW9uIHRoYXQgdXNlZCBub24tc3RyaWN0IGBldmFsJy4gQXQgcnVudGltZSB3ZSdsbCBoYXZl
IHRvCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIGFic2VuY2Ugb2YgdGhpcyBwcm9wZXJ0
eSBpbiB0aG9zZSBpbnRlcnZlbmluZworICAgICAgICAgICAgLy8gc2NvcGVzLgorICAgICAgICAg
ICAgRHluYW1pY0xleGljYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgU2NvcGVGbGFn
LAorICAgICAgICAgICAgLy8gTGlrZSBSZWFkT25seUxleGljYWwsIGJ1dCB3aXRoIGludGVydmVu
aW5nIG5vbi1zdHJpY3QgYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY1JlYWRPbmx5TGV4aWNh
bCA9IER5bmFtaWNGbGFnIHwgSW5kZXhlZEZsYWcgfCBTY29wZUZsYWcgfCBSZWFkT25seUZsYWcs
CisgICAgICAgICAgICAvLyBMaWtlIEdsb2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcgbm9uLXN0
cmljdCBgZXZhbCcuIEFzIHdpdGggCisgICAgICAgICAgICAvLyBEeW5hbWljLCBTY29wZUZsYWcg
aXMgc2V0IHRvIGluZGljYXRlIHRoYXQgImRlcHRoIiBkb2VzIGluZGVlZAorICAgICAgICAgICAg
Ly8gc3RvcmUgYSBudW1iZXIgb2YgZnJhbWVzIHRvIHNraXAgYmVmb3JlIGRvaW5nIHRoZSBkeW5h
bWljIGNoZWNrcy4KKyAgICAgICAgICAgIER5bmFtaWNHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEds
b2JhbEZsYWcgfCBTY29wZUZsYWcsCisgICAgICAgICAgICAvLyBMaWtlIEluZGV4ZWRHbG9iYWws
IGJ1dCB3aXRoIGludGVydmVuaW5nIG5vbi1zdHJpY3QgYGV2YWwnLgorICAgICAgICAgICAgRHlu
YW1pY0luZGV4ZWRHbG9iYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgR2xvYmFsRmxh
ZyB8IFNjb3BlRmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgUmVhZE9ubHlJbmRleGVkR2xvYmFs
LCBidXQgd2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0CisgICAgICAgICAgICAvLyBgZXZhbCcu
CisgICAgICAgICAgICBEeW5hbWljUmVhZE9ubHlJbmRleGVkR2xvYmFsID0gRHluYW1pY0ZsYWcg
fCBJbmRleGVkRmxhZyB8IFJlYWRPbmx5RmxhZyB8IEdsb2JhbEZsYWcgfCBTY29wZUZsYWcsCisg
ICAgICAgIH07CisKKyAgICAgICAgYm9vbCBpc1JlZ2lzdGVyKCkgY29uc3QgeyByZXR1cm4gdHlw
ZSAmIFJlZ2lzdGVyRmxhZzsgfQorICAgICAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0
dXJuIHR5cGUgJiBEeW5hbWljRmxhZzsgfQorICAgICAgICBib29sIGlzU3RhdGljKCkgY29uc3Qg
eyByZXR1cm4gdHlwZSAmIFN0YXRpY0ZsYWc7IH0KKyAgICAgICAgYm9vbCBpc1JlYWRPbmx5KCkg
Y29uc3QgeyByZXR1cm4gdHlwZSAmIFJlYWRPbmx5RmxhZzsgfQorICAgICAgICBib29sIGlzR2xv
YmFsKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIEdsb2JhbEZsYWc7IH0KKworICAgICAgICB1bnNp
Z25lZCB0eXBlOworICAgICAgICBpbnQgaW5kZXg7IC8vIEluZGV4IGluIHNjb3BlLCBpZiBJbmRl
eGVkRmxhZyBpcyBzZXQsIG9yIGluIHJlZ2lzdGVycywgaWYgUmVnaXN0ZXJGbGFnIGlzIHNldC4K
KyAgICAgICAgc2l6ZV90IGRlcHRoOyAvLyBEZXB0aCBpbiBzY29wZSBjaGFpbiwgaWYgU2NvcGVG
bGFnIGlzIHNldAorICAgICAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0OyAvLyBJZiBHbG9iYWxG
bGFnIGlzIHNldC4KKyAgICB9OworCiAgICAgY2xhc3MgQnl0ZWNvZGVHZW5lcmF0b3IgewogICAg
ICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKICAgICBwdWJsaWM6CkBAIC0xMDcsMTEgKzE4
Niw2IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIEpTT2JqZWN0KiBnZW5lcmF0ZSgpOwog
Ci0gICAgICAgIC8vIFJldHVybnMgdGhlIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gYSBsb2Nh
bCB2YXJpYWJsZSwgb3IgMCBpZiBubwotICAgICAgICAvLyBzdWNoIHJlZ2lzdGVyIGV4aXN0cy4g
UmVnaXN0ZXJzIHJldHVybmVkIGJ5IHJlZ2lzdGVyRm9yIGRvIG5vdAotICAgICAgICAvLyByZXF1
aXJlIGV4cGxpY2l0IHJlZmVyZW5jZSBjb3VudGluZy4KLSAgICAgICAgUmVnaXN0ZXJJRCogcmVn
aXN0ZXJGb3IoY29uc3QgSWRlbnRpZmllciYpOwotCiAgICAgICAgIGJvb2wgaXNBcmd1bWVudE51
bWJlcihjb25zdCBJZGVudGlmaWVyJiwgaW50KTsKIAogICAgICAgICB2b2lkIHNldElzTnVtZXJp
Y0NvbXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvbik7CkBAIC0xMTks
MTcgKzE5MywxNiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgYm9vbCB3aWxsUmVzb2x2ZVRv
QXJndW1lbnRzKGNvbnN0IElkZW50aWZpZXImKTsKICAgICAgICAgUmVnaXN0ZXJJRCogdW5jaGVj
a2VkUmVnaXN0ZXJGb3JBcmd1bWVudHMoKTsKIAotICAgICAgICAvLyBCZWhhdmVzIGFzIHJlZ2lz
dGVyRm9yIGRvZXMsIGJ1dCBpZ25vcmVzIGR5bmFtaWMgc2NvcGUgYXMKKyAgICAgICAgLy8gUmVz
b2x2ZSBhbiBpZGVudGlmaWVyLCBnaXZlbiB0aGUgY3VycmVudCBjb21waWxlLXRpbWUgc2NvcGUg
Y2hhaW4uCisgICAgICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZShjb25zdCBJZGVudGlmaWVyJik7
CisgICAgICAgIC8vIEJlaGF2ZXMgYXMgcmVzb2x2ZSBkb2VzLCBidXQgaWdub3JlcyBkeW5hbWlj
IHNjb3BlIGFzCiAgICAgICAgIC8vIGR5bmFtaWMgc2NvcGUgc2hvdWxkIG5vdCBpbnRlcmZlcmUg
d2l0aCBjb25zdCBpbml0aWFsaXNhdGlvbgotICAgICAgICBSZWdpc3RlcklEKiBjb25zdFJlZ2lz
dGVyRm9yKGNvbnN0IElkZW50aWZpZXImKTsKKyAgICAgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZl
Q29uc3REZWNsKGNvbnN0IElkZW50aWZpZXImKTsKIAotICAgICAgICAvLyBTZWFyY2hlcyB0aGUg
c2NvcGUgY2hhaW4gaW4gYW4gYXR0ZW1wdCB0byAgc3RhdGljYWxseSBsb2NhdGUgdGhlIHJlcXVl
c3RlZAotICAgICAgICAvLyBwcm9wZXJ0eS4gIFJldHVybnMgZmFsc2UgaWYgZm9yIGFueSByZWFz
b24gdGhlIHByb3BlcnR5IGNhbm5vdCBiZSBzYWZlbHkKLSAgICAgICAgLy8gb3B0aW1pc2VkIGF0
IGFsbC4gIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiB0aGUgaW5kZXggYW5kIGRlcHRoIG9mIHRo
ZQotICAgICAgICAvLyBWYXJpYWJsZU9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHByb3BlcnR5LiAg
SWYgdGhlIHByb3BlcnR5IGNhbm5vdCBiZSBmb3VuZAotICAgICAgICAvLyBzdGF0aWNhbGx5LCBk
ZXB0aCB3aWxsIGNvbnRhaW4gdGhlIGRlcHRoIG9mIHRoZSBzY29wZSBjaGFpbiB3aGVyZSBkeW5h
bWljCi0gICAgICAgIC8vIGxvb2t1cCBtdXN0IGJlZ2luLgotICAgICAgICBib29sIGZpbmRTY29w
ZWRQcm9wZXJ0eShjb25zdCBJZGVudGlmaWVyJiwgaW50JiBpbmRleCwgc2l6ZV90JiBkZXB0aCwg
Ym9vbCBmb3JXcml0aW5nLCBib29sJiBpbmNsdWRlc0R5bmFtaWNTY29wZXMsIEpTT2JqZWN0KiYg
Z2xvYmFsT2JqZWN0KTsKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY29ycmVzcG9u
ZGluZyB0byBhIGxvY2FsIHZhcmlhYmxlLCBvciAwIGlmIG5vCisgICAgICAgIC8vIHN1Y2ggcmVn
aXN0ZXIgZXhpc3RzLiBSZWdpc3RlcnMgcmV0dXJuZWQgYnkgcmVnaXN0ZXJGb3IgZG8gbm90Cisg
ICAgICAgIC8vIHJlcXVpcmUgZXhwbGljaXQgcmVmZXJlbmNlIGNvdW50aW5nLgorICAgICAgICBS
ZWdpc3RlcklEKiByZWdpc3RlckZvcihjb25zdCBSZXNvbHZlUmVzdWx0Jik7CiAKICAgICAgICAg
Ly8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgc3RvcmluZyAidGhpcyIKICAgICAgICAgUmVnaXN0ZXJJ
RCogdGhpc1JlZ2lzdGVyKCkgeyByZXR1cm4gJm1fdGhpc1JlZ2lzdGVyOyB9CkBAIC0zMDksMTQg
KzM4MiwxNCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFR5cGVP
ZihSZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIHNyYykgeyByZXR1cm4gZW1pdFVuYXJ5T3Ao
b3BfdHlwZW9mLCBkc3QsIHNyYyk7IH0KICAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEluKFJlZ2lz
dGVySUQqIGRzdCwgUmVnaXN0ZXJJRCogcHJvcGVydHksIFJlZ2lzdGVySUQqIGJhc2UpIHsgcmV0
dXJuIGVtaXRCaW5hcnlPcChvcF9pbiwgZHN0LCBwcm9wZXJ0eSwgYmFzZSwgT3BlcmFuZFR5cGVz
KCkpOyB9CiAKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmUoUmVnaXN0ZXJJRCogZHN0
LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGVtaXRH
ZXRTY29wZWRWYXIoUmVnaXN0ZXJJRCogZHN0LCBzaXplX3Qgc2tpcCwgaW50IGluZGV4LCBKU1Zh
bHVlIGdsb2JhbE9iamVjdCk7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGVtaXRQdXRTY29wZWRWYXIo
c2l6ZV90IHNraXAsIGludCBpbmRleCwgUmVnaXN0ZXJJRCogdmFsdWUsIEpTVmFsdWUgZ2xvYmFs
T2JqZWN0KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEdldFN0YXRpY1ZhcihSZWdpc3RlcklE
KiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmKTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFB1
dFN0YXRpY1Zhcihjb25zdCBSZXNvbHZlUmVzdWx0JiwgUmVnaXN0ZXJJRCogdmFsdWUpOwogCi0g
ICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlQmFzZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0
IElkZW50aWZpZXImIHByb3BlcnR5KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmVC
YXNlRm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwot
ICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhCYXNlKFJlZ2lzdGVySUQqIGJhc2VE
c3QsIFJlZ2lzdGVySUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKLSAg
ICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0
LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7CisgICAg
ICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2
ZVJlc3VsdCYsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKKyAgICAgICAgUmVnaXN0ZXJJ
RCogZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJl
c29sdmVCYXNlRm9yUHV0KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYsIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29s
dmVXaXRoQmFzZShSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25z
dCBSZXNvbHZlUmVzdWx0JiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOworICAgICAgICBS
ZWdpc3RlcklEKiBlbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lz
dGVySUQqIHByb3BEc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmLCBjb25zdCBJZGVudGlmaWVyJiBw
cm9wZXJ0eSk7CiAKICAgICAgICAgdm9pZCBlbWl0TWV0aG9kQ2hlY2soKTsKIApkaWZmIC0tZ2l0
IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwIGIv
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCmluZGV4
IDEzMmY2NjYyYWZiY2M3OTU0YWNlNTk5YTQ2MDNmNGQ5MmUwYjg5OGQuLjgwZmQzNDdlYjk1ZDY0
Mjc3YTk4NDc4MDI3NjRkMTliMTU1YTliMjQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAKQEAgLTUsNiArNSw3IEBACiAqICBD
b3B5cmlnaHQgKEMpIDIwMDcgQ2FtZXJvbiBad2FyaWNoIChjd3p3YXJpY2hAdXdhdGVybG9vLmNh
KQogKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1ha3MgT3Jsb3ZpY2gKICogIENvcHlyaWdodCAoQykg
MjAwNyBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEy
IElnYWxpYSwgUy5MLgogKgogKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTE0NiwxNCArMTQ3LDE1IEBAIGJv
b2wgUmVzb2x2ZU5vZGU6OmlzUHVyZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25z
dAogCiBSZWdpc3RlcklEKiBSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCog
bG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVz
dWx0IHJlc29sdmVSZXN1bHQgPSBnZW5lcmF0b3IucmVzb2x2ZShtX2lkZW50KTsKKyAgICBpZiAo
UmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IocmVzb2x2ZVJlc3VsdCkp
IHsKICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQogICAgICAg
ICAgICAgcmV0dXJuIDA7CiAgICAgICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRp
b25JZk5lZWRlZChkc3QsIGxvY2FsKTsKICAgICB9CiAgICAgCiAgICAgZ2VuZXJhdG9yLmVtaXRF
eHByZXNzaW9uSW5mbyhtX3N0YXJ0T2Zmc2V0ICsgbV9pZGVudC5sZW5ndGgoKSwgbV9pZGVudC5s
ZW5ndGgoKSwgMCk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbihkc3QpLCBtX2lkZW50KTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVt
aXRSZXNvbHZlKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHJlc29sdmVSZXN1bHQs
IG1faWRlbnQpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXJyYXlO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzQ2LDcgKzM0OCw3
IEBAIFJlZ2lzdGVySUQqIEV2YWxGdW5jdGlvbkNhbGxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMg
PSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCk7CiAgICAgQ2FsbEFyZ3VtZW50cyBjYWxs
QXJndW1lbnRzKGdlbmVyYXRvciwgbV9hcmdzKTsKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Np
b25JbmZvKGRpdm90KCkgLSBzdGFydE9mZnNldCgpICsgNCwgNCwgMCk7Ci0gICAgZ2VuZXJhdG9y
LmVtaXRSZXNvbHZlV2l0aFRoaXMoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIoKSwgZnVuYy5n
ZXQoKSwgZ2VuZXJhdG9yLnByb3BlcnR5TmFtZXMoKS5ldmFsKTsKKyAgICBnZW5lcmF0b3IuZW1p
dFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgp
LCBnZW5lcmF0b3IucmVzb2x2ZShnZW5lcmF0b3IucHJvcGVydHlOYW1lcygpLmV2YWwpLCBnZW5l
cmF0b3IucHJvcGVydHlOYW1lcygpLmV2YWwpOwogICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENh
bGxFdmFsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgZnVuYy5nZXQoKSksIGZ1bmMu
Z2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgp
KTsKIH0KIApAQCAtMzY0LDIwICszNjYsMTkgQEAgUmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsVmFs
dWVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmUKIAog
UmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgaWYgKFJlZlB0
cjxSZWdpc3RlcklEPiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgewot
ICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuY3Rpb24gPSBnZW5lcmF0b3IuZW1pdE1vdmUo
Z2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBsb2NhbC5nZXQoKSk7CisgICAgUmVzb2x2
ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAg
ICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IocmVzb2x2ZVJl
c3VsdCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMgPSBnZW5lcmF0b3IuZW1p
dE1vdmUoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBsb2NhbCk7CiAgICAgICAgIENh
bGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CiAgICAgICAgIGdl
bmVyYXRvci5lbWl0TG9hZChjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBqc1VuZGVmaW5l
ZCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVyKCkpLCBm
dW5jdGlvbi5nZXQoKSwgY2FsbEFyZ3VtZW50cywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5k
T2Zmc2V0KCkpOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVyYXRvci5m
aW5hbERlc3RpbmF0aW9uT3JJZ25vcmVkKGRzdCwgY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIo
KSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVu
ZE9mZnNldCgpKTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0
aCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJl
c0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9w
ZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3Ms
IGdsb2JhbE9iamVjdCkgJiYgaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYmICFyZXF1
aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMgPSBn
ZW5lcmF0b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGRlcHRo
LCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRpYygp
KSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpOwogICAgICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBt
X2FyZ3MpOworICAgICAgICBnZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihmdW5jLmdldCgpLCBy
ZXNvbHZlUmVzdWx0KTsKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRMb2FkKGNhbGxBcmd1bWVudHMu
dGhpc1JlZ2lzdGVyKCksIGpzVW5kZWZpbmVkKCkpOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
LmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uT3JJZ25vcmVkKGRzdCwgZnVuYy5n
ZXQoKSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCks
IGVuZE9mZnNldCgpKTsKICAgICB9CkBAIC0zODUsOCArMzg2LDkgQEAgUmVnaXN0ZXJJRCogRnVu
Y3Rpb25DYWxsUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLAogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpOwogICAgIENhbGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJn
cyk7CiAgICAgaW50IGlkZW50aWZpZXJTdGFydCA9IGRpdm90KCkgLSBzdGFydE9mZnNldCgpOwor
CiAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhpZGVudGlmaWVyU3RhcnQgKyBtX2lk
ZW50Lmxlbmd0aCgpLCBtX2lkZW50Lmxlbmd0aCgpLCAwKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJl
c29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCBt
X2lkZW50KTsKKyAgICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoVGhpcyhjYWxsQXJndW1lbnRz
LnRoaXNSZWdpc3RlcigpLCBmdW5jLmdldCgpLCByZXNvbHZlUmVzdWx0LCBtX2lkZW50KTsKICAg
ICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uT3JJ
Z25vcmVkKGRzdCwgZnVuYy5nZXQoKSksIGZ1bmMuZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90
KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKIH0KIApAQCAtNTUwLDI0ICs1NTIsMjEg
QEAgc3RhdGljIFJlZ2lzdGVySUQqIGVtaXRQb3N0SW5jT3JEZWMoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHMKIAogUmVnaXN0ZXJJRCogUG9zdGZpeFJlc29sdmVO
b2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJ
RCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3Rl
ckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFudCht
X2lkZW50KSkgeworICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZVJlc3VsdCA9IGdlbmVyYXRvci5y
ZXNvbHZlKG1faWRlbnQpOworCisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9y
LnJlZ2lzdGVyRm9yKHJlc29sdmVSZXN1bHQpKSB7CisgICAgICAgIGlmIChyZXNvbHZlUmVzdWx0
LmlzUmVhZE9ubHkoKSkgewogICAgICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3Jl
ZFJlc3VsdCgpKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgcmV0dXJu
IGdlbmVyYXRvci5lbWl0VG9KU051bWJlcihnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qp
LCBsb2NhbCk7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25v
cmVkUmVzdWx0KCkpCiAgICAgICAgICAgICByZXR1cm4gZW1pdFByZUluY09yRGVjKGdlbmVyYXRv
ciwgbG9jYWwsIG1fb3BlcmF0b3IpOwogICAgICAgICByZXR1cm4gZW1pdFBvc3RJbmNPckRlYyhn
ZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxvY2FsLCBtX29wZXJh
dG9yKTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7
Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFt
aWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eSht
X2lkZW50LCBpbmRleCwgZGVwdGgsIHRydWUsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFs
T2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHlu
YW1pY0NoZWNrcykgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0
b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGRlcHRoLCBpbmRl
eCwgZ2xvYmFsT2JqZWN0KTsKKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRpYygpICYmICFy
ZXNvbHZlUmVzdWx0LmlzUmVhZE9ubHkoKSkgeworICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
dmFsdWUgPSBnZW5lcmF0b3IuZW1pdEdldFN0YXRpY1ZhcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5
KCksIHJlc29sdmVSZXN1bHQpOwogICAgICAgICBSZWdpc3RlcklEKiBvbGRWYWx1ZTsKICAgICAg
ICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7CiAgICAgICAgICAgICBv
bGRWYWx1ZSA9IDA7CkBAIC01NzUsMTMgKzU3NCwxMyBAQCBSZWdpc3RlcklEKiBQb3N0Zml4UmVz
b2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdp
cwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09y
RGVjKGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0
KCksIG1fb3BlcmF0b3IpOwogICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2Nv
cGVkVmFyKGRlcHRoLCBpbmRleCwgdmFsdWUuZ2V0KCksIGdsb2JhbE9iamVjdCk7CisgICAgICAg
IGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKHJlc29sdmVSZXN1bHQsIHZhbHVlLmdldCgpKTsK
ICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwogICAgIH0KLQorICAgIAogICAgIGdlbmVyYXRvci5l
bWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwog
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsK
LSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhC
YXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgdmFsdWUuZ2V0KCksIG1faWRlbnQpOworICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2Uo
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCB2YWx1ZS5nZXQoKSwgcmVzb2x2ZVJlc3VsdCwgbV9p
ZGVudCk7CiAgICAgUmVnaXN0ZXJJRCogb2xkVmFsdWU7CiAgICAgaWYgKGRzdCA9PSBnZW5lcmF0
b3IuaWdub3JlZFJlc3VsdCgpKSB7CiAgICAgICAgIG9sZFZhbHVlID0gMDsKQEAgLTY1MywxMSAr
NjUyLDEyIEBAIFJlZ2lzdGVySUQqIFBvc3RmaXhFcnJvck5vZGU6OmVtaXRCeXRlY29kZShCeXRl
Y29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlCiAKIFJlZ2lzdGVySUQqIERlbGV0ZVJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCogZHN0KQogewotICAgIGlmIChnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkp
CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9p
ZGVudCk7CisgICAgaWYgKGdlbmVyYXRvci5yZWdpc3RlckZvcihyZXNvbHZlUmVzdWx0KSkKICAg
ICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0TG9hZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlv
bihkc3QpLCBmYWxzZSk7CiAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90
KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICBSZWdpc3RlcklEKiBiYXNlID0g
Z2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCks
IG1faWRlbnQpOworICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVC
YXNlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgcmVzb2x2ZVJlc3VsdCwgbV9pZGVu
dCk7CiAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0RGVsZXRlQnlJZChnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbihkc3QsIGJhc2UpLCBiYXNlLCBtX2lkZW50KTsKIH0KIApAQCAtNzA4LDEzICs3
MDgsMTQgQEAgUmVnaXN0ZXJJRCogVm9pZE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QKIAogUmVnaXN0ZXJJRCogVHlwZU9mUmVz
b2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdp
c3RlcklEKiBkc3QpCiB7Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJl
Z2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0g
Z2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0g
Z2VuZXJhdG9yLnJlZ2lzdGVyRm9yKHJlc29sdmVSZXN1bHQpKSB7CiAgICAgICAgIGlmIChkc3Qg
PT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAg
ICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRUeXBlT2YoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0KSwgbG9jYWwpOwogICAgIH0KIAotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzY3JhdGNo
ID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRz
dCksIG1faWRlbnQpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzY3JhdGNoID0gZ2VuZXJhdG9y
LmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIHJlc29sdmVS
ZXN1bHQsIG1faWRlbnQpOwogICAgIGdlbmVyYXRvci5lbWl0R2V0QnlJZChzY3JhdGNoLmdldCgp
LCBzY3JhdGNoLmdldCgpLCBtX2lkZW50KTsKICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25v
cmVkUmVzdWx0KCkpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNzM3LDMyICs3MzgsMjggQEAgUmVn
aXN0ZXJJRCogVHlwZU9mVmFsdWVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZXIKIAogUmVnaXN0ZXJJRCogUHJlZml4UmVzb2x2ZU5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3Qp
CiB7Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1f
aWRlbnQpKSB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJl
c29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJl
Z2lzdGVyRm9yKHJlc29sdmVSZXN1bHQpKSB7CiAgICAgICAgIGlmIChnZW5lcmF0b3IuaXNMb2Nh
bENvbnN0YW50KG1faWRlbnQpKSB7CiAgICAgICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5p
Z25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gcjAgPSBnZW5lcmF0b3IuZW1pdExvYWQoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgKG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cykgPyAxLjAgOiAtMS4w
KTsKICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdEJpbmFyeU9wKG9wX2FkZCwgcjAu
Z2V0KCksIGxvY2FsLCByMC5nZXQoKSwgT3BlcmFuZFR5cGVzKCkpOwogICAgICAgICB9Ci0KICAg
ICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwgbG9jYWwsIG1fb3BlcmF0b3IpOwogICAg
ICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBsb2Nh
bCk7CiAgICAgfQogCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGggPSAwOwot
ICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWlj
Q2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHkobV9p
ZGVudCwgaW5kZXgsIGRlcHRoLCB0cnVlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2JhbE9i
amVjdCkgJiYgaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYmICFyZXF1aXJlc0R5bmFt
aWNDaGVja3MpIHsKLSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBnZW5lcmF0
b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGRlcHRo
LCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRpYygp
ICYmICFyZXNvbHZlUmVzdWx0LmlzUmVhZE9ubHkoKSkgeworICAgICAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRvci5lbWl0R2V0U3RhdGljVmFyKGdlbmVyYXRvci50ZW1w
RGVzdGluYXRpb24oZHN0KSwgcmVzb2x2ZVJlc3VsdCk7CiAgICAgICAgIGVtaXRQcmVJbmNPckRl
YyhnZW5lcmF0b3IsIHByb3BEc3QuZ2V0KCksIG1fb3BlcmF0b3IpOwotICAgICAgICBnZW5lcmF0
b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgsIHByb3BEc3QuZ2V0KCksIGdsb2JhbE9i
amVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKHJlc29sdmVSZXN1bHQs
IHByb3BEc3QuZ2V0KCkpOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0
aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKICAgICB9CiAKICAgICBnZW5lcmF0b3Iu
ZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsK
ICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRp
b24oZHN0KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVz
b2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgcHJvcERzdC5nZXQoKSwgbV9p
ZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29s
dmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHByb3BEc3QuZ2V0KCksIHJlc29s
dmVSZXN1bHQsIG1faWRlbnQpOwogICAgIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIHByb3BE
c3QuZ2V0KCksIG1fb3BlcmF0b3IpOwogICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLmdl
dCgpLCBtX2lkZW50LCBwcm9wRHN0LmdldCgpKTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVU
b0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKQEAgLTExNTAsMTAgKzEx
NDcsMTEgQEAgc3RhdGljIEFMV0FZU19JTkxJTkUgUmVnaXN0ZXJJRCogZW1pdFJlYWRNb2RpZnlB
c3NpZ25tZW50KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW4KIAogUmVnaXN0ZXJJRCogUmVhZE1vZGlm
eVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRv
ci5yZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxD
b25zdGFudChtX2lkZW50KSkgeworICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZVJlc3VsdCA9IGdl
bmVyYXRvci5yZXNvbHZlKG1faWRlbnQpOworCisgICAgaWYgKFJlZ2lzdGVySUQgKmxvY2FsID0g
Z2VuZXJhdG9yLnJlZ2lzdGVyRm9yKHJlc29sdmVSZXN1bHQpKSB7CisgICAgICAgIGlmIChyZXNv
bHZlUmVzdWx0LmlzUmVhZE9ubHkoKSkKICAgICAgICAgICAgIHJldHVybiBlbWl0UmVhZE1vZGlm
eUFzc2lnbm1lbnQoZ2VuZXJhdG9yLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBs
b2NhbCwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25v
d25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwotICAgICAgICB9CiAgICAg
ICAgIAogICAgICAgICBpZiAoZ2VuZXJhdG9yLmxlZnRIYW5kU2lkZU5lZWRzQ29weShtX3JpZ2h0
SGFzQXNzaWdubWVudHMsIG1fcmlnaHQtPmlzUHVyZShnZW5lcmF0b3IpKSkgewogICAgICAgICAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsK
QEAgLTExNjcsMjAgKzExNjUsMTYgQEAgUmVnaXN0ZXJJRCogUmVhZE1vZGlmeVJlc29sdmVOb2Rl
OjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmUKICAgICAgICAg
cmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsK
ICAgICB9CiAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAg
SlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVj
a3MgPSBmYWxzZTsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50
LCBpbmRleCwgZGVwdGgsIHRydWUsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0
KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0No
ZWNrcykgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci5lbWl0
R2V0U2NvcGVkVmFyKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgZGVwdGgsIGluZGV4
LCBnbG9iYWxPYmplY3QpOworICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkgJiYgIXJl
c29sdmVSZXN1bHQuaXNSZWFkT25seSgpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBz
cmMxID0gZ2VuZXJhdG9yLmVtaXRHZXRTdGF0aWNWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlv
bihkc3QpLCByZXNvbHZlUmVzdWx0KTsKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1p
dFJlYWRNb2RpZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3Bl
cmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2Ny
aXB0b3IoKSkpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5k
ZXgsIHJlc3VsdCwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0
aWNWYXIocmVzb2x2ZVJlc3VsdCwgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAg
ICB9CiAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci50ZW1wRGVzdGlu
YXRpb24oZHN0KTsKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBz
dGFydE9mZnNldCgpICsgbV9pZGVudC5sZW5ndGgoKSwgbV9pZGVudC5sZW5ndGgoKSwgMCk7Ci0g
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFz
ZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHNyYzEuZ2V0KCksIG1faWRlbnQpOworICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2UoZ2Vu
ZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBzcmMxLmdldCgpLCByZXNvbHZlUmVzdWx0LCBtX2lkZW50
KTsKICAgICBSZWdpc3RlcklEKiByZXN1bHQgPSBlbWl0UmVhZE1vZGlmeUFzc2lnbm1lbnQoZ2Vu
ZXJhdG9yLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIHNyYzEuZ2V0KCkpLCBzcmMx
LmdldCgpLCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlwZXMoUmVzdWx0VHlwZTo6dW5r
bm93blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigpKSwgdGhpcyk7CiAgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCByZXN1bHQpOwog
fQpAQCAtMTE4OSwyNyArMTE4MywyNCBAQCBSZWdpc3RlcklEKiBSZWFkTW9kaWZ5UmVzb2x2ZU5v
ZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZQogCiBSZWdp
c3RlcklEKiBBc3NpZ25SZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9j
YWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVy
YXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpCisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZl
UmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJ
RCAqbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IocmVzb2x2ZVJlc3VsdCkpIHsKKyAgICAg
ICAgaWYgKHJlc29sdmVSZXN1bHQuaXNSZWFkT25seSgpKQogICAgICAgICAgICAgcmV0dXJuIGdl
bmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmlnaHQpOwotICAgICAgICAKICAgICAgICAgUmVnaXN0
ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGxvY2FsLCBtX3JpZ2h0KTsKICAgICAg
ICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0
KTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0g
ICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWND
aGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lk
ZW50LCBpbmRleCwgZGVwdGgsIHRydWUsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2Jq
ZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1p
Y0NoZWNrcykgeworICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkgJiYgIXJlc29sdmVS
ZXN1bHQuaXNSZWFkT25seSgpKSB7CiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9y
ZWRSZXN1bHQoKSkKICAgICAgICAgICAgIGRzdCA9IDA7CiAgICAgICAgIFJlZ2lzdGVySUQqIHZh
bHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdodCk7Ci0gICAgICAgIGdlbmVyYXRv
ci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgdmFsdWUsIGdsb2JhbE9iamVjdCk7Cisg
ICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKHJlc29sdmVSZXN1bHQsIHZhbHVlKTsK
ICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBi
YXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZUZvclB1dChnZW5lcmF0b3IubmV3VGVtcG9y
YXJ5KCksIG1faWRlbnQpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9y
LmVtaXRSZXNvbHZlQmFzZUZvclB1dChnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHJlc29sdmVS
ZXN1bHQsIG1faWRlbnQpOwogICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQo
KSkKICAgICAgICAgZHN0ID0gMDsKICAgICBSZWdpc3RlcklEKiB2YWx1ZSA9IGdlbmVyYXRvci5l
bWl0Tm9kZShkc3QsIG1fcmlnaHQpOwpAQCAtMTI5Nyw4ICsxMjg4LDEwIEBAIFJlZ2lzdGVySUQq
IENvbW1hTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJl
Z2lzdGVySUQqIGRzCiAKIFJlZ2lzdGVySUQqIENvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xl
KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IpCiB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNv
bHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmVDb25zdERlY2wobV9pZGVudCk7CisKICAgICAv
LyBGSVhNRTogVGhpcyBjb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBiZWhhdmlvciBvZiBjb25zdCBp
biBGaXJlZm94LgotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5jb25zdFJl
Z2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJh
dG9yLnJlZ2lzdGVyRm9yKHJlc29sdmVSZXN1bHQpKSB7CiAgICAgICAgIGlmICghbV9pbml0KQog
ICAgICAgICAgICAgcmV0dXJuIGxvY2FsOwogCkBAIC0xMzA3LDI3ICsxMzAwLDE1IEBAIFJlZ2lz
dGVySUQqIENvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IpCiAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUgPSBtX2luaXQgPyBnZW5l
cmF0b3IuZW1pdE5vZGUobV9pbml0KSA6IGdlbmVyYXRvci5lbWl0TG9hZCgwLCBqc1VuZGVmaW5l
ZCgpKTsKIAotICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gZ2VuZXJhdG9yLnNjb3BlQ2hh
aW4oKS0+YmVnaW4oKTsKLSAgICBTY29wZUNoYWluSXRlcmF0b3IgZW5kID0gZ2VuZXJhdG9yLnNj
b3BlQ2hhaW4oKS0+ZW5kKCk7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBmb3IgKDsgaXRl
ciAhPSBlbmQ7ICsraXRlciwgKytkZXB0aCkgewotICAgICAgICBKU09iamVjdCogY3VycmVudFNj
b3BlID0gaXRlci0+Z2V0KCk7Ci0gICAgICAgIGlmICghY3VycmVudFNjb3BlLT5pc1ZhcmlhYmxl
T2JqZWN0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgSlNWYXJpYWJsZU9iamVj
dCogY3VycmVudFZhcmlhYmxlT2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNWYXJpYWJsZU9iamVjdCo+
KGN1cnJlbnRTY29wZSk7Ci0gICAgICAgIFN5bWJvbFRhYmxlRW50cnkgZW50cnkgPSBjdXJyZW50
VmFyaWFibGVPYmplY3QtPnN5bWJvbFRhYmxlKCkuZ2V0KG1faWRlbnQuaW1wbCgpKTsKLSAgICAg
ICAgaWYgKGVudHJ5LmlzTnVsbCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGdlbmVyYXRvci5zY29wZURlcHRoKCkg
KyBkZXB0aCwgZW50cnkuZ2V0SW5kZXgoKSwgdmFsdWUuZ2V0KCksIGN1cnJlbnRWYXJpYWJsZU9i
amVjdC0+aXNHbG9iYWxPYmplY3QoKSA/IGN1cnJlbnRWYXJpYWJsZU9iamVjdCA6IDApOwotICAg
IH0KLQorICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkpCisgICAgICAgIHJldHVybiBn
ZW5lcmF0b3IuZW1pdFB1dFN0YXRpY1ZhcihyZXNvbHZlUmVzdWx0LCB2YWx1ZS5nZXQoKSk7Cisg
ICAgCiAgICAgaWYgKGdlbmVyYXRvci5jb2RlVHlwZSgpICE9IEV2YWxDb2RlKQogICAgICAgICBy
ZXR1cm4gdmFsdWUuZ2V0KCk7CiAKICAgICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3Vs
ZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFsIGJsb2NrLCBpdCB3aWxsIGFzc2lnbgogICAgIC8vIHRv
IHRoZSB3cm9uZyBiYXNlIGlmIG1faWRlbnQgZXhpc3RzIGluIGFuIGludGVydmVuaW5nIHdpdGgg
c2NvcGUuCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29s
dmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKSwgcmVzb2x2ZVJlc3VsdCwgbV9pZGVudCk7CiAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCB2YWx1ZS5nZXQoKSk7CiB9CiAKQEAg
LTE1OTgsMTEgKzE1NzksMTIgQEAgUmVnaXN0ZXJJRCogRm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHMKICAgICBib29sIG9w
dGltaXplZEZvcmluQWNjZXNzID0gZmFsc2U7CiAgICAgaWYgKG1fbGV4cHItPmlzUmVzb2x2ZU5v
ZGUoKSkgewogICAgICAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudCA9IHN0YXRpY19jYXN0PFJl
c29sdmVOb2RlKj4obV9sZXhwciktPmlkZW50aWZpZXIoKTsKLSAgICAgICAgcHJvcGVydHlOYW1l
ID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGlkZW50KTsKKyAgICAgICAgUmVzb2x2ZVJlc3VsdCBy
ZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUoaWRlbnQpOworICAgICAgICBwcm9wZXJ0
eU5hbWUgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IocmVzb2x2ZVJlc3VsdCk7CiAgICAgICAgIGlm
ICghcHJvcGVydHlOYW1lKSB7CiAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvdGVjdCA9
IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3Iu
ZW1pdFJlc29sdmVCYXNlRm9yUHV0KGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgaWRlbnQpOwor
ICAgICAgICAgICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VG
b3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCByZXNvbHZlUmVzdWx0LCBpZGVudCk7CiAK
ICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRP
ZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwogICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRCeUlk
KGJhc2UsIGlkZW50LCBwcm9wZXJ0eU5hbWUpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>123742</attachid>
            <date>2012-01-24 08:38:14 -0800</date>
            <delta_ts>2012-02-01 11:37:14 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76285-20120124173812.patch</filename>
            <type>text/plain</type>
            <size>58055</size>
            <attacher name="Andy Wingo">wingo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1NzE3CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA1
MjMxMmRkNmFiNDU1ZDQ0NjViYzE3ZGI4NWQ2MzhjNmEyNjdhOWIyLi42MTcwMTA5NWQxM2IyZWJl
Y2Y0YWZkOTQ4NGUxMTk3ZTVlMzJkZjUwIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0NCBAQAorMjAxMi0wMS0yNCAgQW5keSBXaW5nbyAgPHdpbmdvQGlnYWxpYS5jb20+CisK
KyAgICAgICAgUmVmYWN0b3IgaWRlbnRpZmllciByZXNvbHV0aW9uIGluIEJ5dGVjb2RlR2VuZXJh
dG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OlJlc29sdmVSZXN1
bHQpOiBOZXcgY2xhc3MsIHRvIGRlc2NyaWJlIHRoZSBzdG9yYWdlCisgICAgICAgIGxvY2F0aW9u
IGNvcnJlc3BvbmRpbmcgdG8gYW4gaWRlbnRpZmllciBpbiBhIHByb2dyYW0uCisgICAgICAgICog
Ynl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNv
ZGVHZW5lcmF0b3I6OnJlc29sdmUpOiBOZXcgZnVuY3Rpb24sIHJlcGxhY2luZworICAgICAgICBm
aW5kU2NvcGVkUHJvcGVydHkuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjpyZXNv
bHZlQ29uc3REZWNsKTogTmV3IGZ1bmN0aW9uLAorICAgICAgICBlbmNhcHN1bGF0aW5nIHdoYXQg
Q29uc3REZWNsTm9kZTo6ZW1pdEJ5dGVjb2RlIHVzZWQgdG8gZG8uCisgICAgICAgIChKU0M6OkJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0R2V0U3RhdGljVmFyKToKKyAgICAgICAgKEpTQzo6Qnl0ZWNv
ZGVHZW5lcmF0b3I6OmVtaXRQdXRTdGF0aWNWYXIpOiBOZXcgZnVuY3Rpb25zLAorICAgICAgICBj
b3JyZXNwb25kaW5nIHRvIHRoZSBvbGQgZW1pdEdldFNjb3BlZFZhciBhbmQgZW1pdFB1dFNjb3Bl
ZFZhci4KKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OnJlZ2lzdGVyRm9yKTogUmVt
b3ZlIHZlcnNpb24gdGhhdCB0b29rIGFuCisgICAgICAgIElkZW50aWZpZXImOyByZXBsYWNlZCBi
eSBSZXNvbHZlUmVzdWx0Ojpsb2NhbCgpLgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRv
cjo6ZW1pdFJlc29sdmUpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJl
c29sdmVCYXNlKToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZl
QmFzZUZvclB1dCk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2
ZVdpdGhCYXNlKToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZl
V2l0aFRoaXMpOiBDaGFuZ2UgdG8gYWNjZXB0IGEKKyAgICAgICAgInJlc29sdmVSZXN1bHQiIGFy
Z3VtZW50LiAgVGhpcyBpcyBtb3JlIGNsZWFyLCBhbmQgcmVkdWNlcyB0aGUKKyAgICAgICAgYW1v
dW50IG9mIGRvdWJsZSBhbmFseXNpcyBoYXBwZW5pbmcgYXQgY29tcGlsZS10aW1lLgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwOgorICAgICAgICAoSlNDOjpSZXNvbHZl
Tm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6RXZhbEZ1bmN0aW9uQ2FsbE5vZGU6
OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjpl
bWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpQb3N0Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRl
Y29kZSk6CisgICAgICAgIChKU0M6OkRlbGV0ZVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUpOgor
ICAgICAgICAoSlNDOjpUeXBlT2ZSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAg
KEpTQzo6UHJlZml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OlJl
YWRNb2RpZnlSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6QXNzaWdu
UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkNvbnN0RGVjbE5vZGU6
OmVtaXRDb2RlU2luZ2xlKToKKyAgICAgICAgKEpTQzo6Rm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUp
OiBSZWZhY3RvciB0byB1c2UgdGhlIG5ldworICAgICAgICBSZXNvbHZlUmVzdWx0IHN0cnVjdHVy
ZS4KKwogMjAxMi0wMS0yNCAgS2VuaWNoaSBJc2hpYmFzaGkgIDxiYXNoaUBjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgW1Y4XSBBZGQgVWludDhDbGFtcGVkQXJyYXkgc3VwcG9ydApkaWZmIC0tZ2l0
IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5j
cHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmNwcAppbmRleCAyYjFjMTY0NDFiZmI5MzI3ODIxOGVkODk3MWFmNmU3M2UzNjc4YTY3Li5kZWE4
YzhiYTZiN2YwYzMxZDFkYmNjZmRmYTI3ODU3NjkzMWZiZGUyIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAorKysgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcApA
QCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA4IENhbWVyb24gWndh
cmljaCA8Y3d6d2FyaWNoQHV3YXRlcmxvby5jYT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBJZ2Fs
aWEsIFMuTC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTE3LDYgKzExOCwz
OSBAQCBuYW1lc3BhY2UgSlNDIHsKICovCiAKICNpZm5kZWYgTkRFQlVHCit2b2lkIFJlc29sdmVS
ZXN1bHQ6OmNoZWNrVmFsaWRpdHkoKQoreworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2Fz
ZSBSZWdpc3RlcjoKKyAgICBjYXNlIFJlYWRPbmx5UmVnaXN0ZXI6CisgICAgICAgIEFTU0VSVCht
X2xvY2FsKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgTGV4aWNhbDoKKyAgICBjYXNlIFJl
YWRPbmx5TGV4aWNhbDoKKyAgICBjYXNlIER5bmFtaWNMZXhpY2FsOgorICAgIGNhc2UgRHluYW1p
Y1JlYWRPbmx5TGV4aWNhbDoKKyAgICAgICAgQVNTRVJUKG1faW5kZXggIT0gbWlzc2luZ1N5bWJv
bE1hcmtlcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgR2xvYmFsOgorICAgIGNhc2Ug
RHluYW1pY0dsb2JhbDoKKyAgICAgICAgQVNTRVJUKG1fZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgSW5kZXhlZEdsb2JhbDoKKyAgICBjYXNlIFJlYWRPbmx5SW5kZXhl
ZEdsb2JhbDoKKyAgICBjYXNlIER5bmFtaWNJbmRleGVkR2xvYmFsOgorICAgIGNhc2UgRHluYW1p
Y1JlYWRPbmx5SW5kZXhlZEdsb2JhbDoKKyAgICAgICAgQVNTRVJUKG1faW5kZXggIT0gbWlzc2lu
Z1N5bWJvbE1hcmtlcigpKTsKKyAgICAgICAgQVNTRVJUKG1fZ2xvYmFsT2JqZWN0KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIGNhc2UgRHluYW1pYzoKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1
bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKyNlbmRpZgorCisj
aWZuZGVmIE5ERUJVRwogc3RhdGljIGJvb2wgc19kdW1wc0dlbmVyYXRlZENvZGUgPSBmYWxzZTsK
ICNlbmRpZgogCkBAIC01MDMsNDIgKzUzNyw2IEBAIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmFk
ZFBhcmFtZXRlcihjb25zdCBJZGVudGlmaWVyJiBpZGVudCwgaW50IHBhcmFtZXRlckluZGV4CiAg
ICAgbV9jb2RlQmxvY2stPmFkZFBhcmFtZXRlcigpOwogfQogCi1SZWdpc3RlcklEKiBCeXRlY29k
ZUdlbmVyYXRvcjo6cmVnaXN0ZXJGb3IoY29uc3QgSWRlbnRpZmllciYgaWRlbnQpCi17Ci0gICAg
aWYgKGlkZW50ID09IHByb3BlcnR5TmFtZXMoKS50aGlzSWRlbnRpZmllcikKLSAgICAgICAgcmV0
dXJuICZtX3RoaXNSZWdpc3RlcjsKLSAgICAgICAgCi0gICAgaWYgKG1fY29kZVR5cGUgPT0gR2xv
YmFsQ29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIXNob3VsZE9wdGltaXplTG9j
YWxzKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9
IHN5bWJvbFRhYmxlKCkuZ2V0KGlkZW50LmltcGwoKSk7Ci0gICAgaWYgKGVudHJ5LmlzTnVsbCgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChpZGVudCA9PSBwcm9wZXJ0eU5hbWVzKCku
YXJndW1lbnRzKQotICAgICAgICBjcmVhdGVBcmd1bWVudHNJZk5lY2Vzc2FyeSgpOwotCi0gICAg
cmV0dXJuIGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5n
ZXRJbmRleCgpKSk7Ci19Ci0KLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjpjb25zdFJl
Z2lzdGVyRm9yKGNvbnN0IElkZW50aWZpZXImIGlkZW50KQotewotICAgIGlmIChtX2NvZGVUeXBl
ID09IEV2YWxDb2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChtX2NvZGVUeXBlID09
IEdsb2JhbENvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgU3ltYm9sVGFibGVFbnRyeSBl
bnRyeSA9IHN5bWJvbFRhYmxlKCkuZ2V0KGlkZW50LmltcGwoKSk7Ci0gICAgaWYgKGVudHJ5Lmlz
TnVsbCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBjcmVhdGVMYXp5UmVnaXN0
ZXJJZk5lY2Vzc2FyeSgmcmVnaXN0ZXJGb3IoZW50cnkuZ2V0SW5kZXgoKSkpOwotfQotCiBib29s
IEJ5dGVjb2RlR2VuZXJhdG9yOjp3aWxsUmVzb2x2ZVRvQXJndW1lbnRzKGNvbnN0IElkZW50aWZp
ZXImIGlkZW50KQogewogICAgIGlmIChpZGVudCAhPSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1lbnRz
KQpAQCAtMTE3MCw1OSArMTE2OCwxMDkgQEAgUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6
OmVtaXRMb2FkKFJlZ2lzdGVySUQqIGRzdCwgSlNWYWx1ZSB2KQogICAgIHJldHVybiBjb25zdGFu
dElEOwogfQogCi1ib29sIEJ5dGVjb2RlR2VuZXJhdG9yOjpmaW5kU2NvcGVkUHJvcGVydHkoY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHksIGludCYgaW5kZXgsIHNpemVfdCYgc3RhY2tEZXB0aCwg
Ym9vbCBmb3JXcml0aW5nLCBib29sJiByZXF1aXJlc0R5bmFtaWNDaGVja3MsIEpTT2JqZWN0KiYg
Z2xvYmFsT2JqZWN0KQorUmVzb2x2ZVJlc3VsdCBCeXRlY29kZUdlbmVyYXRvcjo6cmVzb2x2ZShj
b25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKIHsKKyAgICBpZiAocHJvcGVydHkgPT0gcHJvcGVy
dHlOYW1lcygpLnRoaXNJZGVudGlmaWVyKQorICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6
cmVnaXN0ZXJSZXNvbHZlKHRoaXNSZWdpc3RlcigpLCBSZXNvbHZlUmVzdWx0OjpSZWFkT25seUZs
YWcpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhbGxvY2F0ZWQg
aW4gYSByZWdpc3Rlci4KKyAgICBpZiAobV9jb2RlVHlwZSAhPSBHbG9iYWxDb2RlICYmIHNob3Vs
ZE9wdGltaXplTG9jYWxzKCkpIHsKKyAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5
bWJvbFRhYmxlKCkuZ2V0KHByb3BlcnR5LmltcGwoKSk7CisgICAgICAgIGlmICghZW50cnkuaXNO
dWxsKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJn
dW1lbnRzKQorICAgICAgICAgICAgICAgIGNyZWF0ZUFyZ3VtZW50c0lmTmVjZXNzYXJ5KCk7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGVudHJ5LmlzUmVhZE9ubHkoKSA/IFJlc29sdmVS
ZXN1bHQ6OlJlYWRPbmx5RmxhZyA6IDA7CisgICAgICAgICAgICBSZWdpc3RlcklEKiBsb2NhbCA9
IGNyZWF0ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRl
eCgpKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6cmVnaXN0ZXJSZXNvbHZl
KGxvY2FsLCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBDYXNlcyB3aGVyZSB3
ZSBjYW5ub3Qgc3RhdGljYWxseSBvcHRpbWl6ZSB0aGUgbG9va3VwLgogICAgIGlmIChwcm9wZXJ0
eSA9PSBwcm9wZXJ0eU5hbWVzKCkuYXJndW1lbnRzIHx8ICFjYW5PcHRpbWl6ZU5vbkxvY2Fscygp
KSB7Ci0gICAgICAgIHN0YWNrRGVwdGggPSAwOwotICAgICAgICBpbmRleCA9IG1pc3NpbmdTeW1i
b2xNYXJrZXIoKTsKLQogICAgICAgICBpZiAoc2hvdWxkT3B0aW1pemVMb2NhbHMoKSAmJiBtX2Nv
ZGVUeXBlID09IEdsb2JhbENvZGUpIHsKICAgICAgICAgICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBp
dGVyID0gbV9zY29wZUNoYWluLT5iZWdpbigpOwotICAgICAgICAgICAgZ2xvYmFsT2JqZWN0ID0g
aXRlci0+Z2V0KCk7CisgICAgICAgICAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gaXRlci0+
Z2V0KCk7CiAgICAgICAgICAgICBBU1NFUlQoKCsraXRlcikgPT0gbV9zY29wZUNoYWluLT5lbmQo
KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJu
IFJlc29sdmVSZXN1bHQ6Omdsb2JhbFJlc29sdmUoZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6ZHluYW1pY1Jlc29sdmUoMCk7
CiAgICAgfQogCi0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICByZXF1aXJlc0R5bmFtaWNDaGVj
a3MgPSBmYWxzZTsKICAgICBTY29wZUNoYWluSXRlcmF0b3IgaXRlciA9IG1fc2NvcGVDaGFpbi0+
YmVnaW4oKTsKICAgICBTY29wZUNoYWluSXRlcmF0b3IgZW5kID0gbV9zY29wZUNoYWluLT5lbmQo
KTsKKyAgICBzaXplX3QgZGVwdGggPSAwOworICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKICAgICBm
b3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlciwgKytkZXB0aCkgewogICAgICAgICBKU09iamVjdCog
Y3VycmVudFNjb3BlID0gaXRlci0+Z2V0KCk7Ci0gICAgICAgIGlmICghY3VycmVudFNjb3BlLT5p
c1ZhcmlhYmxlT2JqZWN0KCkpCisgICAgICAgIGlmICghY3VycmVudFNjb3BlLT5pc1ZhcmlhYmxl
T2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWNG
bGFnOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgICAgIAogICAgICAgICBKU1Zh
cmlhYmxlT2JqZWN0KiBjdXJyZW50VmFyaWFibGVPYmplY3QgPSBzdGF0aWNfY2FzdDxKU1Zhcmlh
YmxlT2JqZWN0Kj4oY3VycmVudFNjb3BlKTsKICAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRy
eSA9IGN1cnJlbnRWYXJpYWJsZU9iamVjdC0+c3ltYm9sVGFibGUoKS5nZXQocHJvcGVydHkuaW1w
bCgpKTsKIAogICAgICAgICAvLyBGb3VuZCB0aGUgcHJvcGVydHkKICAgICAgICAgaWYgKCFlbnRy
eS5pc051bGwoKSkgewotICAgICAgICAgICAgaWYgKGVudHJ5LmlzUmVhZE9ubHkoKSAmJiBmb3JX
cml0aW5nKSB7Ci0gICAgICAgICAgICAgICAgc3RhY2tEZXB0aCA9IDA7Ci0gICAgICAgICAgICAg
ICAgaW5kZXggPSBtaXNzaW5nU3ltYm9sTWFya2VyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCsr
aXRlciA9PSBlbmQpCi0gICAgICAgICAgICAgICAgICAgIGdsb2JhbE9iamVjdCA9IGN1cnJlbnRW
YXJpYWJsZU9iamVjdDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAoZW50cnkuaXNSZWFkT25seSgpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IFJlc29s
dmVSZXN1bHQ6OlJlYWRPbmx5RmxhZzsKKyAgICAgICAgICAgIGRlcHRoICs9IG1fY29kZUJsb2Nr
LT5uZWVkc0Z1bGxTY29wZUNoYWluKCk7CisgICAgICAgICAgICBpZiAoKytpdGVyID09IGVuZCkg
eworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIFJlc29sdmVSZXN1bHQ6OkR5bmFtaWNGbGFn
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6ZHluYW1pY0luZGV4
ZWRHbG9iYWxSZXNvbHZlKGVudHJ5LmdldEluZGV4KCksIGRlcHRoLCBjdXJyZW50U2NvcGUsIGZs
YWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6aW5kZXhlZEdsb2Jh
bFJlc29sdmUoZW50cnkuZ2V0SW5kZXgoKSwgY3VycmVudFNjb3BlLCBmbGFncyk7CiAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBzdGFja0RlcHRoID0gZGVwdGggKyBtX2NvZGVCbG9jay0+bmVl
ZHNGdWxsU2NvcGVDaGFpbigpOwotICAgICAgICAgICAgaW5kZXggPSBlbnRyeS5nZXRJbmRleCgp
OwotICAgICAgICAgICAgaWYgKCsraXRlciA9PSBlbmQpCi0gICAgICAgICAgICAgICAgZ2xvYmFs
T2JqZWN0ID0gY3VycmVudFZhcmlhYmxlT2JqZWN0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6bGV4aWNhbFJlc29sdmUoZW50cnku
Z2V0SW5kZXgoKSwgZGVwdGgsIGZsYWdzKTsKICAgICAgICAgfQogICAgICAgICBib29sIHNjb3Bl
UmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7CiAgICAgICAgIGlmIChjdXJyZW50VmFyaWFi
bGVPYmplY3QtPmlzRHluYW1pY1Njb3BlKHNjb3BlUmVxdWlyZXNEeW5hbWljQ2hlY2tzKSkKICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICByZXF1aXJlc0R5bmFtaWNDaGVja3MgfD0gc2NvcGVS
ZXF1aXJlc0R5bmFtaWNDaGVja3M7CisgICAgICAgIGlmIChzY29wZVJlcXVpcmVzRHluYW1pY0No
ZWNrcykKKyAgICAgICAgICAgIGZsYWdzIHw9IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWNGbGFnOwog
ICAgIH0KKwogICAgIC8vIENhbid0IGxvY2F0ZSB0aGUgcHJvcGVydHkgYnV0IHdlJ3JlIGFibGUg
dG8gYXZvaWQgYSBmZXcgbG9va3Vwcy4KLSAgICBzdGFja0RlcHRoID0gZGVwdGggKyBtX2NvZGVC
bG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpOwotICAgIGluZGV4ID0gbWlzc2luZ1N5bWJvbE1h
cmtlcigpOwogICAgIEpTT2JqZWN0KiBzY29wZSA9IGl0ZXItPmdldCgpOwotICAgIGlmICgrK2l0
ZXIgPT0gZW5kKQotICAgICAgICBnbG9iYWxPYmplY3QgPSBzY29wZTsKLSAgICByZXR1cm4gdHJ1
ZTsKKyAgICBkZXB0aCArPSBtX2NvZGVCbG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpOworICAg
IGlmICgrK2l0ZXIgPT0gZW5kKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBSZXNvbHZlUmVzdWx0
OjpEeW5hbWljRmxhZykgJiYgZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3Vs
dDo6ZHluYW1pY0dsb2JhbFJlc29sdmUoZGVwdGgsIHNjb3BlKTsKKyAgICAgICAgcmV0dXJuIFJl
c29sdmVSZXN1bHQ6Omdsb2JhbFJlc29sdmUoc2NvcGUpOworICAgIH0KKyAgICByZXR1cm4gUmVz
b2x2ZVJlc3VsdDo6ZHluYW1pY1Jlc29sdmUoZGVwdGgpOworfQorCitSZXNvbHZlUmVzdWx0IEJ5
dGVjb2RlR2VuZXJhdG9yOjpyZXNvbHZlQ29uc3REZWNsKGNvbnN0IElkZW50aWZpZXImIHByb3Bl
cnR5KQoreworICAgIC8vIFJlZ2lzdGVyLWFsbG9jYXRlZCBjb25zdCBkZWNsYXJhdGlvbnMuCisg
ICAgaWYgKG1fY29kZVR5cGUgIT0gRXZhbENvZGUgJiYgbV9jb2RlVHlwZSAhPSBHbG9iYWxDb2Rl
KSB7CisgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgZW50cnkgPSBzeW1ib2xUYWJsZSgpLmdldChw
cm9wZXJ0eS5pbXBsKCkpOworICAgICAgICBpZiAoIWVudHJ5LmlzTnVsbCgpKSB7CisgICAgICAg
ICAgICB1bnNpZ25lZCBmbGFncyA9IGVudHJ5LmlzUmVhZE9ubHkoKSA/IFJlc29sdmVSZXN1bHQ6
OlJlYWRPbmx5RmxhZyA6IDA7CisgICAgICAgICAgICBSZWdpc3RlcklEKiBsb2NhbCA9IGNyZWF0
ZUxhenlSZWdpc3RlcklmTmVjZXNzYXJ5KCZyZWdpc3RlckZvcihlbnRyeS5nZXRJbmRleCgpKSk7
CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6cmVnaXN0ZXJSZXNvbHZlKGxvY2Fs
LCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb25zdCBkZWNsYXJhdGlvbnMg
aW4gZXZhbCBjb2RlIG9yIGdsb2JhbCBjb2RlLgorICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVy
ID0gc2NvcGVDaGFpbigpLT5iZWdpbigpOworICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBlbmQgPSBz
Y29wZUNoYWluKCktPmVuZCgpOworICAgIHNpemVfdCBkZXB0aCA9IDA7CisgICAgZm9yICg7IGl0
ZXIgIT0gZW5kOyArK2l0ZXIsICsrZGVwdGgpIHsKKyAgICAgICAgSlNPYmplY3QqIGN1cnJlbnRT
Y29wZSA9IGl0ZXItPmdldCgpOworICAgICAgICBpZiAoIWN1cnJlbnRTY29wZS0+aXNWYXJpYWJs
ZU9iamVjdCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIEpTVmFyaWFibGVPYmpl
Y3QqIGN1cnJlbnRWYXJpYWJsZU9iamVjdCA9IHN0YXRpY19jYXN0PEpTVmFyaWFibGVPYmplY3Qq
PihjdXJyZW50U2NvcGUpOworICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IGVudHJ5ID0gY3VycmVu
dFZhcmlhYmxlT2JqZWN0LT5zeW1ib2xUYWJsZSgpLmdldChwcm9wZXJ0eS5pbXBsKCkpOworICAg
ICAgICBpZiAoZW50cnkuaXNOdWxsKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
aWYgKCsraXRlciA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdDo6aW5k
ZXhlZEdsb2JhbFJlc29sdmUoZW50cnkuZ2V0SW5kZXgoKSwgY3VycmVudFZhcmlhYmxlT2JqZWN0
LCAwKTsKKyAgICAgICAgcmV0dXJuIFJlc29sdmVSZXN1bHQ6OmxleGljYWxSZXNvbHZlKGVudHJ5
LmdldEluZGV4KCksIGRlcHRoICsgc2NvcGVEZXB0aCgpLCAwKTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3VsZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFsIGJsb2Nr
LCBpdCB3aWxsIGFzc2lnbgorICAgIC8vIHRvIHRoZSB3cm9uZyBiYXNlIGlmIHByb3BlcnR5IGV4
aXN0cyBpbiBhbiBpbnRlcnZlbmluZyB3aXRoIHNjb3BlLgorICAgIHJldHVybiBSZXNvbHZlUmVz
dWx0OjpkeW5hbWljUmVzb2x2ZShzY29wZURlcHRoKCkpOwogfQogCiB2b2lkIEJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0Q2hlY2tIYXNJbnN0YW5jZShSZWdpc3RlcklEKiBiYXNlKQpAQCAtMTI0OCwy
MTkgKzEyOTYsMTQxIEBAIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OnNob3VsZEF2b2lkUmVzb2x2
ZUdsb2JhbCgpCiAgICAgcmV0dXJuIG1fY29kZUJsb2NrLT5nbG9iYWxSZXNvbHZlSW5mb0NvdW50
KCkgPiBtYXhHbG9iYWxSZXNvbHZlcyAmJiAhbV9sYWJlbFNjb3Blcy5zaXplKCk7CiB9CiAKLVJl
Z2lzdGVySUQqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UmVzb2x2ZShSZWdpc3RlcklEKiBkc3Qs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0
b3I6OmVtaXRSZXNvbHZlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgcmVz
b2x2ZVJlc3VsdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRl
cHRoID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3Qg
PSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFm
aW5kU2NvcGVkUHJvcGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVz
RHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiAhZ2xvYmFsT2JqZWN0KSB7Ci0gICAgICAg
IC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAgVmFsdWVQcm9maWxlKiBw
cm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmUpOwotICAgICAgICBpbnN0cnVj
dGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBw
ZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVu
ZChwcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9Ci0gICAgaWYgKHNob3VsZEF2
b2lkUmVzb2x2ZUdsb2JhbCgpKSB7Ci0gICAgICAgIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgICAg
IHJlcXVpcmVzRHluYW1pY0NoZWNrcyA9IHRydWU7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAo
Z2xvYmFsT2JqZWN0KSB7Ci0gICAgICAgIGlmIChpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2Vy
KCkgJiYgIXJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAgICAgICAgICAgLy8gRGlyZWN0bHkg
aW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAgICAg
ICAgICAgcmV0dXJuIGVtaXRHZXRTY29wZWRWYXIoZHN0LCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9i
amVjdCk7Ci0gICAgICAgIH0KLQorICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkpCisg
ICAgICAgIHJldHVybiBlbWl0R2V0U3RhdGljVmFyKGRzdCwgcmVzb2x2ZVJlc3VsdCk7CisgICAg
CisgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNHbG9iYWwoKSAmJiAhc2hvdWxkQXZvaWRSZXNvbHZl
R2xvYmFsKCkpIHsKICNpZiBFTkFCTEUoSklUKQogICAgICAgICBtX2NvZGVCbG9jay0+YWRkR2xv
YmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsKICNlbmRpZgogI2lmIEVOQUJM
RShJTlRFUlBSRVRFUikKICAgICAgICAgbV9jb2RlQmxvY2stPmFkZEdsb2JhbFJlc29sdmVJbnN0
cnVjdGlvbihpbnN0cnVjdGlvbnMoKS5zaXplKCkpOwogI2VuZGlmCi0gICAgICAgIFZhbHVlUHJv
ZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShyZXF1aXJlc0R5bmFtaWNDaGVja3Mg
PyBvcF9yZXNvbHZlX2dsb2JhbF9keW5hbWljIDogb3BfcmVzb2x2ZV9nbG9iYWwpOworICAgICAg
ICBib29sIGR5bmFtaWMgPSByZXNvbHZlUmVzdWx0LmlzRHluYW1pYygpICYmIHJlc29sdmVSZXN1
bHQuZGVwdGgoKTsKKyAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVk
T3Bjb2RlKGR5bmFtaWMgPyBvcF9yZXNvbHZlX2dsb2JhbF9keW5hbWljIDogb3BfcmVzb2x2ZV9n
bG9iYWwpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKICAg
ICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7CiAgICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBw
ZW5kKDApOwotICAgICAgICBpZiAocmVxdWlyZXNEeW5hbWljQ2hlY2tzKQotICAgICAgICAgICAg
aW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKKyAgICAgICAgaWYgKGR5bmFtaWMpCisgICAg
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5kZXB0aCgpKTsKICAg
ICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUpOwogICAgICAgICByZXR1cm4gZHN0
OwogICAgIH0KLQotICAgIGlmIChyZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsKLSAgICAgICAgLy8g
SWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBldmFsIG5lc3RlZCBpbnNpZGUgYSB8d2l0aHwganVzdCBn
aXZlIHVwCi0gICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29k
ZShvcF9yZXNvbHZlKTsKKyAgICAgICAgCisgICAgaWYgKHJlc29sdmVSZXN1bHQudHlwZSgpID09
IFJlc29sdmVSZXN1bHQ6OkR5bmFtaWMgJiYgcmVzb2x2ZVJlc3VsdC5kZXB0aCgpKSB7CisgICAg
ICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBhcmUgYXQgbGVhc3QgYWJsZSB0byBkcm9wIGEgZmV3IHNj
b3BlIGNoYWlucyBmcm9tIHRoZQorICAgICAgICAvLyBsb29rdXAgY2hhaW4sIGFsdGhvdWdoIHdl
IHN0aWxsIG5lZWQgdG8gaGFzaCBmcm9tIHRoZW4gb24uCisgICAgICAgIFZhbHVlUHJvZmlsZSog
cHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlX3NraXApOwogICAgICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25z
KCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7CisgICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChyZXNvbHZlUmVzdWx0LmRlcHRoKCkpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQocHJvZmlsZSk7CiAgICAgICAgIHJldHVybiBkc3Q7CiAgICAgfQogCi0gICAgaWYgKGlu
ZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSkgewotICAgICAgICAvLyBEaXJlY3RseSBpbmRl
eCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9zcyBtdWx0aXBsZSBzY29wZXMuCi0gICAgICAgIHJl
dHVybiBlbWl0R2V0U2NvcGVkVmFyKGRzdCwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmplY3QpOwot
ICAgIH0KLQotICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBhcmUgYXQgbGVhc3QgYWJsZSB0byBkcm9w
IGEgZmV3IHNjb3BlIGNoYWlucyBmcm9tIHRoZQotICAgIC8vIGxvb2t1cCBjaGFpbiwgYWx0aG91
Z2ggd2Ugc3RpbGwgbmVlZCB0byBoYXNoIGZyb20gdGhlbiBvbi4KLSAgICBWYWx1ZVByb2ZpbGUq
IHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2ZV9za2lwKTsKKyAgICBWYWx1
ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2ZSk7CiAgICAg
aW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KGRlcHRoKTsKICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7CiAgICAgcmV0dXJu
IGRzdDsKIH0KIAotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRHZXRTY29wZWRW
YXIoUmVnaXN0ZXJJRCogZHN0LCBzaXplX3QgZGVwdGgsIGludCBpbmRleCwgSlNWYWx1ZSBnbG9i
YWxPYmplY3QpCitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNl
KFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgcmVzb2x2ZVJlc3VsdCwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgaWYgKGdsb2JhbE9iamVjdCkgewotICAg
ICAgICBpZiAobV9sYXN0T3Bjb2RlSUQgPT0gb3BfcHV0X2dsb2JhbF92YXIpIHsKLSAgICAgICAg
ICAgIGludCBkc3RJbmRleDsKLSAgICAgICAgICAgIGludCBzcmNJbmRleDsKLSAgICAgICAgICAg
IHJldHJpZXZlTGFzdFVuYXJ5T3AoZHN0SW5kZXgsIHNyY0luZGV4KTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgaWYgKGRzdEluZGV4ID09IGluZGV4ICYmIHNyY0luZGV4ID09IGRzdC0+aW5k
ZXgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZHN0OwotICAgICAgICB9Ci0KLSAgICAgICAg
VmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX2dldF9nbG9iYWxf
dmFyKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+aW5kZXgoKSk7Ci0gICAg
ICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIGluc3RydWN0aW9ucygp
LmFwcGVuZChwcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKLSAgICB9CisgICAgaWYgKHJl
c29sdmVSZXN1bHQuaXNHbG9iYWwoKSAmJiAhcmVzb2x2ZVJlc3VsdC5pc0R5bmFtaWMoKSkKKyAg
ICAgICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQorICAgICAgICByZXR1cm4gZW1pdExv
YWQoZHN0LCBKU1ZhbHVlKHJlc29sdmVSZXN1bHQuZ2xvYmFsT2JqZWN0KCkpKTsKIAotICAgIFZh
bHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9nZXRfc2NvcGVkX3Zh
cik7CisgICAgLy8gV2UgY2FuJ3Qgb3B0aW1pc2UgYXQgYWxsIDotKAorICAgIFZhbHVlUHJvZmls
ZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwogICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwotICAgIGluc3RydWN0aW9ucygpLmFw
cGVuZChpbmRleCk7Ci0gICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKKyAgICBpbnN0
cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKKyAgICBpbnN0cnVjdGlv
bnMoKS5hcHBlbmQoZmFsc2UpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxlKTsK
ICAgICByZXR1cm4gZHN0OwogfQogCi1SZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1p
dFB1dFNjb3BlZFZhcihzaXplX3QgZGVwdGgsIGludCBpbmRleCwgUmVnaXN0ZXJJRCogdmFsdWUs
IEpTVmFsdWUgZ2xvYmFsT2JqZWN0KQorUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVt
aXRSZXNvbHZlQmFzZUZvclB1dChSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQm
IHJlc29sdmVSZXN1bHQsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQogewotICAgIGlmIChn
bG9iYWxPYmplY3QpIHsKLSAgICAgICAgZW1pdE9wY29kZShvcF9wdXRfZ2xvYmFsX3Zhcik7Ci0g
ICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9
Ci0gICAgZW1pdE9wY29kZShvcF9wdXRfc2NvcGVkX3Zhcik7Ci0gICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKGluZGV4KTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVwdGgpOwotICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwot
fQorICAgIGlmICghbV9jb2RlQmxvY2stPmlzU3RyaWN0TW9kZSgpKQorICAgICAgICByZXR1cm4g
ZW1pdFJlc29sdmVCYXNlKGRzdCwgcmVzb2x2ZVJlc3VsdCwgcHJvcGVydHkpOwogCi1SZWdpc3Rl
cklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVCYXNlKFJlZ2lzdGVySUQqIGRzdCwg
Y29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCi17Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAg
ICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJv
b2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgZmluZFNjb3BlZFByb3BlcnR5
KHByb3BlcnR5LCBpbmRleCwgZGVwdGgsIGZhbHNlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGds
b2JhbE9iamVjdCk7Ci0gICAgaWYgKCFnbG9iYWxPYmplY3QgfHwgcmVxdWlyZXNEeW5hbWljQ2hl
Y2tzKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKLSAgICAgICAg
VmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfYmFz
ZSk7CisgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNHbG9iYWwoKSAmJiAhcmVzb2x2ZVJlc3VsdC5p
c0R5bmFtaWMoKSkgeworICAgICAgICAvLyBHbG9iYWwgb2JqZWN0IGlzIHRoZSBiYXNlCisgICAg
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBlbWl0TG9hZChkc3QsIEpTVmFsdWUocmVz
b2x2ZVJlc3VsdC5nbG9iYWxPYmplY3QoKSkpOworICAgICAgICBlbWl0T3Bjb2RlKG9wX2Vuc3Vy
ZV9wcm9wZXJ0eV9leGlzdHMpOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5p
bmRleCgpKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3Bl
cnR5KSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChmYWxzZSk7Ci0gICAgICAgIGlu
c3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIGRzdDsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdC5nZXQoKTsKICAgICB9CiAKLSAgICAvLyBHbG9iYWwgb2JqZWN0IGlz
IHRoZSBiYXNlCi0gICAgcmV0dXJuIGVtaXRMb2FkKGRzdCwgSlNWYWx1ZShnbG9iYWxPYmplY3Qp
KTsKLX0KLQotUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlQmFzZUZv
clB1dChSZWdpc3RlcklEKiBkc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQotewotICAg
IGlmICghbV9jb2RlQmxvY2stPmlzU3RyaWN0TW9kZSgpKQotICAgICAgICByZXR1cm4gZW1pdFJl
c29sdmVCYXNlKGRzdCwgcHJvcGVydHkpOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgaW50
IGluZGV4ID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKLSAgICBib29sIHJl
cXVpcmVzRHluYW1pY0NoZWNrcyA9IGZhbHNlOwotICAgIGZpbmRTY29wZWRQcm9wZXJ0eShwcm9w
ZXJ0eSwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxP
YmplY3QpOwotICAgIGlmICghZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNrcykg
ewotICAgICAgICAvLyBXZSBjYW4ndCBvcHRpbWlzZSBhdCBhbGwgOi0oCi0gICAgICAgIFZhbHVl
UHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlX2Jhc2UpOwot
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgICAgIGluc3Ry
dWN0aW9ucygpLmFwcGVuZCh0cnVlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHBy
b2ZpbGUpOwotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLSAgICAKLSAgICAvLyBHbG9iYWwg
b2JqZWN0IGlzIHRoZSBiYXNlCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGVtaXRM
b2FkKGRzdCwgSlNWYWx1ZShnbG9iYWxPYmplY3QpKTsKLSAgICBlbWl0T3Bjb2RlKG9wX2Vuc3Vy
ZV9wcm9wZXJ0eV9leGlzdHMpOworICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgK
KyAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUob3BfcmVzb2x2
ZV9iYXNlKTsKICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZHN0LT5pbmRleCgpKTsKICAgICBp
bnN0cnVjdGlvbnMoKS5hcHBlbmQoYWRkQ29uc3RhbnQocHJvcGVydHkpKTsKLSAgICByZXR1cm4g
cmVzdWx0LmdldCgpOworICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh0cnVlKTsKKyAgICBpbnN0
cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7CisgICAgcmV0dXJuIGRzdDsKIH0KIAotUmVnaXN0
ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJRCog
YmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkp
CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJlc29sdmVXaXRoQmFzZShSZWdp
c3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0
JiByZXNvbHZlUmVzdWx0LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSkKIHsKLSAgICBzaXpl
X3QgZGVwdGggPSAwOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9i
amVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBp
ZiAoIWZpbmRTY29wZWRQcm9wZXJ0eShwcm9wZXJ0eSwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVx
dWlyZXNEeW5hbWljQ2hlY2tzLCBnbG9iYWxPYmplY3QpIHx8ICFnbG9iYWxPYmplY3QgfHwgcmVx
dWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFs
bCA6LSgKLSAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2Rl
KG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGJh
c2VEc3QtPmluZGV4KCkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+
aW5kZXgoKSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9w
ZXJ0eSkpOwotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvZmlsZSk7Ci0gICAgICAg
IHJldHVybiBiYXNlRHN0OwotICAgIH0KKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc0dsb2JhbCgp
ICYmICFyZXNvbHZlUmVzdWx0LmlzRHluYW1pYygpKSB7CisgICAgICAgIC8vIEdsb2JhbCBvYmpl
Y3QgaXMgdGhlIGJhc2UKKyAgICAgICAgZW1pdExvYWQoYmFzZURzdCwgSlNWYWx1ZShyZXNvbHZl
UmVzdWx0Lmdsb2JhbE9iamVjdCgpKSk7CiAKLSAgICBib29sIGZvcmNlR2xvYmFsUmVzb2x2ZSA9
IGZhbHNlOworICAgICAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRpYygpKSB7CisgICAgICAg
ICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9zcyBtdWx0aXBs
ZSBzY29wZXMuCisgICAgICAgICAgICBlbWl0R2V0U3RhdGljVmFyKHByb3BEc3QsIHJlc29sdmVS
ZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgICAgIH0KIAotICAgIC8v
IEdsb2JhbCBvYmplY3QgaXMgdGhlIGJhc2UKLSAgICBlbWl0TG9hZChiYXNlRHN0LCBKU1ZhbHVl
KGdsb2JhbE9iamVjdCkpOworICAgICAgICBpZiAoc2hvdWxkQXZvaWRSZXNvbHZlR2xvYmFsKCkp
IHsKKyAgICAgICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29k
ZShvcF9yZXNvbHZlKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9wRHN0
LT5pbmRleCgpKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFu
dChwcm9wZXJ0eSkpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUp
OworICAgICAgICAgICAgcmV0dXJuIGJhc2VEc3Q7CisgICAgICAgIH0KIAotICAgIGlmIChpbmRl
eCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIWZvcmNlR2xvYmFsUmVzb2x2ZSkgewotICAg
ICAgICAvLyBEaXJlY3RseSBpbmRleCB0aGUgcHJvcGVydHkgbG9va3VwIGFjcm9zcyBtdWx0aXBs
ZSBzY29wZXMuCi0gICAgICAgIGVtaXRHZXRTY29wZWRWYXIocHJvcERzdCwgZGVwdGgsIGluZGV4
LCBnbG9iYWxPYmplY3QpOwotICAgICAgICByZXR1cm4gYmFzZURzdDsKLSAgICB9Ci0gICAgaWYg
KHNob3VsZEF2b2lkUmVzb2x2ZUdsb2JhbCgpKSB7Ci0gICAgICAgIFZhbHVlUHJvZmlsZSogcHJv
ZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9yZXNvbHZlKTsKKyNpZiBFTkFCTEUoSklUKQor
ICAgICAgICBtX2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCku
c2l6ZSgpKTsKKyNlbmRpZgorI2lmIEVOQUJMRShJTlRFUlBSRVRFUikKKyAgICAgICAgbV9jb2Rl
QmxvY2stPmFkZEdsb2JhbFJlc29sdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMoKS5zaXplKCkp
OworI2VuZGlmCisgICAgICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9w
Y29kZShvcF9yZXNvbHZlX2dsb2JhbCk7CiAgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChw
cm9wRHN0LT5pbmRleCgpKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0
YW50KHByb3BlcnR5KSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKKyAgICAg
ICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKDApOwogICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBl
bmQocHJvZmlsZSk7CiAgICAgICAgIHJldHVybiBiYXNlRHN0OwogICAgIH0KLSNpZiBFTkFCTEUo
SklUKQotICAgIG1fY29kZUJsb2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5mbyhpbnN0cnVjdGlvbnMo
KS5zaXplKCkpOwotI2VuZGlmCi0jaWYgRU5BQkxFKElOVEVSUFJFVEVSKQotICAgIG1fY29kZUJs
b2NrLT5hZGRHbG9iYWxSZXNvbHZlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsK
LSNlbmRpZgotICAgIFZhbHVlUHJvZmlsZSogcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShy
ZXF1aXJlc0R5bmFtaWNDaGVja3MgPyBvcF9yZXNvbHZlX2dsb2JhbF9keW5hbWljIDogb3BfcmVz
b2x2ZV9nbG9iYWwpOworCisKKworCisgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gZW1pdFBy
b2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF9iYXNlKTsKKyAgICBpbnN0cnVjdGlvbnMoKS5h
cHBlbmQoYmFzZURzdC0+aW5kZXgoKSk7CiAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb3BE
c3QtPmluZGV4KCkpOwogICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChhZGRDb25zdGFudChwcm9w
ZXJ0eSkpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICBpbnN0cnVjdGlvbnMo
KS5hcHBlbmQoMCk7Ci0gICAgaWYgKHJlcXVpcmVzRHluYW1pY0NoZWNrcykKLSAgICAgICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKGRlcHRoKTsKICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJv
ZmlsZSk7CiAgICAgcmV0dXJuIGJhc2VEc3Q7CiB9CiAKLVJlZ2lzdGVySUQqIEJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0UmVzb2x2ZVdpdGhUaGlzKFJlZ2lzdGVySUQqIGJhc2VEc3QsIFJlZ2lzdGVy
SUQqIHByb3BEc3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KQorUmVnaXN0ZXJJRCogQnl0
ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNvbHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwg
UmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYgcmVzb2x2ZVJlc3VsdCwg
Y29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpCiB7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAg
ICBpbnQgaW5kZXggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJv
b2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKCFmaW5kU2NvcGVkUHJv
cGVydHkocHJvcGVydHksIGluZGV4LCBkZXB0aCwgZmFsc2UsIHJlcXVpcmVzRHluYW1pY0NoZWNr
cywgZ2xvYmFsT2JqZWN0KSB8fCAhZ2xvYmFsT2JqZWN0IHx8IHJlcXVpcmVzRHluYW1pY0NoZWNr
cykgeworICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkpIHsKKyAgICAgICAgZW1pdExv
YWQoYmFzZURzdCwganNVbmRlZmluZWQoKSk7CisgICAgICAgIGVtaXRHZXRTdGF0aWNWYXIocHJv
cERzdCwgcmVzb2x2ZVJlc3VsdCk7CisgICAgICAgIHJldHVybiBiYXNlRHN0OworICAgIH0KKwor
ICAgIGlmIChyZXNvbHZlUmVzdWx0LnR5cGUoKSA9PSBSZXNvbHZlUmVzdWx0OjpEeW5hbWljKSB7
CiAgICAgICAgIC8vIFdlIGNhbid0IG9wdGltaXNlIGF0IGFsbCA6LSgKICAgICAgICAgVmFsdWVQ
cm9maWxlKiBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2RlKG9wX3Jlc29sdmVfd2l0aF90aGlz
KTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGJhc2VEc3QtPmluZGV4KCkpOwpAQCAt
MTQ3MCwzOCArMTQ0MCw3OCBAQCBSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFJl
c29sdmVXaXRoVGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcgogICAgICAgICByZXR1
cm4gYmFzZURzdDsKICAgICB9CiAKLSAgICBib29sIGZvcmNlR2xvYmFsUmVzb2x2ZSA9IGZhbHNl
OwotCi0gICAgLy8gR2xvYmFsIG9iamVjdCBpcyB0aGUgYmFzZQogICAgIGVtaXRMb2FkKGJhc2VE
c3QsIGpzVW5kZWZpbmVkKCkpOworICAgIHJldHVybiBlbWl0UmVzb2x2ZShwcm9wRHN0LCByZXNv
bHZlUmVzdWx0LCBwcm9wZXJ0eSk7Cit9CiAKLSAgICBpZiAoaW5kZXggIT0gbWlzc2luZ1N5bWJv
bE1hcmtlcigpICYmICFmb3JjZUdsb2JhbFJlc29sdmUpIHsKLSAgICAgICAgLy8gRGlyZWN0bHkg
aW5kZXggdGhlIHByb3BlcnR5IGxvb2t1cCBhY3Jvc3MgbXVsdGlwbGUgc2NvcGVzLgotICAgICAg
ICBlbWl0R2V0U2NvcGVkVmFyKHByb3BEc3QsIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsK
LSAgICAgICAgcmV0dXJuIGJhc2VEc3Q7Ci0gICAgfQotICAgIGlmIChzaG91bGRBdm9pZFJlc29s
dmVHbG9iYWwoKSkgewotICAgICAgICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmls
ZWRPcGNvZGUob3BfcmVzb2x2ZSk7Ci0gICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9w
RHN0LT5pbmRleCgpKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50
KHByb3BlcnR5KSk7CitSZWdpc3RlcklEKiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdEdldFN0YXRp
Y1ZhcihSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmIHJlc29sdmVSZXN1bHQp
Cit7CisgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gMDsKKworICAgIHN3aXRjaCAocmVzb2x2
ZVJlc3VsdC50eXBlKCkpIHsKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OlJlZ2lzdGVyOgorICAg
IGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVhZE9ubHlSZWdpc3RlcjoKKyAgICAgICAgaWYgKGRzdCA9
PSBpZ25vcmVkUmVzdWx0KCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJu
IG1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCByZXNvbHZlUmVzdWx0LmxvY2FsKCkpOwor
CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpMZXhpY2FsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3Vs
dDo6UmVhZE9ubHlMZXhpY2FsOgorICAgICAgICBwcm9maWxlID0gZW1pdFByb2ZpbGVkT3Bjb2Rl
KG9wX2dldF9zY29wZWRfdmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKGRzdC0+
aW5kZXgoKSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChyZXNvbHZlUmVzdWx0Lmlu
ZGV4KCkpOworICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5kZXB0
aCgpKTsKICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUpOwotICAgICAgICBy
ZXR1cm4gYmFzZURzdDsKKyAgICAgICAgcmV0dXJuIGRzdDsKKworICAgIGNhc2UgUmVzb2x2ZVJl
c3VsdDo6SW5kZXhlZEdsb2JhbDoKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OlJlYWRPbmx5SW5k
ZXhlZEdsb2JhbDoKKyAgICAgICAgaWYgKG1fbGFzdE9wY29kZUlEID09IG9wX3B1dF9nbG9iYWxf
dmFyKSB7CisgICAgICAgICAgICBpbnQgZHN0SW5kZXg7CisgICAgICAgICAgICBpbnQgc3JjSW5k
ZXg7CisgICAgICAgICAgICByZXRyaWV2ZUxhc3RVbmFyeU9wKGRzdEluZGV4LCBzcmNJbmRleCk7
CisgICAgICAgICAgICBpZiAoZHN0SW5kZXggPT0gcmVzb2x2ZVJlc3VsdC5pbmRleCgpICYmIHNy
Y0luZGV4ID09IGRzdC0+aW5kZXgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZHN0OworICAg
ICAgICB9CisKKyAgICAgICAgcHJvZmlsZSA9IGVtaXRQcm9maWxlZE9wY29kZShvcF9nZXRfZ2xv
YmFsX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChkc3QtPmluZGV4KCkpOwor
ICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5pbmRleCgpKTsKKyAg
ICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByb2ZpbGUpOworICAgICAgICByZXR1cm4gZHN0
OworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KK30KKworUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVt
aXRQdXRTdGF0aWNWYXIoY29uc3QgUmVzb2x2ZVJlc3VsdCYgcmVzb2x2ZVJlc3VsdCwgUmVnaXN0
ZXJJRCogdmFsdWUpCit7CisgICAgc3dpdGNoIChyZXNvbHZlUmVzdWx0LnR5cGUoKSkgeworICAg
IGNhc2UgUmVzb2x2ZVJlc3VsdDo6UmVnaXN0ZXI6CisgICAgY2FzZSBSZXNvbHZlUmVzdWx0OjpS
ZWFkT25seVJlZ2lzdGVyOgorICAgICAgICByZXR1cm4gbW92ZVRvRGVzdGluYXRpb25JZk5lZWRl
ZChyZXNvbHZlUmVzdWx0LmxvY2FsKCksIHZhbHVlKTsKKworICAgIGNhc2UgUmVzb2x2ZVJlc3Vs
dDo6TGV4aWNhbDoKKyAgICBjYXNlIFJlc29sdmVSZXN1bHQ6OlJlYWRPbmx5TGV4aWNhbDoKKyAg
ICAgICAgZW1pdE9wY29kZShvcF9wdXRfc2NvcGVkX3Zhcik7CisgICAgICAgIGluc3RydWN0aW9u
cygpLmFwcGVuZChyZXNvbHZlUmVzdWx0LmluZGV4KCkpOworICAgICAgICBpbnN0cnVjdGlvbnMo
KS5hcHBlbmQocmVzb2x2ZVJlc3VsdC5kZXB0aCgpKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCku
YXBwZW5kKHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgY2Fz
ZSBSZXNvbHZlUmVzdWx0OjpJbmRleGVkR2xvYmFsOgorICAgIGNhc2UgUmVzb2x2ZVJlc3VsdDo6
UmVhZE9ubHlJbmRleGVkR2xvYmFsOgorICAgICAgICBlbWl0T3Bjb2RlKG9wX3B1dF9nbG9iYWxf
dmFyKTsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHJlc29sdmVSZXN1bHQuaW5kZXgo
KSk7CisgICAgICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCh2YWx1ZS0+aW5kZXgoKSk7CisgICAg
ICAgIHJldHVybiB2YWx1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBt
X2NvZGVCbG9jay0+YWRkR2xvYmFsUmVzb2x2ZUluZm8oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsK
LSNlbmRpZgotI2lmIEVOQUJMRShJTlRFUlBSRVRFUikKLSAgICBtX2NvZGVCbG9jay0+YWRkR2xv
YmFsUmVzb2x2ZUluc3RydWN0aW9uKGluc3RydWN0aW9ucygpLnNpemUoKSk7Ci0jZW5kaWYKLSAg
ICBWYWx1ZVByb2ZpbGUqIHByb2ZpbGUgPSBlbWl0UHJvZmlsZWRPcGNvZGUocmVxdWlyZXNEeW5h
bWljQ2hlY2tzID8gb3BfcmVzb2x2ZV9nbG9iYWxfZHluYW1pYyA6IG9wX3Jlc29sdmVfZ2xvYmFs
KTsKLSAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJvcERzdC0+aW5kZXgoKSk7Ci0gICAgaW5z
dHJ1Y3Rpb25zKCkuYXBwZW5kKGFkZENvbnN0YW50KHByb3BlcnR5KSk7Ci0gICAgaW5zdHJ1Y3Rp
b25zKCkuYXBwZW5kKDApOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZCgwKTsKLSAgICBpZiAo
cmVxdWlyZXNEeW5hbWljQ2hlY2tzKQotICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQoZGVw
dGgpOwotICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcm9maWxlKTsKLSAgICByZXR1cm4gYmFz
ZURzdDsKIH0KIAogdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdE1ldGhvZENoZWNrKCkKQEAg
LTIzOTIsNyArMjQwMiw3IEBAIHZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OnNldElzTnVtZXJpY0Nv
bXBhcmVGdW5jdGlvbihib29sIGlzTnVtZXJpY0NvbXBhcmVGdW5jdGlvCiAKIGJvb2wgQnl0ZWNv
ZGVHZW5lcmF0b3I6OmlzQXJndW1lbnROdW1iZXIoY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIGlu
dCBhcmd1bWVudE51bWJlcikKIHsKLSAgICBSZWdpc3RlcklEKiByZWdpc3RlcklEID0gcmVnaXN0
ZXJGb3IoaWRlbnQpOworICAgIFJlZ2lzdGVySUQqIHJlZ2lzdGVySUQgPSByZXNvbHZlKGlkZW50
KS5sb2NhbCgpOwogICAgIGlmICghcmVnaXN0ZXJJRCB8fCByZWdpc3RlcklELT5pbmRleCgpID49
IDApCiAgICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gcmVnaXN0ZXJJRC0+aW5kZXgoKSA9
PSBDYWxsRnJhbWU6OmFyZ3VtZW50T2Zmc2V0KGFyZ3VtZW50TnVtYmVyKTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaCBi
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaApp
bmRleCA1OWQ3NzZlOTA2YzE2NTgzOTg4ODY5Yjg1M2FlZjQyNzJkNTU3Y2ZjLi40NmFkYzE0MTdk
MmM3OGY2YmRiYjI2MjI0OTk0NWQ3ZWM5ODI2M2IzIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgKKysrIGIvU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCkBAIC0xLDYgKzEs
NyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ2FtZXJvbiBad2FyaWNoIDxjd3p3
YXJpY2hAdXdhdGVybG9vLmNhPgorICogQ29weXJpZ2h0IChDKSAyMDEyIElnYWxpYSwgUy5MLgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC04NSw2ICs4NiwxNDQgQEAgbmFtZXNw
YWNlIEpTQyB7CiAgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wZXJ0eVJlZ2lzdGVyOwog
ICAgIH07CiAKKyAgICBjbGFzcyBSZXNvbHZlUmVzdWx0IHsKKyAgICBwdWJsaWM6CisgICAgICAg
IGVudW0gRmxhZ3MgeworICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGlzIGxvY2FsbHkgYm91
bmQsIGluIGEgcmVnaXN0ZXIuCisgICAgICAgICAgICBSZWdpc3RlckZsYWcgPSAweDEsCisgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSBzY29wZSBjaGFpbiBhdCBydW50aW1l
LCBjaGVja2luZyBmb3IKKyAgICAgICAgICAgIC8vIG5vbi1zdHJpY3QgZXZhbCBhbmQvb3IgYHdp
dGgnIG5vZGVzLgorICAgICAgICAgICAgRHluYW1pY0ZsYWcgPSAweDIsCisgICAgICAgICAgICAv
LyBUaGUgcHJvcGVydHkgd2FzIHJlc29sdmVkIHRvIGEgZGVmaW5pdGUgbG9jYXRpb24sIGFuZCB0
aGUKKyAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KKyAg
ICAgICAgICAgIFN0YXRpY0ZsYWcgPSAweDQsCisgICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUg
dGhlIGJhc2Ugb2JqZWN0LCB0aGUgcHJvcGVydHkgd2lsbCBiZSBsb2NhdGVkIGF0IGEKKyAgICAg
ICAgICAgIC8vIGtub3duIGluZGV4LgorICAgICAgICAgICAgSW5kZXhlZEZsYWcgPSAweDgsCisg
ICAgICAgICAgICAvLyBTa2lwIHNvbWUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNjb3BlIGNo
YWluLCBnaXZlbiBieSAiZGVwdGgiLgorICAgICAgICAgICAgU2NvcGVkRmxhZyA9IDB4MTAsCisg
ICAgICAgICAgICAvLyBUaGUgcmVzb2x2ZWQgYmluZGluZyBpcyBpbW11dGFibGUuCisgICAgICAg
ICAgICBSZWFkT25seUZsYWcgPSAweDIwLAorICAgICAgICAgICAgLy8gVGhlIGJhc2Ugb2JqZWN0
IGlzIHRoZSBnbG9iYWwgb2JqZWN0LgorICAgICAgICAgICAgR2xvYmFsRmxhZyA9IDB4NDAKKyAg
ICAgICAgfTsKKyAgICAgICAgZW51bSBUeXBlIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0
eSBpcyBsb2NhbCwgYW5kIHN0b3JlZCBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgUmVnaXN0
ZXIgPSBSZWdpc3RlckZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gQSByZWFkLW9u
bHkgbG9jYWwsIGNyZWF0ZWQgYnkgImNvbnN0Ii4KKyAgICAgICAgICAgIFJlYWRPbmx5UmVnaXN0
ZXIgPSBSZWdpc3RlckZsYWcgfCBSZWFkT25seUZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAg
ICAgLy8gVGhlIHByb3BlcnR5IGlzIHN0YXRpY2FsbHkgc2NvcGVkIGZyZWUgdmFyaWFibGUuIEl0
cyBjb29yZGluYXRlcworICAgICAgICAgICAgLy8gYXJlIGluICJpbmRleCIgYW5kICJkZXB0aCIu
CisgICAgICAgICAgICBMZXhpY2FsID0gSW5kZXhlZEZsYWcgfCBTY29wZWRGbGFnIHwgU3RhdGlj
RmxhZywKKyAgICAgICAgICAgIC8vIEEgcmVhZC1vbmx5IExleGljYWwsIGNyZWF0ZWQgYnkgImNv
bnN0Ii4KKyAgICAgICAgICAgIFJlYWRPbmx5TGV4aWNhbCA9IEluZGV4ZWRGbGFnIHwgU2NvcGVk
RmxhZyB8IFJlYWRPbmx5RmxhZyB8IFN0YXRpY0ZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJv
cGVydHkgd2FzIG5vdCBib3VuZCBsZXhpY2FsbHksIHNvIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkCisg
ICAgICAgICAgICAvLyBsb29rIGRpcmVjdGx5IGluIHRoZSBnbG9iYWwgb2JqZWN0LgorICAgICAg
ICAgICAgR2xvYmFsID0gR2xvYmFsRmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgR2xvYmFsLCBi
dXQgd2UgY291bGQgYWN0dWFsbHkgcmVzb2x2ZSB0aGUgcHJvcGVydHkgdG8gYQorICAgICAgICAg
ICAgLy8gRG9udERlbGV0ZSBwcm9wZXJ0eSBpbiB0aGUgZ2xvYmFsIG9iamVjdCwgZm9yIGluc3Rh
bmNlLCBhbnkKKyAgICAgICAgICAgIC8vIGJpbmRpbmcgY3JlYXRlZCB3aXRoICJ2YXIiIGF0IHRo
ZSB0b3AgbGV2ZWwuIEF0IHJ1bnRpbWUgd2UnbGwKKyAgICAgICAgICAgIC8vIGp1c3QgaW5kZXgg
aW50byB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgICAgICAgICAgIEluZGV4ZWRHbG9iYWwgPSBJbmRl
eGVkRmxhZyB8IEdsb2JhbEZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gTGlrZSBJ
bmRleGVkR2xvYmFsLCBidXQgdGhlIHByb3BlcnR5IGlzIGFsc28gcmVhZC1vbmx5LCBsaWtlIE5h
TiwKKyAgICAgICAgICAgIC8vIEluZmluaXR5LCBvciB1bmRlZmluZWQuCisgICAgICAgICAgICBS
ZWFkT25seUluZGV4ZWRHbG9iYWwgPSBJbmRleGVkRmxhZyB8IFJlYWRPbmx5RmxhZyB8IEdsb2Jh
bEZsYWcgfCBTdGF0aWNGbGFnLAorICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IGNvdWxkIG5v
dCBiZSByZXNvbHZlZCBzdGF0aWNhbGx5LCBkdWUgdG8gdGhlCisgICAgICAgICAgICAvLyBwcmVz
ZW5jZSBvZiBgd2l0aCcgYmxvY2tzLiBBdCBydW50aW1lIHdlJ2xsIGhhdmUgdG8gd2FsayB0aGUK
KyAgICAgICAgICAgIC8vIHNjb3BlIGNoYWluLiBTY29wZWRGbGFnIGlzIHNldCB0byBpbmRpY2F0
ZSB0aGF0ICJkZXB0aCIgd2lsbAorICAgICAgICAgICAgLy8gaG9sZCBzb21lIG51bWJlciBvZiBu
b2RlcyB0byBza2lwIGluIHRoZSBzY29wZSBjaGFpbiwgYmVmb3JlCisgICAgICAgICAgICAvLyBi
ZWdpbm5pbmcgdGhlIHNlYXJjaC4KKyAgICAgICAgICAgIER5bmFtaWMgPSBEeW5hbWljRmxhZyB8
IFNjb3BlZEZsYWcsCisgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgd2FzIGxvY2F0ZWQgYXMg
YSBzdGF0aWNhbGx5IHNjb3BlZCBmcmVlIHZhcmlhYmxlLAorICAgICAgICAgICAgLy8gYnV0IHdo
aWxlIHRyYXZlcnNpbmcgdGhlIHNjb3BlIGNoYWluLCB0aGVyZSB3YXMgYW4gaW50ZXJtZWRpYXRl
CisgICAgICAgICAgICAvLyBhY3RpdmF0aW9uIHRoYXQgdXNlZCBub24tc3RyaWN0IGBldmFsJy4g
QXQgcnVudGltZSB3ZSdsbCBoYXZlIHRvCisgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIGFi
c2VuY2Ugb2YgdGhpcyBwcm9wZXJ0eSBpbiB0aG9zZSBpbnRlcnZlbmluZworICAgICAgICAgICAg
Ly8gc2NvcGVzLgorICAgICAgICAgICAgRHluYW1pY0xleGljYWwgPSBEeW5hbWljRmxhZyB8IElu
ZGV4ZWRGbGFnIHwgU2NvcGVkRmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgUmVhZE9ubHlMZXhp
Y2FsLCBidXQgd2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0IGBldmFsJy4KKyAgICAgICAgICAg
IER5bmFtaWNSZWFkT25seUxleGljYWwgPSBEeW5hbWljRmxhZyB8IEluZGV4ZWRGbGFnIHwgU2Nv
cGVkRmxhZyB8IFJlYWRPbmx5RmxhZywKKyAgICAgICAgICAgIC8vIExpa2UgR2xvYmFsLCBidXQg
d2l0aCBpbnRlcnZlbmluZyBub24tc3RyaWN0IGBldmFsJy4gQXMgd2l0aCAKKyAgICAgICAgICAg
IC8vIER5bmFtaWMsIFNjb3BlRmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCAiZGVwdGgiIGRv
ZXMgaW5kZWVkCisgICAgICAgICAgICAvLyBzdG9yZSBhIG51bWJlciBvZiBmcmFtZXMgdG8gc2tp
cCBiZWZvcmUgZG9pbmcgdGhlIGR5bmFtaWMgY2hlY2tzLgorICAgICAgICAgICAgRHluYW1pY0ds
b2JhbCA9IER5bmFtaWNGbGFnIHwgR2xvYmFsRmxhZyB8IFNjb3BlZEZsYWcsCisgICAgICAgICAg
ICAvLyBMaWtlIEluZGV4ZWRHbG9iYWwsIGJ1dCB3aXRoIGludGVydmVuaW5nIG5vbi1zdHJpY3Qg
YGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY0luZGV4ZWRHbG9iYWwgPSBEeW5hbWljRmxhZyB8
IEluZGV4ZWRGbGFnIHwgR2xvYmFsRmxhZyB8IFNjb3BlZEZsYWcsCisgICAgICAgICAgICAvLyBM
aWtlIFJlYWRPbmx5SW5kZXhlZEdsb2JhbCwgYnV0IHdpdGggaW50ZXJ2ZW5pbmcgbm9uLXN0cmlj
dAorICAgICAgICAgICAgLy8gYGV2YWwnLgorICAgICAgICAgICAgRHluYW1pY1JlYWRPbmx5SW5k
ZXhlZEdsb2JhbCA9IER5bmFtaWNGbGFnIHwgSW5kZXhlZEZsYWcgfCBSZWFkT25seUZsYWcgfCBH
bG9iYWxGbGFnIHwgU2NvcGVkRmxhZywKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgUmVz
b2x2ZVJlc3VsdCByZWdpc3RlclJlc29sdmUoUmVnaXN0ZXJJRCAqbG9jYWwsIHVuc2lnbmVkIGZs
YWdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdChSZWdpc3Rl
ciB8IGZsYWdzLCBsb2NhbCwgbWlzc2luZ1N5bWJvbE1hcmtlcigpLCAwLCAwKTsKKyAgICAgICAg
fQorICAgICAgICBzdGF0aWMgUmVzb2x2ZVJlc3VsdCBkeW5hbWljUmVzb2x2ZShzaXplX3QgZGVw
dGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlUmVzdWx0KER5bmFtaWMs
IDAsIG1pc3NpbmdTeW1ib2xNYXJrZXIoKSwgZGVwdGgsIDApOworICAgICAgICB9CisgICAgICAg
IHN0YXRpYyBSZXNvbHZlUmVzdWx0IGxleGljYWxSZXNvbHZlKGludCBpbmRleCwgc2l6ZV90IGRl
cHRoLCB1bnNpZ25lZCBmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgdHlw
ZSA9IChmbGFncyAmIER5bmFtaWNGbGFnKSA/IER5bmFtaWNMZXhpY2FsIDogTGV4aWNhbDsKKyAg
ICAgICAgICAgIHJldHVybiBSZXNvbHZlUmVzdWx0KHR5cGUgfCBmbGFncywgMCwgaW5kZXgsIGRl
cHRoLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgUmVzb2x2ZVJlc3VsdCBpbmRleGVk
R2xvYmFsUmVzb2x2ZShpbnQgaW5kZXgsIEpTT2JqZWN0ICpnbG9iYWxPYmplY3QsIHVuc2lnbmVk
IGZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZVJlc3VsdChJbmRl
eGVkR2xvYmFsIHwgZmxhZ3MsIDAsIGluZGV4LCAwLCBnbG9iYWxPYmplY3QpOworICAgICAgICB9
CisgICAgICAgIHN0YXRpYyBSZXNvbHZlUmVzdWx0IGR5bmFtaWNJbmRleGVkR2xvYmFsUmVzb2x2
ZShpbnQgaW5kZXgsIHNpemVfdCBkZXB0aCwgSlNPYmplY3QgKmdsb2JhbE9iamVjdCwgdW5zaWdu
ZWQgZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlUmVzdWx0KER5
bmFtaWNJbmRleGVkR2xvYmFsIHwgZmxhZ3MsIDAsIGluZGV4LCBkZXB0aCwgZ2xvYmFsT2JqZWN0
KTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgUmVzb2x2ZVJlc3VsdCBnbG9iYWxSZXNvbHZl
KEpTT2JqZWN0ICpnbG9iYWxPYmplY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBS
ZXNvbHZlUmVzdWx0KEdsb2JhbCwgMCwgbWlzc2luZ1N5bWJvbE1hcmtlcigpLCAwLCBnbG9iYWxP
YmplY3QpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBSZXNvbHZlUmVzdWx0IGR5bmFtaWNH
bG9iYWxSZXNvbHZlKHNpemVfdCBkeW5hbWljRGVwdGgsIEpTT2JqZWN0ICpnbG9iYWxPYmplY3Qp
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlUmVzdWx0KER5bmFtaWNHbG9i
YWwsIDAsIG1pc3NpbmdTeW1ib2xNYXJrZXIoKSwgZHluYW1pY0RlcHRoLCBnbG9iYWxPYmplY3Qp
OworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
dHlwZTsgfQorICAgICAgICAvLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRv
IGEgbG9jYWwgdmFyaWFibGUsIG9yIDAgaWYgbm8KKyAgICAgICAgLy8gc3VjaCByZWdpc3RlciBl
eGlzdHMuIFJlZ2lzdGVycyByZXR1cm5lZCBieSBSZXNvbHZlUmVzdWx0Ojpsb2NhbCgpIGRvCisg
ICAgICAgIC8vIG5vdCByZXF1aXJlIGV4cGxpY2l0IHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAg
ICAgUmVnaXN0ZXJJRCogbG9jYWwoKSBjb25zdCB7IHJldHVybiBtX2xvY2FsOyB9CisgICAgICAg
IGludCBpbmRleCgpIGNvbnN0IHsgQVNTRVJUIChpc0luZGV4ZWQoKSB8fCBpc1JlZ2lzdGVyKCkp
OyByZXR1cm4gbV9pbmRleDsgfQorICAgICAgICBzaXplX3QgZGVwdGgoKSBjb25zdCB7IEFTU0VS
VChpc1Njb3BlZCgpKTsgcmV0dXJuIG1fZGVwdGg7IH0KKyAgICAgICAgSlNPYmplY3QqIGdsb2Jh
bE9iamVjdCgpIGNvbnN0IHsgQVNTRVJUKGlzR2xvYmFsKCkpOyBBU1NFUlQobV9nbG9iYWxPYmpl
Y3QpOyByZXR1cm4gbV9nbG9iYWxPYmplY3Q7IH0KKworICAgICAgICBib29sIGlzUmVnaXN0ZXIo
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgJiBSZWdpc3RlckZsYWc7IH0KKyAgICAgICAgYm9vbCBp
c0R5bmFtaWMoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgJiBEeW5hbWljRmxhZzsgfQorICAgICAg
ICBib29sIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gbV90eXBlICYgU3RhdGljRmxhZzsgfQor
ICAgICAgICBib29sIGlzSW5kZXhlZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSAmIEluZGV4ZWRG
bGFnOyB9CisgICAgICAgIGJvb2wgaXNTY29wZWQoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgJiBT
Y29wZWRGbGFnOyB9CisgICAgICAgIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuICht
X3R5cGUgJiBSZWFkT25seUZsYWcpICYmICFpc0R5bmFtaWMoKTsgfQorICAgICAgICBib29sIGlz
R2xvYmFsKCkgY29uc3QgeyByZXR1cm4gbV90eXBlICYgR2xvYmFsRmxhZzsgfQorCisgICAgcHJp
dmF0ZToKKyAgICAgICAgUmVzb2x2ZVJlc3VsdCh1bnNpZ25lZCB0eXBlLCBSZWdpc3RlcklEKiBs
b2NhbCwgaW50IGluZGV4LCBzaXplX3QgZGVwdGgsIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QpCisg
ICAgICAgICAgICA6IG1fdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBtX2luZGV4KGluZGV4KQor
ICAgICAgICAgICAgLCBtX2xvY2FsKGxvY2FsKQorICAgICAgICAgICAgLCBtX2RlcHRoKGRlcHRo
KQorICAgICAgICAgICAgLCBtX2dsb2JhbE9iamVjdChnbG9iYWxPYmplY3QpCisgICAgICAgIHsK
KyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICBjaGVja1ZhbGlkaXR5KCk7CisjZW5kaWYKKyAg
ICAgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgICAgICB2b2lkIGNoZWNrVmFsaWRpdHkoKTsK
KyNlbmRpZgorCisgICAgICAgIHVuc2lnbmVkIG1fdHlwZTsKKyAgICAgICAgaW50IG1faW5kZXg7
IC8vIEluZGV4IGluIHNjb3BlLCBpZiBJbmRleGVkRmxhZyBpcyBzZXQKKyAgICAgICAgUmVnaXN0
ZXJJRCogbV9sb2NhbDsgLy8gTG9jYWwgcmVnaXN0ZXIsIGlmIFJlZ2lzdGVyRmxhZyBpcyBzZXQK
KyAgICAgICAgc2l6ZV90IG1fZGVwdGg7IC8vIERlcHRoIGluIHNjb3BlIGNoYWluLCBpZiBTY29w
ZWRGbGFnIGlzIHNldAorICAgICAgICBKU09iamVjdCogbV9nbG9iYWxPYmplY3Q7IC8vIElmIEds
b2JhbEZsYWcgaXMgc2V0LgorICAgIH07CisKICAgICBjbGFzcyBCeXRlY29kZUdlbmVyYXRvciB7
CiAgICAgICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogICAgIHB1YmxpYzoKQEAgLTEwNywx
MSArMjQ2LDYgQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAgSlNPYmplY3QqIGdlbmVyYXRl
KCk7CiAKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byBh
IGxvY2FsIHZhcmlhYmxlLCBvciAwIGlmIG5vCi0gICAgICAgIC8vIHN1Y2ggcmVnaXN0ZXIgZXhp
c3RzLiBSZWdpc3RlcnMgcmV0dXJuZWQgYnkgcmVnaXN0ZXJGb3IgZG8gbm90Ci0gICAgICAgIC8v
IHJlcXVpcmUgZXhwbGljaXQgcmVmZXJlbmNlIGNvdW50aW5nLgotICAgICAgICBSZWdpc3RlcklE
KiByZWdpc3RlckZvcihjb25zdCBJZGVudGlmaWVyJik7Ci0KICAgICAgICAgYm9vbCBpc0FyZ3Vt
ZW50TnVtYmVyKGNvbnN0IElkZW50aWZpZXImLCBpbnQpOwogCiAgICAgICAgIHZvaWQgc2V0SXNO
dW1lcmljQ29tcGFyZUZ1bmN0aW9uKGJvb2wgaXNOdW1lcmljQ29tcGFyZUZ1bmN0aW9uKTsKQEAg
LTExOSwxNyArMjUzLDExIEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBib29sIHdpbGxSZXNv
bHZlVG9Bcmd1bWVudHMoY29uc3QgSWRlbnRpZmllciYpOwogICAgICAgICBSZWdpc3RlcklEKiB1
bmNoZWNrZWRSZWdpc3RlckZvckFyZ3VtZW50cygpOwogCi0gICAgICAgIC8vIEJlaGF2ZXMgYXMg
cmVnaXN0ZXJGb3IgZG9lcywgYnV0IGlnbm9yZXMgZHluYW1pYyBzY29wZSBhcworICAgICAgICAv
LyBSZXNvbHZlIGFuIGlkZW50aWZpZXIsIGdpdmVuIHRoZSBjdXJyZW50IGNvbXBpbGUtdGltZSBz
Y29wZSBjaGFpbi4KKyAgICAgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlKGNvbnN0IElkZW50aWZp
ZXImKTsKKyAgICAgICAgLy8gQmVoYXZlcyBhcyByZXNvbHZlIGRvZXMsIGJ1dCBpZ25vcmVzIGR5
bmFtaWMgc2NvcGUgYXMKICAgICAgICAgLy8gZHluYW1pYyBzY29wZSBzaG91bGQgbm90IGludGVy
ZmVyZSB3aXRoIGNvbnN0IGluaXRpYWxpc2F0aW9uCi0gICAgICAgIFJlZ2lzdGVySUQqIGNvbnN0
UmVnaXN0ZXJGb3IoY29uc3QgSWRlbnRpZmllciYpOwotCi0gICAgICAgIC8vIFNlYXJjaGVzIHRo
ZSBzY29wZSBjaGFpbiBpbiBhbiBhdHRlbXB0IHRvICBzdGF0aWNhbGx5IGxvY2F0ZSB0aGUgcmVx
dWVzdGVkCi0gICAgICAgIC8vIHByb3BlcnR5LiAgUmV0dXJucyBmYWxzZSBpZiBmb3IgYW55IHJl
YXNvbiB0aGUgcHJvcGVydHkgY2Fubm90IGJlIHNhZmVseQotICAgICAgICAvLyBvcHRpbWlzZWQg
YXQgYWxsLiAgT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZSBpbmRleCBhbmQgZGVwdGggb2Yg
dGhlCi0gICAgICAgIC8vIFZhcmlhYmxlT2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcHJvcGVydHku
ICBJZiB0aGUgcHJvcGVydHkgY2Fubm90IGJlIGZvdW5kCi0gICAgICAgIC8vIHN0YXRpY2FsbHks
IGRlcHRoIHdpbGwgY29udGFpbiB0aGUgZGVwdGggb2YgdGhlIHNjb3BlIGNoYWluIHdoZXJlIGR5
bmFtaWMKLSAgICAgICAgLy8gbG9va3VwIG11c3QgYmVnaW4uCi0gICAgICAgIGJvb2wgZmluZFNj
b3BlZFByb3BlcnR5KGNvbnN0IElkZW50aWZpZXImLCBpbnQmIGluZGV4LCBzaXplX3QmIGRlcHRo
LCBib29sIGZvcldyaXRpbmcsIGJvb2wmIGluY2x1ZGVzRHluYW1pY1Njb3BlcywgSlNPYmplY3Qq
JiBnbG9iYWxPYmplY3QpOworICAgICAgICBSZXNvbHZlUmVzdWx0IHJlc29sdmVDb25zdERlY2wo
Y29uc3QgSWRlbnRpZmllciYpOwogCiAgICAgICAgIC8vIFJldHVybnMgdGhlIHJlZ2lzdGVyIHN0
b3JpbmcgInRoaXMiCiAgICAgICAgIFJlZ2lzdGVySUQqIHRoaXNSZWdpc3RlcigpIHsgcmV0dXJu
ICZtX3RoaXNSZWdpc3RlcjsgfQpAQCAtMzA5LDE0ICs0MzcsMTQgQEAgbmFtZXNwYWNlIEpTQyB7
CiAgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRUeXBlT2YoUmVnaXN0ZXJJRCogZHN0LCBSZWdpc3Rl
cklEKiBzcmMpIHsgcmV0dXJuIGVtaXRVbmFyeU9wKG9wX3R5cGVvZiwgZHN0LCBzcmMpOyB9CiAg
ICAgICAgIFJlZ2lzdGVySUQqIGVtaXRJbihSZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIHBy
b3BlcnR5LCBSZWdpc3RlcklEKiBiYXNlKSB7IHJldHVybiBlbWl0QmluYXJ5T3Aob3BfaW4sIGRz
dCwgcHJvcGVydHksIGJhc2UsIE9wZXJhbmRUeXBlcygpKTsgfQogCi0gICAgICAgIFJlZ2lzdGVy
SUQqIGVtaXRSZXNvbHZlKFJlZ2lzdGVySUQqIGRzdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHkpOwotICAgICAgICBSZWdpc3RlcklEKiBlbWl0R2V0U2NvcGVkVmFyKFJlZ2lzdGVySUQqIGRz
dCwgc2l6ZV90IHNraXAsIGludCBpbmRleCwgSlNWYWx1ZSBnbG9iYWxPYmplY3QpOwotICAgICAg
ICBSZWdpc3RlcklEKiBlbWl0UHV0U2NvcGVkVmFyKHNpemVfdCBza2lwLCBpbnQgaW5kZXgsIFJl
Z2lzdGVySUQqIHZhbHVlLCBKU1ZhbHVlIGdsb2JhbE9iamVjdCk7CisgICAgICAgIFJlZ2lzdGVy
SUQqIGVtaXRHZXRTdGF0aWNWYXIoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBSZXNvbHZlUmVzdWx0
Jik7CisgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRQdXRTdGF0aWNWYXIoY29uc3QgUmVzb2x2ZVJl
c3VsdCYsIFJlZ2lzdGVySUQqIHZhbHVlKTsKIAotICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVz
b2x2ZUJhc2UoUmVnaXN0ZXJJRCogZHN0LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7Ci0g
ICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlQmFzZUZvclB1dChSZWdpc3RlcklEKiBkc3Qs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJl
c29sdmVXaXRoQmFzZShSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBj
b25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNv
bHZlV2l0aFRoaXMoUmVnaXN0ZXJJRCogYmFzZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHkpOworICAgICAgICBSZWdpc3RlcklEKiBlbWl0UmVzb2x2
ZShSZWdpc3RlcklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmLCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eSk7CisgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlQmFzZShSZWdpc3Rl
cklEKiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0
eSk7CisgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlQmFzZUZvclB1dChSZWdpc3RlcklE
KiBkc3QsIGNvbnN0IFJlc29sdmVSZXN1bHQmLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eSk7
CisgICAgICAgIFJlZ2lzdGVySUQqIGVtaXRSZXNvbHZlV2l0aEJhc2UoUmVnaXN0ZXJJRCogYmFz
ZURzdCwgUmVnaXN0ZXJJRCogcHJvcERzdCwgY29uc3QgUmVzb2x2ZVJlc3VsdCYsIGNvbnN0IElk
ZW50aWZpZXImIHByb3BlcnR5KTsKKyAgICAgICAgUmVnaXN0ZXJJRCogZW1pdFJlc29sdmVXaXRo
VGhpcyhSZWdpc3RlcklEKiBiYXNlRHN0LCBSZWdpc3RlcklEKiBwcm9wRHN0LCBjb25zdCBSZXNv
bHZlUmVzdWx0JiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHkpOwogCiAgICAgICAgIHZvaWQg
ZW1pdE1ldGhvZENoZWNrKCk7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAppbmRleCAxMzJmNjY2MmFmYmNjNzk1NGFjZTU5OWE0
NjAzZjRkOTJlMGI4OThkLi4zZTNjOWE0OWU4MzlhY2M4NzRhYzlkNjQ2M2IzNzhiZDI3YjdiZDk3
IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29k
ZWdlbi5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0Nv
ZGVnZW4uY3BwCkBAIC01LDYgKzUsNyBAQAogKiAgQ29weXJpZ2h0IChDKSAyMDA3IENhbWVyb24g
WndhcmljaCAoY3d6d2FyaWNoQHV3YXRlcmxvby5jYSkKICogIENvcHlyaWdodCAoQykgMjAwNyBN
YWtzIE9ybG92aWNoCiAqICBDb3B5cmlnaHQgKEMpIDIwMDcgRXJpYyBTZWlkZWwgPGVyaWNAd2Vi
a2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBJZ2FsaWEsIFMuTC4KICoKICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
ICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCkBAIC0xNDYsMTQgKzE0NywxNSBAQCBib29sIFJlc29sdmVOb2RlOjppc1B1cmUoQnl0
ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QKIAogUmVnaXN0ZXJJRCogUmVzb2x2ZU5v
ZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklE
KiBkc3QpCiB7Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVy
Rm9yKG1faWRlbnQpKSB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJh
dG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gcmVzb2x2
ZVJlc3VsdC5sb2NhbCgpKSB7CiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRS
ZXN1bHQoKSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
Lm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBsb2NhbCk7CiAgICAgfQogICAgIAogICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8obV9zdGFydE9mZnNldCArIG1faWRlbnQubGVu
Z3RoKCksIG1faWRlbnQubGVuZ3RoKCksIDApOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJl
c29sdmUoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbV9pZGVudCk7CisgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qp
LCByZXNvbHZlUmVzdWx0LCBtX2lkZW50KTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tIEFycmF5Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
QEAgLTM0Niw3ICszNDgsNyBAQCBSZWdpc3RlcklEKiBFdmFsRnVuY3Rpb25DYWxsTm9kZTo6ZW1p
dEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZwogICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpOwogICAgIENh
bGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CiAgICAgZ2VuZXJh
dG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gc3RhcnRPZmZzZXQoKSArIDQsIDQsIDAp
OwotICAgIGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhUaGlzKGNhbGxBcmd1bWVudHMudGhpc1Jl
Z2lzdGVyKCksIGZ1bmMuZ2V0KCksIGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuZXZhbCk7Cisg
ICAgZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aFRoaXMoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0
ZXIoKSwgZnVuYy5nZXQoKSwgZ2VuZXJhdG9yLnJlc29sdmUoZ2VuZXJhdG9yLnByb3BlcnR5TmFt
ZXMoKS5ldmFsKSwgZ2VuZXJhdG9yLnByb3BlcnR5TmFtZXMoKS5ldmFsKTsKICAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXRDYWxsRXZhbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGZ1
bmMuZ2V0KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNl
dCgpLCBlbmRPZmZzZXQoKSk7CiB9CiAKQEAgLTM2NCwyMCArMzY2LDE5IEBAIFJlZ2lzdGVySUQq
IEZ1bmN0aW9uQ2FsbFZhbHVlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IsIFJlCiAKIFJlZ2lzdGVySUQqIEZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQog
ewotICAgIGlmIChSZWZQdHI8UmVnaXN0ZXJJRD4gbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJG
b3IobV9pZGVudCkpIHsKLSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmN0aW9uID0gZ2Vu
ZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbG9jYWwuZ2V0
KCkpOworICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZVJlc3VsdCA9IGdlbmVyYXRvci5yZXNvbHZl
KG1faWRlbnQpOworCisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gcmVzb2x2ZVJlc3VsdC5s
b2NhbCgpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVt
aXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOwogICAgICAgICBD
YWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBtX2FyZ3MpOwogICAgICAgICBn
ZW5lcmF0b3IuZW1pdExvYWQoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIoKSwganNVbmRlZmlu
ZWQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb25Pcklnbm9yZWQoZHN0LCBjYWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpKSwg
ZnVuY3Rpb24uZ2V0KCksIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVu
ZE9mZnNldCgpKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGNhbGxBcmd1bWVudHMudGhpc1JlZ2lzdGVy
KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBl
bmRPZmZzZXQoKSk7CiAgICAgfQogCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVw
dGggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWly
ZXNEeW5hbWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJv
cGVydHkobV9pZGVudCwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgcmVxdWlyZXNEeW5hbWljQ2hlY2tz
LCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSAmJiAhcmVx
dWlyZXNEeW5hbWljQ2hlY2tzKSB7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0g
Z2VuZXJhdG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBkZXB0
aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNTdGF0aWMo
KSkgeworICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci5uZXdUZW1w
b3JhcnkoKTsKICAgICAgICAgQ2FsbEFyZ3VtZW50cyBjYWxsQXJndW1lbnRzKGdlbmVyYXRvciwg
bV9hcmdzKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRHZXRTdGF0aWNWYXIoZnVuYy5nZXQoKSwg
cmVzb2x2ZVJlc3VsdCk7CiAgICAgICAgIGdlbmVyYXRvci5lbWl0TG9hZChjYWxsQXJndW1lbnRz
LnRoaXNSZWdpc3RlcigpLCBqc1VuZGVmaW5lZCgpKTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9ySWdub3JlZChkc3QsIGZ1bmMu
Z2V0KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgp
LCBlbmRPZmZzZXQoKSk7CiAgICAgfQpAQCAtMzg1LDggKzM4Niw5IEBAIFJlZ2lzdGVySUQqIEZ1
bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdl
bmVyYXRvciwKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci5uZXdUZW1w
b3JhcnkoKTsKICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBtX2Fy
Z3MpOwogICAgIGludCBpZGVudGlmaWVyU3RhcnQgPSBkaXZvdCgpIC0gc3RhcnRPZmZzZXQoKTsK
KwogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oaWRlbnRpZmllclN0YXJ0ICsgbV9p
ZGVudC5sZW5ndGgoKSwgbV9pZGVudC5sZW5ndGgoKSwgMCk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRS
ZXNvbHZlV2l0aFRoaXMoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0ZXIoKSwgZnVuYy5nZXQoKSwg
bV9pZGVudCk7CisgICAgZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aFRoaXMoY2FsbEFyZ3VtZW50
cy50aGlzUmVnaXN0ZXIoKSwgZnVuYy5nZXQoKSwgcmVzb2x2ZVJlc3VsdCwgbV9pZGVudCk7CiAg
ICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbk9y
SWdub3JlZChkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgpLCBjYWxsQXJndW1lbnRzLCBkaXZv
dCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CiB9CiAKQEAgLTU1MCwyNCArNTUyLDIx
IEBAIHN0YXRpYyBSZWdpc3RlcklEKiBlbWl0UG9zdEluY09yRGVjKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAKIFJlZ2lzdGVySUQqIFBvc3RmaXhSZXNvbHZl
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0
ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQo
bV9pZGVudCkpIHsKKyAgICBSZXNvbHZlUmVzdWx0IHJlc29sdmVSZXN1bHQgPSBnZW5lcmF0b3Iu
cmVzb2x2ZShtX2lkZW50KTsKKworICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IHJlc29sdmVS
ZXN1bHQubG9jYWwoKSkgeworICAgICAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1JlYWRPbmx5KCkp
IHsKICAgICAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1p
dFRvSlNOdW1iZXIoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOwogICAg
ICAgICB9Ci0KICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQog
ICAgICAgICAgICAgcmV0dXJuIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIGxvY2FsLCBtX29w
ZXJhdG9yKTsKICAgICAgICAgcmV0dXJuIGVtaXRQb3N0SW5jT3JEZWMoZ2VuZXJhdG9yLCBnZW5l
cmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBsb2NhbCwgbV9vcGVyYXRvcik7CiAgICAgfQog
Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGggPSAwOwotICAgIEpTT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5hbWljQ2hlY2tzID0gZmFs
c2U7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHkobV9pZGVudCwgaW5kZXgs
IGRlcHRoLCB0cnVlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2JhbE9iamVjdCkgJiYgaW5k
ZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYmICFyZXF1aXJlc0R5bmFtaWNDaGVja3MpIHsK
LSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29w
ZWRWYXIoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVj
dCk7CisgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNTdGF0aWMoKSAmJiAhcmVzb2x2ZVJlc3VsdC5p
c1JlYWRPbmx5KCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gZ2VuZXJh
dG9yLmVtaXRHZXRTdGF0aWNWYXIoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCByZXNvbHZlUmVz
dWx0KTsKICAgICAgICAgUmVnaXN0ZXJJRCogb2xkVmFsdWU7CiAgICAgICAgIGlmIChkc3QgPT0g
Z2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkgewogICAgICAgICAgICAgb2xkVmFsdWUgPSAwOwpA
QCAtNTc1LDEzICs1NzQsMTMgQEAgUmVnaXN0ZXJJRCogUG9zdGZpeFJlc29sdmVOb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXMKICAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgICAgIG9sZFZhbHVlID0gZW1pdFBvc3RJbmNPckRlYyhnZW5lcmF0b3Is
IGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHZhbHVlLmdldCgpLCBtX29wZXJhdG9y
KTsKICAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwg
aW5kZXgsIHZhbHVlLmdldCgpLCBnbG9iYWxPYmplY3QpOworICAgICAgICBnZW5lcmF0b3IuZW1p
dFB1dFN0YXRpY1ZhcihyZXNvbHZlUmVzdWx0LCB2YWx1ZS5nZXQoKSk7CiAgICAgICAgIHJldHVy
biBvbGRWYWx1ZTsKICAgICB9Ci0KKyAgICAKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25J
bmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCksIHZhbHVlLmdldCgpLCBtX2lkZW50KTsKKyAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKSwgdmFsdWUuZ2V0KCksIHJlc29sdmVSZXN1bHQsIG1faWRlbnQpOwogICAgIFJl
Z2lzdGVySUQqIG9sZFZhbHVlOwogICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSkgewogICAgICAgICBvbGRWYWx1ZSA9IDA7CkBAIC02NTMsMTEgKzY1MiwxMiBAQCBSZWdp
c3RlcklEKiBQb3N0Zml4RXJyb3JOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZQogCiBSZWdpc3RlcklEKiBEZWxldGVSZXNvbHZlTm9kZTo6ZW1p
dEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkK
IHsKLSAgICBpZiAoZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKQorICAgIFJlc29sdmVS
ZXN1bHQgcmVzb2x2ZVJlc3VsdCA9IGdlbmVyYXRvci5yZXNvbHZlKG1faWRlbnQpOworICAgIGlm
IChyZXNvbHZlUmVzdWx0LmlzUmVnaXN0ZXIoKSkKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5l
bWl0TG9hZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBmYWxzZSk7CiAKICAgICBn
ZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9m
ZnNldCgpKTsKLSAgICBSZWdpc3RlcklEKiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFz
ZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIG1faWRlbnQpOworICAgIFJlZ2lzdGVy
SUQqIGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci50ZW1wRGVzdGlu
YXRpb24oZHN0KSwgcmVzb2x2ZVJlc3VsdCwgbV9pZGVudCk7CiAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0RGVsZXRlQnlJZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGJhc2UpLCBi
YXNlLCBtX2lkZW50KTsKIH0KIApAQCAtNzA4LDEzICs3MDgsMTQgQEAgUmVnaXN0ZXJJRCogVm9p
ZE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKiBkc3QKIAogUmVnaXN0ZXJJRCogVHlwZU9mUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShC
eXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgaWYg
KFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7Cisg
ICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVu
dCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gcmVzb2x2ZVJlc3VsdC5sb2NhbCgpKSB7
CiAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAg
ICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRUeXBlT2YoZ2VuZXJh
dG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOwogICAgIH0KIAotICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBzY3JhdGNoID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3Iu
dGVtcERlc3RpbmF0aW9uKGRzdCksIG1faWRlbnQpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBz
Y3JhdGNoID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIHJlc29sdmVSZXN1bHQsIG1faWRlbnQpOwogICAgIGdlbmVyYXRvci5lbWl0R2V0
QnlJZChzY3JhdGNoLmdldCgpLCBzY3JhdGNoLmdldCgpLCBtX2lkZW50KTsKICAgICBpZiAoZHN0
ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNzM3
LDMyICs3MzgsMjggQEAgUmVnaXN0ZXJJRCogVHlwZU9mVmFsdWVOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXIKIAogUmVnaXN0ZXJJRCogUHJl
Zml4UmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJh
dG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVz
dWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxv
Y2FsID0gcmVzb2x2ZVJlc3VsdC5sb2NhbCgpKSB7CiAgICAgICAgIGlmIChnZW5lcmF0b3IuaXNM
b2NhbENvbnN0YW50KG1faWRlbnQpKSB7CiAgICAgICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRv
ci5pZ25vcmVkUmVzdWx0KCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gcjAgPSBnZW5lcmF0b3IuZW1pdExvYWQoZ2VuZXJhdG9yLmZp
bmFsRGVzdGluYXRpb24oZHN0KSwgKG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cykgPyAxLjAgOiAt
MS4wKTsKICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdEJpbmFyeU9wKG9wX2FkZCwg
cjAuZ2V0KCksIGxvY2FsLCByMC5nZXQoKSwgT3BlcmFuZFR5cGVzKCkpOwogICAgICAgICB9Ci0K
ICAgICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwgbG9jYWwsIG1fb3BlcmF0b3IpOwog
ICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBs
b2NhbCk7CiAgICAgfQogCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGggPSAw
OwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGJvb2wgcmVxdWlyZXNEeW5h
bWljQ2hlY2tzID0gZmFsc2U7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHko
bV9pZGVudCwgaW5kZXgsIGRlcHRoLCB0cnVlLCByZXF1aXJlc0R5bmFtaWNDaGVja3MsIGdsb2Jh
bE9iamVjdCkgJiYgaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpICYmICFyZXF1aXJlc0R5
bmFtaWNDaGVja3MpIHsKLSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBnZW5l
cmF0b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGRl
cHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKKyAgICBpZiAocmVzb2x2ZVJlc3VsdC5pc1N0YXRp
YygpICYmICFyZXNvbHZlUmVzdWx0LmlzUmVhZE9ubHkoKSkgeworICAgICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRvci5lbWl0R2V0U3RhdGljVmFyKGdlbmVyYXRvci50
ZW1wRGVzdGluYXRpb24oZHN0KSwgcmVzb2x2ZVJlc3VsdCk7CiAgICAgICAgIGVtaXRQcmVJbmNP
ckRlYyhnZW5lcmF0b3IsIHByb3BEc3QuZ2V0KCksIG1fb3BlcmF0b3IpOwotICAgICAgICBnZW5l
cmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgsIHByb3BEc3QuZ2V0KCksIGdsb2Jh
bE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3RhdGljVmFyKHJlc29sdmVSZXN1
bHQsIHByb3BEc3QuZ2V0KCkpOwogICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3Rp
bmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKICAgICB9CiAKICAgICBnZW5lcmF0
b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgp
KTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRvci50ZW1wRGVzdGlu
YXRpb24oZHN0KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0
UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgcHJvcERzdC5nZXQoKSwg
bV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJl
c29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHByb3BEc3QuZ2V0KCksIHJl
c29sdmVSZXN1bHQsIG1faWRlbnQpOwogICAgIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIHBy
b3BEc3QuZ2V0KCksIG1fb3BlcmF0b3IpOwogICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNl
LmdldCgpLCBtX2lkZW50LCBwcm9wRHN0LmdldCgpKTsKICAgICByZXR1cm4gZ2VuZXJhdG9yLm1v
dmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKQEAgLTExNTAsMTAg
KzExNDcsMTEgQEAgc3RhdGljIEFMV0FZU19JTkxJTkUgUmVnaXN0ZXJJRCogZW1pdFJlYWRNb2Rp
ZnlBc3NpZ25tZW50KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW4KIAogUmVnaXN0ZXJJRCogUmVhZE1v
ZGlmeVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgUmVnaXN0ZXJJRCogZHN0KQogewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVy
YXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9j
YWxDb25zdGFudChtX2lkZW50KSkgeworICAgIFJlc29sdmVSZXN1bHQgcmVzb2x2ZVJlc3VsdCA9
IGdlbmVyYXRvci5yZXNvbHZlKG1faWRlbnQpOworCisgICAgaWYgKFJlZ2lzdGVySUQgKmxvY2Fs
ID0gcmVzb2x2ZVJlc3VsdC5sb2NhbCgpKSB7CisgICAgICAgIGlmIChyZXNvbHZlUmVzdWx0Lmlz
UmVhZE9ubHkoKSkKICAgICAgICAgICAgIHJldHVybiBlbWl0UmVhZE1vZGlmeUFzc2lnbm1lbnQo
Z2VuZXJhdG9yLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBsb2NhbCwgbV9yaWdo
dCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1f
cmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwotICAgICAgICB9CiAgICAgICAgIAogICAgICAg
ICBpZiAoZ2VuZXJhdG9yLmxlZnRIYW5kU2lkZU5lZWRzQ29weShtX3JpZ2h0SGFzQXNzaWdubWVu
dHMsIG1fcmlnaHQtPmlzUHVyZShnZW5lcmF0b3IpKSkgewogICAgICAgICAgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IHJlc3VsdCA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKQEAgLTExNjcsMjAg
KzExNjUsMTYgQEAgUmVnaXN0ZXJJRCogUmVhZE1vZGlmeVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmUKICAgICAgICAgcmV0dXJuIGdlbmVy
YXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKICAgICB9CiAKLSAg
ICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgSlNPYmplY3QqIGds
b2JhbE9iamVjdCA9IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsK
LSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVw
dGgsIHRydWUsIHJlcXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAh
PSBtaXNzaW5nU3ltYm9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0NoZWNrcykgewotICAg
ICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci5lbWl0R2V0U2NvcGVkVmFy
KGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgZGVwdGgsIGluZGV4LCBnbG9iYWxPYmpl
Y3QpOworICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkgJiYgIXJlc29sdmVSZXN1bHQu
aXNSZWFkT25seSgpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJh
dG9yLmVtaXRHZXRTdGF0aWNWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCByZXNv
bHZlUmVzdWx0KTsKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1pdFJlYWRNb2RpZnlB
c3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMx
LmdldCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJl
c3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwot
ICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgsIHJlc3VsdCwg
Z2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTdGF0aWNWYXIocmVzb2x2
ZVJlc3VsdCwgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsK
ICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBzdGFydE9mZnNldCgp
ICsgbV9pZGVudC5sZW5ndGgoKSwgbV9pZGVudC5sZW5ndGgoKSwgMCk7Ci0gICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCksIHNyYzEuZ2V0KCksIG1faWRlbnQpOworICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2UoZ2VuZXJhdG9yLm5ld1Rl
bXBvcmFyeSgpLCBzcmMxLmdldCgpLCByZXNvbHZlUmVzdWx0LCBtX2lkZW50KTsKICAgICBSZWdp
c3RlcklEKiByZXN1bHQgPSBlbWl0UmVhZE1vZGlmeUFzc2lnbm1lbnQoZ2VuZXJhdG9yLCBnZW5l
cmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIHNyYzEuZ2V0KCkpLCBzcmMxLmdldCgpLCBtX3Jp
Z2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlwZXMoUmVzdWx0VHlwZTo6dW5rbm93blR5cGUoKSwg
bV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigpKSwgdGhpcyk7CiAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCByZXN1bHQpOwogfQpAQCAtMTE4OSwy
NyArMTE4MywyNCBAQCBSZWdpc3RlcklEKiBSZWFkTW9kaWZ5UmVzb2x2ZU5vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZQogCiBSZWdpc3RlcklEKiBBc3Np
Z25SZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Is
IFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0
b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2Fs
Q29uc3RhbnQobV9pZGVudCkpCisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2Vu
ZXJhdG9yLnJlc29sdmUobV9pZGVudCk7CisKKyAgICBpZiAoUmVnaXN0ZXJJRCAqbG9jYWwgPSBy
ZXNvbHZlUmVzdWx0LmxvY2FsKCkpIHsKKyAgICAgICAgaWYgKHJlc29sdmVSZXN1bHQuaXNSZWFk
T25seSgpKQogICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmln
aHQpOwotICAgICAgICAKICAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVt
aXROb2RlKGxvY2FsLCBtX3JpZ2h0KTsKICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9E
ZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKICAgICB9CiAKLSAgICBpbnQgaW5kZXgg
PSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9
IDA7Ci0gICAgYm9vbCByZXF1aXJlc0R5bmFtaWNDaGVja3MgPSBmYWxzZTsKLSAgICBpZiAoZ2Vu
ZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgsIHRydWUsIHJl
cXVpcmVzRHluYW1pY0NoZWNrcywgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3lt
Ym9sTWFya2VyKCkgJiYgIXJlcXVpcmVzRHluYW1pY0NoZWNrcykgeworICAgIGlmIChyZXNvbHZl
UmVzdWx0LmlzU3RhdGljKCkgJiYgIXJlc29sdmVSZXN1bHQuaXNSZWFkT25seSgpKSB7CiAgICAg
ICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgICAgIGRz
dCA9IDA7CiAgICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRz
dCwgbV9yaWdodCk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBp
bmRleCwgdmFsdWUsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U3Rh
dGljVmFyKHJlc29sdmVSZXN1bHQsIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAg
IH0KIAotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZl
QmFzZUZvclB1dChnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIG1faWRlbnQpOworICAgIFJlZlB0
cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZUZvclB1dChnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCksIHJlc29sdmVSZXN1bHQsIG1faWRlbnQpOwogICAgIGlmIChk
c3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKICAgICAgICAgZHN0ID0gMDsKICAgICBS
ZWdpc3RlcklEKiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmlnaHQpOwpAQCAt
MTI5Nyw4ICsxMjg4LDEwIEBAIFJlZ2lzdGVySUQqIENvbW1hTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5
dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzCiAKIFJlZ2lzdGVySUQq
IENvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0
b3IpCiB7CisgICAgUmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29s
dmVDb25zdERlY2wobV9pZGVudCk7CisKICAgICAvLyBGSVhNRTogVGhpcyBjb2RlIGRvZXMgbm90
IG1hdGNoIHRoZSBiZWhhdmlvciBvZiBjb25zdCBpbiBGaXJlZm94LgotICAgIGlmIChSZWdpc3Rl
cklEKiBsb2NhbCA9IGdlbmVyYXRvci5jb25zdFJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAg
aWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gcmVzb2x2ZVJlc3VsdC5sb2NhbCgpKSB7CiAgICAgICAg
IGlmICghbV9pbml0KQogICAgICAgICAgICAgcmV0dXJuIGxvY2FsOwogCkBAIC0xMzA3LDI3ICsx
MzAwLDE1IEBAIFJlZ2lzdGVySUQqIENvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKEJ5dGVj
b2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IpCiAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUg
PSBtX2luaXQgPyBnZW5lcmF0b3IuZW1pdE5vZGUobV9pbml0KSA6IGdlbmVyYXRvci5lbWl0TG9h
ZCgwLCBqc1VuZGVmaW5lZCgpKTsKIAotICAgIFNjb3BlQ2hhaW5JdGVyYXRvciBpdGVyID0gZ2Vu
ZXJhdG9yLnNjb3BlQ2hhaW4oKS0+YmVnaW4oKTsKLSAgICBTY29wZUNoYWluSXRlcmF0b3IgZW5k
ID0gZ2VuZXJhdG9yLnNjb3BlQ2hhaW4oKS0+ZW5kKCk7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsK
LSAgICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlciwgKytkZXB0aCkgewotICAgICAgICBKU09i
amVjdCogY3VycmVudFNjb3BlID0gaXRlci0+Z2V0KCk7Ci0gICAgICAgIGlmICghY3VycmVudFNj
b3BlLT5pc1ZhcmlhYmxlT2JqZWN0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
SlNWYXJpYWJsZU9iamVjdCogY3VycmVudFZhcmlhYmxlT2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNW
YXJpYWJsZU9iamVjdCo+KGN1cnJlbnRTY29wZSk7Ci0gICAgICAgIFN5bWJvbFRhYmxlRW50cnkg
ZW50cnkgPSBjdXJyZW50VmFyaWFibGVPYmplY3QtPnN5bWJvbFRhYmxlKCkuZ2V0KG1faWRlbnQu
aW1wbCgpKTsKLSAgICAgICAgaWYgKGVudHJ5LmlzTnVsbCgpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGdlbmVyYXRv
ci5zY29wZURlcHRoKCkgKyBkZXB0aCwgZW50cnkuZ2V0SW5kZXgoKSwgdmFsdWUuZ2V0KCksIGN1
cnJlbnRWYXJpYWJsZU9iamVjdC0+aXNHbG9iYWxPYmplY3QoKSA/IGN1cnJlbnRWYXJpYWJsZU9i
amVjdCA6IDApOwotICAgIH0KLQorICAgIGlmIChyZXNvbHZlUmVzdWx0LmlzU3RhdGljKCkpCisg
ICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dFN0YXRpY1ZhcihyZXNvbHZlUmVzdWx0LCB2
YWx1ZS5nZXQoKSk7CisgICAgCiAgICAgaWYgKGdlbmVyYXRvci5jb2RlVHlwZSgpICE9IEV2YWxD
b2RlKQogICAgICAgICByZXR1cm4gdmFsdWUuZ2V0KCk7CiAKICAgICAvLyBGSVhNRTogV2hpbGUg
dGhpcyBjb2RlIHNob3VsZCBvbmx5IGJlIGhpdCBpbiBhbiBldmFsIGJsb2NrLCBpdCB3aWxsIGFz
c2lnbgogICAgIC8vIHRvIHRoZSB3cm9uZyBiYXNlIGlmIG1faWRlbnQgZXhpc3RzIGluIGFuIGlu
dGVydmVuaW5nIHdpdGggc2NvcGUuCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5l
cmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbV9pZGVudCk7
CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNl
KGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgcmVzb2x2ZVJlc3VsdCwgbV9pZGVudCk7CiAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCB2YWx1ZS5n
ZXQoKSk7CiB9CiAKQEAgLTE1OTgsMTEgKzE1NzksMTIgQEAgUmVnaXN0ZXJJRCogRm9ySW5Ob2Rl
OjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCog
ZHMKICAgICBib29sIG9wdGltaXplZEZvcmluQWNjZXNzID0gZmFsc2U7CiAgICAgaWYgKG1fbGV4
cHItPmlzUmVzb2x2ZU5vZGUoKSkgewogICAgICAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudCA9
IHN0YXRpY19jYXN0PFJlc29sdmVOb2RlKj4obV9sZXhwciktPmlkZW50aWZpZXIoKTsKLSAgICAg
ICAgcHJvcGVydHlOYW1lID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKGlkZW50KTsKKyAgICAgICAg
UmVzb2x2ZVJlc3VsdCByZXNvbHZlUmVzdWx0ID0gZ2VuZXJhdG9yLnJlc29sdmUoaWRlbnQpOwor
ICAgICAgICBwcm9wZXJ0eU5hbWUgPSByZXNvbHZlUmVzdWx0LmxvY2FsKCk7CiAgICAgICAgIGlm
ICghcHJvcGVydHlOYW1lKSB7CiAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCk7CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvdGVjdCA9
IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3Iu
ZW1pdFJlc29sdmVCYXNlRm9yUHV0KGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgaWRlbnQpOwor
ICAgICAgICAgICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2VG
b3JQdXQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCByZXNvbHZlUmVzdWx0LCBpZGVudCk7CiAK
ICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRP
ZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwogICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRCeUlk
KGJhc2UsIGlkZW50LCBwcm9wZXJ0eU5hbWUpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>