<?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>153535</bug_id>
          
          <creation_ts>2016-01-26 21:58:25 -0800</creation_ts>
          <short_desc>IRC should know which Tmps hold constants, and emit spill code accordingly</short_desc>
          <delta_ts>2016-01-26 23:05:34 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</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>
          
          <blocked>150456</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenb</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1159207</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-26 21:58:25 -0800</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159209</commentid>
    <comment_count>1</comment_count>
      <attachid>269981</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-26 22:02:14 -0800</bug_when>
    <thetext>Created attachment 269981
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159210</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-26 22:03:11 -0800</bug_when>
    <thetext>Attachment 269981 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirTmpSummary.cpp:83:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159213</commentid>
    <comment_count>3</comment_count>
      <attachid>269981</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2016-01-26 22:17:08 -0800</bug_when>
    <thetext>Comment on attachment 269981
the patch

R=me -- do you have full perf output?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159214</commentid>
    <comment_count>4</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-01-26 22:27:45 -0800</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=269981&amp;action=review

The idea looks okay but I am not convinced that is safe.

You can have:

Move(Imm, Tmp1)
Move(Tmp1, Tmp2)
Add(const, Tmp2)
Use(Tmp2)

In the first round, you figure that Tmp1 and 2 should really be merged. Due to back luck, Tmp1 is picked as the name.
In the second round, you have to spill Tmp1. You check it&apos;s value and figure it is a constant.

You would need some very bad luck but that seems feasible to me.

It seems to me that you have to update the TmpSummary when aliasing. What was before a worse spill selection may end up into a bug now.

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1226
&gt; +                    plan.constant = summary-&gt;constant;

You can probably get away with less duplication by doing everything bug filling the SlotOrConstant outside the branch.

SlotOrConstant plan;
if ()
   ... constant plan
else
   ... stackslot plan

Give it a temp

&gt; Source/JavaScriptCore/b3/air/AirTmpSummary.h:49
&gt; +        int64_t constant { 0 };

Why not store the Air::Arg?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159217</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-26 22:42:47 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=269981&amp;action=review
&gt; 
&gt; The idea looks okay but I am not convinced that is safe.
&gt; 
&gt; You can have:
&gt; 
&gt; Move(Imm, Tmp1)
&gt; Move(Tmp1, Tmp2)
&gt; Add(const, Tmp2)
&gt; Use(Tmp2)
&gt; 
&gt; In the first round, you figure that Tmp1 and 2 should really be merged. Due
&gt; to back luck, Tmp1 is picked as the name.
&gt; In the second round, you have to spill Tmp1. You check it&apos;s value and figure
&gt; it is a constant.
&gt; 
&gt; You would need some very bad luck but that seems feasible to me.
&gt; 
&gt; It seems to me that you have to update the TmpSummary when aliasing. What
&gt; was before a worse spill selection may end up into a bug now.

Yup, you&apos;re right.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1226
&gt; &gt; +                    plan.constant = summary-&gt;constant;
&gt; 
&gt; You can probably get away with less duplication by doing everything bug
&gt; filling the SlotOrConstant outside the branch.
&gt; 
&gt; SlotOrConstant plan;
&gt; if ()
&gt;    ... constant plan
&gt; else
&gt;    ... stackslot plan
&gt; 
&gt; Give it a temp
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirTmpSummary.h:49
&gt; &gt; +        int64_t constant { 0 };
&gt; 
&gt; Why not store the Air::Arg?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159219</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-26 22:47:52 -0800</bug_when>
    <thetext>I&apos;m not seeing a big speed-up from this.  I will retest.  But if implementing this means having to do a lot of analysis updates during spilling, then that may be too much complexity for no speed-up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1159221</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-01-26 23:05:24 -0800</bug_when>
    <thetext>Yeah I&apos;m going to abandon this.  &quot;FixStackSlot&quot; is really this patch.


Benchmark report for SunSpider, V8Spider, Octane, Kraken, and AsmBench on shakezilla (MacBookPro11,3).

VMs tested:
&quot;LLVM&quot; at /Volumes/Data/secondary/OpenSource/WebKitBuild/Release/jsc (r195637)
&quot;B3ToT&quot; at /Volumes/Data/tertiary/OpenSource/WebKitBuild/Release/jsc (r195653)
&quot;FixStackSlot&quot; at /Volumes/Data/quinary/OpenSource/WebKitBuild/Release/jsc (r195653)

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

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
SunSpider:
   3d-cube                                    4.7894+-0.2559     ?      4.9212+-0.4678            4.6844+-0.0956          might be 1.0224x faster
   3d-morph                                   5.4443+-0.1522            5.4110+-0.2089     ?      5.5740+-0.2290        ? might be 1.0238x slower
   3d-raytrace                                5.6170+-0.2053            5.5291+-0.0769            5.4171+-0.0780          might be 1.0369x faster
   access-binary-trees                        2.2149+-0.1390     ?      2.5319+-0.6268            2.5278+-0.8981        ? might be 1.1413x slower
   access-fannkuch                            5.7083+-0.2275     ?      5.7520+-0.2915            5.6160+-0.0437          might be 1.0164x faster
   access-nbody                               2.8453+-0.2651            2.8114+-0.3230     ?      2.9543+-0.3683        ? might be 1.0383x slower
   access-nsieve                              3.3110+-0.3001     ?      3.7904+-0.4962     ^      3.1191+-0.0811          might be 1.0615x faster
   bitops-3bit-bits-in-byte                   1.1755+-0.0140            1.1733+-0.0181     ?      1.2276+-0.0572        ? might be 1.0444x slower
   bitops-bits-in-byte                        3.1551+-0.0492     ?      3.1640+-0.0737            3.1606+-0.0467        ?
   bitops-bitwise-and                         1.9755+-0.0293     ?      2.1064+-0.1746            1.9745+-0.0246        
   bitops-nsieve-bits                         2.9530+-0.0587     ?      3.0345+-0.0485     ^      2.9362+-0.0125        
   controlflow-recursive                      2.6573+-0.7910            2.4211+-0.0975            2.2872+-0.0419          might be 1.1619x faster
   crypto-aes                                 4.0558+-0.0580            4.0356+-0.0843     ?      4.1029+-0.1861        ? might be 1.0116x slower
   crypto-md5                                 2.5686+-0.1678            2.4742+-0.0215     ?      2.6687+-0.3550        ? might be 1.0390x slower
   crypto-sha1                                2.5059+-0.2783            2.4903+-0.1492            2.4428+-0.1370          might be 1.0258x faster
   date-format-tofte                          7.3312+-0.2966            6.9319+-0.1673            6.8319+-0.0348        ^ definitely 1.0731x faster
   date-format-xparb                          4.6788+-0.1351     ?      5.0529+-0.8775            4.9351+-0.3952        ? might be 1.0548x slower
   math-cordic                                2.9197+-0.0281     ?      3.1418+-0.3785            2.8995+-0.0521        
   math-partial-sums                          4.9575+-0.2886            4.8896+-0.0920            4.8880+-0.0905          might be 1.0142x faster
   math-spectral-norm                         2.0713+-0.0082     ?      2.0731+-0.0459            2.0570+-0.0632        
   regexp-dna                                 6.3435+-0.1982            6.1319+-0.1590     ?      6.2488+-0.2575          might be 1.0152x faster
   string-base64                              4.8879+-0.5220            4.8155+-0.1738     ^      4.5019+-0.0843          might be 1.0857x faster
   string-fasta                               5.8739+-0.0692            5.8568+-0.1465            5.8030+-0.0912          might be 1.0122x faster
   string-tagcloud                            8.0479+-0.3202            8.0140+-0.3554            7.7443+-0.0373          might be 1.0392x faster
   string-unpack-code                        19.2266+-1.7077           18.3458+-0.8107     ?     18.8305+-1.5089          might be 1.0210x faster
   string-validate-input                      4.4493+-0.1844     ?      4.6125+-0.4244            4.3435+-0.2975          might be 1.0244x faster

   &lt;arithmetic&gt;                               4.6833+-0.1094            4.6735+-0.0593            4.6068+-0.0730          might be 1.0166x faster

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
V8Spider:
   crypto                                    50.4202+-1.0291     ^     38.0345+-0.4847           37.6337+-0.6090        ^ definitely 1.3398x faster
   deltablue                                 76.6903+-2.3078     ^     51.4685+-0.8000     ?     53.4559+-1.3808        ^ definitely 1.4346x faster
   earley-boyer                              45.5573+-0.8511     ^     41.9361+-0.8742           41.8469+-0.4467        ^ definitely 1.0887x faster
   raytrace                                  30.8907+-1.3434     ^     20.3018+-0.6365     ?     20.5273+-0.9701        ^ definitely 1.5049x faster
   regexp                                    63.8780+-2.8251     ?     64.8892+-3.2281           64.2653+-2.6902        ?
   richards                                  53.2545+-1.1488     ^     40.1047+-0.5869     ?     47.0843+-16.2073         might be 1.1310x faster
   splay                                     38.9781+-1.9016           36.6893+-1.7494           36.2443+-1.8178          might be 1.0754x faster

   &lt;geometric&gt;                               49.4164+-0.6504     ^     39.8205+-0.3884     ?     40.6534+-1.8265        ^ definitely 1.2156x faster

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
Octane:
   encrypt                                   0.15251+-0.00208    !     0.16297+-0.00296          0.15864+-0.00407       ? might be 1.0402x slower
   decrypt                                   2.90266+-0.00906    ^     2.85430+-0.02266          2.83900+-0.00300       ^ definitely 1.0224x faster
   deltablue                        x2       0.13560+-0.00320          0.13395+-0.00335    ?     0.13412+-0.00481         might be 1.0111x faster
   earley                                    0.28595+-0.00715          0.27764+-0.00259    ?     0.28103+-0.00357         might be 1.0175x faster
   boyer                                     4.25335+-0.02297    ?     4.36977+-0.13231          4.29641+-0.00876       ! definitely 1.0101x slower
   navier-stokes                    x2       4.86960+-0.17996          4.83430+-0.02650          4.80787+-0.01486         might be 1.0128x faster
   raytrace                         x2       0.85306+-0.00544    !     0.86828+-0.00268    !     0.88498+-0.00581       ! definitely 1.0374x slower
   richards                         x2       0.08555+-0.00069    ^     0.07882+-0.00122    ?     0.07907+-0.00081       ^ definitely 1.0819x faster
   splay                            x2       0.35048+-0.00259    ?     0.35344+-0.00386          0.34989+-0.00126       
   regexp                           x2      25.27622+-0.42318    ^    24.27359+-0.15231         24.05678+-0.33669       ^ definitely 1.0507x faster
   pdfjs                            x2      38.03603+-0.31473         37.69347+-0.10104    ?    37.80200+-0.28297       
   mandreel                         x2      42.71740+-0.82776    ?    43.15691+-0.64838    ?    44.03764+-2.64013       ? might be 1.0309x slower
   gbemu                            x2      29.18268+-0.34543    !    32.38942+-2.62173    ?    34.13318+-3.96887       ! definitely 1.1696x slower
   closure                                   0.56746+-0.00255          0.56601+-0.00445          0.56455+-0.00149       
   jquery                                    7.32850+-0.04465          7.32338+-0.03271    ?     7.33013+-0.07065       ?
   box2d                            x2       9.16494+-0.05151    ^     9.02753+-0.08029    !     9.28304+-0.05046       ! definitely 1.0129x slower
   zlib                             x2     376.69156+-16.47696   ?   385.74034+-10.18427       382.34942+-17.89433      ? might be 1.0150x slower
   typescript                       x2     686.20626+-22.49363       675.96883+-17.63547       668.51090+-12.70805        might be 1.0265x faster

   &lt;geometric&gt;                               5.29248+-0.02903    ?     5.29388+-0.03583    ?     5.31485+-0.06388       ? might be 1.0042x slower

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
Kraken:
   ai-astar                                  129.422+-3.409      ^      94.272+-3.070             93.845+-0.878         ^ definitely 1.3791x faster
   audio-beat-detection                       49.567+-0.523      !      55.176+-0.205      ?      55.540+-0.838         ! definitely 1.1205x slower
   audio-dft                                  95.289+-1.367      ?      96.266+-1.702      ?      96.545+-1.788         ? might be 1.0132x slower
   audio-fft                                  35.509+-0.656      !      44.368+-0.817             43.882+-0.801         ! definitely 1.2358x slower
   audio-oscillator                           59.799+-1.799      ^      52.255+-1.896             51.419+-1.543         ^ definitely 1.1630x faster
   imaging-darkroom                           60.026+-0.746      ?      60.150+-0.083      ?      60.180+-0.075         ?
   imaging-desaturate                         49.252+-2.382      !      86.944+-0.573             86.811+-0.858         ! definitely 1.7626x slower
   imaging-gaussian-blur                      89.319+-4.651      ^      68.899+-2.958             68.210+-0.399         ^ definitely 1.3095x faster
   json-parse-financial                       37.175+-0.642      ?      37.700+-1.064      ?      43.903+-15.552        ? might be 1.1810x slower
   json-stringify-tinderbox                   23.588+-0.719             23.321+-1.359      ?      23.795+-3.512         ?
   stanford-crypto-aes                        43.097+-1.236      ^      40.649+-1.166             40.378+-1.087         ^ definitely 1.0673x faster
   stanford-crypto-ccm                        37.085+-1.656      ?      37.134+-1.540      ?      37.901+-1.152         ? might be 1.0220x slower
   stanford-crypto-pbkdf2                     97.625+-0.655      !      98.836+-0.420      !      99.920+-0.597         ! definitely 1.0235x slower
   stanford-crypto-sha256-iterative           37.577+-1.650      ?      38.586+-1.140      ?      39.282+-1.340         ? might be 1.0454x slower

   &lt;arithmetic&gt;                               60.309+-0.264      ^      59.611+-0.375      ?      60.115+-1.551           might be 1.0032x faster

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
AsmBench:
   bigfib.cpp                               446.1048+-7.0531     ?    460.2276+-16.1047         453.6863+-6.0451        ? might be 1.0170x slower
   cray.c                                   390.9513+-1.0508     ^    375.1922+-5.9795     ?    376.4558+-4.4787        ^ definitely 1.0385x faster
   dry.c                                    426.2250+-2.4951     ^    411.9704+-7.2703     ?    415.3663+-11.4569         might be 1.0261x faster
   FloatMM.c                                680.7536+-1.3438     !    734.1637+-2.4712     ?    734.8278+-4.1856        ! definitely 1.0794x slower
   gcc-loops.cpp                           3414.7884+-16.0611    !   3506.4532+-9.9958     ?   3510.0105+-22.5020       ! definitely 1.0279x slower
   n-body.c                                 820.3629+-1.0765     !    852.7295+-2.3957          851.1387+-2.3577        ! definitely 1.0375x slower
   Quicksort.c                              406.3832+-1.0965     ^    397.3653+-4.6427          392.7680+-2.4018        ^ definitely 1.0347x faster
   stepanov_container.cpp                  3478.7534+-26.8152    ^   3220.7915+-31.0237    ?   3245.4424+-15.6376       ^ definitely 1.0719x faster
   Towers.c                                 232.1444+-1.1496     !    250.9630+-2.9381     ?    253.3819+-5.0959        ! definitely 1.0915x slower

   &lt;geometric&gt;                              711.1437+-1.5959     ?    717.0700+-5.3172     ?    717.3056+-2.8316        ! definitely 1.0087x slower

                                                   LLVM                     B3ToT                  FixStackSlot            FixStackSlot v. LLVM   
Geomean of preferred means:
   &lt;scaled-result&gt;                           34.9997+-0.1968     ^     33.4868+-0.1406     ?     33.6097+-0.4412        ^ definitely 1.0414x faster</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269981</attachid>
            <date>2016-01-26 22:02:14 -0800</date>
            <delta_ts>2016-01-26 22:17:08 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>35587</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTk1NjUzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM3IEBA
CisyMDE2LTAxLTI2ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
SVJDIHNob3VsZCBrbm93IHdoaWNoIFRtcHMgaG9sZCBjb25zdGFudHMsIGFuZCBlbWl0IHNwaWxs
IGNvZGUgYWNjb3JkaW5nbHkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE1MzUzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIENoYW5nZXMgdGhlIG9sZCBVc2VDb3VudHMgYW5hbHlzaXMgdG8gYmUgYSBUbXAt
c3BlY2lmaWMgInN1bW1hcnkiIGFuYWx5c2lzIHRoYXQgdGVsbHMgeW91CisgICAgICAgIGEgbG90
IG9mIGJhc2ljIGZhY3RzIGFib3V0IGFsbCB0bXBzLiBJdCBub3cgYWxzbyB0ZWxscyB5b3UgaWYg
YSBUbXAgd2lsbCBhbHdheXMgaGF2ZSBhCisgICAgICAgIGNvbnN0YW50IHZhbHVlLgorCisgICAg
ICAgIElSQyB1c2VzIHRoaXMgdG8gInNwaWxsIiBjb25zdGFudHMgYnkgc2ltcGx5IHJlbWF0ZXJp
YWxpemluZyB0aGVtLiBQcmV2aW91c2x5LCB3ZSB3b3VsZAorICAgICAgICBhY2hpZXZlIHRoaXMg
ZWZmZWN0IGluIG1hbnkgcGxhY2VzIHVzaW5nIGZpeE9idmlvdXNTcGlsbHMoKSAtIGJ1dCB0aGlz
IHdvdWxkIGZhaWwgaWYgdGhlCisgICAgICAgIFRtcCB1c2UgaGFkIGJlZW4gcmVwbGFjZWQgd2l0
aCBhIHN0YWNrIHVzZS4gSGF2aW5nIGJvdGggSVJDIGFuZCBmaXhPYnZpb3VzU3BpbGxzKCkgYm90
aAorICAgICAgICBrbm93IGhvdyB0byBkbyBzbWFydCB0aGluZ3Mgd2l0aCBjb25zdGFudHMgaXMg
Z29vZCwgYmVjYXVzZSBmaXhPYnZpb3VzU3BpbGxzKCkgc3RpbGwgaGFzCisgICAgICAgIGFuIGVk
Z2UgZm9yIGZsb3ctc2Vuc2l0aXZlIGNvbnN0YW50cy4KKworICAgICAgICBUaGlzIGVyYWRpY2F0
ZXMgb3VyIHRocm91Z2hwdXQgZGVmaWNpdCBhZ2FpbnN0IExMVk0gb24gYm95ZXIuCisKKyAgICAg
ICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGIzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZy5jcHA6CisgICAgICAgICogYjMvYWlyL0FpclRtcFN1bW1hcnkuY3BwOiBBZGRlZC4K
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wU3VtbWFyeTo6U3VtbWFyeTo6ZHVtcCk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OlRtcFN1bW1hcnk6OlRtcFN1bW1hcnkpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpUbXBTdW1tYXJ5OjpvcGVyYXRvcltdKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6VG1wU3VtbWFyeTo6ZHVtcCk6CisgICAgICAgICogYjMvYWlyL0FpclRtcFN1bW1hcnkuaDog
Q29waWVkIGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJVc2VDb3VudHMuaC4K
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VXNlQ291bnRzOjpDb3VudHM6OmR1bXApOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpVc2VDb3VudHM6OlVzZUNvdW50cyk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlVzZUNvdW50czo6b3BlcmF0b3JbXSk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlVzZUNvdW50czo6ZHVtcCk6IERlbGV0ZWQuCisgICAg
ICAgICogYjMvYWlyL0FpclVzZUNvdW50cy5oOiBSZW1vdmVkLgorCiAyMDE2LTAxLTI2ICBGaWxp
cCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAgVGFpbCBkdXBsaWNhdGlvbiBz
aG91bGQgYnJlYWsgY3JpdGljYWwgZWRnZXMgZmlyc3QKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Q01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDE5NTY1MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtOTgsNiArOTgsNyBAQCBzZXQoSmF2
YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJTcGlsbEV2ZXJ5dGhpbmcuY3BwCiAg
ICAgYjMvYWlyL0FpclN0YWNrU2xvdC5jcHAKICAgICBiMy9haXIvQWlyVG1wLmNwcAorICAgIGIz
L2Fpci9BaXJUbXBTdW1tYXJ5LmNwcAogICAgIGIzL2Fpci9BaXJUbXBXaWR0aC5jcHAKICAgICBi
My9haXIvQWlyVmFsaWRhdGUuY3BwCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZh
U2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CShyZXZpc2lvbiAxOTU2NTMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMzE3LDcgKzMx
Nyw3IEBACiAJCTBGMzczMDhEMUMwQkQyOTEwMDA1MkJGQSAvKiBCM1BoaUNoaWxkcmVuLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjM3MzA4QjFDMEJE
MjkxMDAwNTJCRkEgLyogQjNQaGlDaGlsZHJlbi5oICovOyB9OwogCQkwRjM3MzA4RjFDMENENjg1
MDAwNTJCRkEgLyogRGlzYWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjM3MzA4RTFDMENENjg1MDAw
NTJCRkEgLyogRGlzYWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlLmggKi87IH07CiAJCTBG
MzczMDkxMUMwQ0Q3MEMwMDA1MkJGQSAvKiBBbGxvd01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2Uu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGMzczMDkw
MUMwQ0Q3MEMwMDA1MkJGQSAvKiBBbGxvd01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UuaCAqLzsg
fTsKLQkJMEYzNzMwOTMxQzBENjdFRTAwMDUyQkZBIC8qIEFpclVzZUNvdW50cy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEYzNzMwOTIxQzBENjdFRTAw
MDUyQkZBIC8qIEFpclVzZUNvdW50cy5oICovOyB9OworCQkwRjM3MzA5MzFDMEQ2N0VFMDAwNTJC
RkEgLyogQWlyVG1wU3VtbWFyeS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEYzNzMwOTIxQzBENjdFRTAwMDUyQkZBIC8qIEFpclRtcFN1bW1hcnkuaCAq
LzsgfTsKIAkJMEYzOEIwMTExN0NGMDc4MDAwQjE0NEQzIC8qIExMSW50RW50cnlwb2ludC5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjM4QjAwRjE3
Q0YwNzdGMDBCMTQ0RDMgLyogTExJbnRFbnRyeXBvaW50LmNwcCAqLzsgfTsKIAkJMEYzOEIwMTIx
N0NGMDc4MzAwQjE0NEQzIC8qIExMSW50RW50cnlwb2ludC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEYzOEIwMTAxN0NGMDc3RjAwQjE0NEQzIC8qIExM
SW50RW50cnlwb2ludC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7
IH07IH07CiAJCTBGMzhCMDE3MTdDRkU3NTUwMEIxNDREMyAvKiBERkdDb21waWxhdGlvbktleS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjM4QjAx
MzE3Q0ZFNzU1MDBCMTQ0RDMgLyogREZHQ29tcGlsYXRpb25LZXkuY3BwICovOyB9OwpAQCAtNDM1
LDYgKzQzNSw3IEBACiAJCTBGNjRCMjc5MUE3OTU3QjIwMDZFNEU2NiAvKiBDYWxsRWRnZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjY0QjI3NzFB
Nzk1N0IyMDA2RTRFNjYgLyogQ2FsbEVkZ2UuY3BwICovOyB9OwogCQkwRjY0QjI3QTFBNzk1N0Iy
MDA2RTRFNjYgLyogQ2FsbEVkZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGNjRCMjc4MUE3OTU3QjIwMDZFNEU2NiAvKiBDYWxsRWRnZS5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGNjRFQUYzMUM0
RUNEMDYwMDYyMUU5QiAvKiBBaXJBcmdJbmxpbmVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjY0RUFGMjFDNEVDRDA2MDA2MjFFOUIgLyogQWlyQXJn
SW5saW5lcy5oICovOyB9OworCQkwRjY2NkI0OTFDNTg4QjAxMDBBNDU4RDIgLyogQWlyVG1wU3Vt
bWFyeS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
RjY2NkI0ODFDNTg4QjAxMDBBNDU4RDIgLyogQWlyVG1wU3VtbWFyeS5jcHAgKi87IH07CiAJCTBG
NjY2RUMwMTgzNTY2RjkwMEQwMTdGMSAvKiBCeXRlY29kZUxpdmVuZXNzQW5hbHlzaXNJbmxpbmVz
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjY2NkVC
RTE4MzU2NkY5MDBEMDE3RjEgLyogQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzSW5saW5lcy5oICov
OyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGNjY2RUMx
MTgzNTY2RjkwMEQwMTdGMSAvKiBGdWxsQnl0ZWNvZGVMaXZlbmVzcy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2NjZFQkYxODM1NjZGOTAwRDAxN0Yx
IC8qIEZ1bGxCeXRlY29kZUxpdmVuZXNzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY2NjZFQzYxODM1NjcyQjAwRDAxN0YxIC8qIERGR0F2YWls
YWJpbGl0eS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRjY2NkVDMjE4MzU2NzJCMDBEMDE3RjEgLyogREZHQXZhaWxhYmlsaXR5LmNwcCAqLzsgfTsK
QEAgLTI1MDQsNyArMjUwNSw3IEBACiAJCTBGMzczMDhCMUMwQkQyOTEwMDA1MkJGQSAvKiBCM1Bo
aUNoaWxkcmVuLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEIzUGhpQ2hpbGRy
ZW4uaDsgcGF0aCA9IGIzL0IzUGhpQ2hpbGRyZW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEYzNzMwOEUxQzBDRDY4NTAwMDUyQkZBIC8qIERpc2FsbG93TWFjcm9TY3JhdGNoUmVn
aXN0ZXJVc2FnZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEaXNhbGxvd01h
Y3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MEYzNzMwOTAxQzBDRDcwQzAwMDUyQkZBIC8qIEFsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2Fn
ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBbGxvd01hY3JvU2NyYXRjaFJl
Z2lzdGVyVXNhZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJMEYzNzMwOTIxQzBE
NjdFRTAwMDUyQkZBIC8qIEFpclVzZUNvdW50cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBBaXJVc2VDb3VudHMuaDsgcGF0aCA9IGIzL2Fpci9BaXJVc2VDb3VudHMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEYzNzMwOTIxQzBENjdFRTAwMDUyQkZBIC8qIEFp
clRtcFN1bW1hcnkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWlyVG1wU3Vt
bWFyeS5oOyBwYXRoID0gYjMvYWlyL0FpclRtcFN1bW1hcnkuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJMEYzOEIwMEYxN0NGMDc3RjAwQjE0NEQzIC8qIExMSW50RW50cnlwb2ludC5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBMTEludEVudHJ5cG9pbnQuY3BwOyBwYXRoID0gbGxpbnQv
TExJbnRFbnRyeXBvaW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEYzOEIw
MTAxN0NGMDc3RjAwQjE0NEQzIC8qIExMSW50RW50cnlwb2ludC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBM
TEludEVudHJ5cG9pbnQuaDsgcGF0aCA9IGxsaW50L0xMSW50RW50cnlwb2ludC5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQkwRjM4QjAxMzE3Q0ZFNzU1MDBCMTQ0RDMgLyogREZHQ29t
cGlsYXRpb25LZXkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gREZH
Q29tcGlsYXRpb25LZXkuY3BwOyBwYXRoID0gZGZnL0RGR0NvbXBpbGF0aW9uS2V5LmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI2MjIsNiArMjYyMyw3IEBACiAJCTBGNjRCMjc3
MUE3OTU3QjIwMDZFNEU2NiAvKiBDYWxsRWRnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBDYWxsRWRnZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTBGNjRCMjc4MUE3OTU3QjIwMDZFNEU2NiAvKiBDYWxsRWRnZS5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBDYWxsRWRnZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQkwRjY0RUFGMjFDNEVDRDA2MDA2MjFFOUIgLyogQWlyQXJnSW5saW5lcy5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBBaXJBcmdJbmxpbmVzLmg7IHBhdGggPSBiMy9haXIvQWly
QXJnSW5saW5lcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjY2NkI0ODFDNTg4
QjAxMDBBNDU4RDIgLyogQWlyVG1wU3VtbWFyeS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IG5hbWUgPSBBaXJUbXBTdW1tYXJ5LmNwcDsgcGF0aCA9IGIzL2Fpci9BaXJUbXBTdW1t
YXJ5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY2NjZFQkUxODM1NjZGOTAw
RDAxN0YxIC8qIEJ5dGVjb2RlTGl2ZW5lc3NBbmFseXNpc0lubGluZXMuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzSW5saW5lcy5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRjY2NkVCRjE4MzU2NkY5MDBEMDE3RjEgLyog
RnVsbEJ5dGVjb2RlTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
RnVsbEJ5dGVjb2RlTGl2ZW5lc3MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY2
NjZFQzIxODM1NjcyQjAwRDAxN0YxIC8qIERGR0F2YWlsYWJpbGl0eS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBERkdBdmFpbGFiaWxpdHkuY3BwOyBwYXRoID0gZGZn
L0RGR0F2YWlsYWJpbGl0eS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC00OTY3
LDkgKzQ5NjksMTAgQEAKIAkJCQkwRkVDODU2ODFCREFDREM3MDA4MEZGNzQgLyogQWlyVG1wLmNw
cCAqLywKIAkJCQkwRkVDODU2OTFCREFDREM3MDA4MEZGNzQgLyogQWlyVG1wLmggKi8sCiAJCQkJ
MEZFQzg1NkExQkRBQ0RDNzAwODBGRjc0IC8qIEFpclRtcElubGluZXMuaCAqLywKKwkJCQkwRjY2
NkI0ODFDNTg4QjAxMDBBNDU4RDIgLyogQWlyVG1wU3VtbWFyeS5jcHAgKi8sCisJCQkJMEYzNzMw
OTIxQzBENjdFRTAwMDUyQkZBIC8qIEFpclRtcFN1bW1hcnkuaCAqLywKIAkJCQkwRkUwRTRBQjFD
MjRDOTRBMDAyRTE3QjYgLyogQWlyVG1wV2lkdGguY3BwICovLAogCQkJCTBGRTBFNEFDMUMyNEM5
NEEwMDJFMTdCNiAvKiBBaXJUbXBXaWR0aC5oICovLAotCQkJCTBGMzczMDkyMUMwRDY3RUUwMDA1
MkJGQSAvKiBBaXJVc2VDb3VudHMuaCAqLywKIAkJCQkwRkVDODU2QjFCREFDREM3MDA4MEZGNzQg
LyogQWlyVmFsaWRhdGUuY3BwICovLAogCQkJCTBGRUM4NTZDMUJEQUNEQzcwMDgwRkY3NCAvKiBB
aXJWYWxpZGF0ZS5oICovLAogCQkJCTBGNjE4MzQ0MUM0NUY2NjAwMDcyNDUwQiAvKiB0ZXN0YWly
LmNwcCAqLywKQEAgLTcwMjksNyArNzAzMiw3IEBACiAJCQkJMEYzMzhFMTYxQkYwMjc2QzAwMTND
ODhGIC8qIEIzVmFsdWVLZXlJbmxpbmVzLmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODU3NDFC
REFDREM3MDA4MEZGNzQgLyogQWlyQ0NhbGxTcGVjaWFsLmggaW4gSGVhZGVycyAqLywKIAkJCQkw
RkVDODU3NjFCREFDREM3MDA4MEZGNzQgLyogQWlyQ29kZS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJ
MEYzNzMwOTMxQzBENjdFRTAwMDUyQkZBIC8qIEFpclVzZUNvdW50cy5oIGluIEhlYWRlcnMgKi8s
CisJCQkJMEYzNzMwOTMxQzBENjdFRTAwMDUyQkZBIC8qIEFpclRtcFN1bW1hcnkuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTBGNDU3MDM5MUJFNDRDOTEwMDYyQTYyOSAvKiBBaXJFbGltaW5hdGVEZWFk
Q29kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNzlDRkM2RjAxQzMzQjEwMDAwQzc2OEVBIC8qIExM
SW50UENSYW5nZXMuaCBpbiBIZWFkZXJzICovLAogCQkJCTc5RDVDRDVCMUMxMTA2QTkwMENFQ0Ew
NyAvKiBTYW1wbGluZ1Byb2ZpbGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTg5MDUsNiArODkwOCw3
IEBACiAJCQkJQTdEOUEyOTQxN0EwQkM3NDAwRUUyNjE4IC8qIERGR0F0VGFpbEFic3RyYWN0U3Rh
dGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEY2NjZFQzYxODM1NjcyQjAwRDAxN0YxIC8qIERG
R0F2YWlsYWJpbGl0eS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjJCOUNFMjE5RDBCQTdEMDBC
MUQxQjUgLyogREZHQXZhaWxhYmlsaXR5TWFwLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTBGNjY2
QjQ5MUM1ODhCMDEwMEE0NThEMiAvKiBBaXJUbXBTdW1tYXJ5LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTBGNzI1Q0E3MUM1MDNERUQwMEFEOTQzQSAvKiBCM0VsaW1pbmF0ZUNvbW1vblN1YmV4cHJl
c3Npb25zLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNzE0Q0E0MTZFQTkyRjAwMEYzRUJFQiAv
KiBERkdCYWNrd2FyZHNQcm9wYWdhdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE3
RDg5Q0YyMTdBMEI4Q0MwMDc3M0FEOCAvKiBERkdCYXNpY0Jsb2NrLmNwcCBpbiBTb3VyY2VzICov
LApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAJKHJldmlzaW9uIDE5NTY1MykKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw4ICszNSw4IEBACiAjaW5jbHVkZSAiQWlyUGhh
c2VTY29wZS5oIgogI2luY2x1ZGUgIkFpclJlZ2lzdGVyUHJpb3JpdHkuaCIKICNpbmNsdWRlICJB
aXJUbXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyVG1wU3VtbWFyeS5oIgogI2luY2x1ZGUgIkFp
clRtcFdpZHRoLmgiCi0jaW5jbHVkZSAiQWlyVXNlQ291bnRzLmgiCiAjaW5jbHVkZSA8d3RmL0xp
c3REdW1wLmg+CiAjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CiAKQEAgLTY3MiwxMSArNjcy
LDExIEBAIHByb3RlY3RlZDoKIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgogY2xhc3MgQ29sb3Jp
bmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4g
ewogcHVibGljOgotICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0
bXBXaWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1
bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNv
ZGUsIFRtcFdpZHRoJiB0bXBXaWR0aCwgY29uc3QgVG1wU3VtbWFyeSYgdG1wU3VtbWFyeSwgY29u
c3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQogICAgICAgICA6IEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+KHJlZ3NJblByaW9yaXR5T3JkZXIodHlwZSksIEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKSwgdG1wQXJy
YXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCkKICAgICAgICAgLCBtX2NvZGUoY29kZSkKICAg
ICAgICAgLCBtX3RtcFdpZHRoKHRtcFdpZHRoKQotICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNv
dW50cykKKyAgICAgICAgLCBtX3RtcFN1bW1hcnkodG1wU3VtbWFyeSkKICAgICB7CiAgICAgICAg
IGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCk7CiAgICAgICAgIGJ1aWxkKCk7CkBAIC05ODMsMTUg
Kzk4MywxNSBAQCBwcml2YXRlOgogCiAgICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVh
bCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9m
IHdhcm0gdXNlcyBhbmQKICAgICAgICAgICAgIC8vIGRlZnMuCi0gICAgICAgICAgICBjb25zdCBV
c2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwotICAgICAg
ICAgICAgaWYgKCFjb3VudHMpCisgICAgICAgICAgICBjb25zdCBUbXBTdW1tYXJ5OjpTdW1tYXJ5
KiBzdW1tYXJ5ID0gbV90bXBTdW1tYXJ5W3RtcF07CisgICAgICAgICAgICBpZiAoIXN1bW1hcnkp
CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5m
aW5pdHkoKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMt
Pm51bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOworICAgICAgICAgICAgZG91YmxlIHVzZXMg
PSBzdW1tYXJ5LT5udW1XYXJtVXNlcyArIHN1bW1hcnktPm51bURlZnM7CiAKICAgICAgICAgICAg
IC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3BpbGwuIFdl
IGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKICAgICAgICAgICAgIC8vIGNhc2VzLgotICAg
ICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IGNvdW50cy0+bnVtRGVmcykKKyAg
ICAgICAgICAgIGlmIChzdW1tYXJ5LT5oYXNDb25zdGFudCkKICAgICAgICAgICAgICAgICB1c2Vz
IC89IDI7CiAKICAgICAgICAgICAgIHJldHVybiBkZWdyZWUgLyB1c2VzOwpAQCAtMTA5NSwxNSAr
MTA5NSwxNSBAQCBwcml2YXRlOgogCiAgICAgQ29kZSYgbV9jb2RlOwogICAgIFRtcFdpZHRoJiBt
X3RtcFdpZHRoOwotICAgIC8vIEZJWE1FOiBzcGlsbGluZyBzaG91bGQgbm90IHR5cGUgc3BlY2lm
aWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1c2luZyBVc2VDb3VudHMuCi0gICAgY29u
c3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOworICAgIC8vIEZJWE1FOiBzcGlsbGluZyBz
aG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1c2lu
ZyBUbXBTdW1tYXJ5LgorICAgIGNvbnN0IFRtcFN1bW1hcnkmIG1fdG1wU3VtbWFyeTsKIH07CiAK
IGNsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIHsKIHB1YmxpYzoKICAgICBJdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQogICAgICAgICA6IG1fY29kZShjb2RlKQot
ICAgICAgICAsIG1fdXNlQ291bnRzKGNvZGUpCisgICAgICAgICwgbV90bXBTdW1tYXJ5KGNvZGUp
CiAgICAgewogICAgIH0KIApAQCAtMTE0NSw3ICsxMTQ1LDcgQEAgcHJpdmF0ZToKICAgICAgICAg
ICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKICAg
ICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlKG1fY29kZSk7CiAgICAgICAgICAgICAKLSAg
ICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1w
V2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAgICAgQ29sb3Jp
bmdBbGxvY2F0b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV90bXBTdW1t
YXJ5LCB1bnNwaWxsYWJsZVRtcHMpOwogICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWly
ZXNTcGlsbGluZygpKSB7CiAgICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxs
b2NhdG9yKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjA2LDE4ICsxMjA2LDM1IEBA
IHByaXZhdGU6CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzdHJ1Y3QgU2xvdE9yQ29uc3RhbnQg
eworICAgICAgICBTdGFja1Nsb3QqIHNsb3QgeyBudWxscHRyIH07CisgICAgICAgIGludDY0X3Qg
Y29uc3RhbnQgeyAwIH07CisgICAgfTsKKwogICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgog
ICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBh
bGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCiAgICAgewotICAg
ICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsKKyAgICAgICAgSGFzaE1h
cDxUbXAsIFNsb3RPckNvbnN0YW50PiBzcGlsbFBsYW5zOwogICAgICAgICBmb3IgKFRtcCB0bXAg
OiBhbGxvY2F0b3Iuc3BpbGxlZFRtcHMoKSkgewogICAgICAgICAgICAgLy8gQWxsIHRoZSBzcGls
bGVkIHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCiAgICAgICAgICAgICB1bnNwaWxsYWJsZVRt
cHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOwogCi0g
ICAgICAgICAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQgdmFsdWUu
CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90LCBvciBmaW5kIHRoZSBjb25zdGFu
dCwgZm9yIGVhY2ggc3BpbGxlZCB2YWx1ZS4KKyAgICAgICAgICAgIGlmIChjb25zdCBUbXBTdW1t
YXJ5OjpTdW1tYXJ5KiBzdW1tYXJ5ID0gbV90bXBTdW1tYXJ5W3RtcF0pIHsKKyAgICAgICAgICAg
ICAgICBpZiAoc3VtbWFyeS0+aGFzQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xv
dE9yQ29uc3RhbnQgcGxhbjsKKyAgICAgICAgICAgICAgICAgICAgcGxhbi5jb25zdGFudCA9IHN1
bW1hcnktPmNvbnN0YW50OworICAgICAgICAgICAgICAgICAgICBib29sIGlzTmV3VG1wID0gc3Bp
bGxQbGFucy5hZGQodG1wLCBwbGFuKS5pc05ld0VudHJ5OworICAgICAgICAgICAgICAgICAgICBB
U1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1RtcCk7CisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAog
ICAgICAgICAgICAgU3RhY2tTbG90KiBzdGFja1Nsb3QgPSBtX2NvZGUuYWRkU3RhY2tTbG90KAog
ICAgICAgICAgICAgICAgIG1fdG1wV2lkdGgud2lkdGgodG1wKSA8PSBBcmc6OldpZHRoMzIgPyA0
IDogOCwgU3RhY2tTbG90S2luZDo6QW5vbnltb3VzKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdU
bXAgPSBzdGFja1Nsb3RzLmFkZCh0bXAsIHN0YWNrU2xvdCkuaXNOZXdFbnRyeTsKKyAgICAgICAg
ICAgIFNsb3RPckNvbnN0YW50IHBsYW47CisgICAgICAgICAgICBwbGFuLnNsb3QgPSBzdGFja1Ns
b3Q7CisgICAgICAgICAgICBib29sIGlzTmV3VG1wID0gc3BpbGxQbGFucy5hZGQodG1wLCBwbGFu
KS5pc05ld0VudHJ5OwogICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChpc05ld1RtcCwgaXNOZXdU
bXApOwogICAgICAgICB9CiAKQEAgLTEyNDYsMTIgKzEyNjMsMjAgQEAgcHJpdmF0ZToKICAgICAg
ICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoCiAgICAgICAgICAgICAgICAgICAgIFsmXSAoQXJn
JiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGggd2lkdGgpIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuaXNUbXAoKSAmJiBhcmdUeXBlID09IHR5
cGUgJiYgIWFyZy5pc1JlZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBz
dGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChhcmcudG1wKCkpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChzdGFja1Nsb3RFbnRyeSAhPSBzdGFja1Nsb3RzLmVuZCgpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWNlIHRoZSBjaGVjayBmb3Igc3RhY2tT
bG90RW50cnktPnZhbHVlLnNsb3QuIElmIGl0J3MgbnVsbCwgaXQKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBtZWFucyB0aGF0IHRoZSBUbXAgaGFzIGEgY29uc3RhbnQgdmFsdWUuIFdl
IGNvdWxkIGRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9u
IGhlcmUgd2hlcmUgd2UgY2hlY2sgaWYgdGhlIGluc3QgYWNjZXB0cyBhbiBpbW02NC4gQnV0Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBub3QgY2xlYXIgdGhhdCB0aGlzIHdv
dWxkIGV2ZXIgYmUgZWZmZWN0aXZlLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBUbXBTdW1tYXJ5IGNvbnN0YW50IHByb3BhZ2F0aW9uIGlzIG11Y2ggZHVtYmVyIHRo
YW4gd2hhdCBCMyB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxy
ZWFkeSBkb25lLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gc3Bp
bGxQbGFucy5maW5kKGFyZy50bXAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KGl0ZXIgIT0gc3BpbGxQbGFucy5lbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmJiBpdGVyLT52YWx1ZS5zbG90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYm
IGluc3QuYWRtaXRzU3RhY2soYXJnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGFja1Nsb3RFbnRyeS0+dmFsdWUtPmVuc3VyZVNpemUoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGl0ZXItPnZhbHVlLnNsb3QtPmVuc3VyZVNpemUoCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU1vdmUzMklmRGlkU3BpbGwgPyA0IDogQXJnOjpi
eXRlcyh3aWR0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBBcmc6
OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGFyZyA9IEFyZzo6c3RhY2soaXRlci0+dmFsdWUuc2xvdCk7CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRpZFNwaWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMjY1LDggKzEyOTAsOCBA
QCBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgYXJnVHlw
ZSAhPSB0eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAg
ICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3RzLmZpbmQodG1wKTsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gc3BpbGxQbGFucy5maW5kKHRtcCk7
CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyID09IHNwaWxsUGxhbnMuZW5kKCkpIHsKICAg
ICAgICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhcyA9IGFsbG9jYXRvci5nZXRBbGlhc1doZW5T
cGlsbGluZyh0bXApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzICE9IHRtcCkg
ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGFsaWFzOwpAQCAtMTI3NSw5ICsx
MzAwLDIzIEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBcmcgYXJnID0gQXJnOjpz
dGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWl0
ZXItPnZhbHVlLnNsb3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG1fY29kZS5u
ZXdUbXAodHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRk
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOworCisgICAgICAg
ICAgICAgICAgICAgICAgICBBU1NFUlQocm9sZSAhPSBBcmc6OlNjcmF0Y2gpOworCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGluc3RJbmRleCwgTW92ZSwgaW5zdC5vcmlnaW4sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEFyZzo6aW1tNjQoaXRlci0+dmFsdWUuY29uc3RhbnQpLCB0bXAp
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQXJnIGFy
ZyA9IEFyZzo6c3RhY2soaXRlci0+dmFsdWUuc2xvdCk7CiAgICAgICAgICAgICAgICAgICAgIE9w
Y29kZSBtb3ZlID0gT29wczsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGFja1Nsb3RF
bnRyeS0+dmFsdWUtPmJ5dGVTaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChp
dGVyLT52YWx1ZS5zbG90LT5ieXRlU2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2Ug
NDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3Zl
MzIgOiBNb3ZlRmxvYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEzMTAs
NyArMTM0OSw3IEBAIHByaXZhdGU6CiAKICAgICBDb2RlJiBtX2NvZGU7CiAgICAgVG1wV2lkdGgg
bV90bXBXaWR0aDsKLSAgICBVc2VDb3VudHM8VG1wPiBtX3VzZUNvdW50czsKKyAgICBUbXBTdW1t
YXJ5IG1fdG1wU3VtbWFyeTsKICAgICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMgeyAwIH07CiB9
OwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFN1bW1hcnkuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wU3VtbWFy
eS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRt
cFN1bW1hcnkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkFpclRtcFN1bW1hcnkuaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisK
KyNpbmNsdWRlICJBaXJBcmdJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyQmxvY2tXb3JrbGlzdC5o
IgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKyNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5oIgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgVG1w
U3VtbWFyeTo6U3VtbWFyeTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIG91
dC5wcmludCgKKyAgICAgICAgIntudW1XYXJtVXNlcyA9ICIsIG51bVdhcm1Vc2VzLCAiLCBudW1D
b2xkVXNlcyA9ICIsIG51bUNvbGRVc2VzLCAiLCBudW1EZWZzID0gIiwKKyAgICAgICAgbnVtRGVm
cywgIiwgY29uc3RhbnQgPSAiKTsKKyAgICBpZiAoaGFzQ29uc3RhbnQpCisgICAgICAgIG91dC5w
cmludChjb25zdGFudCk7CisgICAgZWxzZQorICAgICAgICBvdXQucHJpbnQoIjxub25lPiIpOwor
ICAgIG91dC5wcmludCgifSIpOworfQorCitUbXBTdW1tYXJ5OjpUbXBTdW1tYXJ5KENvZGUmIGNv
ZGUpCit7CisgICAgLy8gRmluZCBub24tcmFyZSBibG9ja3MuCisgICAgQmxvY2tXb3JrbGlzdCBm
YXN0V29ya2xpc3Q7CisgICAgZmFzdFdvcmtsaXN0LnB1c2goY29kZVswXSk7CisgICAgd2hpbGUg
KEJhc2ljQmxvY2sqIGJsb2NrID0gZmFzdFdvcmtsaXN0LnBvcCgpKSB7CisgICAgICAgIGZvciAo
RnJlcXVlbnRlZEJsb2NrJiBzdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7CisgICAg
ICAgICAgICBpZiAoIXN1Y2Nlc3Nvci5pc1JhcmUoKSkKKyAgICAgICAgICAgICAgICBmYXN0V29y
a2xpc3QucHVzaChzdWNjZXNzb3IuYmxvY2soKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgICAg
IAorICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7CisgICAgICAgIGRvdWJsZSBm
cmVxdWVuY3kgPSBibG9jay0+ZnJlcXVlbmN5KCk7CisgICAgICAgIGlmICghZmFzdFdvcmtsaXN0
LnNhdyhibG9jaykpCisgICAgICAgICAgICBmcmVxdWVuY3kgKj0gT3B0aW9uczo6cmFyZUJsb2Nr
UGVuYWx0eSgpOworICAgICAgICBmb3IgKEluc3QmIGluc3QgOiAqYmxvY2spIHsKKyAgICAgICAg
ICAgIGlmICgoaW5zdC5vcGNvZGUgPT0gTW92ZSB8fCBpbnN0Lm9wY29kZSA9PSBNb3ZlMzIpCisg
ICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBdLmlzU29tZUltbSgpCisgICAgICAgICAgICAg
ICAgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3Vs
dCA9IG1fbWFwLmFkZChpbnN0LmFyZ3NbMV0udG1wKCksIFN1bW1hcnkoKSk7CisgICAgICAgICAg
ICAgICAgU3VtbWFyeSYgc3VtbWFyeSA9IHJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgICAg
ICAgICAgICAgaWYgKHJlc3VsdC5pc05ld0VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHN1
bW1hcnkuaGFzQ29uc3RhbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LmNv
bnN0YW50ID0gaW5zdC5hcmdzWzBdLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuaGFzQ29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICBzdW1tYXJ5Lm51bUNvbnN0RGVmcysrOworICAgICAgICAgICAgICAgIHN1bW1hcnku
bnVtRGVmcysrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpbnN0LmZvckVhY2hUbXAoCisgICAgICAgICAgICAgICAgWyZdIChUbXAmIHRt
cCwgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSwgQXJnOjpXaWR0aCkgeworICAgICAgICAgICAg
ICAgICAgICBTdW1tYXJ5JiBzdW1tYXJ5ID0gbV9tYXAuYWRkKHRtcCwgU3VtbWFyeSgpKS5pdGVy
YXRvci0+dmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNXYXJtVXNlKHJv
bGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS5udW1XYXJtVXNlcyArPSBmcmVx
dWVuY3k7CisgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQ29sZFVzZShyb2xlKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkubnVtQ29sZFVzZXMgKz0gZnJlcXVlbmN5Owor
ICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURlZihyb2xlKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgc3VtbWFyeS5udW1EZWZzICs9IGZyZXF1ZW5jeTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN1bW1hcnkuaGFzQ29uc3RhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCitjb25z
dCBUbXBTdW1tYXJ5OjpTdW1tYXJ5KiBUbXBTdW1tYXJ5OjpvcGVyYXRvcltdKFRtcCB0bXApIGNv
bnN0Cit7CisgICAgYXV0byBpdGVyID0gbV9tYXAuZmluZCh0bXApOworICAgIGlmIChpdGVyID09
IG1fbWFwLmVuZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gJml0ZXIt
PnZhbHVlOworfQorCit2b2lkIFRtcFN1bW1hcnk6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29u
c3QKK3sKKyAgICBvdXQucHJpbnQobWFwRHVtcChtX21hcCkpOworfQorCit9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFN1bW1hcnkuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcFN1bW1hcnkuaAkocmV2aXNpb24g
MTk1NjUzKQkoZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclVzZUNvdW50cy5o
OjE5NTY1MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wU3VtbWFyeS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJVc2VDb3VudHNfaAorI2Rl
ZmluZSBBaXJVc2VDb3VudHNfaAorCisjaWYgRU5BQkxFKEIzX0pJVCkKKworI2luY2x1ZGUgIkFp
ckFyZ0lubGluZXMuaCIKKyNpbmNsdWRlICJBaXJCbG9ja1dvcmtsaXN0LmgiCisjaW5jbHVkZSAi
QWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpckluc3RJbmxpbmVzLmgiCisjaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCisvLyBDb21wdXRl
cyB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgYSB2YXJpYWJsZSBiYXNlZCBvbiBmcmVxdWVuY3kgb2Yg
ZXhlY3V0aW9uLiBUaGUgZnJlcXVlbmN5IG9mIGJsb2NrcworLy8gdGhhdCBhcmUgb25seSByZWFj
aGFibGUgYnkgcmFyZSBlZGdlcyBpcyBzY2FsZWQgYnkgT3B0aW9uczo6cmFyZUJsb2NrUGVuYWx0
eSgpLgorCisvLyBUaGluZyBjYW4gYmUgZWl0aGVyIFRtcCBvciBBcmcuCit0ZW1wbGF0ZTx0eXBl
bmFtZSBUaGluZz4KK2NsYXNzIFVzZUNvdW50cyB7CitwdWJsaWM6CisgICAgc3RydWN0IENvdW50
cyB7CisgICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgICAgICB7
CisgICAgICAgICAgICBvdXQucHJpbnQoCisgICAgICAgICAgICAgICAgIntudW1XYXJtVXNlcyA9
ICIsIG51bVdhcm1Vc2VzLCAiLCBudW1Db2xkVXNlcyA9ICIsIG51bUNvbGRVc2VzLCAiLCBudW1E
ZWZzID0gIiwKKyAgICAgICAgICAgICAgICBudW1EZWZzLCAifSIpOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBkb3VibGUgbnVtV2FybVVzZXMgeyAwIH07CisgICAgICAgIGRvdWJsZSBu
dW1Db2xkVXNlcyB7IDAgfTsKKyAgICAgICAgZG91YmxlIG51bURlZnMgeyAwIH07CisgICAgICAg
IGRvdWJsZSBudW1Db25zdERlZnMgeyAwIH07CisgICAgfTsKKyAgICAKKyAgICBVc2VDb3VudHMo
Q29kZSYgY29kZSkKKyAgICB7CisgICAgICAgIC8vIEZpbmQgbm9uLXJhcmUgYmxvY2tzLgorICAg
ICAgICBCbG9ja1dvcmtsaXN0IGZhc3RXb3JrbGlzdDsKKyAgICAgICAgZmFzdFdvcmtsaXN0LnB1
c2goY29kZVswXSk7CisgICAgICAgIHdoaWxlIChCYXNpY0Jsb2NrKiBibG9jayA9IGZhc3RXb3Jr
bGlzdC5wb3AoKSkgeworICAgICAgICAgICAgZm9yIChGcmVxdWVudGVkQmxvY2smIHN1Y2Nlc3Nv
ciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3Nv
ci5pc1JhcmUoKSkKKyAgICAgICAgICAgICAgICAgICAgZmFzdFdvcmtsaXN0LnB1c2goc3VjY2Vz
c29yLmJsb2NrKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkgeworICAgICAgICAgICAgZG91YmxlIGZy
ZXF1ZW5jeSA9IGJsb2NrLT5mcmVxdWVuY3koKTsKKyAgICAgICAgICAgIGlmICghZmFzdFdvcmts
aXN0LnNhdyhibG9jaykpCisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ICo9IE9wdGlvbnM6OnJh
cmVCbG9ja1BlbmFsdHkoKTsKKyAgICAgICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykg
eworICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaDxUaGluZz4oCisgICAgICAgICAgICAgICAg
ICAgIFsmXSAoVGhpbmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSwgQXJnOjpXaWR0
aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzJiBjb3VudHMgPSBtX2NvdW50cy5h
ZGQoYXJnLCBDb3VudHMoKSkuaXRlcmF0b3ItPnZhbHVlOworCisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoQXJnOjppc1dhcm1Vc2Uocm9sZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY291bnRzLm51bVdhcm1Vc2VzICs9IGZyZXF1ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChBcmc6OmlzQ29sZFVzZShyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb3VudHMubnVtQ29sZFVzZXMgKz0gZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNBbnlEZWYocm9sZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y291bnRzLm51bURlZnMgKz0gZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICB9KTsKKwor
ICAgICAgICAgICAgICAgIGlmICgoaW5zdC5vcGNvZGUgPT0gTW92ZSB8fCBpbnN0Lm9wY29kZSA9
PSBNb3ZlMzIpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1swXS5pc1NvbWVJbW0o
KQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMV0uaXM8VGhpbmc+KCkpCisgICAg
ICAgICAgICAgICAgICAgIG1fY291bnRzLmFkZChpbnN0LmFyZ3NbMV0uYXM8VGhpbmc+KCksIENv
dW50cygpKS5pdGVyYXRvci0+dmFsdWUubnVtQ29uc3REZWZzKys7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBDb3VudHMqIG9wZXJhdG9yW10oY29uc3QgVGhp
bmcmIGFyZykgY29uc3QKKyAgICB7CisgICAgICAgIGF1dG8gaXRlciA9IG1fY291bnRzLmZpbmQo
YXJnKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gbV9jb3VudHMuZW5kKCkpCisgICAgICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICZpdGVyLT52YWx1ZTsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIG91dC5w
cmludChtYXBEdW1wKG1fY291bnRzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEhhc2hNYXA8
VGhpbmcsIENvdW50cz4gbV9jb3VudHM7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCisjZW5kaWYgLy8gQWlyVXNlQ291
bnRzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBTdW1tYXJ5
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBTdW1t
YXJ5LmgJKHdvcmtpbmcgY29weSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
VG1wU3VtbWFyeS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMywxNSArMjMsMTIgQEAKICAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAogICovCiAKLSNpZm5kZWYgQWlyVXNlQ291bnRzX2gKLSNkZWZpbmUgQWlyVXNlQ291
bnRzX2gKKyNpZm5kZWYgQWlyVG1wU3VtbWFyeV9oCisjZGVmaW5lIEFpclRtcFN1bW1hcnlfaAog
CiAjaWYgRU5BQkxFKEIzX0pJVCkKIAotI2luY2x1ZGUgIkFpckFyZ0lubGluZXMuaCIKLSNpbmNs
dWRlICJBaXJCbG9ja1dvcmtsaXN0LmgiCi0jaW5jbHVkZSAiQWlyQ29kZS5oIgotI2luY2x1ZGUg
IkFpckluc3RJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyVG1wLmgiCiAjaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KIApAQCAtMzksODQgKzM2LDMyIEBA
IG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UKIAogY2xhc3MgQ29kZTsK
IAotLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB1c2VzIG9mIGEgdmFyaWFibGUgYmFzZWQgb24g
ZnJlcXVlbmN5IG9mIGV4ZWN1dGlvbi4gVGhlIGZyZXF1ZW5jeSBvZiBibG9ja3MKLS8vIHRoYXQg
YXJlIG9ubHkgcmVhY2hhYmxlIGJ5IHJhcmUgZWRnZXMgaXMgc2NhbGVkIGJ5IE9wdGlvbnM6OnJh
cmVCbG9ja1BlbmFsdHkoKS4KLQotLy8gVGhpbmcgY2FuIGJlIGVpdGhlciBUbXAgb3IgQXJnLgot
dGVtcGxhdGU8dHlwZW5hbWUgVGhpbmc+Ci1jbGFzcyBVc2VDb3VudHMgeworY2xhc3MgVG1wU3Vt
bWFyeSB7CiBwdWJsaWM6Ci0gICAgc3RydWN0IENvdW50cyB7Ci0gICAgICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQo
Ci0gICAgICAgICAgICAgICAgIntudW1XYXJtVXNlcyA9ICIsIG51bVdhcm1Vc2VzLCAiLCBudW1D
b2xkVXNlcyA9ICIsIG51bUNvbGRVc2VzLCAiLCBudW1EZWZzID0gIiwKLSAgICAgICAgICAgICAg
ICBudW1EZWZzLCAifSIpOwotICAgICAgICB9CisgICAgc3RydWN0IFN1bW1hcnkgeworICAgICAg
ICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKICAgICAgICAgCiAgICAgICAgIGRvdWJs
ZSBudW1XYXJtVXNlcyB7IDAgfTsKICAgICAgICAgZG91YmxlIG51bUNvbGRVc2VzIHsgMCB9Owog
ICAgICAgICBkb3VibGUgbnVtRGVmcyB7IDAgfTsKICAgICAgICAgZG91YmxlIG51bUNvbnN0RGVm
cyB7IDAgfTsKKyAgICAgICAgYm9vbCBoYXNDb25zdGFudCB7IGZhbHNlIH07CisgICAgICAgIGlu
dDY0X3QgY29uc3RhbnQgeyAwIH07CiAgICAgfTsKICAgICAKLSAgICBVc2VDb3VudHMoQ29kZSYg
Y29kZSkKLSAgICB7Ci0gICAgICAgIC8vIEZpbmQgbm9uLXJhcmUgYmxvY2tzLgotICAgICAgICBC
bG9ja1dvcmtsaXN0IGZhc3RXb3JrbGlzdDsKLSAgICAgICAgZmFzdFdvcmtsaXN0LnB1c2goY29k
ZVswXSk7Ci0gICAgICAgIHdoaWxlIChCYXNpY0Jsb2NrKiBibG9jayA9IGZhc3RXb3JrbGlzdC5w
b3AoKSkgewotICAgICAgICAgICAgZm9yIChGcmVxdWVudGVkQmxvY2smIHN1Y2Nlc3NvciA6IGJs
b2NrLT5zdWNjZXNzb3JzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3Nvci5pc1Jh
cmUoKSkKLSAgICAgICAgICAgICAgICAgICAgZmFzdFdvcmtsaXN0LnB1c2goc3VjY2Vzc29yLmJs
b2NrKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3Ig
KEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkgewotICAgICAgICAgICAgZG91YmxlIGZyZXF1ZW5j
eSA9IGJsb2NrLT5mcmVxdWVuY3koKTsKLSAgICAgICAgICAgIGlmICghZmFzdFdvcmtsaXN0LnNh
dyhibG9jaykpCi0gICAgICAgICAgICAgICAgZnJlcXVlbmN5ICo9IE9wdGlvbnM6OnJhcmVCbG9j
a1BlbmFsdHkoKTsKLSAgICAgICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgewotICAg
ICAgICAgICAgICAgIGluc3QuZm9yRWFjaDxUaGluZz4oCi0gICAgICAgICAgICAgICAgICAgIFsm
XSAoVGhpbmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSwgQXJnOjpXaWR0aCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzJiBjb3VudHMgPSBtX2NvdW50cy5hZGQoYXJn
LCBDb3VudHMoKSkuaXRlcmF0b3ItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoQXJnOjppc1dhcm1Vc2Uocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291
bnRzLm51bVdhcm1Vc2VzICs9IGZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChBcmc6OmlzQ29sZFVzZShyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Vu
dHMubnVtQ29sZFVzZXMgKz0gZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KEFyZzo6aXNBbnlEZWYocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRz
Lm51bURlZnMgKz0gZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAg
ICAgICAgICAgIGlmICgoaW5zdC5vcGNvZGUgPT0gTW92ZSB8fCBpbnN0Lm9wY29kZSA9PSBNb3Zl
MzIpCi0gICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1swXS5pc1NvbWVJbW0oKQotICAg
ICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMV0uaXM8VGhpbmc+KCkpCi0gICAgICAgICAg
ICAgICAgICAgIG1fY291bnRzLmFkZChpbnN0LmFyZ3NbMV0uYXM8VGhpbmc+KCksIENvdW50cygp
KS5pdGVyYXRvci0+dmFsdWUubnVtQ29uc3REZWZzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBjb25zdCBDb3VudHMqIG9wZXJhdG9yW10oY29uc3QgVGhpbmcmIGFy
ZykgY29uc3QKLSAgICB7Ci0gICAgICAgIGF1dG8gaXRlciA9IG1fY291bnRzLmZpbmQoYXJnKTsK
LSAgICAgICAgaWYgKGl0ZXIgPT0gbV9jb3VudHMuZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4g
bnVsbHB0cjsKLSAgICAgICAgcmV0dXJuICZpdGVyLT52YWx1ZTsKLSAgICB9Ci0KLSAgICB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKLSAgICB7Ci0gICAgICAgIG91dC5wcmludCht
YXBEdW1wKG1fY291bnRzKSk7Ci0gICAgfQorICAgIFRtcFN1bW1hcnkoQ29kZSYpOworCisgICAg
Y29uc3QgU3VtbWFyeSogb3BlcmF0b3JbXShUbXAgdG1wKSBjb25zdDsKKworICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBIYXNoTWFwPFRoaW5n
LCBDb3VudHM+IG1fY291bnRzOworICAgIEhhc2hNYXA8VG1wLCBTdW1tYXJ5PiBtX21hcDsKIH07
CiAKIH0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKIAogI2VuZGlmIC8vIEVOQUJMRShC
M19KSVQpCiAKLSNlbmRpZiAvLyBBaXJVc2VDb3VudHNfaAorI2VuZGlmIC8vIEFpclRtcFN1bW1h
cnlfaAogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclVzZUNvdW50cy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVXNlQ291bnRz
LmgJKHJldmlzaW9uIDE5NTY1MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
VXNlQ291bnRzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAot
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaWZuZGVmIEFpclVzZUNv
dW50c19oCi0jZGVmaW5lIEFpclVzZUNvdW50c19oCi0KLSNpZiBFTkFCTEUoQjNfSklUKQotCi0j
aW5jbHVkZSAiQWlyQXJnSW5saW5lcy5oIgotI2luY2x1ZGUgIkFpckJsb2NrV29ya2xpc3QuaCIK
LSNpbmNsdWRlICJBaXJDb2RlLmgiCi0jaW5jbHVkZSAiQWlySW5zdElubGluZXMuaCIKLSNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgotCi1uYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7Ci0KLWNsYXNzIENvZGU7Ci0K
LS8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgdXNlcyBvZiBhIHZhcmlhYmxlIGJhc2VkIG9uIGZy
ZXF1ZW5jeSBvZiBleGVjdXRpb24uIFRoZSBmcmVxdWVuY3kgb2YgYmxvY2tzCi0vLyB0aGF0IGFy
ZSBvbmx5IHJlYWNoYWJsZSBieSByYXJlIGVkZ2VzIGlzIHNjYWxlZCBieSBPcHRpb25zOjpyYXJl
QmxvY2tQZW5hbHR5KCkuCi0KLS8vIFRoaW5nIGNhbiBiZSBlaXRoZXIgVG1wIG9yIEFyZy4KLXRl
bXBsYXRlPHR5cGVuYW1lIFRoaW5nPgotY2xhc3MgVXNlQ291bnRzIHsKLXB1YmxpYzoKLSAgICBz
dHJ1Y3QgQ291bnRzIHsKLSAgICAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmludCgKLSAgICAgICAgICAgICAgICAie251
bVdhcm1Vc2VzID0gIiwgbnVtV2FybVVzZXMsICIsIG51bUNvbGRVc2VzID0gIiwgbnVtQ29sZFVz
ZXMsICIsIG51bURlZnMgPSAiLAotICAgICAgICAgICAgICAgIG51bURlZnMsICJ9Iik7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRvdWJsZSBudW1XYXJtVXNlcyB7IDAgfTsKLSAgICAg
ICAgZG91YmxlIG51bUNvbGRVc2VzIHsgMCB9OwotICAgICAgICBkb3VibGUgbnVtRGVmcyB7IDAg
fTsKLSAgICAgICAgZG91YmxlIG51bUNvbnN0RGVmcyB7IDAgfTsKLSAgICB9OwotICAgIAotICAg
IFVzZUNvdW50cyhDb2RlJiBjb2RlKQotICAgIHsKLSAgICAgICAgLy8gRmluZCBub24tcmFyZSBi
bG9ja3MuCi0gICAgICAgIEJsb2NrV29ya2xpc3QgZmFzdFdvcmtsaXN0OwotICAgICAgICBmYXN0
V29ya2xpc3QucHVzaChjb2RlWzBdKTsKLSAgICAgICAgd2hpbGUgKEJhc2ljQmxvY2sqIGJsb2Nr
ID0gZmFzdFdvcmtsaXN0LnBvcCgpKSB7Ci0gICAgICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9j
ayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgewotICAgICAgICAgICAgICAgIGlm
ICghc3VjY2Vzc29yLmlzUmFyZSgpKQotICAgICAgICAgICAgICAgICAgICBmYXN0V29ya2xpc3Qu
cHVzaChzdWNjZXNzb3IuYmxvY2soKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7Ci0gICAgICAgICAg
ICBkb3VibGUgZnJlcXVlbmN5ID0gYmxvY2stPmZyZXF1ZW5jeSgpOwotICAgICAgICAgICAgaWYg
KCFmYXN0V29ya2xpc3Quc2F3KGJsb2NrKSkKLSAgICAgICAgICAgICAgICBmcmVxdWVuY3kgKj0g
T3B0aW9uczo6cmFyZUJsb2NrUGVuYWx0eSgpOwotICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0
IDogKmJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoPFRoaW5nPigKLSAgICAg
ICAgICAgICAgICAgICAgWyZdIChUaGluZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBl
LCBBcmc6OldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMmIGNvdW50cyA9
IG1fY291bnRzLmFkZChhcmcsIENvdW50cygpKS5pdGVyYXRvci0+dmFsdWU7Ci0KLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzV2FybVVzZShyb2xlKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb3VudHMubnVtV2FybVVzZXMgKz0gZnJlcXVlbmN5OwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNDb2xkVXNlKHJvbGUpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvdW50cy5udW1Db2xkVXNlcyArPSBmcmVxdWVuY3k7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURlZihyb2xlKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb3VudHMubnVtRGVmcyArPSBmcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAg
ICAgIH0pOwotCi0gICAgICAgICAgICAgICAgaWYgKChpbnN0Lm9wY29kZSA9PSBNb3ZlIHx8IGlu
c3Qub3Bjb2RlID09IE1vdmUzMikKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBd
LmlzU29tZUltbSgpCi0gICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1sxXS5pczxUaGlu
Zz4oKSkKLSAgICAgICAgICAgICAgICAgICAgbV9jb3VudHMuYWRkKGluc3QuYXJnc1sxXS5hczxU
aGluZz4oKSwgQ291bnRzKCkpLml0ZXJhdG9yLT52YWx1ZS5udW1Db25zdERlZnMrKzsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IENvdW50cyogb3BlcmF0b3Jb
XShjb25zdCBUaGluZyYgYXJnKSBjb25zdAotICAgIHsKLSAgICAgICAgYXV0byBpdGVyID0gbV9j
b3VudHMuZmluZChhcmcpOwotICAgICAgICBpZiAoaXRlciA9PSBtX2NvdW50cy5lbmQoKSkKLSAg
ICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICByZXR1cm4gJml0ZXItPnZhbHVlOwot
ICAgIH0KLQotICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAotICAgIHsKLSAg
ICAgICAgb3V0LnByaW50KG1hcER1bXAobV9jb3VudHMpKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0g
ICAgSGFzaE1hcDxUaGluZywgQ291bnRzPiBtX2NvdW50czsKLX07Ci0KLX0gfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkIzOjpBaXIKLQotI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCi0KLSNlbmRpZiAv
LyBBaXJVc2VDb3VudHNfaAotCg==
</data>
<flag name="review"
          id="294845"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>