<?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>112780</bug_id>
          
          <creation_ts>2013-03-20 00:45:54 -0700</creation_ts>
          <short_desc>DFG implementation of op_strcat should inline rope allocations</short_desc>
          <delta_ts>2013-03-20 13:32:14 -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>All</rep_platform>
          <op_sys>All</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="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenberg</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>859129</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-20 00:45:54 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>859133</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-20 00:51:40 -0700</bug_when>
    <thetext>OMG.


Benchmark report for SunSpider, V8Spider, Octane, Kraken, and JSRegress on oldmac (MacPro4,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc (r146250)
&quot;StrCat&quot; at /Volumes/Data/fromMiniMe/secondary/OpenSource/WebKitBuild/Release/jsc (r146250)

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.

                                                     TipOfTree                   StrCat                                      
SunSpider:
   3d-cube                                         9.1020+-0.1405            9.0950+-0.1850        
   3d-morph                                        8.7251+-0.1225     ?      8.8282+-0.1520        ? might be 1.0118x slower
   3d-raytrace                                    10.4436+-0.1461           10.4374+-0.1566        
   access-binary-trees                             1.9471+-0.0509            1.9353+-0.0111        
   access-fannkuch                                 7.7616+-0.1153            7.7001+-0.1067        
   access-nbody                                    4.6520+-0.0112     ?      4.6531+-0.0095        ?
   access-nsieve                                   4.9701+-0.0401            4.9238+-0.0813        
   bitops-3bit-bits-in-byte                        1.8327+-0.0085            1.8307+-0.0101        
   bitops-bits-in-byte                             7.0533+-0.1048     ?      7.0751+-0.1076        ?
   bitops-bitwise-and                              2.5455+-0.0763     ?      2.6443+-0.0709        ? might be 1.0388x slower
   bitops-nsieve-bits                              4.1817+-0.0232            4.1740+-0.0162        
   controlflow-recursive                           3.1199+-0.0449            3.1174+-0.0490        
   crypto-aes                                      7.6646+-0.1196     ?      7.7703+-0.1513        ? might be 1.0138x slower
   crypto-md5                                      3.9127+-0.0297     !      4.0287+-0.0361        ! definitely 1.0296x slower
   crypto-sha1                                     3.2083+-0.0224            3.1921+-0.0152        
   date-format-tofte                              14.8310+-0.1966     ?     14.8933+-0.1365        ?
   date-format-xparb                              10.5381+-0.2785     ^      9.3676+-0.1994        ^ definitely 1.1250x faster
   math-cordic                                     4.0293+-0.0119     ?      4.0297+-0.0107        ?
   math-partial-sums                              12.4347+-0.1101     ?     12.4886+-0.1218        ?
   math-spectral-norm                              3.1625+-0.0169            3.1514+-0.0139        
   regexp-dna                                     11.4363+-0.2102           11.3769+-0.1685        
   string-base64                                   4.8215+-0.0351            4.7259+-0.0886          might be 1.0202x faster
   string-fasta                                   10.8107+-0.1140     ?     10.8940+-0.1457        ?
   string-tagcloud                                14.3466+-0.3045           14.0300+-0.2068          might be 1.0226x faster
   string-unpack-code                             26.7938+-0.0828     !     27.2721+-0.1211        ! definitely 1.0179x slower
   string-validate-input                           7.5661+-0.1156            7.4003+-0.0780          might be 1.0224x faster

   &lt;arithmetic&gt; *                                  7.7650+-0.0574            7.7321+-0.0674          might be 1.0043x faster
   &lt;geometric&gt;                                     6.2588+-0.0384            6.2363+-0.0459          might be 1.0036x faster
   &lt;harmonic&gt;                                      5.0462+-0.0299            5.0432+-0.0279          might be 1.0006x faster

                                                     TipOfTree                   StrCat                                      
V8Spider:
   crypto                                         87.5234+-0.2011     ?     88.3779+-1.6128        ?
   deltablue                                     125.2600+-0.4073     ?    125.2918+-0.8755        ?
   earley-boyer                                   82.7613+-0.3771           82.7290+-0.2061        
   raytrace                                       61.5320+-0.1550     !     61.9204+-0.1081        ! definitely 1.0063x slower
   regexp                                        101.8963+-0.5501          101.4172+-0.1028        
   richards                                      119.0732+-0.3724     ?    119.1839+-0.5371        ?
   splay                                          56.6075+-0.4767     ^     48.7913+-0.2259        ^ definitely 1.1602x faster

   &lt;arithmetic&gt;                                   90.6648+-0.1710     ^     89.6731+-0.1945        ^ definitely 1.0111x faster
   &lt;geometric&gt; *                                  87.2010+-0.1745     ^     85.5134+-0.1948        ^ definitely 1.0197x faster
   &lt;harmonic&gt;                                     83.7071+-0.1899     ^     81.1221+-0.1878        ^ definitely 1.0319x faster

                                                     TipOfTree                   StrCat                                      
Octane and V8v7:
   encrypt                                        0.46706+-0.00054    ?     0.46774+-0.00056       ?
   decrypt                                        8.65021+-0.02235    ?     8.67169+-0.06606       ?
   deltablue                             x2       0.56827+-0.00067          0.56742+-0.00166       
   earley                                         0.88077+-0.00188    !     0.90650+-0.00392       ! definitely 1.0292x slower
   boyer                                         12.79319+-0.03411    ?    12.81921+-0.04082       ?
   raytrace                              x2       4.48527+-0.05895          4.43804+-0.03000         might be 1.0106x faster
   regexp                                x2      32.37329+-0.15671         32.25172+-0.14972       
   richards                              x2       0.30726+-0.00048          0.30637+-0.00106       
   splay                                 x2       0.70344+-0.00925    ^     0.64376+-0.02271       ^ definitely 1.0927x faster
   navier-stokes                         x2      10.81820+-0.01309         10.79608+-0.01563       
   closure                                        0.30878+-0.03588    ?     0.30972+-0.03426       ?
   jquery                                         4.39308+-0.55456    ?     4.41432+-0.55612       ?
   gbemu                                 x2     252.03606+-16.94385       251.16266+-16.24598      
   box2d                                 x2      31.63886+-0.18567         31.46117+-0.08973       

V8v7:
   &lt;arithmetic&gt;                                   7.58142+-0.02224          7.55450+-0.02116         might be 1.0036x faster
   &lt;geometric&gt; *                                  2.45074+-0.00605    ^     2.42239+-0.00884       ^ definitely 1.0117x faster
   &lt;harmonic&gt;                                     0.93920+-0.00210    ^     0.92490+-0.00497       ^ definitely 1.0155x faster

Octane including V8v7:
   &lt;arithmetic&gt;                                  31.51611+-1.55121         31.40198+-1.49411         might be 1.0036x faster
   &lt;geometric&gt; *                                  4.39657+-0.06955          4.35776+-0.06437         might be 1.0089x faster
   &lt;harmonic&gt;                                     1.06504+-0.02038          1.05233+-0.01717         might be 1.0121x faster

                                                     TipOfTree                   StrCat                                      
Kraken:
   ai-astar                                       494.695+-0.353      ?     495.012+-0.590         ?
   audio-beat-detection                           246.476+-2.484            246.077+-2.210         
   audio-dft                                      312.825+-0.970            312.310+-1.964         
   audio-fft                                      144.105+-0.240            143.736+-0.145         
   audio-oscillator                               234.673+-1.084            234.629+-1.034         
   imaging-darkroom                               291.928+-1.033            290.231+-0.802         
   imaging-desaturate                             160.432+-0.333            160.428+-0.308         
   imaging-gaussian-blur                          398.305+-0.991            397.517+-0.641         
   json-parse-financial                            79.658+-0.365             79.631+-0.155         
   json-stringify-tinderbox                       100.691+-0.306      ?     101.113+-0.543         ?
   stanford-crypto-aes                             97.129+-0.381             96.490+-0.544         
   stanford-crypto-ccm                            105.133+-4.045            104.265+-4.112         
   stanford-crypto-pbkdf2                         273.904+-7.458            268.631+-0.808           might be 1.0196x faster
   stanford-crypto-sha256-iterative               117.754+-2.031      ^     115.072+-0.131         ^ definitely 1.0233x faster

   &lt;arithmetic&gt; *                                 218.408+-0.856            217.510+-0.467           might be 1.0041x faster
   &lt;geometric&gt;                                    186.885+-0.895            186.008+-0.689           might be 1.0047x faster
   &lt;harmonic&gt;                                     160.695+-0.915            159.914+-0.861           might be 1.0049x faster

                                                     TipOfTree                   StrCat                                      
JSRegress:
   adapt-to-double-divide                         22.4650+-0.0973     ?     22.6001+-0.1221        ?
   aliased-arguments-getbyval                      0.9029+-0.0087     ?      0.9087+-0.0103        ?
   allocate-big-object                             2.5204+-0.0474     ?      2.6371+-0.1047        ? might be 1.0463x slower
   arity-mismatch-inlining                         0.7669+-0.0108     ?      0.7744+-0.0219        ?
   array-access-polymorphic-structure              7.1098+-0.0810            7.0706+-0.0928        
   array-with-double-add                           5.7874+-0.0919     ?      5.7987+-0.0900        ?
   array-with-double-increment                     4.2175+-0.0912            4.1231+-0.0101          might be 1.0229x faster
   array-with-double-mul-add                       6.9980+-0.0931     ?      7.0709+-0.1059        ? might be 1.0104x slower
   array-with-double-sum                           7.9035+-0.0950            7.8891+-0.1105        
   array-with-int32-add-sub                       10.5194+-0.1474           10.4017+-0.1086          might be 1.0113x faster
   array-with-int32-or-double-sum                  7.9755+-0.1145     ?      7.9937+-0.0935        ?
   big-int-mul                                     4.9911+-0.0155     ?      5.0021+-0.0173        ?
   boolean-test                                    4.3989+-0.0565     ?      4.4199+-0.0680        ?
   cast-int-to-double                             13.9444+-0.1181           13.9162+-0.1042        
   cell-argument                                  14.4922+-0.1202           14.3659+-0.0764        
   cfg-simplify                                    3.9303+-0.0930     ?      4.0021+-0.0150        ? might be 1.0183x slower
   cmpeq-obj-to-obj-other                         11.1266+-0.2263     !     11.5914+-0.1692        ! definitely 1.0418x slower
   constant-test                                   8.5508+-0.1374            8.4728+-0.1135        
   direct-arguments-getbyval                       0.8325+-0.0093            0.8320+-0.0098        
   double-pollution-getbyval                      10.6867+-0.1196     ?     10.7506+-0.1226        ?
   double-pollution-putbyoffset                    5.0264+-0.0251            5.0231+-0.0249        
   external-arguments-getbyval                     2.2082+-0.0389            2.1934+-0.0410        
   external-arguments-putbyval                     3.3122+-0.0171     ?      3.3415+-0.0699        ?
   Float32Array-matrix-mult                       13.8183+-0.0865     !     14.4195+-0.1432        ! definitely 1.0435x slower
   fold-double-to-int                             22.0176+-0.2537           21.8695+-0.1613        
   function-dot-apply                              3.1733+-0.0080     ?      3.1754+-0.0096        ?
   function-test                                   4.9984+-0.0560            4.9837+-0.1162        
   get-by-id-chain-from-try-block                  7.4270+-0.0960     ?      7.5099+-0.0977        ? might be 1.0112x slower
   HashMap-put-get-iterate-keys                   88.5555+-0.5321     ?     89.8767+-0.9993        ? might be 1.0149x slower
   HashMap-put-get-iterate                        91.6294+-0.8363           90.5546+-0.8644          might be 1.0119x faster
   HashMap-string-put-get-iterate                 73.6103+-0.4110           73.3356+-0.3383        
   indexed-properties-in-objects                   4.5354+-0.0180     ?      4.5420+-0.0374        ?
   inline-arguments-access                         1.2481+-0.0065            1.2465+-0.0097        
   inline-arguments-local-escape                  23.2782+-0.1161     ^     22.9261+-0.1571        ^ definitely 1.0154x faster
   inline-get-scoped-var                           6.6146+-0.0857     ?      6.6248+-0.0877        ?
   inlined-put-by-id-transition                   16.7545+-0.3331           16.6549+-0.1323        
   int-or-other-abs-then-get-by-val                8.7932+-0.0988     ?      8.9186+-0.1068        ? might be 1.0143x slower
   int-or-other-abs-zero-then-get-by-val          37.0613+-0.1350     ?     37.3534+-0.3862        ?
   int-or-other-add-then-get-by-val               10.2542+-0.1285     ?     10.2806+-0.1248        ?
   int-or-other-add                               10.4798+-0.0966     ?     10.5149+-0.1229        ?
   int-or-other-div-then-get-by-val                7.9403+-0.0946     ?      7.9640+-0.0814        ?
   int-or-other-max-then-get-by-val               10.0088+-0.2449            9.9383+-0.2083        
   int-or-other-min-then-get-by-val                8.1825+-0.1114     ?      8.1835+-0.1020        ?
   int-or-other-mod-then-get-by-val                8.0365+-0.1108            8.0016+-0.1055        
   int-or-other-mul-then-get-by-val                7.2223+-0.0971     ?      7.2227+-0.1034        ?
   int-or-other-neg-then-get-by-val                8.1501+-0.0902     ?      8.1594+-0.1232        ?
   int-or-other-neg-zero-then-get-by-val          36.4814+-0.1262           36.4060+-0.1169        
   int-or-other-sub-then-get-by-val               10.2348+-0.1096     ?     10.2845+-0.1287        ?
   int-or-other-sub                                8.2182+-0.1126            8.1580+-0.1015        
   int-overflow-local                             12.8913+-0.1131           12.8646+-0.1150        
   Int16Array-bubble-sort                         49.7224+-0.4382           49.4922+-0.2366        
   Int16Array-load-int-mul                         1.8789+-0.0074     ?      1.8830+-0.0066        ?
   Int8Array-load                                  4.8646+-0.0419     ?      4.8714+-0.0239        ?
   integer-divide                                 15.1984+-0.1290           15.1204+-0.1107        
   integer-modulo                                  2.0599+-0.0125     ?      2.0610+-0.0150        ?
   make-indexed-storage                            3.9300+-0.0424            3.9054+-0.0447        
   method-on-number                               23.8250+-0.5492           23.4125+-0.4873          might be 1.0176x faster
   nested-function-parsing-random                376.1677+-13.1717    ?    377.4356+-13.0783       ?
   nested-function-parsing                        51.1583+-1.1442     ^     47.8857+-1.1675        ^ definitely 1.0683x faster
   new-array-buffer-dead                           3.6232+-0.0125     ?      3.6266+-0.0173        ?
   new-array-buffer-push                          10.4755+-0.1594           10.3989+-0.1856        
   new-array-dead                                 28.2948+-0.1251           28.2491+-0.0811        
   new-array-push                                  7.1196+-0.1813            6.9540+-0.0700          might be 1.0238x faster
   number-test                                     4.3065+-0.0908     ?      4.3227+-0.0573        ?
   object-closure-call                             8.3433+-0.0916            8.3339+-0.1054        
   object-test                                     4.9050+-0.0548     ?      4.9232+-0.1054        ?
   poly-stricteq                                  91.5765+-1.1989           90.8259+-0.2760        
   polymorphic-structure                          20.1160+-0.1612           20.0110+-0.1295        
   polyvariant-monomorphic-get-by-id              12.5509+-0.1449           12.5053+-0.1203        
   rare-osr-exit-on-local                         20.6214+-0.1457           20.5618+-0.1147        
   register-pressure-from-osr                     31.5523+-0.1350     ?     31.5747+-0.1140        ?
   simple-activation-demo                         34.4323+-0.1305     ?     34.4448+-0.1393        ?
   slow-array-profile-convergence                  4.3552+-0.0278            4.3467+-0.0201        
   slow-convergence                                3.7944+-0.0081     ?      3.8006+-0.0109        ?
   sparse-conditional                              1.3154+-0.0115            1.3125+-0.0139        
   splice-to-remove                               50.4247+-0.1741           50.3684+-0.1691        
   string-concat-object                            5.5094+-0.0579     ^      2.7209+-0.0145        ^ definitely 2.0248x faster
   string-concat-pair-object                       2.7271+-0.0297     ^      2.6626+-0.0188        ^ definitely 1.0242x faster
   string-concat-pair-simple                      17.9229+-0.2238     ^     17.2733+-0.1407        ^ definitely 1.0376x faster
   string-concat-simple                           44.9397+-0.2664     ^     16.9350+-0.1740        ^ definitely 2.6537x faster
   string-cons-repeat                             10.1017+-0.0206     ?     10.1288+-0.0274        ?
   string-cons-tower                              10.9276+-0.0291     ?     10.9645+-0.0564        ?
   string-hash                                     2.6490+-0.0112     ?      2.6492+-0.0094        ?
   string-repeat-arith                            45.7644+-0.1524     ^     45.3655+-0.1909        ^ definitely 1.0088x faster
   string-sub                                     89.3981+-0.8347     ^     87.0744+-1.3783        ^ definitely 1.0267x faster
   string-test                                     4.2867+-0.0246     ?      4.3133+-0.0555        ?
   structure-hoist-over-transitions                3.3272+-0.0755            3.2727+-0.0276          might be 1.0166x faster
   tear-off-arguments-simple                       1.7767+-0.0109            1.7759+-0.0108        
   tear-off-arguments                              3.3767+-0.0100     ?      3.3871+-0.0095        ?
   temporal-structure                             20.9459+-0.1200           20.8629+-0.1132        
   to-int32-boolean                               27.1413+-0.1167           27.1114+-0.0943        
   undefined-test                                  4.5538+-0.0417     ?      4.5629+-0.0409        ?

   &lt;arithmetic&gt;                                   20.2635+-0.1591     ^     19.8569+-0.1546        ^ definitely 1.0205x faster
   &lt;geometric&gt; *                                   9.3117+-0.0247     ^      9.1322+-0.0242        ^ definitely 1.0197x faster
   &lt;harmonic&gt;                                      5.1612+-0.0135     ^      5.1031+-0.0212        ^ definitely 1.0114x faster

                                                     TipOfTree                   StrCat                                      
All benchmarks:
   &lt;arithmetic&gt;                                   40.0736+-0.3417           39.6992+-0.3252          might be 1.0094x faster
   &lt;geometric&gt;                                    11.2751+-0.0537     ^     11.1165+-0.0531        ^ definitely 1.0143x faster
   &lt;harmonic&gt;                                      3.6747+-0.0349            3.6368+-0.0304          might be 1.0104x faster

                                                     TipOfTree                   StrCat                                      
Geomean of preferred means:
   &lt;scaled-result&gt;                                22.7195+-0.1281     ^     22.4654+-0.1228        ^ definitely 1.0113x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>859143</commentid>
    <comment_count>2</comment_count>
      <attachid>193996</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-20 01:06:55 -0700</bug_when>
    <thetext>Created attachment 193996
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>859157</commentid>
    <comment_count>3</comment_count>
      <attachid>193996</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2013-03-20 01:35:18 -0700</bug_when>
    <thetext>Comment on attachment 193996
the patch

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

&gt; Source/JavaScriptCore/dfg/DFGOperations.cpp:1576
&gt; +    JSGlobalData&amp; globalData = exec-&gt;globalData();

#if CPU(X86)
RELEASE_ASSERT_NOT_REACHED();
#endif 
?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>859175</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-20 01:55:19 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 193996 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=193996&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGOperations.cpp:1576
&gt; &gt; +    JSGlobalData&amp; globalData = exec-&gt;globalData();
&gt; 
&gt; #if CPU(X86)
&gt; RELEASE_ASSERT_NOT_REACHED();
&gt; #endif 
&gt; ?

I could do that, but would it help?  There&apos;s nothing wrong with calling that function on X86.  The fact that it won&apos;t be called is a detail that is orthogonal to the DFGOperations interface.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>859659</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-20 13:32:14 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/146382</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>193996</attachid>
            <date>2013-03-20 01:06:55 -0700</date>
            <delta_ts>2013-03-20 01:35:17 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>37593</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTQ2MzA4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDg1IEBA
CisyMDEzLTAzLTIwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHIGltcGxlbWVudGF0aW9uIG9mIG9wX3N0cmNhdCBzaG91bGQgaW5saW5lIHJvcGUgYWxsb2Nh
dGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEx
Mjc4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAg
ICAgICAgVGhpcyBnZXRzIHJpZCBvZiB0aGUgU3RyQ2F0IG5vZGUgYW5kIGFkZHMgYSBNYWtlUm9w
ZSBub2RlLiBUaGUgTWFrZVJvcGUgbm9kZSBjYW4KKyAgICAgICAgdGFrZSBlaXRoZXIgdHdvIG9y
IHRocmVlIG9wZXJhbmRzLCBhbmQgYWxsb2NhdGVzIGEgcm9wZSBzdHJpbmcgd2l0aCBlaXRoZXIg
dHdvIG9yCisgICAgICAgIHRocmVlIGZpYmVycy4gKFRoZSBtYWdpYyBjaG9pY2Ugb2YgdGhyZWUg
Y2hpbGRyZW4gZm9yIG5vbi1WYXJBcmcgbm9kZXMgaGFwcGVucyB0bworICAgICAgICBtYXRjaCBl
eGFjdGx5IHdpdGggdGhlIG1hZ2ljIGNob2ljZSBvZiB0aHJlZSBmaWJlcnMgZm9yIHJvcGUgc3Ry
aW5ncy4pCisgICAgICAgIAorICAgICAgICBWYWx1ZUFkZCBvbiBLbm93blN0cmluZyBpcyByZXBs
YWNlZCB3aXRoIE1ha2VSb3BlIHdpdGggdHdvIGNoaWxkcmVuLgorICAgICAgICAKKyAgICAgICAg
U3RyQ2F0IGdldHMgcmVwbGFjZWQgYnkgYW4gYXBwcm9wcmlhdGUgc2VxdWVuY2Ugb2YgTWFrZVJv
cGUncy4KKyAgICAgICAgCisgICAgICAgIE1ha2VSb3BlIGRvZXMgbm90IGRvIHRoZSBkeW5hbWlj
IGNoZWNrIHRvIHNlZSBpZiBpdHMgY2hpbGRyZW4gYXJlIGVtcHR5IHN0cmluZ3MuCisgICAgICAg
IFRoaXMgaXMgcmVwbGFjZWQgYnkgYSBzdGF0aWMgY2hlY2ssIGluc3RlYWQuIFRoZSBkb3duc2lk
ZSBpcyB0aGF0IHdlIG1heSB1c2UgbW9yZQorICAgICAgICBtZW1vcnkgaWYgdGhlIHN0cmluZ3Mg
cGFzc2VkIHRvIE1ha2VSb3BlIHR1cm4gb3V0IHRvIGR5bmFtaWNhbGx5IGJlIGVtcHR5LiBUaGUK
KyAgICAgICAgdXBzaWRlIGlzIHRoYXQgd2UgZG8gZmV3ZXIgY2hlY2tzIGluIHRoZSBjYXNlcyB3
aGVyZSBlaXRoZXIgdGhlIHN0cmluZ3MgYXJlIG5vdAorICAgICAgICBlbXB0eSwgb3Igd2hlcmUg
dGhlIHN0cmluZ3MgYXJlIHN0YXRpY2FsbHkga25vd24gdG8gYmUgZW1wdHkuIEkgc3VzcGVjdCBi
b3RoIG9mCisgICAgICAgIHRob3NlIGNhc2VzIGFyZSBtb3JlIGNvbW1vbiwgdGhhbiB0aGUgY2Fz
ZSB3aGVyZSB0aGUgc3RyaW5nIGlzIGR5bmFtaWNhbGx5IGVtcHR5LgorICAgICAgICAKKyAgICAg
ICAgVGhpcyBhbHNvIHJlc3VsdHMgaW4gc29tZSBiYWRuZXNzIGZvciBYODYuIE1ha2VSb3BlIG5l
ZWRzIHNpeCByZWdpc3RlcnMgaWYgaXQgaXMKKyAgICAgICAgYWxsb2NhdGluZyBhIHRocmVlLXJv
cGUuIFdlIGRvbid0IGhhdmUgc2l4IHJlZ2lzdGVycyB0byBzcGFyZSBvbiBYODYuIEN1cnJlbnRs
eSwKKyAgICAgICAgdGhlIGNvZGUgc2lkZS1zdGVwcyB0aGlzIHByb2JsZW0gYnkganVzdCBuZXZl
ciB1c2lnbiB0aHJlZS1yb3BlcyBpbiBvcHRpbWl6ZWQKKyAgICAgICAgY29kZSBvbiBYODYuIEFs
bCBvdGhlciBhcmNoaXRlY3R1cmVzLCBpbmNsdWRpbmcgWDg2XzY0LCBkb24ndCBoYXZlIHRoaXMg
cHJvYmxlbS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgYSBzaG9ja2luZyBzcGVlZC11cC4g
OSUgcHJvZ3Jlc3Npb25zIG9uIGJvdGggVjgvc3BsYXkgYW5kCisgICAgICAgIFN1blNwaWRlci9k
YXRlLWZvcm1hdC14cGFyYi4gMSUgcHJvZ3Jlc3Npb24gb24gVjh2NyBvdmVyYWxsLCBhbmQgfjAu
NSUgcHJvZ3Jlc3Npb24KKyAgICAgICAgb24gU3VuU3BpZGVyLiAyeCBzcGVlZC11cCBvbiBtaWNy
b2JlbmNobWFya3MgdGhhdCB0ZXN0IG9wX3N0cmNhdC4KKworICAgICAgICAqIGRmZy9ERkdBYnN0
cmFjdFN0YXRlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpleGVjdXRl
RWZmZWN0cyk6CisgICAgICAgICogZGZnL0RGR0FkamFjZW5jeUxpc3QuaDoKKyAgICAgICAgKEFk
amFjZW5jeUxpc3QpOgorICAgICAgICAoSlNDOjpERkc6OkFkamFjZW5jeUxpc3Q6OnJlbW92ZUVk
Z2UpOgorICAgICAgICAqIGRmZy9ERkdBcmd1bWVudHNTaW1wbGlmaWNhdGlvblBoYXNlLmNwcDoK
KyAgICAgICAgKEpTQzo6REZHOjpBcmd1bWVudHNTaW1wbGlmaWNhdGlvblBoYXNlOjpyZW1vdmVB
cmd1bWVudHNSZWZlcmVuY2luZ1BoYW50b21DaGlsZCk6CisgICAgICAgICogZGZnL0RGR0JhY2t3
YXJkc1Byb3BhZ2F0aW9uUGhhc2UuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJhY2t3YXJkc1By
b3BhZ2F0aW9uUGhhc2U6OnByb3BhZ2F0ZSk6CisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFy
c2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayk6
CisgICAgICAgICogZGZnL0RGR0NTRVBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpDU0VQ
aGFzZTo6cHV0U3RydWN0dXJlU3RvcmVFbGltaW5hdGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6
Q1NFUGhhc2U6OmVsaW1pbmF0ZUlycmVsZXZhbnRQaGFudG9tQ2hpbGRyZW4pOgorICAgICAgICAo
SlNDOjpERkc6OkNTRVBoYXNlOjpwZXJmb3JtTm9kZUNTRSk6CisgICAgICAgICogZGZnL0RGR0RD
RVBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpEQ0VQaGFzZTo6ZWxpbWluYXRlSXJyZWxl
dmFudFBoYW50b21DaGlsZHJlbik6CisgICAgICAgICogZGZnL0RGR0ZpeHVwUGhhc2UuY3BwOgor
ICAgICAgICAoSlNDOjpERkc6OkZpeHVwUGhhc2U6OmZpeHVwTm9kZSk6CisgICAgICAgIChKU0M6
OkRGRzo6Rml4dXBQaGFzZTo6Y3JlYXRlVG9TdHJpbmcpOgorICAgICAgICAoSlNDOjpERkc6OkZp
eHVwUGhhc2U6OmF0dGVtcHRUb0ZvcmNlU3RyaW5nQXJyYXlNb2RlQnlUb1N0cmluZ0NvbnZlcnNp
b24pOgorICAgICAgICAoSlNDOjpERkc6OkZpeHVwUGhhc2U6OmNvbnZlcnRTdHJpbmdBZGRVc2Up
OgorICAgICAgICAoRml4dXBQaGFzZSk6CisgICAgICAgIChKU0M6OkRGRzo6Rml4dXBQaGFzZTo6
Y29udmVydFRvTWFrZVJvcGUpOgorICAgICAgICAoSlNDOjpERkc6OkZpeHVwUGhhc2U6OmZpeHVw
TWFrZVJvcGUpOgorICAgICAgICAoSlNDOjpERkc6OkZpeHVwUGhhc2U6OmF0dGVtcHRUb01ha2VG
YXN0U3RyaW5nQWRkKToKKyAgICAgICAgKiBkZmcvREZHTm9kZVR5cGUuaDoKKyAgICAgICAgKERG
Ryk6CisgICAgICAgICogZGZnL0RGR09wZXJhdGlvbnMuY3BwOgorICAgICAgICAqIGRmZy9ERkdP
cGVyYXRpb25zLmg6CisgICAgICAgICogZGZnL0RGR1ByZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNl
LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZTo6cHJv
cGFnYXRlKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwOgorICAgICAgICAo
SlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlQWRkKToKKyAgICAgICAgKEpTQzo6REZH
OjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZU1ha2VSb3BlKToKKyAgICAgICAgKERGRyk6CisgICAg
ICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmg6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3Vs
YXRpdmVKSVQ6OmNhbGxPcGVyYXRpb24pOgorICAgICAgICAoU3BlY3VsYXRpdmVKSVQpOgorICAg
ICAgICAoSlNDOjpERkc6OlNwZWN1bGF0ZUNlbGxPcGVyYW5kOjpTcGVjdWxhdGVDZWxsT3BlcmFu
ZCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRlQ2VsbE9wZXJhbmQ6On5TcGVjdWxhdGVD
ZWxsT3BlcmFuZCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRlQ2VsbE9wZXJhbmQ6Omdw
cik6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRlQ2VsbE9wZXJhbmQ6OnVzZSk6CisgICAg
ICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6
OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVK
SVQ2NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgor
ICAgICAgICAqIHJ1bnRpbWUvSlNTdHJpbmcuaDoKKyAgICAgICAgKEpTUm9wZVN0cmluZyk6CisK
IDIwMTMtMDMtMTkgIE1pY2hhZWwgU2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CiAKICAgICAg
ICAgQ3Jhc2ggd2hlbiBsb2FkaW5nIGh0dHA6Ly93d3cuanFjaGFydC5jb20vanF1ZXJ5L2dhdWdl
cy9SYWRpYWxHYXVnZS9MaXZlRGF0YQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdBYnN0cmFjdFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxNDYyNTApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
NjYsOSArNDY2LDYgQEAgYm9vbCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlRWZmZWN0cyh1bnNpZwog
ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGZvck5vZGUobm9kZSkuc2V0KFNwZWNE
b3VibGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS25vd25TdHJpbmdVc2U6
Ci0gICAgICAgICAgICBmb3JOb2RlKG5vZGUpLnNldChtX2dyYXBoLm1fZ2xvYmFsRGF0YS5zdHJp
bmdTdHJ1Y3R1cmUuZ2V0KCkpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6
CiAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChub2RlLT5vcCgpID09IFZhbHVlQWRkKTsKICAg
ICAgICAgICAgIGNsb2JiZXJXb3JsZChub2RlLT5jb2RlT3JpZ2luLCBpbmRleEluQmxvY2spOwpA
QCAtNDc3LDYgKzQ3NCwxMSBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGVFZmZlY3RzKHVu
c2lnCiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgICAgICAKKyAgICBjYXNl
IE1ha2VSb3BlOiB7CisgICAgICAgIGZvck5vZGUobm9kZSkuc2V0KG1fZ3JhcGgubV9nbG9iYWxE
YXRhLnN0cmluZ1N0cnVjdHVyZS5nZXQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KICAgICAg
ICAgICAgIAogICAgIGNhc2UgQXJpdGhTdWI6IHsKICAgICAgICAgSlNWYWx1ZSBsZWZ0ID0gZm9y
Tm9kZShub2RlLT5jaGlsZDEoKSkudmFsdWUoKTsKQEAgLTExMDEsMTAgKzExMDMsNiBAQCBib29s
IEFic3RyYWN0U3RhdGU6OmV4ZWN1dGVFZmZlY3RzKHVuc2lnCiAgICAgICAgIGJyZWFrOwogICAg
IH0KICAgICAgICAgICAgIAotICAgIGNhc2UgU3RyQ2F0OgotICAgICAgICBmb3JOb2RlKG5vZGUp
LnNldChtX2dyYXBoLm1fZ2xvYmFsRGF0YS5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpOwotICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIAogICAgIGNhc2UgTmV3QXJyYXk6CiAgICAgICAgIG5vZGUt
PnNldENhbkV4aXQodHJ1ZSk7CiAgICAgICAgIGZvck5vZGUobm9kZSkuc2V0KG1fZ3JhcGguZ2xv
YmFsT2JqZWN0Rm9yKG5vZGUtPmNvZGVPcmlnaW4pLT5hcnJheVN0cnVjdHVyZUZvckluZGV4aW5n
VHlwZUR1cmluZ0FsbG9jYXRpb24obm9kZS0+aW5kZXhpbmdUeXBlKCkpKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWRqYWNlbmN5TGlzdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWRqYWNlbmN5TGlzdC5oCShyZXZpc2lvbiAxNDYy
NTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0FkamFjZW5jeUxpc3QuaAkod29y
a2luZyBjb3B5KQpAQCAtMTE2LDkgKzExNiw4IEBAIHB1YmxpYzoKICAgICAgICAgaW5pdGlhbGl6
ZSgpOwogICAgIH0KICAgICAKLSAgICAvLyBDYWxsIHRoaXMgaWYgeW91IHdpc2ggdG8gcmVtb3Zl
IGFuIGVkZ2UgYW5kIHRoZSBub2RlIHRyZWF0cyB0aGUgbGlzdCBvZiBjaGlsZHJlbgotICAgIC8v
IGFzIGEgImJhZyIgLSBhbiB1bm9yZGVyZWQgc2V0IHdoZXJlIHRoZSBpbmRleCBvZiB0aGUgZWRn
ZSBkb2VzIG5vdCBtYXR0ZXIuCi0gICAgdm9pZCByZW1vdmVFZGdlRnJvbUJhZyh1bnNpZ25lZCBl
ZGdlSW5kZXgpCisgICAgLy8gQ2FsbCB0aGlzIGlmIHlvdSB3aXNoIHRvIHJlbW92ZSBhbiBlZGdl
IGFuZCB0aGUgbm9kZSB0cmVhdHMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4uCisgICAgdm9pZCByZW1v
dmVFZGdlKHVuc2lnbmVkIGVkZ2VJbmRleCkKICAgICB7CiAgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IGVkZ2VJbmRleDsgaSA8IFNpemUgLSAxOyArK2kpCiAgICAgICAgICAgICBzZXRDaGlsZChp
LCBjaGlsZChpICsgMSkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBcmd1
bWVudHNTaW1wbGlmaWNhdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0FyZ3VtZW50c1NpbXBsaWZpY2F0aW9uUGhhc2UuY3BwCShyZXZpc2lv
biAxNDYyNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0FyZ3VtZW50c1NpbXBs
aWZpY2F0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MzMsMTQgKzgzMywxNCBAQCBw
cml2YXRlOgogICAgICAgICAgICAgICAgICYmICFtX2NyZWF0ZXNBcmd1bWVudHMuY29udGFpbnMo
ZWRnZS0+Y29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWUpOwogICAgICAgICAgICAgaWYgKCFpc0Rl
YWRBcmd1bWVudHNSZWdpc3RlciAmJiAhaXNBbGlhc2VkQXJndW1lbnRzUmVnaXN0ZXIpCiAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5yZW1vdmVFZGdl
RnJvbUJhZyhlZGdlSW5kZXgpOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucmVtb3ZlRWRn
ZShlZGdlSW5kZXgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgICAg
IAogICAgICAgICBjYXNlIENyZWF0ZUFyZ3VtZW50czogeyAvLyBBcmlzZXMgaWYgd2UgQ1NFIHR3
byBHZXRMb2NhbHMgdG8gdGhlIGFyZ3VtZW50cyByZWdpc3RlciBhbmQgdGhlbiBDU0UgdGhlIHNl
Y29uZCB1c2Ugb2YgdGhlIEdldExvY2FsIHRvIHRoZSBmaXJzdC4KICAgICAgICAgICAgIGlmICht
X2NyZWF0ZXNBcmd1bWVudHMuY29udGFpbnMoZWRnZS0+Y29kZU9yaWdpbi5pbmxpbmVDYWxsRnJh
bWUpKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4u
cmVtb3ZlRWRnZUZyb21CYWcoZWRnZUluZGV4KTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVu
LnJlbW92ZUVkZ2UoZWRnZUluZGV4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAg
ICAgICAgICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQmFja3dhcmRz
UHJvcGFnYXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdCYWNrd2FyZHNQcm9wYWdhdGlvblBoYXNlLmNwcAkocmV2aXNpb24gMTQ2MjUwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCYWNrd2FyZHNQcm9wYWdhdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzI4LDExICszMjgsOCBAQCBwcml2YXRlOgogICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICBjYXNlIFN0ckNh
dDogewotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUtPmZpcnN0Q2hp
bGQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZElkeCA8IG5vZGUtPmZpcnN0Q2hpbGQoKSArIG5v
ZGUtPm51bUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgKytjaGlsZElkeCkKLSAgICAgICAg
ICAgICAgICBtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdLT5tZXJnZUZsYWdzKE5v
ZGVVc2VkQXNOdW1iZXIgfCBOb2RlVXNlZEFzT3RoZXIpOworICAgICAgICBjYXNlIFRvU3RyaW5n
OiB7CisgICAgICAgICAgICBub2RlLT5jaGlsZDEoKS0+bWVyZ2VGbGFncyhOb2RlVXNlZEFzTnVt
YmVyIHwgTm9kZVVzZWRBc090aGVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAg
ICAgICAgICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQ
YXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0
ZUNvZGVQYXJzZXIuY3BwCShyZXZpc2lvbiAxNDYyNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM1Miw5ICsy
MzUyLDMxIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAg
ICAgY2FzZSBvcF9zdHJjYXQ6IHsKICAgICAgICAgICAgIGludCBzdGFydE9wZXJhbmQgPSBjdXJy
ZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwogICAgICAgICAgICAgaW50IG51bU9wZXJhbmRz
ID0gY3VycmVudEluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKLSAgICAgICAgICAgIGZvciAoaW50
IG9wZXJhbmRJZHggPSBzdGFydE9wZXJhbmQ7IG9wZXJhbmRJZHggPCBzdGFydE9wZXJhbmQgKyBu
dW1PcGVyYW5kczsgKytvcGVyYW5kSWR4KQotICAgICAgICAgICAgICAgIGFkZFZhckFyZ0NoaWxk
KGdldChvcGVyYW5kSWR4KSk7Ci0gICAgICAgICAgICBzZXQoY3VycmVudEluc3RydWN0aW9uWzFd
LnUub3BlcmFuZCwgYWRkVG9HcmFwaChOb2RlOjpWYXJBcmcsIFN0ckNhdCwgT3BJbmZvKDApLCBP
cEluZm8oMCkpKTsKKyNpZiBDUFUoWDg2KQorICAgICAgICAgICAgLy8gWDg2IGRvZXNuJ3QgaGF2
ZSBlbm91Z2ggcmVnaXN0ZXJzIHRvIGNvbXBpbGUgTWFrZVJvcGUgd2l0aCB0aHJlZSBhcmd1bWVu
dHMuCisgICAgICAgICAgICAvLyBSYXRoZXIgdGhhbiB0cnkgdG8gYmUgY2xldmVyLCB3ZSBqdXN0
IG1ha2UgTWFrZVJvcGUgZHVtYmVyIG9uIHRoaXMgcHJvY2Vzc29yLgorICAgICAgICAgICAgY29u
c3QgdW5zaWduZWQgbWF4Um9wZUFyZ3VtZW50cyA9IDI7CisjZWxzZQorICAgICAgICAgICAgY29u
c3QgdW5zaWduZWQgbWF4Um9wZUFyZ3VtZW50cyA9IDM7CisjZW5kaWYKKyAgICAgICAgICAgIE5v
ZGUqIG9wZXJhbmRzW0FkamFjZW5jeUxpc3Q6OlNpemVdOworICAgICAgICAgICAgdW5zaWduZWQg
aW5kZXhJbk9wZXJhbmRzID0gMDsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBBZGphY2VuY3lMaXN0OjpTaXplOyArK2kpCisgICAgICAgICAgICAgICAgb3BlcmFuZHNbaV0g
PSAwOworICAgICAgICAgICAgZm9yIChpbnQgb3BlcmFuZElkeCA9IHN0YXJ0T3BlcmFuZDsgb3Bl
cmFuZElkeCA8IHN0YXJ0T3BlcmFuZCArIG51bU9wZXJhbmRzOyArK29wZXJhbmRJZHgpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoaW5kZXhJbk9wZXJhbmRzID09IG1heFJvcGVBcmd1bWVudHMpIHsK
KyAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNbMF0gPSBhZGRUb0dyYXBoKE1ha2VSb3BlLCBv
cGVyYW5kc1swXSwgb3BlcmFuZHNbMV0sIG9wZXJhbmRzWzJdKTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IEFkamFjZW5jeUxpc3Q6OlNpemU7ICsraSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzW2ldID0gMDsKKyAgICAgICAgICAgICAgICAg
ICAgaW5kZXhJbk9wZXJhbmRzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgQVNTRVJUKGluZGV4SW5PcGVyYW5kcyA8IEFkamFjZW5jeUxp
c3Q6OlNpemUpOworICAgICAgICAgICAgICAgIEFTU0VSVChpbmRleEluT3BlcmFuZHMgPCBtYXhS
b3BlQXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICBvcGVyYW5kc1tpbmRleEluT3BlcmFuZHMr
K10gPSBhZGRUb0dyYXBoKFRvU3RyaW5nLCBnZXQob3BlcmFuZElkeCkpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgc2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsCisgICAg
ICAgICAgICAgICAgYWRkVG9HcmFwaChNYWtlUm9wZSwgb3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFd
LCBvcGVyYW5kc1syXSkpOwogICAgICAgICAgICAgTkVYVF9PUENPREUob3Bfc3RyY2F0KTsKICAg
ICAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNw
cAkocmV2aXNpb24gMTQ2MjUwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDU0VQ
aGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2Niw3ICs1NjYsNiBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgY2FzZSBOZXdGdW5jdGlvbkV4cHJlc3Npb246CiAgICAgICAgICAgICBjYXNlIENy
ZWF0ZUFjdGl2YXRpb246CiAgICAgICAgICAgICBjYXNlIFRlYXJPZmZBY3RpdmF0aW9uOgotICAg
ICAgICAgICAgY2FzZSBTdHJDYXQ6CiAgICAgICAgICAgICBjYXNlIFRvUHJpbWl0aXZlOgogICAg
ICAgICAgICAgY2FzZSBOZXdSZWdleHA6CiAgICAgICAgICAgICBjYXNlIE5ld0FycmF5QnVmZmVy
OgpAQCAtNTc4LDYgKzU3Nyw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBjYXNlIFR5cGVPZjoK
ICAgICAgICAgICAgIGNhc2UgVG9TdHJpbmc6CiAgICAgICAgICAgICBjYXNlIE5ld1N0cmluZ09i
amVjdDoKKyAgICAgICAgICAgIGNhc2UgTWFrZVJvcGU6CiAgICAgICAgICAgICAgICAgcmV0dXJu
IDA7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIEdldEluZGV4ZWRQcm9wZXJ0
eVN0b3JhZ2U6CkBAIC05NjcsNyArOTY3LDcgQEAgcHJpdmF0ZToKICNpZiBERkdfRU5BQkxFKERF
QlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgICAgICBkYXRhTG9nKCIgICBFbGltaW5h
dGluZyBlZGdlIEAiLCBtX2N1cnJlbnROb2RlLT5pbmRleCgpLCAiIC0+IEAiLCBlZGdlLT5pbmRl
eCgpKTsKICNlbmRpZgotICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucmVtb3ZlRWRnZUZyb21C
YWcoaS0tKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnJlbW92ZUVkZ2UoaS0tKTsKICAg
ICAgICAgICAgIG1fY2hhbmdlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDMwLDEx
ICsxMDMwLDExIEBAIHByaXZhdGU6CiAjZW5kaWYKICAgICAgICAgCiAgICAgICAgIC8vIE5PVEU6
IHRoZXJlIGFyZSBzb21lIG5vZGVzIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IGRvbid0IENTRSBldmVu
IHRob3VnaCB3ZQotICAgICAgICAvLyBwcm9iYWJseSBjb3VsZCwgbGlrZSBTdHJDYXQgYW5kIFRv
UHJpbWl0aXZlLiBUaGF0J3MgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAvLyBwcm9iYWJs
eSBjb3VsZCwgbGlrZSBNYWtlUm9wZSBhbmQgVG9QcmltaXRpdmUuIFRoYXQncyBiZWNhdXNlIHRo
ZXJlIGlzIG5vCiAgICAgICAgIC8vIGV2aWRlbmNlIHRoYXQgZG9pbmcgQ1NFIG9uIHRoZXNlIG5v
ZGVzIHdvdWxkIHJlc3VsdCBpbiBhIHBlcmZvcm1hbmNlCiAgICAgICAgIC8vIHByb2dyZXNzaW9u
LiBIZW5jZSBjb25zaWRlcmluZyB0aGVzZSBub2RlcyBpbiBDU0Ugd291bGQganVzdCBtZWFuIHRo
YXQgdGhpcwogICAgICAgICAvLyBjb2RlIGRvZXMgbW9yZSB3b3JrIHdpdGggbm8gd2luLiBPZiBj
b3Vyc2UsIHdlIG1heSB3YW50IHRvIHJlY29uc2lkZXIgdGhpcywKLSAgICAgICAgLy8gc2luY2Ug
U3RyQ2F0IGlzIHRyaXZpYWxseSBDU0UtYWJsZS4gSXQncyBub3QgdHJpdmlhbGx5IGRvYWJsZSBm
b3IKKyAgICAgICAgLy8gc2luY2UgTWFrZVJvcGUgaXMgdHJpdmlhbGx5IENTRS1hYmxlLiBJdCdz
IG5vdCB0cml2aWFsbHkgZG9hYmxlIGZvcgogICAgICAgICAvLyBUb1ByaW1pdGl2ZSwgYnV0IHdl
IGNvdWxkIGNoYW5nZSB0aGF0IHdpdGggc29tZSBzcGVjdWxhdGlvbnMgaWYgd2UgcmVhbGx5CiAg
ICAgICAgIC8vIG5lZWRlZCB0by4KICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0RDRVBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0RDRVBoYXNlLmNwcAkocmV2aXNpb24gMTQ2MjUwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdEQ0VQaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2MCw3ICsx
NjAsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgaWYgKCFlZGdlKQogICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKGVkZ2UuaXNQcm92ZWQoKSB8fCBlZGdlLnVzZUtp
bmQoKSA9PSBVbnR5cGVkVXNlKQotICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnJlbW92
ZUVkZ2VGcm9tQmFnKGktLSk7CisgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucmVtb3Zl
RWRnZShpLS0pOwogICAgICAgICB9CiAgICAgfQogICAgIApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdGaXh1cFBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCShyZXZpc2lvbiAxNDYyNTApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNzUsNiArMTc1LDExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAg
fQogICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTWFrZVJvcGU6IHsKKyAgICAgICAgICAgIGZp
eHVwTWFrZVJvcGUobm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICAgICAgCiAgICAgICAgIGNhc2UgQXJpdGhBZGQ6CiAgICAgICAgIGNhc2UgQXJpdGhTdWI6IHsK
ICAgICAgICAgICAgIGlmIChhdHRlbXB0VG9NYWtlSW50ZWdlckFkZChub2RlKSkKQEAgLTg2Miw3
ICs4NjcsNiBAQCBwcml2YXRlOgogICAgICAgICBjYXNlIElzU3RyaW5nOgogICAgICAgICBjYXNl
IElzT2JqZWN0OgogICAgICAgICBjYXNlIElzRnVuY3Rpb246Ci0gICAgICAgIGNhc2UgU3RyQ2F0
OgogICAgICAgICBjYXNlIENyZWF0ZUFjdGl2YXRpb246CiAgICAgICAgIGNhc2UgVGVhck9mZkFj
dGl2YXRpb246CiAgICAgICAgIGNhc2UgQ3JlYXRlQXJndW1lbnRzOgpAQCAtODk4LDExICs5MDIs
MTEgQEAgcHJpdmF0ZToKICAgICB9CiAgICAgCiAgICAgdGVtcGxhdGU8VXNlS2luZCB1c2VLaW5k
PgotICAgIE5vZGUqIGNyZWF0ZVRvU3RyaW5nKE5vZGUqIG5vZGUsIEVkZ2UgZWRnZSkKKyAgICB2
b2lkIGNyZWF0ZVRvU3RyaW5nKE5vZGUqIG5vZGUsIEVkZ2UmIGVkZ2UpCiAgICAgewotICAgICAg
ICByZXR1cm4gbV9pbnNlcnRpb25TZXQuaW5zZXJ0Tm9kZSgKKyAgICAgICAgZWRnZS5zZXROb2Rl
KG1faW5zZXJ0aW9uU2V0Lmluc2VydE5vZGUoCiAgICAgICAgICAgICBtX2luZGV4SW5CbG9jaywg
U3BlY1N0cmluZywgVG9TdHJpbmcsIG5vZGUtPmNvZGVPcmlnaW4sCi0gICAgICAgICAgICBFZGdl
KGVkZ2Uubm9kZSgpLCB1c2VLaW5kKSk7CisgICAgICAgICAgICBFZGdlKGVkZ2Uubm9kZSgpLCB1
c2VLaW5kKSkpOwogICAgIH0KICAgICAKICAgICB0ZW1wbGF0ZTxVc2VLaW5kIHVzZUtpbmQ+CkBA
IC05MTMsNyArOTE3LDcgQEAgcHJpdmF0ZToKICAgICAgICAgaWYgKCFjYW5PcHRpbWl6ZVN0cmlu
Z09iamVjdEFjY2Vzcyhub2RlLT5jb2RlT3JpZ2luKSkKICAgICAgICAgICAgIHJldHVybjsKICAg
ICAgICAgCi0gICAgICAgIG5vZGUtPmNoaWxkMSgpLnNldE5vZGUoY3JlYXRlVG9TdHJpbmc8dXNl
S2luZD4obm9kZSwgbm9kZS0+Y2hpbGQxKCkpKTsKKyAgICAgICAgY3JlYXRlVG9TdHJpbmc8dXNl
S2luZD4obm9kZSwgbm9kZS0+Y2hpbGQxKCkpOwogICAgICAgICBhcnJheU1vZGUgPSBBcnJheU1v
ZGUoQXJyYXk6OlN0cmluZyk7CiAgICAgfQogICAgIApAQCAtOTQ3LDcgKzk1MSwzNCBAQCBwcml2
YXRlOgogICAgICAgICAvLyBGSVhNRTogV2Ugb3VnaHQgdG8gYmUgYWJsZSB0byBoYXZlIGEgVG9Q
cmltaXRpdmVUb1N0cmluZyBub2RlLgogICAgICAgICAKICAgICAgICAgb2JzZXJ2ZVVzZUtpbmRP
bk5vZGU8dXNlS2luZD4oZWRnZS5ub2RlKCkpOwotICAgICAgICBlZGdlID0gRWRnZShjcmVhdGVU
b1N0cmluZzx1c2VLaW5kPihub2RlLCBlZGdlKSwgS25vd25TdHJpbmdVc2UpOworICAgICAgICBj
cmVhdGVUb1N0cmluZzx1c2VLaW5kPihub2RlLCBlZGdlKTsKKyAgICB9CisgICAgCisgICAgdm9p
ZCBjb252ZXJ0VG9NYWtlUm9wZShOb2RlKiBub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS0+c2V0
T3BBbmREZWZhdWx0RmxhZ3MoTWFrZVJvcGUpOworICAgICAgICBmaXh1cE1ha2VSb3BlKG5vZGUp
OworICAgIH0KKyAgICAKKyAgICB2b2lkIGZpeHVwTWFrZVJvcGUoTm9kZSogbm9kZSkKKyAgICB7
CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBZGphY2VuY3lMaXN0OjpTaXplOyAr
K2kpIHsKKyAgICAgICAgICAgIEVkZ2UmIGVkZ2UgPSBub2RlLT5jaGlsZHJlbi5jaGlsZChpKTsK
KyAgICAgICAgICAgIGlmICghZWRnZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGVkZ2Uuc2V0VXNlS2luZChLbm93blN0cmluZ1VzZSk7CisgICAgICAgICAgICBpZiAoIW1f
Z3JhcGguaXNDb25zdGFudChlZGdlLm5vZGUoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICBKU1N0cmluZyogc3RyaW5nID0ganNDYXN0PEpTU3RyaW5nKj4obV9ncmFw
aC52YWx1ZU9mSlNDb25zdGFudChlZGdlLm5vZGUoKSkuYXNDZWxsKCkpOworICAgICAgICAgICAg
aWYgKHN0cmluZy0+bGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBub2RlLT5jaGlsZHJlbi5yZW1vdmVFZGdlKGktLSk7CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIGlmICghbm9kZS0+Y2hpbGQyKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbm9k
ZS0+Y2hpbGQzKCkpOworICAgICAgICAgICAgbm9kZS0+Y29udmVydFRvSWRlbnRpdHkoKTsKKyAg
ICAgICAgfQogICAgIH0KICAgICAKICAgICB0ZW1wbGF0ZTxVc2VLaW5kIGxlZnRVc2VLaW5kPgpA
QCAtOTYxLDYgKzk5Miw3IEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChyaWdodC0+c2hvdWxkU3Bl
Y3VsYXRlU3RyaW5nKCkpIHsKICAgICAgICAgICAgIGNvbnZlcnRTdHJpbmdBZGRVc2U8bGVmdFVz
ZUtpbmQ+KG5vZGUsIGxlZnQpOwogICAgICAgICAgICAgY29udmVydFN0cmluZ0FkZFVzZTxTdHJp
bmdVc2U+KG5vZGUsIHJpZ2h0KTsKKyAgICAgICAgICAgIGNvbnZlcnRUb01ha2VSb3BlKG5vZGUp
OwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC05Njgs
NiArMTAwMCw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAmJiBjYW5PcHRpbWl6ZVN0cmluZ09i
amVjdEFjY2Vzcyhub2RlLT5jb2RlT3JpZ2luKSkgewogICAgICAgICAgICAgY29udmVydFN0cmlu
Z0FkZFVzZTxsZWZ0VXNlS2luZD4obm9kZSwgbGVmdCk7CiAgICAgICAgICAgICBjb252ZXJ0U3Ry
aW5nQWRkVXNlPFN0cmluZ09iamVjdFVzZT4obm9kZSwgcmlnaHQpOworICAgICAgICAgICAgY29u
dmVydFRvTWFrZVJvcGUobm9kZSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAg
fQogICAgICAgICAKQEAgLTk3NSw2ICsxMDA4LDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICYm
IGNhbk9wdGltaXplU3RyaW5nT2JqZWN0QWNjZXNzKG5vZGUtPmNvZGVPcmlnaW4pKSB7CiAgICAg
ICAgICAgICBjb252ZXJ0U3RyaW5nQWRkVXNlPGxlZnRVc2VLaW5kPihub2RlLCBsZWZ0KTsKICAg
ICAgICAgICAgIGNvbnZlcnRTdHJpbmdBZGRVc2U8U3RyaW5nT3JTdHJpbmdPYmplY3RVc2U+KG5v
ZGUsIHJpZ2h0KTsKKyAgICAgICAgICAgIGNvbnZlcnRUb01ha2VSb3BlKG5vZGUpOwogICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR05vZGVUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdOb2RlVHlwZS5oCShyZXZpc2lvbiAxNDYyNTApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGVUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTIyNCw3
ICsyMjQsNyBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CiAgICAgbWFjcm8oVG9Q
cmltaXRpdmUsIE5vZGVSZXN1bHRKUyB8IE5vZGVNdXN0R2VuZXJhdGUgfCBOb2RlQ2xvYmJlcnNX
b3JsZCkgXAogICAgIG1hY3JvKFRvU3RyaW5nLCBOb2RlUmVzdWx0SlMgfCBOb2RlTXVzdEdlbmVy
YXRlIHwgTm9kZU1pZ2h0Q2xvYmJlcikgXAogICAgIG1hY3JvKE5ld1N0cmluZ09iamVjdCwgTm9k
ZVJlc3VsdEpTKSBcCi0gICAgbWFjcm8oU3RyQ2F0LCBOb2RlUmVzdWx0SlMgfCBOb2RlTXVzdEdl
bmVyYXRlIHwgTm9kZUhhc1ZhckFyZ3MgfCBOb2RlQ2xvYmJlcnNXb3JsZCkgXAorICAgIG1hY3Jv
KE1ha2VSb3BlLCBOb2RlUmVzdWx0SlMpIFwKICAgICBcCiAgICAgLyogTm9kZXMgdXNlZCBmb3Ig
YWN0aXZhdGlvbnMuIEFjdGl2YXRpb24gc3VwcG9ydCB3b3JrcyBieSBoYXZpbmcgaXQgYW5jaG9y
ZWQgYXQgKi9cCiAgICAgLyogZXBpbGdvdWVzIHZpYSBUZWFyT2ZmQWN0aXZhdGlvbiwgYW5kIGFs
bCBDcmVhdGVBY3RpdmF0aW9uIG5vZGVzIGtlcHQgYWxpdmUgYnkgKi9cCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5jcHAJKHJldmlzaW9uIDE0NjI1MCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEyNTMsMTQgKzEyNTMsNiBAQCBFbmNvZGVkSlNWYWx1ZSBERkdfT1BFUkFUSU9O
IG9wZXJhdGlvblRvCiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShKU1ZhbHVlOjpkZWNvZGUo
dmFsdWUpLnRvUHJpbWl0aXZlKGV4ZWMpKTsKIH0KIAotRW5jb2RlZEpTVmFsdWUgREZHX09QRVJB
VElPTiBvcGVyYXRpb25TdHJDYXQoRXhlY1N0YXRlKiBleGVjLCB2b2lkKiBidWZmZXIsIHNpemVf
dCBzaXplKQotewotICAgIEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9ICZleGVjLT5nbG9iYWxE
YXRhKCk7Ci0gICAgTmF0aXZlQ2FsbEZyYW1lVHJhY2VyIHRyYWNlcihnbG9iYWxEYXRhLCBleGVj
KTsKLQotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNTdHJpbmcoZXhlYywgc3RhdGljX2Nh
c3Q8UmVnaXN0ZXIqPihidWZmZXIpLCBzaXplKSk7Ci19Ci0KIGNoYXIqIERGR19PUEVSQVRJT04g
b3BlcmF0aW9uTmV3QXJyYXkoRXhlY1N0YXRlKiBleGVjLCBTdHJ1Y3R1cmUqIGFycmF5U3RydWN0
dXJlLCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIEpTR2xvYmFsRGF0YSogZ2xv
YmFsRGF0YSA9ICZleGVjLT5nbG9iYWxEYXRhKCk7CkBAIC0xNTcxLDE2ICsxNTYzLDIyIEBAIEpT
Q2VsbCogREZHX09QRVJBVElPTiBvcGVyYXRpb25Ub1N0cmluZygKICAgICByZXR1cm4gSlNWYWx1
ZTo6ZGVjb2RlKHZhbHVlKS50b1N0cmluZyhleGVjKTsKIH0KIAotSlNDZWxsKiBERkdfT1BFUkFU
SU9OIG9wZXJhdGlvblN0cmluZ0FkZChFeGVjU3RhdGUqIGV4ZWMsIEpTU3RyaW5nKiBsZWZ0LCBK
U1N0cmluZyogcmlnaHQpCitKU0NlbGwqIERGR19PUEVSQVRJT04gb3BlcmF0aW9uTWFrZVJvcGUy
KEV4ZWNTdGF0ZSogZXhlYywgSlNTdHJpbmcqIGxlZnQsIEpTU3RyaW5nKiByaWdodCkKIHsKICAg
ICBKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEgPSBleGVjLT5nbG9iYWxEYXRhKCk7CiAgICAgTmF0
aXZlQ2FsbEZyYW1lVHJhY2VyIHRyYWNlcigmZ2xvYmFsRGF0YSwgZXhlYyk7CiAKLSAgICAvLyBE
b24ndCBldmVuIGJvdGhlciBjYWxsaW5nIGpzU3RyaW5nKCkgYmVjYXVzZSBvdXIgZmFzdCBwYXRo
IHdvdWxkIGhhdmUgZG9uZSB3aGF0ZXZlcgotICAgIC8vIG9wdGltaXphdGlvbnMgdGhhdCBmdW5j
dGlvbiB3b3VsZCBoYXZlIGRvbmUuCiAgICAgcmV0dXJuIEpTUm9wZVN0cmluZzo6Y3JlYXRlKGds
b2JhbERhdGEsIGxlZnQsIHJpZ2h0KTsKIH0KIAorSlNDZWxsKiBERkdfT1BFUkFUSU9OIG9wZXJh
dGlvbk1ha2VSb3BlMyhFeGVjU3RhdGUqIGV4ZWMsIEpTU3RyaW5nKiBhLCBKU1N0cmluZyogYiwg
SlNTdHJpbmcqIGMpCit7CisgICAgSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhID0gZXhlYy0+Z2xv
YmFsRGF0YSgpOworICAgIE5hdGl2ZUNhbGxGcmFtZVRyYWNlciB0cmFjZXIoJmdsb2JhbERhdGEs
IGV4ZWMpOworCisgICAgcmV0dXJuIEpTUm9wZVN0cmluZzo6Y3JlYXRlKGdsb2JhbERhdGEsIGEs
IGIsIGMpOworfQorCiBkb3VibGUgREZHX09QRVJBVElPTiBvcGVyYXRpb25GTW9kT25JbnRzKGlu
dDMyX3QgYSwgaW50MzJfdCBiKQogewogICAgIHJldHVybiBmbW9kKGEsIGIpOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmgJKHJldmlzaW9uIDE0NjI1MCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5oCSh3b3JraW5nIGNv
cHkpCkBAIC04OCw2ICs4OCw3IEBAIHR5cGVkZWYgSlNDZWxsKiBERkdfT1BFUkFUSU9OICgqQ19E
RkdPcGUKIHR5cGVkZWYgSlNDZWxsKiBERkdfT1BFUkFUSU9OICgqQ19ERkdPcGVyYXRpb25fRUop
KEV4ZWNTdGF0ZSosIEVuY29kZWRKU1ZhbHVlKTsKIHR5cGVkZWYgSlNDZWxsKiBERkdfT1BFUkFU
SU9OICgqQ19ERkdPcGVyYXRpb25fRUpzc1N0KShFeGVjU3RhdGUqLCBKU1N0cmluZyosIFN0cnVj
dHVyZSopOwogdHlwZWRlZiBKU0NlbGwqIERGR19PUEVSQVRJT04gKCpDX0RGR09wZXJhdGlvbl9F
SnNzSnNzKShFeGVjU3RhdGUqLCBKU1N0cmluZyosIEpTU3RyaW5nKik7Cit0eXBlZGVmIEpTQ2Vs
bCogREZHX09QRVJBVElPTiAoKkNfREZHT3BlcmF0aW9uX0VKc3NKc3NKc3MpKEV4ZWNTdGF0ZSos
IEpTU3RyaW5nKiwgSlNTdHJpbmcqLCBKU1N0cmluZyopOwogdHlwZWRlZiBKU0NlbGwqIERGR19P
UEVSQVRJT04gKCpDX0RGR09wZXJhdGlvbl9FT1opKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgaW50
MzJfdCk7CiB0eXBlZGVmIEpTQ2VsbCogREZHX09QRVJBVElPTiAoKkNfREZHT3BlcmF0aW9uX0VT
dCkoRXhlY1N0YXRlKiwgU3RydWN0dXJlKik7CiB0eXBlZGVmIGRvdWJsZSBERkdfT1BFUkFUSU9O
ICgqRF9ERkdPcGVyYXRpb25fREQpKGRvdWJsZSwgZG91YmxlKTsKQEAgLTE0NSw3ICsxNDYsNiBA
QCBFbmNvZGVkSlNWYWx1ZSBERkdfT1BFUkFUSU9OIG9wZXJhdGlvblJlCiBFbmNvZGVkSlNWYWx1
ZSBERkdfT1BFUkFUSU9OIG9wZXJhdGlvblJlc29sdmVCYXNlU3RyaWN0UHV0KEV4ZWNTdGF0ZSos
IElkZW50aWZpZXIqLCBSZXNvbHZlT3BlcmF0aW9ucyosIFB1dFRvQmFzZU9wZXJhdGlvbiopIFdU
Rl9JTlRFUk5BTDsKIEVuY29kZWRKU1ZhbHVlIERGR19PUEVSQVRJT04gb3BlcmF0aW9uUmVzb2x2
ZUdsb2JhbChFeGVjU3RhdGUqLCBSZXNvbHZlT3BlcmF0aW9uKiwgSlNHbG9iYWxPYmplY3QqLCBJ
ZGVudGlmaWVyKikgV1RGX0lOVEVSTkFMOwogRW5jb2RlZEpTVmFsdWUgREZHX09QRVJBVElPTiBv
cGVyYXRpb25Ub1ByaW1pdGl2ZShFeGVjU3RhdGUqLCBFbmNvZGVkSlNWYWx1ZSkgV1RGX0lOVEVS
TkFMOwotRW5jb2RlZEpTVmFsdWUgREZHX09QRVJBVElPTiBvcGVyYXRpb25TdHJDYXQoRXhlY1N0
YXRlKiwgdm9pZCosIHNpemVfdCkgV1RGX0lOVEVSTkFMOwogY2hhciogREZHX09QRVJBVElPTiBv
cGVyYXRpb25OZXdBcnJheShFeGVjU3RhdGUqLCBTdHJ1Y3R1cmUqLCB2b2lkKiwgc2l6ZV90KSBX
VEZfSU5URVJOQUw7CiBjaGFyKiBERkdfT1BFUkFUSU9OIG9wZXJhdGlvbk5ld0FycmF5QnVmZmVy
KEV4ZWNTdGF0ZSosIFN0cnVjdHVyZSosIHNpemVfdCwgc2l6ZV90KSBXVEZfSU5URVJOQUw7CiBj
aGFyKiBERkdfT1BFUkFUSU9OIG9wZXJhdGlvbk5ld0VtcHR5QXJyYXkoRXhlY1N0YXRlKiwgU3Ry
dWN0dXJlKikgV1RGX0lOVEVSTkFMOwpAQCAtMjE4LDcgKzIxOCw4IEBAIFN0cmluZ0ltcGwqIERG
R19PUEVSQVRJT04gb3BlcmF0aW9uUmVzb2wKIEpTQ2VsbCogREZHX09QRVJBVElPTiBvcGVyYXRp
b25OZXdTdHJpbmdPYmplY3QoRXhlY1N0YXRlKiwgSlNTdHJpbmcqLCBTdHJ1Y3R1cmUqKTsKIEpT
Q2VsbCogREZHX09QRVJBVElPTiBvcGVyYXRpb25Ub1N0cmluZ09uQ2VsbChFeGVjU3RhdGUqLCBK
U0NlbGwqKTsKIEpTQ2VsbCogREZHX09QRVJBVElPTiBvcGVyYXRpb25Ub1N0cmluZyhFeGVjU3Rh
dGUqLCBFbmNvZGVkSlNWYWx1ZSk7Ci1KU0NlbGwqIERGR19PUEVSQVRJT04gb3BlcmF0aW9uU3Ry
aW5nQWRkKEV4ZWNTdGF0ZSosIEpTU3RyaW5nKiwgSlNTdHJpbmcqKTsKK0pTQ2VsbCogREZHX09Q
RVJBVElPTiBvcGVyYXRpb25NYWtlUm9wZTIoRXhlY1N0YXRlKiwgSlNTdHJpbmcqLCBKU1N0cmlu
ZyopOworSlNDZWxsKiBERkdfT1BFUkFUSU9OIG9wZXJhdGlvbk1ha2VSb3BlMyhFeGVjU3RhdGUq
LCBKU1N0cmluZyosIEpTU3RyaW5nKiwgSlNTdHJpbmcqKTsKIAogLy8gVGhpcyBtZXRob2QgaXMg
dXNlZCB0byBsb29rdXAgYW4gZXhjZXB0aW9uIGhhbmRlciwga2V5ZWQgYnkgZmF1bHRMb2NhdGlv
biwgd2hpY2ggaXMKIC8vIHRoZSByZXR1cm4gbG9jYXRpb24gZnJvbSBvbmUgb2YgdGhlIGNhbGxz
IG91dCB0byBvbmUgb2YgdGhlIGhlbHBlciBvcGVyYXRpb25zIGFib3ZlLgpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQcmVkaWN0aW9uUHJvcGFn
YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDE0NjI1MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHUHJlZGljdGlvblByb3BhZ2F0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00MTMsOCArNDEzLDggQEAgcHJpdmF0ZToKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAg
Y2FzZSBTdHJpbmdDaGFyQXQ6Ci0gICAgICAgIGNhc2UgU3RyQ2F0OgotICAgICAgICBjYXNlIFRv
U3RyaW5nOiB7CisgICAgICAgIGNhc2UgVG9TdHJpbmc6CisgICAgICAgIGNhc2UgTWFrZVJvcGU6
IHsKICAgICAgICAgICAgIGNoYW5nZWQgfD0gc2V0UHJlZGljdGlvbihTcGVjU3RyaW5nKTsKICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAJKHJldmlzaW9uIDE0NjI1
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMjgsNiArMjIyOCwxMCBAQCB2b2lkIFNwZWN1bGF0aXZl
SklUOjpjb21waWxlKE5vZGUqIG5vZGUpCiAgICAgICAgIGNvbXBpbGVBZGQobm9kZSk7CiAgICAg
ICAgIGJyZWFrOwogCisgICAgY2FzZSBNYWtlUm9wZToKKyAgICAgICAgY29tcGlsZU1ha2VSb3Bl
KG5vZGUpOworICAgICAgICBicmVhazsKKwogICAgIGNhc2UgQXJpdGhTdWI6CiAgICAgICAgIGNv
bXBpbGVBcml0aFN1Yihub2RlKTsKICAgICAgICAgYnJlYWs7CkBAIC0zMzY0LDQ4ICszMzY4LDYg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlKiBub2RlKQogICAgICAgICBicmVh
azsKICAgICB9CiAgICAgICAgIAotICAgIGNhc2UgU3RyQ2F0OiB7Ci0gICAgICAgIHNpemVfdCBz
Y3JhdGNoU2l6ZSA9IHNpemVvZihFbmNvZGVkSlNWYWx1ZSkgKiBub2RlLT5udW1DaGlsZHJlbigp
OwotICAgICAgICBTY3JhdGNoQnVmZmVyKiBzY3JhdGNoQnVmZmVyID0gbV9qaXQuZ2xvYmFsRGF0
YSgpLT5zY3JhdGNoQnVmZmVyRm9yU2l6ZShzY3JhdGNoU2l6ZSk7Ci0gICAgICAgIEVuY29kZWRK
U1ZhbHVlKiBidWZmZXIgPSBzY3JhdGNoQnVmZmVyID8gc3RhdGljX2Nhc3Q8RW5jb2RlZEpTVmFs
dWUqPihzY3JhdGNoQnVmZmVyLT5kYXRhQnVmZmVyKCkpIDogMDsKLSAgICAgICAgCi0gICAgICAg
IGZvciAodW5zaWduZWQgb3BlcmFuZElkeCA9IDA7IG9wZXJhbmRJZHggPCBub2RlLT5udW1DaGls
ZHJlbigpOyArK29wZXJhbmRJZHgpIHsKLSAgICAgICAgICAgIEpTVmFsdWVPcGVyYW5kIG9wZXJh
bmQodGhpcywgbV9qaXQuZ3JhcGgoKS5tX3ZhckFyZ0NoaWxkcmVuW25vZGUtPmZpcnN0Q2hpbGQo
KSArIG9wZXJhbmRJZHhdKTsKLSAgICAgICAgICAgIEdQUlJlZyBvcFRhZ0dQUiA9IG9wZXJhbmQu
dGFnR1BSKCk7Ci0gICAgICAgICAgICBHUFJSZWcgb3BQYXlsb2FkR1BSID0gb3BlcmFuZC5wYXls
b2FkR1BSKCk7Ci0gICAgICAgICAgICBvcGVyYW5kLnVzZSgpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBtX2ppdC5zdG9yZTMyKG9wVGFnR1BSLCByZWludGVycHJldF9jYXN0PGNoYXIqPihi
dWZmZXIgKyBvcGVyYW5kSWR4KSArIE9CSkVDVF9PRkZTRVRPRihFbmNvZGVkVmFsdWVEZXNjcmlw
dG9yLCBhc0JpdHMudGFnKSk7Ci0gICAgICAgICAgICBtX2ppdC5zdG9yZTMyKG9wUGF5bG9hZEdQ
UiwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyICsgb3BlcmFuZElkeCkgKyBPQkpFQ1Rf
T0ZGU0VUT0YoRW5jb2RlZFZhbHVlRGVzY3JpcHRvciwgYXNCaXRzLnBheWxvYWQpKTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgZmx1c2hSZWdpc3RlcnMoKTsKLQotICAgICAgICBpZiAo
c2NyYXRjaFNpemUpIHsKLSAgICAgICAgICAgIEdQUlRlbXBvcmFyeSBzY3JhdGNoKHRoaXMpOwot
Ci0gICAgICAgICAgICAvLyBUZWxsIEdDIG1hcmsgcGhhc2UgaG93IG11Y2ggb2YgdGhlIHNjcmF0
Y2ggYnVmZmVyIGlzIGFjdGl2ZSBkdXJpbmcgY2FsbC4KLSAgICAgICAgICAgIG1faml0Lm1vdmUo
VHJ1c3RlZEltbVB0cihzY3JhdGNoQnVmZmVyLT5hY3RpdmVMZW5ndGhQdHIoKSksIHNjcmF0Y2gu
Z3ByKCkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIoVHJ1c3RlZEltbVB0cihzY3JhdGNo
U2l6ZSksIHNjcmF0Y2guZ3ByKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgR1BSUmVzdWx0IHJl
c3VsdFBheWxvYWQodGhpcyk7Ci0gICAgICAgIEdQUlJlc3VsdDIgcmVzdWx0VGFnKHRoaXMpOwot
ICAgICAgICAKLSAgICAgICAgY2FsbE9wZXJhdGlvbihvcGVyYXRpb25TdHJDYXQsIHJlc3VsdFRh
Zy5ncHIoKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSwgc3RhdGljX2Nhc3Q8dm9pZCAqPihidWZmZXIp
LCBub2RlLT5udW1DaGlsZHJlbigpKTsKLQotICAgICAgICBpZiAoc2NyYXRjaFNpemUpIHsKLSAg
ICAgICAgICAgIEdQUlRlbXBvcmFyeSBzY3JhdGNoKHRoaXMpOwotCi0gICAgICAgICAgICBtX2pp
dC5tb3ZlKFRydXN0ZWRJbW1QdHIoc2NyYXRjaEJ1ZmZlci0+YWN0aXZlTGVuZ3RoUHRyKCkpLCBz
Y3JhdGNoLmdwcigpKTsKLSAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKFRydXN0ZWRJbW1QdHIo
MCksIHNjcmF0Y2guZ3ByKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IG1ha2Ug
dGhlIGNhbGxPcGVyYXRpb24gYWJvdmUgZXhwbGljaXRseSByZXR1cm4gYSBjZWxsIHJlc3VsdCwg
b3Igaml0QXNzZXJ0IHRoZSB0YWcgaXMgYSBjZWxsIHRhZy4KLSAgICAgICAgY2VsbFJlc3VsdChy
ZXN1bHRQYXlsb2FkLmdwcigpLCBub2RlLCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwot
ICAgICAgICBicmVhazsKLSAgICB9Ci0KICAgICBjYXNlIE5ld0FycmF5OiB7CiAgICAgICAgIEpT
R2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBtX2ppdC5ncmFwaCgpLmdsb2JhbE9iamVjdEZv
cihub2RlLT5jb2RlT3JpZ2luKTsKICAgICAgICAgaWYgKCFnbG9iYWxPYmplY3QtPmlzSGF2aW5n
QUJhZFRpbWUoKSAmJiAhaGFzQXJyYXlTdG9yYWdlKG5vZGUtPmluZGV4aW5nVHlwZSgpKSkgewpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
NjQuY3BwCShyZXZpc2lvbiAxNDYyNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1NwZWN1bGF0aXZlSklUNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTY1LDYgKzIxNjUsMTAg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlKiBub2RlKQogICAgIGNhc2UgQXJp
dGhBZGQ6CiAgICAgICAgIGNvbXBpbGVBZGQobm9kZSk7CiAgICAgICAgIGJyZWFrOworICAgICAg
ICAKKyAgICBjYXNlIE1ha2VSb3BlOgorICAgICAgICBjb21waWxlTWFrZVJvcGUobm9kZSk7Cisg
ICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBBcml0aFN1YjoKICAgICAgICAgY29tcGlsZUFyaXRo
U3ViKG5vZGUpOwpAQCAtMzUyMyw0NCArMzUyNyw2IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNv
bXBpbGUoTm9kZSogbm9kZSkKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgICAgICAKLSAgICBj
YXNlIFN0ckNhdDogewotICAgICAgICBzaXplX3Qgc2NyYXRjaFNpemUgPSBzaXplb2YoRW5jb2Rl
ZEpTVmFsdWUpICogbm9kZS0+bnVtQ2hpbGRyZW4oKTsKLSAgICAgICAgU2NyYXRjaEJ1ZmZlciog
c2NyYXRjaEJ1ZmZlciA9IG1faml0Lmdsb2JhbERhdGEoKS0+c2NyYXRjaEJ1ZmZlckZvclNpemUo
c2NyYXRjaFNpemUpOwotICAgICAgICBFbmNvZGVkSlNWYWx1ZSogYnVmZmVyID0gc2NyYXRjaEJ1
ZmZlciA/IHN0YXRpY19jYXN0PEVuY29kZWRKU1ZhbHVlKj4oc2NyYXRjaEJ1ZmZlci0+ZGF0YUJ1
ZmZlcigpKSA6IDA7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHVuc2lnbmVkIG9wZXJhbmRJZHgg
PSAwOyBvcGVyYW5kSWR4IDwgbm9kZS0+bnVtQ2hpbGRyZW4oKTsgKytvcGVyYW5kSWR4KSB7Ci0g
ICAgICAgICAgICBKU1ZhbHVlT3BlcmFuZCBvcGVyYW5kKHRoaXMsIG1faml0LmdyYXBoKCkubV92
YXJBcmdDaGlsZHJlbltub2RlLT5maXJzdENoaWxkKCkgKyBvcGVyYW5kSWR4XSk7Ci0gICAgICAg
ICAgICBHUFJSZWcgb3BHUFIgPSBvcGVyYW5kLmdwcigpOwotICAgICAgICAgICAgb3BlcmFuZC51
c2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbV9qaXQuc3RvcmU2NChvcEdQUiwgYnVm
ZmVyICsgb3BlcmFuZElkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZsdXNoUmVn
aXN0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKHNjcmF0Y2hTaXplKSB7Ci0gICAgICAgICAgICBHUFJU
ZW1wb3Jhcnkgc2NyYXRjaCh0aGlzKTsKLQotICAgICAgICAgICAgLy8gVGVsbCBHQyBtYXJrIHBo
YXNlIGhvdyBtdWNoIG9mIHRoZSBzY3JhdGNoIGJ1ZmZlciBpcyBhY3RpdmUgZHVyaW5nIGNhbGwu
Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKFRydXN0ZWRJbW1QdHIoc2NyYXRjaEJ1ZmZlci0+YWN0
aXZlTGVuZ3RoUHRyKCkpLCBzY3JhdGNoLmdwcigpKTsKLSAgICAgICAgICAgIG1faml0LnN0b3Jl
UHRyKFRydXN0ZWRJbW1QdHIoc2NyYXRjaFNpemUpLCBzY3JhdGNoLmdwcigpKTsKLSAgICAgICAg
fQotCi0gICAgICAgIEdQUlJlc3VsdCByZXN1bHQodGhpcyk7Ci0gICAgICAgIAotICAgICAgICBj
YWxsT3BlcmF0aW9uKG9wZXJhdGlvblN0ckNhdCwgcmVzdWx0LmdwcigpLCBzdGF0aWNfY2FzdDx2
b2lkICo+KGJ1ZmZlciksIG5vZGUtPm51bUNoaWxkcmVuKCkpOwotCi0gICAgICAgIGlmIChzY3Jh
dGNoU2l6ZSkgewotICAgICAgICAgICAgR1BSVGVtcG9yYXJ5IHNjcmF0Y2godGhpcyk7Ci0KLSAg
ICAgICAgICAgIG1faml0Lm1vdmUoVHJ1c3RlZEltbVB0cihzY3JhdGNoQnVmZmVyLT5hY3RpdmVM
ZW5ndGhQdHIoKSksIHNjcmF0Y2guZ3ByKCkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIo
VHJ1c3RlZEltbVB0cigwKSwgc2NyYXRjaC5ncHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBj
ZWxsUmVzdWx0KHJlc3VsdC5ncHIoKSwgbm9kZSwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKICAgICBjYXNlIE5ld0FycmF5QnVm
ZmVyOiB7CiAgICAgICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBtX2ppdC5ncmFw
aCgpLmdsb2JhbE9iamVjdEZvcihub2RlLT5jb2RlT3JpZ2luKTsKICAgICAgICAgSW5kZXhpbmdU
eXBlIGluZGV4aW5nVHlwZSA9IG5vZGUtPmluZGV4aW5nVHlwZSgpOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDE0
NjI1MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMDk0LDYxICszMDk0LDYgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJ
VDo6Y29tcGlsZUFkZChOb2RlKiBubwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgICAgICAK
LSAgICBjYXNlIEtub3duU3RyaW5nVXNlOiB7Ci0gICAgICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5k
IG9wMSh0aGlzLCBub2RlLT5jaGlsZDEoKSk7Ci0gICAgICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5k
IG9wMih0aGlzLCBub2RlLT5jaGlsZDIoKSk7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHQo
dGhpcyk7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSBhbGxvY2F0b3IodGhpcyk7Ci0gICAgICAgIEdQ
UlRlbXBvcmFyeSBzY3JhdGNoKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgR1BSUmVnIG9wMUdQ
UiA9IG9wMS5ncHIoKTsKLSAgICAgICAgR1BSUmVnIG9wMkdQUiA9IG9wMi5ncHIoKTsKLSAgICAg
ICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKLSAgICAgICAgR1BSUmVnIGFsbG9j
YXRvckdQUiA9IGFsbG9jYXRvci5ncHIoKTsKLSAgICAgICAgR1BSUmVnIHNjcmF0Y2hHUFIgPSBz
Y3JhdGNoLmdwcigpOwotICAgICAgICAKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgb3AxTm90
RW1wdHkgPSBtX2ppdC5icmFuY2hUZXN0MzIoCi0gICAgICAgICAgICBKSVRDb21waWxlcjo6Tm9u
WmVybywgSklUQ29tcGlsZXI6OkFkZHJlc3Mob3AxR1BSLCBKU1N0cmluZzo6b2Zmc2V0T2ZMZW5n
dGgoKSkpOwotICAgICAgICAKLSAgICAgICAgbV9qaXQubW92ZShvcDJHUFIsIHJlc3VsdEdQUik7
Ci0gICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmUxID0gbV9qaXQuanVtcCgpOwotICAgICAg
ICAKLSAgICAgICAgb3AxTm90RW1wdHkubGluaygmbV9qaXQpOwotICAgICAgICBKSVRDb21waWxl
cjo6SnVtcCBvcDJOb3RFbXB0eSA9IG1faml0LmJyYW5jaFRlc3QzMigKLSAgICAgICAgICAgIEpJ
VENvbXBpbGVyOjpOb25aZXJvLCBKSVRDb21waWxlcjo6QWRkcmVzcyhvcDJHUFIsIEpTU3RyaW5n
OjpvZmZzZXRPZkxlbmd0aCgpKSk7Ci0gICAgICAgIAotICAgICAgICBtX2ppdC5tb3ZlKG9wMUdQ
UiwgcmVzdWx0R1BSKTsKLSAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZTIgPSBtX2ppdC5q
dW1wKCk7Ci0gICAgICAgIAotICAgICAgICBvcDJOb3RFbXB0eS5saW5rKCZtX2ppdCk7Ci0gICAg
ICAgIAotICAgICAgICBKSVRDb21waWxlcjo6SnVtcExpc3Qgc2xvd1BhdGg7Ci0gICAgICAgIE1h
cmtlZEFsbG9jYXRvciYgbWFya2VkQWxsb2NhdG9yID0gbV9qaXQuZ2xvYmFsRGF0YSgpLT5oZWFw
LmFsbG9jYXRvckZvck9iamVjdFdpdGhJbW1vcnRhbFN0cnVjdHVyZURlc3RydWN0b3Ioc2l6ZW9m
KEpTUm9wZVN0cmluZykpOwotICAgICAgICBtX2ppdC5tb3ZlKFRydXN0ZWRJbW1QdHIoJm1hcmtl
ZEFsbG9jYXRvciksIGFsbG9jYXRvckdQUik7Ci0gICAgICAgIGVtaXRBbGxvY2F0ZUpTQ2VsbChy
ZXN1bHRHUFIsIGFsbG9jYXRvckdQUiwgVHJ1c3RlZEltbVB0cihtX2ppdC5nbG9iYWxEYXRhKCkt
PnN0cmluZ1N0cnVjdHVyZS5nZXQoKSksIHNjcmF0Y2hHUFIsIHNsb3dQYXRoKTsKLSAgICAgICAg
Ci0gICAgICAgIG1faml0LnN0b3JlUHRyKFRydXN0ZWRJbW1QdHIoMCksIEpJVENvbXBpbGVyOjpB
ZGRyZXNzKHJlc3VsdEdQUiwgSlNTdHJpbmc6Om9mZnNldE9mVmFsdWUoKSkpOwotICAgICAgICBt
X2ppdC5zdG9yZVB0cihUcnVzdGVkSW1tUHRyKDApLCBKSVRDb21waWxlcjo6QWRkcmVzcyhyZXN1
bHRHUFIsIEpTUm9wZVN0cmluZzo6b2Zmc2V0T2ZGaWJlcnMoKSArIHNpemVvZihXcml0ZUJhcnJp
ZXI8SlNTdHJpbmc+KSAqIDIpKTsKLSAgICAgICAgbV9qaXQuc3RvcmVQdHIob3AxR1BSLCBKSVRD
b21waWxlcjo6QWRkcmVzcyhyZXN1bHRHUFIsIEpTUm9wZVN0cmluZzo6b2Zmc2V0T2ZGaWJlcnMo
KSkpOwotICAgICAgICBtX2ppdC5zdG9yZVB0cihvcDJHUFIsIEpJVENvbXBpbGVyOjpBZGRyZXNz
KHJlc3VsdEdQUiwgSlNSb3BlU3RyaW5nOjpvZmZzZXRPZkZpYmVycygpICsgc2l6ZW9mKFdyaXRl
QmFycmllcjxKU1N0cmluZz4pKSk7Ci0gICAgICAgIG1faml0LmxvYWQzMihKSVRDb21waWxlcjo6
QWRkcmVzcyhvcDFHUFIsIEpTU3RyaW5nOjpvZmZzZXRPZkZsYWdzKCkpLCBzY3JhdGNoR1BSKTsK
LSAgICAgICAgbV9qaXQubG9hZDMyKEpJVENvbXBpbGVyOjpBZGRyZXNzKG9wMUdQUiwgSlNTdHJp
bmc6Om9mZnNldE9mTGVuZ3RoKCkpLCBhbGxvY2F0b3JHUFIpOwotICAgICAgICBtX2ppdC5hbmQz
MihKSVRDb21waWxlcjo6QWRkcmVzcyhvcDJHUFIsIEpTU3RyaW5nOjpvZmZzZXRPZkZsYWdzKCkp
LCBzY3JhdGNoR1BSKTsKLSAgICAgICAgbV9qaXQuYWRkMzIoSklUQ29tcGlsZXI6OkFkZHJlc3Mo
b3AyR1BSLCBKU1N0cmluZzo6b2Zmc2V0T2ZMZW5ndGgoKSksIGFsbG9jYXRvckdQUik7Ci0gICAg
ICAgIG1faml0LmFuZDMyKEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNTdHJpbmc6OklzOEJp
dCksIHNjcmF0Y2hHUFIpOwotICAgICAgICBtX2ppdC5zdG9yZTMyKHNjcmF0Y2hHUFIsIEpJVENv
bXBpbGVyOjpBZGRyZXNzKHJlc3VsdEdQUiwgSlNTdHJpbmc6Om9mZnNldE9mRmxhZ3MoKSkpOwot
ICAgICAgICBtX2ppdC5zdG9yZTMyKGFsbG9jYXRvckdQUiwgSklUQ29tcGlsZXI6OkFkZHJlc3Mo
cmVzdWx0R1BSLCBKU1N0cmluZzo6b2Zmc2V0T2ZMZW5ndGgoKSkpOwotICAgICAgICAKLSAgICAg
ICAgYWRkU2xvd1BhdGhHZW5lcmF0b3Ioc2xvd1BhdGhDYWxsKAotICAgICAgICAgICAgc2xvd1Bh
dGgsIHRoaXMsIG9wZXJhdGlvblN0cmluZ0FkZCwgcmVzdWx0R1BSLCBvcDFHUFIsIG9wMkdQUikp
OwotICAgICAgICAKLSAgICAgICAgZG9uZTEubGluaygmbV9qaXQpOwotICAgICAgICBkb25lMi5s
aW5rKCZtX2ppdCk7Ci0gICAgICAgIAotICAgICAgICBjZWxsUmVzdWx0KHJlc3VsdEdQUiwgbm9k
ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAogICAgIGNhc2UgVW50eXBlZFVz
ZTogewogICAgICAgICBSRUxFQVNFX0FTU0VSVChub2RlLT5vcCgpID09IFZhbHVlQWRkKTsKICAg
ICAgICAgY29tcGlsZVZhbHVlQWRkKG5vZGUpOwpAQCAtMzE2MSw2ICszMTA2LDcxIEBAIHZvaWQg
U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVBZGQoTm9kZSogbm8KICAgICB9CiB9CiAKK3ZvaWQgU3Bl
Y3VsYXRpdmVKSVQ6OmNvbXBpbGVNYWtlUm9wZShOb2RlKiBub2RlKQoreworICAgIEFTU0VSVChu
b2RlLT5jaGlsZDEoKS51c2VLaW5kKCkgPT0gS25vd25TdHJpbmdVc2UpOworICAgIEFTU0VSVChu
b2RlLT5jaGlsZDIoKS51c2VLaW5kKCkgPT0gS25vd25TdHJpbmdVc2UpOworICAgIEFTU0VSVCgh
bm9kZS0+Y2hpbGQzKCkgfHwgbm9kZS0+Y2hpbGQzKCkudXNlS2luZCgpID09IEtub3duU3RyaW5n
VXNlKTsKKyAgICAKKyAgICBTcGVjdWxhdGVDZWxsT3BlcmFuZCBvcDEodGhpcywgbm9kZS0+Y2hp
bGQxKCkpOworICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5kIG9wMih0aGlzLCBub2RlLT5jaGlsZDIo
KSk7CisgICAgU3BlY3VsYXRlQ2VsbE9wZXJhbmQgb3AzKHRoaXMsIG5vZGUtPmNoaWxkMygpKTsK
KyAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOworICAgIEdQUlRlbXBvcmFyeSBhbGxvY2F0
b3IodGhpcyk7CisgICAgR1BSVGVtcG9yYXJ5IHNjcmF0Y2godGhpcyk7CisgICAgCisgICAgR1BS
UmVnIG9wR1BSc1szXTsKKyAgICB1bnNpZ25lZCBudW1PcEdQUnM7CisgICAgb3BHUFJzWzBdID0g
b3AxLmdwcigpOworICAgIG9wR1BSc1sxXSA9IG9wMi5ncHIoKTsKKyAgICBpZiAobm9kZS0+Y2hp
bGQzKCkpIHsKKyAgICAgICAgb3BHUFJzWzJdID0gb3AzLmdwcigpOworICAgICAgICBudW1PcEdQ
UnMgPSAzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wR1BSc1syXSA9IEludmFsaWRHUFJSZWc7
CisgICAgICAgIG51bU9wR1BScyA9IDI7CisgICAgfQorICAgIEdQUlJlZyByZXN1bHRHUFIgPSBy
ZXN1bHQuZ3ByKCk7CisgICAgR1BSUmVnIGFsbG9jYXRvckdQUiA9IGFsbG9jYXRvci5ncHIoKTsK
KyAgICBHUFJSZWcgc2NyYXRjaEdQUiA9IHNjcmF0Y2guZ3ByKCk7CisgICAgCisgICAgSklUQ29t
cGlsZXI6Okp1bXBMaXN0IHNsb3dQYXRoOworICAgIE1hcmtlZEFsbG9jYXRvciYgbWFya2VkQWxs
b2NhdG9yID0gbV9qaXQuZ2xvYmFsRGF0YSgpLT5oZWFwLmFsbG9jYXRvckZvck9iamVjdFdpdGhJ
bW1vcnRhbFN0cnVjdHVyZURlc3RydWN0b3Ioc2l6ZW9mKEpTUm9wZVN0cmluZykpOworICAgIG1f
aml0Lm1vdmUoVHJ1c3RlZEltbVB0cigmbWFya2VkQWxsb2NhdG9yKSwgYWxsb2NhdG9yR1BSKTsK
KyAgICBlbWl0QWxsb2NhdGVKU0NlbGwocmVzdWx0R1BSLCBhbGxvY2F0b3JHUFIsIFRydXN0ZWRJ
bW1QdHIobV9qaXQuZ2xvYmFsRGF0YSgpLT5zdHJpbmdTdHJ1Y3R1cmUuZ2V0KCkpLCBzY3JhdGNo
R1BSLCBzbG93UGF0aCk7CisgICAgICAgIAorICAgIG1faml0LnN0b3JlUHRyKFRydXN0ZWRJbW1Q
dHIoMCksIEpJVENvbXBpbGVyOjpBZGRyZXNzKHJlc3VsdEdQUiwgSlNTdHJpbmc6Om9mZnNldE9m
VmFsdWUoKSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1PcEdQUnM7ICsraSkK
KyAgICAgICAgbV9qaXQuc3RvcmVQdHIob3BHUFJzW2ldLCBKSVRDb21waWxlcjo6QWRkcmVzcyhy
ZXN1bHRHUFIsIEpTUm9wZVN0cmluZzo6b2Zmc2V0T2ZGaWJlcnMoKSArIHNpemVvZihXcml0ZUJh
cnJpZXI8SlNTdHJpbmc+KSAqIGkpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBudW1PcEdQUnM7
IGkgPCBKU1JvcGVTdHJpbmc6OnNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoOyArK2kpCisgICAgICAg
IG1faml0LnN0b3JlUHRyKFRydXN0ZWRJbW1QdHIoMCksIEpJVENvbXBpbGVyOjpBZGRyZXNzKHJl
c3VsdEdQUiwgSlNSb3BlU3RyaW5nOjpvZmZzZXRPZkZpYmVycygpICsgc2l6ZW9mKFdyaXRlQmFy
cmllcjxKU1N0cmluZz4pICogaSkpOworICAgIG1faml0LmxvYWQzMihKSVRDb21waWxlcjo6QWRk
cmVzcyhvcEdQUnNbMF0sIEpTU3RyaW5nOjpvZmZzZXRPZkZsYWdzKCkpLCBzY3JhdGNoR1BSKTsK
KyAgICBtX2ppdC5sb2FkMzIoSklUQ29tcGlsZXI6OkFkZHJlc3Mob3BHUFJzWzBdLCBKU1N0cmlu
Zzo6b2Zmc2V0T2ZMZW5ndGgoKSksIGFsbG9jYXRvckdQUik7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMTsgaSA8IG51bU9wR1BSczsgKytpKSB7CisgICAgICAgIG1faml0LmFuZDMyKEpJVENvbXBp
bGVyOjpBZGRyZXNzKG9wR1BSc1tpXSwgSlNTdHJpbmc6Om9mZnNldE9mRmxhZ3MoKSksIHNjcmF0
Y2hHUFIpOworICAgICAgICBtX2ppdC5hZGQzMihKSVRDb21waWxlcjo6QWRkcmVzcyhvcEdQUnNb
aV0sIEpTU3RyaW5nOjpvZmZzZXRPZkxlbmd0aCgpKSwgYWxsb2NhdG9yR1BSKTsKKyAgICB9Cisg
ICAgbV9qaXQuYW5kMzIoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMihKU1N0cmluZzo6SXM4Qml0
KSwgc2NyYXRjaEdQUik7CisgICAgbV9qaXQuc3RvcmUzMihzY3JhdGNoR1BSLCBKSVRDb21waWxl
cjo6QWRkcmVzcyhyZXN1bHRHUFIsIEpTU3RyaW5nOjpvZmZzZXRPZkZsYWdzKCkpKTsKKyAgICBt
X2ppdC5zdG9yZTMyKGFsbG9jYXRvckdQUiwgSklUQ29tcGlsZXI6OkFkZHJlc3MocmVzdWx0R1BS
LCBKU1N0cmluZzo6b2Zmc2V0T2ZMZW5ndGgoKSkpOworICAgIAorICAgIHN3aXRjaCAobnVtT3BH
UFJzKSB7CisgICAgY2FzZSAyOgorICAgICAgICBhZGRTbG93UGF0aEdlbmVyYXRvcihzbG93UGF0
aENhbGwoCisgICAgICAgICAgICBzbG93UGF0aCwgdGhpcywgb3BlcmF0aW9uTWFrZVJvcGUyLCBy
ZXN1bHRHUFIsIG9wR1BSc1swXSwgb3BHUFJzWzFdKSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgMzoKKyAgICAgICAgYWRkU2xvd1BhdGhHZW5lcmF0b3Ioc2xvd1BhdGhDYWxsKAorICAgICAg
ICAgICAgc2xvd1BhdGgsIHRoaXMsIG9wZXJhdGlvbk1ha2VSb3BlMywgcmVzdWx0R1BSLCBvcEdQ
UnNbMF0sIG9wR1BSc1sxXSwgb3BHUFJzWzJdKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1
bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICAgICAgCisgICAgY2VsbFJlc3VsdChyZXN1bHRHUFIsIG5vZGUpOworfQor
CiB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlQXJpdGhTdWIoTm9kZSogbm9kZSkKIHsKICAg
ICBzd2l0Y2ggKG5vZGUtPmJpbmFyeVVzZUtpbmQoKSkgewpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkocmV2aXNpb24gMTQ2MjUwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xMDk4LDYgKzEwOTgsMTEgQEAgcHVibGljOgogICAgICAgICBtX2ppdC5zZXR1cEFy
Z3VtZW50c1dpdGhFeGVjU3RhdGUoYXJnMSwgYXJnMik7CiAgICAgICAgIHJldHVybiBhcHBlbmRD
YWxsV2l0aEV4Y2VwdGlvbkNoZWNrU2V0UmVzdWx0KG9wZXJhdGlvbiwgcmVzdWx0KTsKICAgICB9
CisgICAgSklUQ29tcGlsZXI6OkNhbGwgY2FsbE9wZXJhdGlvbihDX0RGR09wZXJhdGlvbl9FSnNz
SnNzSnNzIG9wZXJhdGlvbiwgR1BSUmVnIHJlc3VsdCwgR1BSUmVnIGFyZzEsIEdQUlJlZyBhcmcy
LCBHUFJSZWcgYXJnMykKKyAgICB7CisgICAgICAgIG1faml0LnNldHVwQXJndW1lbnRzV2l0aEV4
ZWNTdGF0ZShhcmcxLCBhcmcyLCBhcmczKTsKKyAgICAgICAgcmV0dXJuIGFwcGVuZENhbGxXaXRo
RXhjZXB0aW9uQ2hlY2tTZXRSZXN1bHQob3BlcmF0aW9uLCByZXN1bHQpOworICAgIH0KICAgICBK
SVRDb21waWxlcjo6Q2FsbCBjYWxsT3BlcmF0aW9uKENfREZHT3BlcmF0aW9uX0VKIG9wZXJhdGlv
biwgR1BSUmVnIHJlc3VsdCwgR1BSUmVnIGFyZzEpCiAgICAgewogICAgICAgICBtX2ppdC5zZXR1
cEFyZ3VtZW50c1dpdGhFeGVjU3RhdGUoYXJnMSk7CkBAIC0xNTAxLDYgKzE1MDYsMTEgQEAgcHVi
bGljOgogICAgICAgICBtX2ppdC5zZXR1cEFyZ3VtZW50c1dpdGhFeGVjU3RhdGUoYXJnMSwgYXJn
Mik7CiAgICAgICAgIHJldHVybiBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrU2V0UmVzdWx0
KG9wZXJhdGlvbiwgcmVzdWx0KTsKICAgICB9CisgICAgSklUQ29tcGlsZXI6OkNhbGwgY2FsbE9w
ZXJhdGlvbihDX0RGR09wZXJhdGlvbl9FSnNzSnNzSnNzIG9wZXJhdGlvbiwgR1BSUmVnIHJlc3Vs
dCwgR1BSUmVnIGFyZzEsIEdQUlJlZyBhcmcyLCBHUFJSZWcgYXJnMykKKyAgICB7CisgICAgICAg
IG1faml0LnNldHVwQXJndW1lbnRzV2l0aEV4ZWNTdGF0ZShhcmcxLCBhcmcyLCBhcmczKTsKKyAg
ICAgICAgcmV0dXJuIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2tTZXRSZXN1bHQob3BlcmF0
aW9uLCByZXN1bHQpOworICAgIH0KICAgICBKSVRDb21waWxlcjo6Q2FsbCBjYWxsT3BlcmF0aW9u
KENfREZHT3BlcmF0aW9uX0VKIG9wZXJhdGlvbiwgR1BSUmVnIHJlc3VsdCwgR1BSUmVnIGFyZzFU
YWcsIEdQUlJlZyBhcmcxUGF5bG9hZCkKICAgICB7CiAgICAgICAgIG1faml0LnNldHVwQXJndW1l
bnRzV2l0aEV4ZWNTdGF0ZShhcmcxUGF5bG9hZCwgYXJnMVRhZyk7CkBAIC0yMTA1LDYgKzIxMTUs
NyBAQCBwdWJsaWM6CiAgICAgdm9pZCBjb21waWxlRG91YmxlQXNJbnQzMihOb2RlKik7CiAgICAg
dm9pZCBjb21waWxlSW50MzJUb0RvdWJsZShOb2RlKik7CiAgICAgdm9pZCBjb21waWxlQWRkKE5v
ZGUqKTsKKyAgICB2b2lkIGNvbXBpbGVNYWtlUm9wZShOb2RlKik7CiAgICAgdm9pZCBjb21waWxl
QXJpdGhTdWIoTm9kZSopOwogICAgIHZvaWQgY29tcGlsZUFyaXRoTmVnYXRlKE5vZGUqKTsKICAg
ICB2b2lkIGNvbXBpbGVBcml0aE11bChOb2RlKik7CkBAIC0yODg3LDYgKzI4OTgsOCBAQCBwdWJs
aWM6CiAgICAgICAgICwgbV9ncHJPckludmFsaWQoSW52YWxpZEdQUlJlZykKICAgICB7CiAgICAg
ICAgIEFTU0VSVChtX2ppdCk7CisgICAgICAgIGlmICghZWRnZSkKKyAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgQVNTRVJUX1VOVVNFRChtb2RlLCBtb2RlID09IE1hbnVhbE9wZXJhbmRTcGVj
dWxhdGlvbiB8fCAoZWRnZS51c2VLaW5kKCkgPT0gQ2VsbFVzZSB8fCBlZGdlLnVzZUtpbmQoKSA9
PSBLbm93bkNlbGxVc2UgfHwgZWRnZS51c2VLaW5kKCkgPT0gT2JqZWN0VXNlIHx8IGVkZ2UudXNl
S2luZCgpID09IFN0cmluZ1VzZSB8fCBlZGdlLnVzZUtpbmQoKSA9PSBLbm93blN0cmluZ1VzZSB8
fCBlZGdlLnVzZUtpbmQoKSA9PSBTdHJpbmdPYmplY3RVc2UgfHwgZWRnZS51c2VLaW5kKCkgPT0g
U3RyaW5nT3JTdHJpbmdPYmplY3RVc2UpKTsKICAgICAgICAgaWYgKGppdC0+aXNGaWxsZWQobm9k
ZSgpKSkKICAgICAgICAgICAgIGdwcigpOwpAQCAtMjg5NCw2ICsyOTA3LDggQEAgcHVibGljOgog
CiAgICAgflNwZWN1bGF0ZUNlbGxPcGVyYW5kKCkKICAgICB7CisgICAgICAgIGlmICghbV9lZGdl
KQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBBU1NFUlQobV9ncHJPckludmFsaWQgIT0g
SW52YWxpZEdQUlJlZyk7CiAgICAgICAgIG1faml0LT51bmxvY2sobV9ncHJPckludmFsaWQpOwog
ICAgIH0KQEAgLTI5MTAsNiArMjkyNSw3IEBAIHB1YmxpYzoKIAogICAgIEdQUlJlZyBncHIoKQog
ICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZWRnZSk7CiAgICAgICAgIGlmIChtX2dwck9ySW52YWxp
ZCA9PSBJbnZhbGlkR1BSUmVnKQogICAgICAgICAgICAgbV9ncHJPckludmFsaWQgPSBtX2ppdC0+
ZmlsbFNwZWN1bGF0ZUNlbGwoZWRnZSgpKTsKICAgICAgICAgcmV0dXJuIG1fZ3ByT3JJbnZhbGlk
OwpAQCAtMjkxNyw2ICsyOTMzLDcgQEAgcHVibGljOgogICAgIAogICAgIHZvaWQgdXNlKCkKICAg
ICB7CisgICAgICAgIEFTU0VSVChtX2VkZ2UpOwogICAgICAgICBtX2ppdC0+dXNlKG5vZGUoKSk7
CiAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1N0cmluZy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmgJ
KHJldmlzaW9uIDE0NjI1MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3Ry
aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxMiw2ICszMTIsOCBAQCBuYW1lc3BhY2UgSlNDIHsK
ICAgICAgICAgCiAgICAgICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZGaWJlcnMoKSB7IHJl
dHVybiBPQkpFQ1RfT0ZGU0VUT0YoSlNSb3BlU3RyaW5nLCBtX2ZpYmVycyk7IH0KIAorICAgICAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19tYXhJbnRlcm5hbFJvcGVMZW5ndGggPSAzOworICAg
ICAgICAKICAgICBwcml2YXRlOgogICAgICAgICBmcmllbmQgSlNWYWx1ZSBqc1N0cmluZyhFeGVj
U3RhdGUqLCBSZWdpc3RlciosIHVuc2lnbmVkKTsKICAgICAgICAgZnJpZW5kIEpTVmFsdWUganNT
dHJpbmdGcm9tQXJndW1lbnRzKEV4ZWNTdGF0ZSosIEpTVmFsdWUpOwpAQCAtMzIzLDggKzMyNSw2
IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICAKICAgICAgICAgSlNTdHJpbmcqIGdldEluZGV4
U2xvd0Nhc2UoRXhlY1N0YXRlKiwgdW5zaWduZWQpOwogCi0gICAgICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBzX21heEludGVybmFsUm9wZUxlbmd0aCA9IDM7Ci0gICAgICAgIAogICAgICAgICBt
dXRhYmxlIEZpeGVkQXJyYXk8V3JpdGVCYXJyaWVyPEpTU3RyaW5nPiwgc19tYXhJbnRlcm5hbFJv
cGVMZW5ndGg+IG1fZmliZXJzOwogICAgIH07CiAK
</data>
<flag name="review"
          id="215678"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>