<?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>74480</bug_id>
          
          <creation_ts>2011-12-13 20:32:33 -0800</creation_ts>
          <short_desc>DFG should infer when local variables are doubles</short_desc>
          <delta_ts>2011-12-14 00:34:11 -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>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</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="Nobody">webkit-unassigned</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>520639</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 20:32:33 -0800</bug_when>
    <thetext>Currently the DFG will box and unbox double variables that span basic blocks. This is expensive.  On 64-bit platforms (that use JSVALUE64) it means moving data between FPR file and the GPR file, and doing some arithmetic.  Moving data between FPR and GPR is typically expensive on x86-64.  On 32-bit systems that means clobbering three registers at a time (two GPRs and one FPR), doing twice as many loads and stores, and also doing data movement between FPRs and GPRs.

It also means that the DFG must recheck that a local variable contains a double most of the time when a basic block uses it for the first time.

The DFG should instead realize when a local variable contains a double.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520641</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 20:32:57 -0800</bug_when>
    <thetext>&lt;rdar://problem/10577764&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520645</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 20:34:52 -0800</bug_when>
    <thetext>This seems to speed up SunSpider by almost 1% and Kraken by over 4%.



[pizlo@nitroflex bencher] ./bencher TipOfTree:/Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc InferDouble:/Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc --remote oldmac,bigmac
Packaging VM builds for remote hosts...
Sending VM builds to oldmac...
Running on oldmac...
376/376                                                          
Generating benchmark report at TipOfTree_InferDouble_SunSpiderV8Kraken_20111213_2031_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on oldmac.local (MacPro4,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r102726)
&quot;InferDouble&quot; at /Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc (r102726)

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              InferDouble                                   
SunSpider:
   3d-cube                                8.8640+-0.0429    ^     7.4783+-0.0387       ^ definitely 1.1853x faster
   3d-morph                              10.1664+-0.1668         10.0235+-0.0396         might be 1.0143x faster
   3d-raytrace                           10.0254+-0.8807          9.1721+-0.0705         might be 1.0930x faster
   access-binary-trees                    1.9152+-0.0090    ?     1.9269+-0.0090       ?
   access-fannkuch                        8.9156+-0.0068    !     9.1071+-0.0079       ! definitely 1.0215x slower
   access-nbody                           4.7595+-0.0254    ?     4.7900+-0.0194       ?
   access-nsieve                          3.7866+-0.0047    !     3.8020+-0.0041       ! definitely 1.0041x slower
   bitops-3bit-bits-in-byte               1.5002+-0.0191    ?     1.5625+-0.0496       ? might be 1.0415x slower
   bitops-bits-in-byte                    6.1139+-0.0243    ?     6.1573+-0.0369       ?
   bitops-bitwise-and                     3.9910+-0.0376          3.9838+-0.0095       
   bitops-nsieve-bits                     6.8580+-0.0513          6.7878+-0.0329         might be 1.0103x faster
   controlflow-recursive                  2.8194+-0.0162    ?     2.8544+-0.0249       ? might be 1.0124x slower
   crypto-aes                             9.1490+-0.3096          9.0991+-0.0468       
   crypto-md5                             2.9499+-0.0146    !     3.0445+-0.0578       ! definitely 1.0321x slower
   crypto-sha1                            2.6060+-0.0203    !     2.6795+-0.0190       ! definitely 1.0282x slower
   date-format-tofte                     13.2222+-0.3235         12.8159+-0.1231         might be 1.0317x faster
   date-format-xparb                     12.1189+-0.1112    ^    11.8531+-0.1179       ^ definitely 1.0224x faster
   math-cordic                            8.6257+-0.0290    ?     8.6343+-0.0248       ?
   math-partial-sums                     12.7365+-0.1972    ?    12.7552+-0.2154       ?
   math-spectral-norm                     3.1432+-0.0107    !     3.1836+-0.0043       ! definitely 1.0128x slower
   regexp-dna                            10.7363+-0.0470    ?    10.7956+-0.1236       ?
   string-base64                          5.2740+-0.1528          5.1653+-0.0371         might be 1.0210x faster
   string-fasta                           8.7299+-0.0440          8.7156+-0.0123       
   string-tagcloud                       14.7977+-0.0608    ?    14.8364+-0.0648       ?
   string-unpack-code                    25.2653+-0.0788    !    26.1269+-0.6823       ! definitely 1.0341x slower
   string-validate-input                  6.9628+-0.2511          6.8991+-0.1079       

   &lt;arithmetic&gt; *                         7.9243+-0.0316    ^     7.8557+-0.0346       ^ definitely 1.0087x faster
   &lt;geometric&gt;                            6.4154+-0.0237          6.3781+-0.0215         might be 1.0059x faster
   &lt;harmonic&gt;                             5.0441+-0.0202    ?     5.0683+-0.0227       ? might be 1.0048x slower

                                            TipOfTree              InferDouble                                   
V8:
   crypto                                92.3189+-0.1768    !    92.9931+-0.2907       ! definitely 1.0073x slower
   deltablue                            202.2128+-0.7672    ?   204.2764+-2.6381       ? might be 1.0102x slower
   earley-boyer                         120.2561+-1.5281        119.9834+-1.0816       
   raytrace                              62.6864+-0.2945    ?    62.9496+-0.3395       ?
   regexp                               146.4076+-0.3915    ?   147.5305+-1.0621       ?
   richards                             169.3085+-0.9655        168.7773+-0.1446       
   splay                                109.0943+-2.6160        107.2942+-1.4021         might be 1.0168x faster

   &lt;arithmetic&gt;                         128.8978+-0.3947    ?   129.1149+-0.5027       ? might be 1.0017x slower
   &lt;geometric&gt; *                        121.0234+-0.4854    ?   121.1533+-0.4136       ? might be 1.0011x slower
   &lt;harmonic&gt;                           112.9735+-0.5265    ?   113.0861+-0.3863       ? might be 1.0010x slower

                                            TipOfTree              InferDouble                                   
Kraken:
   ai-astar                             896.2120+-0.9081    ?   897.4056+-1.4467       ?
   audio-beat-detection                 249.7459+-0.7168    ^   236.9684+-4.7124       ^ definitely 1.0539x faster
   audio-dft                            333.0498+-2.6652        332.0324+-2.7483       
   audio-fft                            162.2732+-0.5465    ^   145.1072+-1.7622       ^ definitely 1.1183x faster
   audio-oscillator                     349.9188+-7.0760    ?   351.8688+-6.0331       ?
   imaging-darkroom                     390.6610+-7.3585    ^   365.0496+-9.1288       ^ definitely 1.0702x faster
   imaging-desaturate                   287.2454+-0.2057        287.0173+-0.1003       
   imaging-gaussian-blur                758.5774+-0.5489    ^   629.6762+-0.3251       ^ definitely 1.2047x faster
   json-parse-financial                  86.2733+-0.6693    ^    84.3297+-0.1604       ^ definitely 1.0230x faster
   json-stringify-tinderbox             100.0438+-0.4731         99.4582+-0.2832       
   stanford-crypto-aes                  140.6614+-0.5033    ?   141.6958+-0.6747       ?
   stanford-crypto-ccm                  136.0580+-0.8596    ?   138.4874+-2.8805       ? might be 1.0179x slower
   stanford-crypto-pbkdf2               283.1231+-3.2818        281.5303+-2.3855       
   stanford-crypto-sha256-iterative     116.7429+-0.1577    ?   116.9579+-0.2699       ?

   &lt;arithmetic&gt; *                       306.4704+-0.7919    ^   293.3989+-0.7825       ^ definitely 1.0446x faster
   &lt;geometric&gt;                          238.8340+-0.5606    ^   231.7124+-0.6685       ^ definitely 1.0307x faster
   &lt;harmonic&gt;                           192.6930+-0.3632    ^   188.6710+-0.5133       ^ definitely 1.0213x faster

                                            TipOfTree              InferDouble                                   
All benchmarks:
   &lt;arithmetic&gt;                         114.8703+-0.2586    ^   110.9710+-0.2019       ^ definitely 1.0351x faster
   &lt;geometric&gt;                           29.1832+-0.0820    ^    28.8325+-0.0695       ^ definitely 1.0122x faster
   &lt;harmonic&gt;                             8.8861+-0.0351    ?     8.9251+-0.0391       ? might be 1.0044x slower

                                            TipOfTree              InferDouble                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       66.4871+-0.1791    ^    65.3617+-0.1533       ^ definitely 1.0172x faster

Sending VM builds to bigmac...
Running on bigmac...
376/376                                                          
Generating benchmark report at TipOfTree_InferDouble_SunSpiderV8Kraken_20111213_2034_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on bigmac.local (MacPro5,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r102726)
&quot;InferDouble&quot; at /Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc (r102726)

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              InferDouble                                   
SunSpider:
   3d-cube                                7.3599+-0.0172    ^     6.1935+-0.0176       ^ definitely 1.1883x faster
   3d-morph                               8.2787+-0.0331    ?     8.3131+-0.0408       ?
   3d-raytrace                            7.7594+-0.0530    ^     7.5626+-0.0297       ^ definitely 1.0260x faster
   access-binary-trees                    1.5990+-0.0052    !     1.6218+-0.0143       ! definitely 1.0143x slower
   access-fannkuch                        7.3794+-0.0073    !     7.4922+-0.0038       ! definitely 1.0153x slower
   access-nbody                           3.9501+-0.0174    ?     3.9710+-0.0097       ?
   access-nsieve                          3.1931+-0.0443    ?     3.1985+-0.0472       ?
   bitops-3bit-bits-in-byte               1.2343+-0.0055    !     1.2645+-0.0171       ! definitely 1.0245x slower
   bitops-bits-in-byte                    5.0627+-0.0232    !     5.1193+-0.0273       ! definitely 1.0112x slower
   bitops-bitwise-and                     3.2883+-0.0042    ?     3.2890+-0.0039       ?
   bitops-nsieve-bits                     5.6403+-0.0372    ?     5.6504+-0.0354       ?
   controlflow-recursive                  2.3189+-0.0138    ?     2.3545+-0.0273       ? might be 1.0154x slower
   crypto-aes                             7.4006+-0.0336    !     7.5795+-0.0310       ! definitely 1.0242x slower
   crypto-md5                             2.4745+-0.0309    ?     2.4950+-0.0210       ?
   crypto-sha1                            2.1917+-0.0449    ?     2.2407+-0.0278       ? might be 1.0224x slower
   date-format-tofte                     11.0961+-0.1433    ^    10.5340+-0.0384       ^ definitely 1.0534x faster
   date-format-xparb                      9.8547+-0.1059    ^     9.5439+-0.0965       ^ definitely 1.0326x faster
   math-cordic                            7.1632+-0.0410    ?     7.1637+-0.0393       ?
   math-partial-sums                     10.3850+-0.0217    ?    10.3925+-0.0196       ?
   math-spectral-norm                     2.6165+-0.0184    !     2.6503+-0.0131       ! definitely 1.0129x slower
   regexp-dna                             8.8524+-0.0147    ?     8.8590+-0.0807       ?
   string-base64                          4.2392+-0.0153    ?     4.2676+-0.0196       ?
   string-fasta                           7.2051+-0.0222    ?     7.2101+-0.0155       ?
   string-tagcloud                       12.3163+-0.0420         12.2793+-0.0387       
   string-unpack-code                    20.3161+-0.0639    !    20.5405+-0.0945       ! definitely 1.0110x slower
   string-validate-input                  5.6125+-0.0396    !     5.7773+-0.1028       ! definitely 1.0294x slower

   &lt;arithmetic&gt; *                         6.4918+-0.0170    ^     6.4448+-0.0153       ^ definitely 1.0073x faster
   &lt;geometric&gt;                            5.2794+-0.0164          5.2639+-0.0163         might be 1.0029x faster
   &lt;harmonic&gt;                             4.1698+-0.0171    ?     4.1920+-0.0188       ? might be 1.0053x slower

                                            TipOfTree              InferDouble                                   
V8:
   crypto                                76.4124+-0.1538    !    77.0335+-0.1729       ! definitely 1.0081x slower
   deltablue                            168.1110+-0.6092    ?   168.7514+-0.3281       ?
   earley-boyer                          99.2037+-1.1928         98.8622+-1.2312       
   raytrace                              52.0740+-0.2648    ?    52.4510+-0.3786       ?
   regexp                               122.5762+-0.4387    ?   122.5942+-0.2169       ?
   richards                             140.6193+-0.7333        139.5501+-0.3941       
   splay                                 90.2985+-1.3064    ?    91.0237+-0.7212       ?

   &lt;arithmetic&gt;                         107.0421+-0.3858    ?   107.1809+-0.2302       ? might be 1.0013x slower
   &lt;geometric&gt; *                        100.4577+-0.3973    ?   100.6914+-0.2481       ? might be 1.0023x slower
   &lt;harmonic&gt;                            93.7450+-0.3869    ?    94.0821+-0.2642       ? might be 1.0036x slower

                                            TipOfTree              InferDouble                                   
Kraken:
   ai-astar                             807.6937+-13.0171   ?   817.9578+-10.9610      ? might be 1.0127x slower
   audio-beat-detection                 204.3632+-0.5384    ^   191.4491+-0.5621       ^ definitely 1.0675x faster
   audio-dft                            276.4388+-2.6729        274.2325+-2.9873       
   audio-fft                            132.8794+-0.7502    ^   118.3667+-0.2785       ^ definitely 1.1226x faster
   audio-oscillator                     284.9315+-4.3764        281.0456+-3.3328         might be 1.0138x faster
   imaging-darkroom                     324.4538+-6.9686    ^   304.7928+-8.4104       ^ definitely 1.0645x faster
   imaging-desaturate                   237.5346+-0.0964    ?   239.1287+-1.8817       ?
   imaging-gaussian-blur                626.5905+-1.1450    ^   520.3426+-0.6142       ^ definitely 1.2042x faster
   json-parse-financial                  70.3191+-0.1552    ^    69.5164+-0.0608       ^ definitely 1.0115x faster
   json-stringify-tinderbox              82.0737+-0.2916         81.6829+-0.1863       
   stanford-crypto-aes                  117.5053+-0.5505    ?   118.4122+-0.7377       ?
   stanford-crypto-ccm                  114.0254+-0.5261        113.5638+-0.6127       
   stanford-crypto-pbkdf2               230.9448+-0.2295        230.8450+-1.0556       
   stanford-crypto-sha256-iterative      96.0198+-0.2617    ?    96.3091+-0.2522       ?

   &lt;arithmetic&gt; *                       257.5553+-1.4028    ^   246.9747+-0.9613       ^ definitely 1.0428x faster
   &lt;geometric&gt;                          198.0558+-0.6962    ^   191.8997+-0.5139       ^ definitely 1.0321x faster
   &lt;harmonic&gt;                           158.8931+-0.3653    ^   155.4050+-0.3034       ^ definitely 1.0224x faster

                                            TipOfTree              InferDouble                                   
All benchmarks:
   &lt;arithmetic&gt;                          96.2523+-0.4319    ^    93.0952+-0.3051       ^ definitely 1.0339x faster
   &lt;geometric&gt;                           24.1014+-0.0648    ^    23.8453+-0.0635       ^ definitely 1.0107x faster
   &lt;harmonic&gt;                             7.3459+-0.0296    ?     7.3821+-0.0326       ? might be 1.0049x slower

                                            TipOfTree              InferDouble                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       55.1742+-0.1569    ^    54.3187+-0.1325       ^ definitely 1.0157x faster

[pizlo@nitroflex bencher]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520647</commentid>
    <comment_count>3</comment_count>
      <attachid>119149</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 20:42:27 -0800</bug_when>
    <thetext>Created attachment 119149
work in progress

Still need to write the JSVALUE32_64 code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520649</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-13 20:45:16 -0800</bug_when>
    <thetext>Attachment 119149 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source...&quot; exit_code: 1

Source/JavaScriptCore/dfg/DFGPropagator.cpp:676:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 1 in 17 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>520688</commentid>
    <comment_count>5</comment_count>
      <attachid>119157</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 22:46:53 -0800</bug_when>
    <thetext>Created attachment 119157
the patch

Wrote the JSVALUE32_64 code.  Luckily, the OSR exit/entry for JSVALUE32_64 needed no special work since an IEEE double is also a valid JSVALUE32_64 double.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520689</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 22:49:36 -0800</bug_when>
    <thetext>Performance on JSVALUE32_64:



[pizlo@nitroflex bencher] ./bencher TipOfTree32:/Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc InferDouble32:/Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc --remote oldmac,bigmac
Packaging VM builds for remote hosts...
Sending VM builds to oldmac...
Running on oldmac...
376/376                                                            
Generating benchmark report at TipOfTree32_InferDouble32_SunSpiderV8Kraken_20111213_2243_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on oldmac.local (MacPro4,1).

VMs tested:
&quot;TipOfTree32&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r102726)
&quot;InferDouble32&quot; at /Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc (r102726)

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.

                                           TipOfTree32            InferDouble32                                  
SunSpider:
   3d-cube                                9.8759+-0.0260    ^     8.7524+-0.0249       ^ definitely 1.1284x faster
   3d-morph                              13.2675+-0.0453    ?    13.2834+-0.0400       ?
   3d-raytrace                           11.6581+-0.0232         11.6313+-0.0210       
   access-binary-trees                    2.3372+-0.0110    !     2.3600+-0.0107       ! definitely 1.0098x slower
   access-fannkuch                       11.1245+-0.0296    !    11.2900+-0.0285       ! definitely 1.0149x slower
   access-nbody                           6.8743+-0.0065    ?     6.8972+-0.0175       ?
   access-nsieve                          3.7255+-0.0076    ?     3.7543+-0.0349       ?
   bitops-3bit-bits-in-byte               1.5625+-0.0270          1.5620+-0.0248       
   bitops-bits-in-byte                    6.0265+-0.0194    ?     6.0318+-0.0154       ?
   bitops-bitwise-and                     4.6959+-0.0090          4.6926+-0.0115       
   bitops-nsieve-bits                     8.1722+-0.0079    ?     8.1799+-0.0126       ?
   controlflow-recursive                  3.6756+-0.0369    ?     3.6908+-0.0478       ?
   crypto-aes                            11.9426+-0.0967    !    12.1948+-0.0501       ! definitely 1.0211x slower
   crypto-md5                             3.9414+-0.0372    ?     3.9869+-0.0475       ? might be 1.0115x slower
   crypto-sha1                            3.2980+-0.0624    ?     3.3295+-0.0366       ?
   date-format-tofte                     13.9670+-0.1470         13.8177+-0.0931         might be 1.0108x faster
   date-format-xparb                     14.4586+-0.0742    !    15.2751+-0.1029       ! definitely 1.0565x slower
   math-cordic                           12.0426+-0.0313         12.0219+-0.0324       
   math-partial-sums                     15.0773+-0.0425    ?    15.0815+-0.0381       ?
   math-spectral-norm                     3.2355+-0.0164    !     3.3117+-0.0302       ! definitely 1.0236x slower
   regexp-dna                            11.0747+-0.1091    ?    11.1738+-0.0794       ?
   string-base64                          5.9331+-0.0116    !     5.9622+-0.0113       ! definitely 1.0049x slower
   string-fasta                          10.5769+-0.0180    ?    10.5942+-0.0236       ?
   string-tagcloud                       16.5458+-0.0281         16.5032+-0.0554       
   string-unpack-code                    26.9658+-0.1368    ?    27.0020+-0.1227       ?
   string-validate-input                  7.5801+-0.0093    !     7.6401+-0.0153       ! definitely 1.0079x slower

   &lt;arithmetic&gt; *                         9.2167+-0.0165    ?     9.2316+-0.0197       ? might be 1.0016x slower
   &lt;geometric&gt;                            7.5099+-0.0202    ?     7.5240+-0.0198       ? might be 1.0019x slower
   &lt;harmonic&gt;                             5.8681+-0.0295    ?     5.8895+-0.0252       ? might be 1.0036x slower

                                           TipOfTree32            InferDouble32                                  
V8:
   crypto                               121.1994+-0.2802    !   121.9700+-0.4194       ! definitely 1.0064x slower
   deltablue                            225.4175+-0.4504    ?   226.6870+-1.9381       ?
   earley-boyer                         142.2687+-1.3848    ?   142.8703+-1.2828       ?
   raytrace                              68.1709+-0.7045         67.8957+-0.2722       
   regexp                               155.7222+-0.3299        155.7170+-0.4948       
   richards                             241.0998+-1.0237        239.9587+-0.6381       
   splay                                116.5125+-1.7885    ?   117.7935+-0.7934       ? might be 1.0110x slower

   &lt;arithmetic&gt;                         152.9130+-0.4079    ?   153.2703+-0.4364       ? might be 1.0023x slower
   &lt;geometric&gt; *                        141.9020+-0.4275    ?   142.2777+-0.3381       ? might be 1.0026x slower
   &lt;harmonic&gt;                           130.7297+-0.4425    ?   131.0370+-0.2673       ? might be 1.0024x slower

                                           TipOfTree32            InferDouble32                                  
Kraken:
   ai-astar                             987.9276+-1.9873    ?   989.5875+-1.9862       ?
   audio-beat-detection                 503.8657+-0.3595    ^   440.5516+-2.3661       ^ definitely 1.1437x faster
   audio-dft                            445.7723+-3.3746        444.7101+-2.4471       
   audio-fft                            334.2702+-0.8098    ^   267.6838+-2.3788       ^ definitely 1.2488x faster
   audio-oscillator                     547.8174+-3.0797    ^   538.0074+-3.2711       ^ definitely 1.0182x faster
   imaging-darkroom                     501.9588+-4.9934    ^   470.3138+-4.7611       ^ definitely 1.0673x faster
   imaging-desaturate                   360.0111+-0.1014    ?   360.0147+-0.2404       ?
   imaging-gaussian-blur                970.4162+-1.3375    ^   842.5708+-1.1573       ^ definitely 1.1517x faster
   json-parse-financial                  88.0039+-0.5441    ?    88.6821+-0.2110       ?
   json-stringify-tinderbox             126.7914+-0.3683        126.4213+-0.2953       
   stanford-crypto-aes                  169.5269+-0.5386        168.6534+-0.7137       
   stanford-crypto-ccm                  156.5946+-0.8589    ^   155.1493+-0.5687       ^ definitely 1.0093x faster
   stanford-crypto-pbkdf2               315.6071+-0.5699        314.4535+-1.0214       
   stanford-crypto-sha256-iterative     133.4636+-1.6870        132.1102+-0.1116         might be 1.0102x faster

   &lt;arithmetic&gt; *                       403.0019+-0.5047    ^   381.3507+-0.4167       ^ definitely 1.0568x faster
   &lt;geometric&gt;                          313.5732+-0.5312    ^   300.3107+-0.3505       ^ definitely 1.0442x faster
   &lt;harmonic&gt;                           241.1390+-0.6709    ^   235.1872+-0.2786       ^ definitely 1.0253x faster

                                           TipOfTree32            InferDouble32                                  
All benchmarks:
   &lt;arithmetic&gt;                         147.9160+-0.1981    ^   141.5281+-0.1751       ^ definitely 1.0451x faster
   &lt;geometric&gt;                           35.3583+-0.0723    ^    34.9561+-0.0690       ^ definitely 1.0115x faster
   &lt;harmonic&gt;                            10.3471+-0.0510    ?    10.3808+-0.0435       ? might be 1.0033x slower

                                           TipOfTree32            InferDouble32                                  
Geomean of preferred means:
   &lt;scaled-result&gt;                       80.7774+-0.1386    ^    79.4167+-0.1330       ^ definitely 1.0171x faster

Sending VM builds to bigmac...
Running on bigmac...
376/376                                                            
Generating benchmark report at TipOfTree32_InferDouble32_SunSpiderV8Kraken_20111213_2248_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on bigmac.local (MacPro5,1).

VMs tested:
&quot;TipOfTree32&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r102726)
&quot;InferDouble32&quot; at /Volumes/Data/pizlo/quartary/OpenSource/WebKitBuild/Release/jsc (r102726)

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.

                                           TipOfTree32            InferDouble32                                  
SunSpider:
   3d-cube                                8.2414+-0.0801    ^     7.2376+-0.0233       ^ definitely 1.1387x faster
   3d-morph                              10.9362+-0.0424    ?    11.0593+-0.0810       ? might be 1.0113x slower
   3d-raytrace                            9.6896+-0.0356    ?     9.7039+-0.0162       ?
   access-binary-trees                    1.9407+-0.0195    ?     1.9451+-0.0104       ?
   access-fannkuch                        9.2441+-0.0445    !     9.3548+-0.0376       ! definitely 1.0120x slower
   access-nbody                           5.6954+-0.0084    !     5.7078+-0.0038       ! definitely 1.0022x slower
   access-nsieve                          3.1094+-0.0128    !     3.1316+-0.0081       ! definitely 1.0071x slower
   bitops-3bit-bits-in-byte               1.2828+-0.0196    ?     1.2960+-0.0200       ? might be 1.0102x slower
   bitops-bits-in-byte                    4.9782+-0.0149    ?     4.9922+-0.0135       ?
   bitops-bitwise-and                     3.8794+-0.0047          3.8460+-0.0465       
   bitops-nsieve-bits                     6.7766+-0.0145          6.7644+-0.0078       
   controlflow-recursive                  2.9983+-0.0049    !     3.0352+-0.0310       ! definitely 1.0123x slower
   crypto-aes                             9.7946+-0.0258    !    10.1624+-0.0387       ! definitely 1.0376x slower
   crypto-md5                             3.2590+-0.0139    ?     3.2878+-0.0228       ?
   crypto-sha1                            2.6971+-0.0330    !     2.7582+-0.0163       ! definitely 1.0226x slower
   date-format-tofte                     11.5669+-0.0824    ?    11.5862+-0.2859       ?
   date-format-xparb                     12.0758+-0.2460    ?    12.4899+-0.2827       ? might be 1.0343x slower
   math-cordic                            9.9287+-0.0269    ?     9.9486+-0.0311       ?
   math-partial-sums                     12.4587+-0.0131         12.4514+-0.0177       
   math-spectral-norm                     2.6819+-0.0034    !     2.7610+-0.0281       ! definitely 1.0295x slower
   regexp-dna                             9.1832+-0.0195          9.1677+-0.0094       
   string-base64                          4.8763+-0.0237    !     4.9144+-0.0081       ! definitely 1.0078x slower
   string-fasta                           8.7722+-0.0213    ?     8.7903+-0.0429       ?
   string-tagcloud                       13.7713+-0.0307         13.7011+-0.0400       
   string-unpack-code                    22.1844+-0.0827    ?    22.2783+-0.0601       ?
   string-validate-input                  6.2970+-0.0165          6.2906+-0.0152       

   &lt;arithmetic&gt; *                         7.6277+-0.0127    ?     7.6408+-0.0139       ? might be 1.0017x slower
   &lt;geometric&gt;                            6.2119+-0.0130    ?     6.2263+-0.0111       ? might be 1.0023x slower
   &lt;harmonic&gt;                             4.8473+-0.0203    ?     4.8735+-0.0170       ? might be 1.0054x slower

                                           TipOfTree32            InferDouble32                                  
V8:
   crypto                               100.5472+-0.3565    ?   101.0559+-0.3720       ?
   deltablue                            187.7118+-0.8009    ?   188.1846+-1.3139       ?
   earley-boyer                         116.7155+-0.4644    ?   117.6857+-0.8208       ?
   raytrace                              56.3113+-0.5766    ?    57.0172+-0.6416       ? might be 1.0125x slower
   regexp                               130.1576+-0.3513        130.1473+-0.2585       
   richards                             198.9660+-0.6000    ?   200.1853+-1.9956       ?
   splay                                 97.2906+-1.0036    ?    99.3742+-1.4491       ? might be 1.0214x slower

   &lt;arithmetic&gt;                         126.8143+-0.2814    !   127.6643+-0.4408       ! definitely 1.0067x slower
   &lt;geometric&gt; *                        117.6751+-0.2986    !   118.6074+-0.3939       ! definitely 1.0079x slower
   &lt;harmonic&gt;                           108.3714+-0.3583    !   109.3784+-0.4169       ! definitely 1.0093x slower

                                           TipOfTree32            InferDouble32                                  
Kraken:
   ai-astar                             881.5506+-12.6789   ?   892.2307+-10.8047      ? might be 1.0121x slower
   audio-beat-detection                 417.6802+-3.9360    ^   365.0161+-3.6568       ^ definitely 1.1443x faster
   audio-dft                            364.9573+-2.0129        361.5342+-2.3947       
   audio-fft                            274.0695+-0.2537    ^   219.2772+-0.4352       ^ definitely 1.2499x faster
   audio-oscillator                     449.9475+-2.2052    ^   442.0701+-3.3194       ^ definitely 1.0178x faster
   imaging-darkroom                     415.0468+-4.4894    ^   390.9574+-4.1853       ^ definitely 1.0616x faster
   imaging-desaturate                   297.4802+-0.2322        297.3128+-0.0707       
   imaging-gaussian-blur                801.7976+-1.2091    ^   696.0927+-0.3739       ^ definitely 1.1519x faster
   json-parse-financial                  71.7417+-0.1640    !    72.7052+-0.1677       ! definitely 1.0134x slower
   json-stringify-tinderbox             104.6179+-0.2561        104.1383+-0.2901       
   stanford-crypto-aes                  140.4939+-0.1132    ?   140.6970+-0.4771       ?
   stanford-crypto-ccm                  130.7869+-0.5467        129.8170+-0.6464       
   stanford-crypto-pbkdf2               261.9172+-0.9742        260.9615+-1.0844       
   stanford-crypto-sha256-iterative     108.2584+-0.1808    ?   108.3181+-0.1846       ?

   &lt;arithmetic&gt; *                       337.1676+-0.8505    ^   320.0806+-1.0325       ^ definitely 1.0534x faster
   &lt;geometric&gt;                          259.8860+-0.3624    ^   249.4294+-0.5060       ^ definitely 1.0419x faster
   &lt;harmonic&gt;                           198.6468+-0.2351    ^   194.3329+-0.2853       ^ definitely 1.0222x faster

                                           TipOfTree32            InferDouble32                                  
All benchmarks:
   &lt;arithmetic&gt;                         123.5397+-0.2540    ^   118.5838+-0.3125       ^ definitely 1.0418x faster
   &lt;geometric&gt;                           29.2752+-0.0451    ^    28.9905+-0.0480       ^ definitely 1.0098x faster
   &lt;harmonic&gt;                             8.5472+-0.0350    ?     8.5908+-0.0296       ? might be 1.0051x slower

                                           TipOfTree32            InferDouble32                                  
Geomean of preferred means:
   &lt;scaled-result&gt;                       67.1386+-0.0768    ^    66.1965+-0.1120       ^ definitely 1.0142x faster

[pizlo@nitroflex bencher]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520701</commentid>
    <comment_count>7</comment_count>
      <attachid>119157</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2011-12-13 23:08:03 -0800</bug_when>
    <thetext>Comment on attachment 119157
the patch

r=me any impact on perf of http://people.xiph.org/~bens/route9/route9.html ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520713</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-13 23:17:02 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/102743</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520753</commentid>
    <comment_count>9</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-12-14 00:34:11 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 119157 [details])
&gt; r=me any impact on perf of http://people.xiph.org/~bens/route9/route9.html ?

Doesn&apos;t seem to affect it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119149</attachid>
            <date>2011-12-13 20:42:27 -0800</date>
            <delta_ts>2011-12-13 22:46:53 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>double_patch_1.diff</filename>
            <type>text/plain</type>
            <size>33647</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAyNzMxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBA
CisyMDExLTEyLTEzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHIHNob3VsZCBpbmZlciB3aGVuIGxvY2FsIHZhcmlhYmxlcyBhcmUgZG91YmxlcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0ODAKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIEludHJvZHVj
ZWQgdGhlIG5vdGlvbiB0aGF0IGEgbG9jYWwgdmFyaWFibGUgKHRob3VnaCBub3QgYW4gYXJndW1l
bnQsIHlldCEpIGNhbgorICAgICAgICBiZSBzdG9yZWQgYXMgYSBkb3VibGUsIGFuZCB3aWxsIGJl
IGd1YXJhbnRlZWQgdG8gYWx3YXlzIGNvbnRhaW4gYSBkb3VibGUuIFRoaXMKKyAgICAgICAgcmVx
dWlyZXMgbW9yZSBtYWdpYyBpbiB0aGUgT1NSIChjb252ZXJzaW9uIGluIGJvdGggZW50cnkgYW5k
IGV4aXQpLiBUaGUgaW5mZXJlbmNlCisgICAgICAgIGlzIHF1aXRlIHVub3J0aG9kb3g6IGFsbCB1
c2VzIG9mIGEgdmFyaWFibGUgdm90ZSBvbiB3aGV0aGVyIHRoZXkgdGhpbmsgaXQgc2hvdWxkCisg
ICAgICAgIGJlIGEgZG91YmxlIG9yIGEgSlNWYWx1ZSwgYmFzZWQgb24gaG93IHRoZXkgdXNlIGl0
LiBJZiB0aGV5IHVzZSBpdCBpbiBhbiBpbnRlZ2VyCisgICAgICAgIG9yIGJveGVkIHZhbHVlIGNv
bnRleHQsIHRoZXkgdm90ZSBKU1ZhbHVlLiBJZiB0aGV5IHVzZSBpdCBpbiBhIGRvdWJsZSBjb250
ZXh0LAorICAgICAgICB0aGV5IHZvdGUgZG91YmxlLiBUaGlzIHZvdGluZyBpcyBpbnRlcmxlYXZl
ZCBpbiB0aGUgcHJvcGFnYXRvcidzIGZpeHBvaW50LCBzbworICAgICAgICB0aGF0IHZhcmlhYmxl
cyB2b3RlZCBkb3VibGUgdGhlbiBoYXZlIGEgZG91YmxlIHByZWRpY3Rpb24gcHJvcGFnYXRlZCBm
cm9tIHRoZW0uCisgICAgICAgIFRoaXMgaW50ZXJsZWF2aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGEg
dmFyaWFibGUgdGhhdCBhY3R1YWxseSBhbHdheXMgY29udGFpbnMgYW4KKyAgICAgICAgaW50ZWdl
ciB0aGF0IGFsd2F5cyBnZXRzIHVzZWQgaW4gYXJpdGhtZXRpYyB0aGF0IGludm9sdmVzIGRvdWJs
ZXMgbWF5IGVuZCB1cAorICAgICAgICBiZWluZyB2b3RlZCBkb3VibGUsIHdoaWNoIHRoZW4gbWVh
bnMgdGhhdCBhbGwgdXNlcyBvZiB0aGUgdmFyaWFibGUgd2lsbCBzZWUgYQorICAgICAgICBkb3Vi
bGUgcmF0aGVyIHRoYW4gYW4gaW50ZWdlci4KKyAgICAgICAgCisgICAgICAgIE9uIEpTVkFMVUU2
NDoKKyAgICAgICAgVGhpcyBpcyB3b3J0aCAxOCUgdG8gU3VuU3BpZGVyLzNkLWN1YmUsIDclIHRv
IEtyYWtlbi9hdWRpby1iZWF0LWRldGVjdGlvbiwgNyUKKyAgICAgICAgdG8gS3Jha2VuL2F1ZGlv
LWZmdCwgNiUgdG8gS3Jha2VuL2ltYWdpbmctZGFya3Jvb20sIDIwJSB0bworICAgICAgICBLcmFr
ZW4vaW1hZ2luZy1nYXVzc2lhbi1ibHVyLCBhbmQganVzdCBvdmVyIDElIHRvIEtyYWtlbi9qc29u
LXBhcnNlLWZpbmFuY2lhbC4KKyAgICAgICAgSXQgcmVzdWx0cyBpbiBhIDElIHNwZWVkLXVwIG9u
IFN1blNwaWRlciBhbmQgYSA0JSBzcGVlZC11cCBpbiBLcmFrZW4uCisKKyAgICAgICAgKiBieXRl
Y29kZS9WYWx1ZVJlY292ZXJ5Lmg6CisgICAgICAgIChKU0M6OlZhbHVlUmVjb3Zlcnk6OmFscmVh
ZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZERvdWJsZSk6CisgICAgICAgIChKU0M6OlZhbHVlUmVj
b3Zlcnk6OmR1bXApOgorICAgICAgICAqIGRmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcDoKKyAgICAg
ICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjpleGVjdXRlKToKKyAgICAgICAgKiBkZmcvREZH
QXNzZW1ibHlIZWxwZXJzLmg6CisgICAgICAgIChKU0M6OkRGRzo6QXNzZW1ibHlIZWxwZXJzOjpi
b3hEb3VibGUpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6CisgICAgICAgIChKU0M6OkRG
Rzo6R3JhcGg6OmR1bXApOgorICAgICAgICAqIGRmZy9ERkdKSVRDb21waWxlci5oOgorICAgICAg
ICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpub3RpY2VPU1JFbnRyeSk6CisgICAgICAgICogZGZn
L0RGR09TUkVudHJ5LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpwcmVwYXJlT1NSRW50cnkpOgor
ICAgICAgICAqIGRmZy9ERkdPU1JFbnRyeS5oOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Q29t
cGlsZXI2NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdENvbXBpbGVyOjpjb21waWxl
RXhpdCk6CisgICAgICAgICogZGZnL0RGR1Byb3BhZ2F0b3IuY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6OnZvdGUpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmRv
Um91bmRPZkRvdWJsZVZvdGluZyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cHJv
cGFnYXRlUHJlZGljdGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmZpeHVw
Tm9kZSk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcDoKKyAgICAgICAgKEpT
Qzo6REZHOjpWYWx1ZVNvdXJjZTo6ZHVtcCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21w
dXRlVmFsdWVSZWNvdmVyeUZvcik6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmg6
CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKiBkZmcvREZHVmFyaWFibGVB
Y2Nlc3NEYXRhLmg6CisgICAgICAgIChKU0M6OkRGRzo6VmFyaWFibGVBY2Nlc3NEYXRhOjpWYXJp
YWJsZUFjY2Vzc0RhdGEpOgorICAgICAgICAoSlNDOjpERkc6OlZhcmlhYmxlQWNjZXNzRGF0YTo6
Y2xlYXJWb3Rlcyk6CisgICAgICAgIChKU0M6OkRGRzo6VmFyaWFibGVBY2Nlc3NEYXRhOjp2b3Rl
KToKKyAgICAgICAgKEpTQzo6REZHOjpWYXJpYWJsZUFjY2Vzc0RhdGE6OmRvdWJsZVZvdGVSYXRp
byk6CisgICAgICAgIChKU0M6OkRGRzo6VmFyaWFibGVBY2Nlc3NEYXRhOjpzaG91bGRVc2VEb3Vi
bGVGb3JtYXRBY2NvcmRpbmdUb1ZvdGUpOgorICAgICAgICAoSlNDOjpERkc6OlZhcmlhYmxlQWNj
ZXNzRGF0YTo6c2hvdWxkVXNlRG91YmxlRm9ybWF0KToKKyAgICAgICAgKEpTQzo6REZHOjpWYXJp
YWJsZUFjY2Vzc0RhdGE6OnRhbGx5Vm90ZXNGb3JTaG91bGRVc2VEb3VibGVGb3JtYXQpOgorICAg
ICAgICAqIHJ1bnRpbWUvQXJndW1lbnRzLmNwcDoKKyAgICAgICAgKEpTQzo6QXJndW1lbnRzOjp0
ZWFyT2ZmKToKKyAgICAgICAgKiBydW50aW1lL0hldXJpc3RpY3MuY3BwOgorICAgICAgICAoSlND
OjpIZXVyaXN0aWNzOjppbml0aWFsaXplSGV1cmlzdGljcyk6CisgICAgICAgICogcnVudGltZS9I
ZXVyaXN0aWNzLmg6CisKIDIwMTEtMTItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFw
cGxlLmNvbT4KIAogICAgICAgICBBZGQgYSB2ZXJ5IGJhcmUtYm9uZXMgaW1wbGVtZW50YXRpb24g
b2YgYmluZCBhbmQgRnVuY3Rpb24gdG8gV1RGCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvVmFsdWVSZWNvdmVyeS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9WYWx1ZVJlY292ZXJ5LmgJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9WYWx1ZVJlY292ZXJ5LmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ3LDYgKzQ3LDcgQEAgZW51bSBWYWx1ZVJlY292ZXJ5VGVjaG5pcXVlIHsKICAgICBBbHJl
YWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWRJbnQzMiwKICAgICBBbHJlYWR5SW5SZWdpc3RlckZp
bGVBc1VuYm94ZWRDZWxsLAogICAgIEFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZEJvb2xl
YW4sCisgICAgQWxyZWFkeUluUmVnaXN0ZXJGaWxlQXNVbmJveGVkRG91YmxlLAogICAgIC8vIEl0
J3MgaW4gYSByZWdpc3Rlci4KICAgICBJbkdQUiwKICAgICBVbmJveGVkSW50MzJJbkdQUiwKQEAg
LTEwMiw2ICsxMDMsMTMgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0K
ICAgICAKKyAgICBzdGF0aWMgVmFsdWVSZWNvdmVyeSBhbHJlYWR5SW5SZWdpc3RlckZpbGVBc1Vu
Ym94ZWREb3VibGUoKQorICAgIHsKKyAgICAgICAgVmFsdWVSZWNvdmVyeSByZXN1bHQ7CisgICAg
ICAgIHJlc3VsdC5tX3RlY2huaXF1ZSA9IEFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZERv
dWJsZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCiAgICAgc3RhdGljIFZh
bHVlUmVjb3ZlcnkgaW5HUFIoTWFjcm9Bc3NlbWJsZXI6OlJlZ2lzdGVySUQgZ3ByLCBEYXRhRm9y
bWF0IGRhdGFGb3JtYXQpCiAgICAgewogICAgICAgICBBU1NFUlQoZGF0YUZvcm1hdCAhPSBEYXRh
Rm9ybWF0Tm9uZSk7CkBAIC0yNDcsNiArMjU1LDkgQEAgcHVibGljOgogICAgICAgICBjYXNlIEFs
cmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZEJvb2xlYW46CiAgICAgICAgICAgICBmcHJpbnRm
KG91dCwgIihib29sKSIpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWxyZWFk
eUluUmVnaXN0ZXJGaWxlQXNVbmJveGVkRG91YmxlOgorICAgICAgICAgICAgZnByaW50ZihvdXQs
ICIoZG91YmxlKSIpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSW5HUFI6CiAg
ICAgICAgICAgICBmcHJpbnRmKG91dCwgIiUlciVkIiwgZ3ByKCkpOwogICAgICAgICAgICAgYnJl
YWs7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0
ZS5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
QWJzdHJhY3RTdGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIwNyw2ICsyMDcsMTIgQEAgYm9v
bCBBYnN0cmFjdFN0YXRlOjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgIH0KICAgICAgICAgCiAg
ICAgY2FzZSBTZXRMb2NhbDogeworICAgICAgICBpZiAobm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEo
KS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIGZvck5vZGUobm9kZS5j
aGlsZDEoKSkuZmlsdGVyKFByZWRpY3ROdW1iZXIpOworICAgICAgICAgICAgbV92YXJpYWJsZXMu
b3BlcmFuZChub2RlLmxvY2FsKCkpLnNldChQcmVkaWN0RG91YmxlKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBQcmVkaWN0ZWRUeXBlIHByZWRpY3Rl
ZFR5cGUgPSBub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5wcmVkaWN0aW9uKCk7CiAgICAgICAg
IGlmIChpc0ludDMyUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkKICAgICAgICAgICAgIGZvck5v
ZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVyKFByZWRpY3RJbnQzMik7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0Fzc2VtYmx5SGVscGVycy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQXNzZW1ibHlIZWxwZXJzLmgJKHJldmlzaW9uIDEwMjcy
NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQXNzZW1ibHlIZWxwZXJzLmgJKHdv
cmtpbmcgY29weSkKQEAgLTIxNSw2ICsyMTUsNyBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICBt
b3ZlRG91YmxlVG9QdHIoZnByLCBncHIpOwogICAgICAgICBzdWJQdHIoR1BSSW5mbzo6dGFnVHlw
ZU51bWJlclJlZ2lzdGVyLCBncHIpOworICAgICAgICBqaXRBc3NlcnRJc0pTRG91YmxlKGdwcik7
CiAgICAgICAgIHJldHVybiBncHI7CiAgICAgfQogICAgIEZQUlJlZyB1bmJveERvdWJsZShHUFJS
ZWcgZ3ByLCBGUFJSZWcgZnByKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdH
cmFwaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFw
aC5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
R3JhcGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjAsNyArMjYwLDcgQEAgdm9pZCBHcmFwaDo6
ZHVtcChOb2RlSW5kZXggbm9kZUluZGV4LCBDbwogCiAgICAgaWYgKCFza2lwcGVkKSB7CiAgICAg
ICAgIGlmIChub2RlLmhhc1ZhcmlhYmxlQWNjZXNzRGF0YSgpKQotICAgICAgICAgICAgcHJpbnRm
KCIgIHByZWRpY3RpbmcgJXMiLCBwcmVkaWN0aW9uVG9TdHJpbmcobm9kZS52YXJpYWJsZUFjY2Vz
c0RhdGEoKS0+cHJlZGljdGlvbigpKSk7CisgICAgICAgICAgICBwcmludGYoIiAgcHJlZGljdGlu
ZyAlcywgZG91YmxlIHJhdGlvICVsZiVzIiwgcHJlZGljdGlvblRvU3RyaW5nKG5vZGUudmFyaWFi
bGVBY2Nlc3NEYXRhKCktPnByZWRpY3Rpb24oKSksIG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkt
PmRvdWJsZVZvdGVSYXRpbygpLCBub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VE
b3VibGVGb3JtYXQoKSA/ICIsIGZvcmNpbmcgZG91YmxlIiA6ICIiKTsKICAgICAgICAgZWxzZSBp
ZiAobm9kZS5oYXNWYXJOdW1iZXIoKSkKICAgICAgICAgICAgIHByaW50ZigiICBwcmVkaWN0aW5n
ICVzIiwgcHJlZGljdGlvblRvU3RyaW5nKGdldEdsb2JhbFZhclByZWRpY3Rpb24obm9kZS52YXJO
dW1iZXIoKSkpKTsKICAgICAgICAgZWxzZSBpZiAobm9kZS5oYXNIZWFwUHJlZGljdGlvbigpKQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkocmV2aXNp
b24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5o
CSh3b3JraW5nIGNvcHkpCkBAIC0yNjYsOCArMjY2LDExIEBAIHB1YmxpYzoKICAgICAgICAgICAg
ICAgICBlbnRyeS0+bV9leHBlY3RlZFZhbHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgp
OwogICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNp
Y0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7Ci0gICAg
ICAgICAgICBpZiAoYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwobG9jYWwpID09IE5v
Tm9kZSkKKyAgICAgICAgICAgIE5vZGVJbmRleCBub2RlSW5kZXggPSBiYXNpY0Jsb2NrLnZhcmlh
Ymxlc0F0SGVhZC5sb2NhbChsb2NhbCk7CisgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IE5v
Tm9kZSkKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9leHBlY3RlZFZhbHVlcy5sb2NhbChsb2Nh
bCkubWFrZVRvcCgpOworICAgICAgICAgICAgZWxzZSBpZiAobV9ncmFwaFtub2RlSW5kZXhdLnZh
cmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkKKyAgICAgICAgICAg
ICAgICBlbnRyeS0+bV9sb2NhbHNGb3JjZWREb3VibGUuc2V0KGxvY2FsKTsKICAgICAgICAgfQog
I2Vsc2UKICAgICAgICAgVU5VU0VEX1BBUkFNKGJhc2ljQmxvY2spOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFbnRyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFbnRyeS5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRW50cnkuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDQsNiArMTA0LDE1IEBAIHZvaWQqIHByZXBhcmVPU1JFbnRyeShFeGVjU3RhdGUqIGV4ZWMs
IEMKICAgICB9CiAgICAgCiAgICAgZm9yIChzaXplX3QgbG9jYWwgPSAwOyBsb2NhbCA8IGVudHJ5
LT5tX2V4cGVjdGVkVmFsdWVzLm51bWJlck9mTG9jYWxzKCk7ICsrbG9jYWwpIHsKKyAgICAgICAg
aWYgKGVudHJ5LT5tX2xvY2Fsc0ZvcmNlZERvdWJsZS5nZXQobG9jYWwpKSB7CisgICAgICAgICAg
ICBpZiAoIWV4ZWMtPnJlZ2lzdGVycygpW2xvY2FsXS5qc1ZhbHVlKCkuaXNOdW1iZXIoKSkgewor
I2lmIEVOQUJMRShKSVRfVkVSQk9TRV9PU1IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAg
T1NSIGZhaWxlZCBiZWNhdXNlIHZhcmlhYmxlICVsdSBpcyAlcywgZXhwZWN0ZWQgbnVtYmVyLlxu
IiwgbG9jYWwsIGV4ZWMtPnJlZ2lzdGVycygpW2xvY2FsXS5qc1ZhbHVlKCkuZGVzY3JpcHRpb24o
KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGlmICghZW50cnktPm1fZXhw
ZWN0ZWRWYWx1ZXMubG9jYWwobG9jYWwpLnZhbGlkYXRlKGV4ZWMtPnJlZ2lzdGVycygpW2xvY2Fs
XS5qc1ZhbHVlKCkpKSB7CiAjaWYgRU5BQkxFKEpJVF9WRVJCT1NFX09TUikKICAgICAgICAgICAg
IHByaW50ZigiICAgIE9TUiBmYWlsZWQgYmVjYXVzZSB2YXJpYWJsZSAlbHUgaXMgJXMsIGV4cGVj
dGVkICIsIGxvY2FsLCBleGVjLT5yZWdpc3RlcnMoKVtsb2NhbF0uanNWYWx1ZSgpLmRlc2NyaXB0
aW9uKCkpOwpAQCAtMTEzLDcgKzEyMiw3IEBAIHZvaWQqIHByZXBhcmVPU1JFbnRyeShFeGVjU3Rh
dGUqIGV4ZWMsIEMKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotICAg
IAorCiAgICAgLy8gMikgQ2hlY2sgdGhlIHN0YWNrIGhlaWdodC4gVGhlIERGRyBKSVQgbWF5IHJl
cXVpcmUgYSB0YWxsZXIgc3RhY2sgdGhhbiB0aGUKICAgICAvLyAgICBiYXNlbGluZSBKSVQsIGlu
IHNvbWUgY2FzZXMuIElmIHdlIGNhbid0IGdyb3cgdGhlIHN0YWNrLCB0aGVuIGRvbid0IGRvCiAg
ICAgLy8gICAgT1NSIHJpZ2h0IG5vdy4gVGhhdCdzIHRoZSBvbmx5IG9wdGlvbiB3ZSBoYXZlIHVu
bGVzcyB3ZSB3YW50IGJhc2ljIGJsb2NrCkBAIC0xMzIsMTEgKzE0MSwxOSBAQCB2b2lkKiBwcmVw
YXJlT1NSRW50cnkoRXhlY1N0YXRlKiBleGVjLCBDCiAgICAgcHJpbnRmKCIgICAgT1NSIHNob3Vs
ZCBzdWNjZWVkLlxuIik7CiAjZW5kaWYKICAgICAKLSAgICAvLyAzKSBGaXggdGhlIGNhbGwgZnJh
bWUuCisjaWYgVVNFKEpTVkFMVUU2NCkKKyAgICAvLyAzKSBQZXJmb3JtIGRhdGEgZm9ybWF0IGNv
bnZlcnNpb25zLgorICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBlbnRyeS0+bV9l
eHBlY3RlZFZhbHVlcy5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CisgICAgICAgIGlmIChl
bnRyeS0+bV9sb2NhbHNGb3JjZWREb3VibGUuZ2V0KGxvY2FsKSkKKyAgICAgICAgICAgICpiaXR3
aXNlX2Nhc3Q8ZG91YmxlKj4oZXhlYy0+cmVnaXN0ZXJzKCkgKyBsb2NhbCkgPSBleGVjLT5yZWdp
c3RlcnMoKVtsb2NhbF0uanNWYWx1ZSgpLmFzTnVtYmVyKCk7CisgICAgfQorI2VuZGlmCisgICAg
CisgICAgLy8gNCkgRml4IHRoZSBjYWxsIGZyYW1lLgogICAgIAogICAgIGV4ZWMtPnNldENvZGVC
bG9jayhjb2RlQmxvY2spOwogICAgIAotICAgIC8vIDQpIEZpbmQgYW5kIHJldHVybiB0aGUgZGVz
dGluYXRpb24gbWFjaGluZSBjb2RlIGFkZHJlc3MuCisgICAgLy8gNSkgRmluZCBhbmQgcmV0dXJu
IHRoZSBkZXN0aW5hdGlvbiBtYWNoaW5lIGNvZGUgYWRkcmVzcy4KICAgICAKICAgICB2b2lkKiBy
ZXN1bHQgPSBjb2RlQmxvY2stPmdldEpJVENvZGUoKS5leGVjdXRhYmxlQWRkcmVzc0F0T2Zmc2V0
KGVudHJ5LT5tX21hY2hpbmVDb2RlT2Zmc2V0KTsKICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHT1NSRW50cnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR09TUkVudHJ5LmgJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHT1NSRW50cnkuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgs
NyBAQAogCiAjaW5jbHVkZSAiREZHQWJzdHJhY3RWYWx1ZS5oIgogI2luY2x1ZGUgIkRGR09wZXJh
bmRzLmgiCisjaW5jbHVkZSA8d3RmL0JpdFZlY3Rvci5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIApA
QCAtNDEsNiArNDIsNyBAQCBzdHJ1Y3QgT1NSRW50cnlEYXRhIHsKICAgICB1bnNpZ25lZCBtX2J5
dGVjb2RlSW5kZXg7CiAgICAgdW5zaWduZWQgbV9tYWNoaW5lQ29kZU9mZnNldDsKICAgICBPcGVy
YW5kczxBYnN0cmFjdFZhbHVlPiBtX2V4cGVjdGVkVmFsdWVzOworICAgIEJpdFZlY3RvciBtX2xv
Y2Fsc0ZvcmNlZERvdWJsZTsKIH07CiAKIGlubGluZSB1bnNpZ25lZCBnZXRPU1JFbnRyeURhdGFC
eXRlY29kZUluZGV4KE9TUkVudHJ5RGF0YSogb3NyRW50cnlEYXRhKQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHAJKHJldmlz
aW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBp
bGVyNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTYsNiArMTE2LDcgQEAgdm9pZCBPU1JFeGl0
Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNvbnN0IAogICAgIC8vIGV4cGVjdCBtb3N0IG9mIHRoZW0g
dG8gYmUganNVbmRlZmluZWQoKTsgaWYgdGhhdCdzIHRydWUgdGhlbiB3ZSBoYW5kbGUgdGhhdAog
ICAgIC8vIHNwZWNpYWxseSB0byBtaW5pbWl6ZSBjb2RlIHNpemUgYW5kIGV4ZWN1dGlvbiB0aW1l
LgogICAgIGJvb2wgaGF2ZVVuYm94ZWRJbnQzMnMgPSBmYWxzZTsKKyAgICBib29sIGhhdmVVbmJv
eGVkRG91YmxlcyA9IGZhbHNlOwogICAgIGJvb2wgaGF2ZUZQUnMgPSBmYWxzZTsKICAgICBib29s
IGhhdmVDb25zdGFudHMgPSBmYWxzZTsKICAgICBib29sIGhhdmVVbmRlZmluZWQgPSBmYWxzZTsK
QEAgLTE1OSw2ICsxNjAsMTAgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNv
bnN0IAogICAgICAgICAgICAgaGF2ZVVuYm94ZWRJbnQzMnMgPSB0cnVlOwogICAgICAgICAgICAg
YnJlYWs7CiAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBbHJlYWR5SW5SZWdpc3RlckZpbGVB
c1VuYm94ZWREb3VibGU6CisgICAgICAgICAgICBoYXZlVW5ib3hlZERvdWJsZXMgPSB0cnVlOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKICAgICAgICAgY2FzZSBVSW50MzJJbkdQ
UjoKICAgICAgICAgICAgIGhhdmVVSW50MzJzID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpA
QCAtMTg2LDYgKzE5MSw4IEBAIHZvaWQgT1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25z
dCAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEaXNwbGFjZWQ9JXUgIiwgbnVtYmVyT2ZEaXNw
bGFjZWRWaXJ0dWFsUmVnaXN0ZXJzKTsKICAgICBpZiAoaGF2ZVVuYm94ZWRJbnQzMnMpCiAgICAg
ICAgIGZwcmludGYoc3RkZXJyLCAiVW5ib3hlZEludDMyICIpOworICAgIGlmIChoYXZlVW5ib3hl
ZERvdWJsZXMpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5ib3hlZERvdWJsZXMgIik7CiAg
ICAgaWYgKGhhdmVVSW50MzJzKQogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVJbnQzMiAiKTsK
ICAgICBpZiAoaGF2ZUZQUnMpCkBAIC0zMTIsNiArMzE5LDIwIEBAIHZvaWQgT1NSRXhpdENvbXBp
bGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICAvLyBB
dCB0aGlzIHBvaW50IGFsbCBHUFJzIGFuZCBGUFJzIGFyZSBhdmFpbGFibGUgZm9yIHNjcmF0Y2gg
dXNlLgorICAgIAorICAgIC8vIDkpIEJveCBhbGwgdW5ib3hlZCBkb3VibGVzIGluIHRoZSByZWdp
c3RlciBmaWxlLgorICAgIGlmIChoYXZlVW5ib3hlZERvdWJsZXMpIHsKKyAgICAgICAgZm9yIChp
bnQgaW5kZXggPSAwOyBpbmRleCA8IGV4aXQubnVtYmVyT2ZSZWNvdmVyaWVzKCk7ICsraW5kZXgp
IHsKKyAgICAgICAgICAgIGNvbnN0IFZhbHVlUmVjb3ZlcnkmIHJlY292ZXJ5ID0gZXhpdC52YWx1
ZVJlY292ZXJ5KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZWNvdmVyeS50ZWNobmlxdWUoKSAh
PSBBbHJlYWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWREb3VibGUpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBtX2ppdC5sb2FkRG91YmxlKEFzc2VtYmx5SGVscGVyczo6
YWRkcmVzc0ZvcigoVmlydHVhbFJlZ2lzdGVyKWV4aXQub3BlcmFuZEZvckluZGV4KGluZGV4KSks
IEZQUkluZm86OmZwUmVnVDApOworICAgICAgICAgICAgbV9qaXQuYm94RG91YmxlKEZQUkluZm86
OmZwUmVnVDAsIEdQUkluZm86OnJlZ1QwKTsKKyAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKEdQ
UkluZm86OnJlZ1QwLCBBc3NlbWJseUhlbHBlcnM6OmFkZHJlc3NGb3IoKFZpcnR1YWxSZWdpc3Rl
cilleGl0Lm9wZXJhbmRGb3JJbmRleChpbmRleCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
ICAgICBBU1NFUlQoc2NyYXRjaEluZGV4ID09IG51bWJlck9mUG9pc29uZWRWaXJ0dWFsUmVnaXN0
ZXJzKTsKICAgICAKICAgICAvLyA5KSBSZXNodWZmbGUgZGlzcGxhY2VkIHZpcnR1YWwgcmVnaXN0
ZXJzLiBPcHRpbWl6ZSBmb3IgdGhlIGNhc2UgdGhhdApAQCAtNTk0LDYgKzYxNSw3IEBAIHZvaWQg
T1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICBBU1NFUlQoR1BSSW5mbzo6
cmVnVDEgIT0gR1BSSW5mbzo6Y2FjaGVkUmVzdWx0UmVnaXN0ZXIpOwogICAgIAogICAgIG1faml0
Lm1vdmUoQXNzZW1ibHlIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGp1bXBUYXJnZXQpLCBHUFJJbmZv
OjpyZWdUMSk7CisgICAgCiAgICAgbV9qaXQuanVtcChHUFJJbmZvOjpyZWdUMSk7CiAKICNpZiBE
RkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1Byb3BhZ2F0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHUHJvcGFnYXRvci5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHUHJvcGFnYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY1Niw2ICs2
NTYsMTExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBwcm9wYWdhdGVOb2RlUHJlZGljdGlvbnMo
bV9ncmFwaFttX2NvbXBpbGVJbmRleF0pOwogICAgIH0KICAgICAKKyAgICB2b2lkIHZvdGUoTm9k
ZUluZGV4IG5vZGVJbmRleCwgVmFyaWFibGVBY2Nlc3NEYXRhOjpCYWxsb3QgYmFsbG90KQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChtX2dyYXBoW25vZGVJbmRleF0ub3ApIHsKKyAgICAgICAgY2Fz
ZSBWYWx1ZVRvTnVtYmVyOgorICAgICAgICBjYXNlIFZhbHVlVG9Eb3VibGU6CisgICAgICAgIGNh
c2UgVmFsdWVUb0ludDMyOgorICAgICAgICBjYXNlIFVJbnQzMlRvTnVtYmVyOgorICAgICAgICAg
ICAgbm9kZUluZGV4ID0gbV9ncmFwaFtub2RlSW5kZXhdLmNoaWxkMSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgaWYgKG1fZ3JhcGhbbm9kZUluZGV4XS5vcCA9PSBHZXRMb2NhbCkK
KyAgICAgICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+dm90
ZShiYWxsb3QpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHZvdGUoTm9kZSYgbm9kZSwgVmFyaWFi
bGVBY2Nlc3NEYXRhOjpCYWxsb3QgYmFsbG90KSB7CisgICAgICAgIGlmIChub2RlLm9wICYgTm9k
ZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hpbGRJZHggPSBub2Rl
LmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hp
bGRyZW4oKTsgY2hpbGRJZHgrKykKKyAgICAgICAgICAgICAgICB2b3RlKG1fZ3JhcGgubV92YXJB
cmdDaGlsZHJlbltjaGlsZElkeF0sIGJhbGxvdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChub2RlLmNoaWxkMSgpID09IE5vTm9kZSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdm90ZShub2RlLmNoaWxkMSgpLCBiYWxsb3QpOwor
ICAgICAgICBpZiAobm9kZS5jaGlsZDIoKSA9PSBOb05vZGUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHZvdGUobm9kZS5jaGlsZDIoKSwgYmFsbG90KTsKKyAgICAgICAgaWYgKG5vZGUu
Y2hpbGQzKCkgPT0gTm9Ob2RlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2b3RlKG5v
ZGUuY2hpbGQzKCksIGJhbGxvdCk7CisgICAgfQorICAgIAorICAgIHZvaWQgZG9Sb3VuZE9mRG91
YmxlVm90aW5nKCkKKyAgICB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJC
T1NFKQorICAgICAgICBwcmludGYoIlZvdGluZyBvbiBkb3VibGUgdXNlcyBvZiBsb2NhbHMgWyV1
XVxuIiwgbV9jb3VudCk7CisjZW5kaWYKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1fZ3JhcGgubV92YXJpYWJsZUFjY2Vzc0RhdGEuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBt
X2dyYXBoLm1fdmFyaWFibGVBY2Nlc3NEYXRhW2ldLmZpbmQoKS0+Y2xlYXJWb3RlcygpOworICAg
ICAgICBmb3IgKG1fY29tcGlsZUluZGV4ID0gMDsgbV9jb21waWxlSW5kZXggPCBtX2dyYXBoLnNp
emUoKTsgKyttX2NvbXBpbGVJbmRleCkgeworICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3Jh
cGhbbV9jb21waWxlSW5kZXhdOworICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAg
ICAgICAgICBjYXNlIFZhbHVlQWRkOgorICAgICAgICAgICAgY2FzZSBBcml0aEFkZDoKKyAgICAg
ICAgICAgIGNhc2UgQXJpdGhTdWI6CisgICAgICAgICAgICBjYXNlIEFyaXRoTXVsOgorICAgICAg
ICAgICAgY2FzZSBBcml0aE1pbjoKKyAgICAgICAgICAgIGNhc2UgQXJpdGhNYXg6CisgICAgICAg
ICAgICBjYXNlIEFyaXRoTW9kOgorICAgICAgICAgICAgY2FzZSBBcml0aERpdjogeworICAgICAg
ICAgICAgICAgIFByZWRpY3RlZFR5cGUgbGVmdCA9IG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJl
ZGljdGlvbigpOworICAgICAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgcmlnaHQgPSBtX2dyYXBo
W25vZGUuY2hpbGQyKCldLnByZWRpY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBWYXJpYWJsZUFjY2Vzc0RhdGE6OkJhbGxvdCBiYWxsb3Q7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyUHJlZGljdGlvbihsZWZ0KSAmJiBpc051
bWJlclByZWRpY3Rpb24ocmlnaHQpICYmICEoTm9kZTo6c2hvdWxkU3BlY3VsYXRlSW50ZWdlciht
X2dyYXBoW25vZGUuY2hpbGQxKCldLCBtX2dyYXBoW25vZGUuY2hpbGQxKCldKSAmJiBub2RlLmNh
blNwZWN1bGF0ZUludGVnZXIoKSkpCisgICAgICAgICAgICAgICAgICAgIGJhbGxvdCA9IFZhcmlh
YmxlQWNjZXNzRGF0YTo6Vm90ZURvdWJsZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgIGJhbGxvdCA9IFZhcmlhYmxlQWNjZXNzRGF0YTo6Vm90ZVZhbHVlOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZvdGUobm9kZS5jaGlsZDEoKSwgYmFsbG90
KTsKKyAgICAgICAgICAgICAgICB2b3RlKG5vZGUuY2hpbGQyKCksIGJhbGxvdCk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICBjYXNlIEFyaXRoQWJzOgorICAgICAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YTo6
QmFsbG90IGJhbGxvdDsKKyAgICAgICAgICAgICAgICBpZiAoIShtX2dyYXBoW25vZGUuY2hpbGQx
KCldLnNob3VsZFNwZWN1bGF0ZUludGVnZXIoKSAmJiBub2RlLmNhblNwZWN1bGF0ZUludGVnZXIo
KSkpCisgICAgICAgICAgICAgICAgICAgIGJhbGxvdCA9IFZhcmlhYmxlQWNjZXNzRGF0YTo6Vm90
ZURvdWJsZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJhbGxv
dCA9IFZhcmlhYmxlQWNjZXNzRGF0YTo6Vm90ZVZhbHVlOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIHZvdGUobm9kZS5jaGlsZDEoKSwgYmFsbG90KTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgQXJpdGhTcXJ0Ogor
ICAgICAgICAgICAgICAgIHZvdGUobm9kZS5jaGlsZDEoKSwgVmFyaWFibGVBY2Nlc3NEYXRhOjpW
b3RlRG91YmxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGNhc2UgVmFsdWVUb051bWJlcjoKKyAgICAgICAgICAgIGNhc2UgVmFsdWVUb0Rv
dWJsZToKKyAgICAgICAgICAgICAgICAvLyBEb24ndCB2b3RlLgorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDogeworICAg
ICAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1fZ3JhcGhbbm9kZS5jaGls
ZDEoKV0ucHJlZGljdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChpc0RvdWJsZVByZWRpY3Rp
b24ocHJlZGljdGlvbikpCisgICAgICAgICAgICAgICAgICAgIG5vZGUudmFyaWFibGVBY2Nlc3NE
YXRhKCktPnZvdGUoVmFyaWFibGVBY2Nlc3NEYXRhOjpWb3RlRG91YmxlKTsKKyAgICAgICAgICAg
ICAgICBlbHNlIGlmICghaXNOdW1iZXJQcmVkaWN0aW9uKHByZWRpY3Rpb24pIHx8IGlzSW50MzJQ
cmVkaWN0aW9uKHByZWRpY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICBub2RlLnZhcmlhYmxl
QWNjZXNzRGF0YSgpLT52b3RlKFZhcmlhYmxlQWNjZXNzRGF0YTo6Vm90ZVZhbHVlKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdm90ZShub2RlLCBWYXJpYWJsZUFjY2Vz
c0RhdGE6OlZvdGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZ3JhcGgubV92
YXJpYWJsZUFjY2Vzc0RhdGEuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX2NoYW5nZWQgfD0g
bV9ncmFwaC5tX3ZhcmlhYmxlQWNjZXNzRGF0YVtpXS5maW5kKCktPnRhbGx5Vm90ZXNGb3JTaG91
bGRVc2VEb3VibGVGb3JtYXQoKTsKKyAgICB9CisgICAgCiAgICAgdm9pZCBwcm9wYWdhdGVQcmVk
aWN0aW9ucygpCiAgICAgewogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9T
RSkKQEAgLTY2Nyw2ICs3NzIsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgLy8gRm9yd2FyZCBw
cm9wYWdhdGlvbiBpcyBuZWFyLW9wdGltYWwgZm9yIGJvdGggdG9wb2xvZ2ljYWxseS1zb3J0ZWQg
YW5kCiAgICAgICAgICAgICAvLyBERlMtc29ydGVkIGNvZGUuCiAgICAgICAgICAgICBwcm9wYWdh
dGVQcmVkaWN0aW9uc0ZvcndhcmQoKTsKKyAgICAgICAgICAgIGRvUm91bmRPZkRvdWJsZVZvdGlu
ZygpOwogICAgICAgICAgICAgaWYgKCFtX2NoYW5nZWQpCiAgICAgICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgICAgICAKQEAgLTY3Niw2ICs3ODIsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAg
Ly8gZm91bmQgYSBzb3VuZCBzb2x1dGlvbiBhbmQgKDIpIHNob3J0LWNpcmN1aXRzIGJhY2t3YXJk
IGZsb3cuCiAgICAgICAgICAgICBtX2NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByb3Bh
Z2F0ZVByZWRpY3Rpb25zQmFja3dhcmQoKTsKKyAgICAgICAgICAgIGRvUm91bmRPZkRvdWJsZVZv
dGluZygpOwogICAgICAgICB9IHdoaWxlIChtX2NoYW5nZWQpOwogICAgIH0KICAgICAKQEAgLTY4
OCw3ICs3OTUsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgbV9ncmFwaFtub2RlSW5kZXhdLm9w
ID0gVmFsdWVUb0RvdWJsZTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgZml4
dXBOb2RlKE5vZGUmIG5vZGUpCiAgICAgewogICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJh
dGUoKSkKQEAgLTcxMSwxMSArODE4LDExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBQcmVkaWN0
ZWRUeXBlIGxlZnQgPSBtX2dyYXBoW25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKTsKICAgICAg
ICAgICAgIFByZWRpY3RlZFR5cGUgcmlnaHQgPSBtX2dyYXBoW25vZGUuY2hpbGQyKCldLnByZWRp
Y3Rpb24oKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQgJiYg
aXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCkpIHsK
LSAgICAgICAgICAgICAgICBpZiAobGVmdCAmIFByZWRpY3REb3VibGUpCi0gICAgICAgICAgICAg
ICAgICAgIHRvRG91YmxlKG5vZGUuY2hpbGQyKCkpOwotICAgICAgICAgICAgICAgIGlmIChyaWdo
dCAmIFByZWRpY3REb3VibGUpCi0gICAgICAgICAgICAgICAgICAgIHRvRG91YmxlKG5vZGUuY2hp
bGQxKCkpOworICAgICAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQKKyAgICAgICAgICAgICAgICAm
JiBpc051bWJlclByZWRpY3Rpb24obGVmdCkgJiYgaXNOdW1iZXJQcmVkaWN0aW9uKHJpZ2h0KQor
ICAgICAgICAgICAgICAgICYmICgobGVmdCAmIFByZWRpY3REb3VibGUpIHx8IChyaWdodCAmIFBy
ZWRpY3REb3VibGUpKSkgeworICAgICAgICAgICAgICAgIHRvRG91YmxlKG5vZGUuY2hpbGQxKCkp
OworICAgICAgICAgICAgICAgIHRvRG91YmxlKG5vZGUuY2hpbGQyKCkpOwogICAgICAgICAgICAg
fQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTczNiwxMSArODQzLDEwIEBAIHBy
aXZhdGU6CiAgICAgICAgICAgICBQcmVkaWN0ZWRUeXBlIGxlZnQgPSBtX2dyYXBoW25vZGUuY2hp
bGQxKCldLnByZWRpY3Rpb24oKTsKICAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgcmlnaHQgPSBt
X2dyYXBoW25vZGUuY2hpbGQyKCldLnByZWRpY3Rpb24oKTsKICAgICAgICAgICAgIAotICAgICAg
ICAgICAgaWYgKGxlZnQgJiYgcmlnaHQpIHsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCAmIFBy
ZWRpY3REb3VibGUpCi0gICAgICAgICAgICAgICAgICAgIHRvRG91YmxlKG5vZGUuY2hpbGQyKCkp
OwotICAgICAgICAgICAgICAgIGlmIChyaWdodCAmIFByZWRpY3REb3VibGUpCi0gICAgICAgICAg
ICAgICAgICAgIHRvRG91YmxlKG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgaWYgKGxlZnQg
JiYgcmlnaHQKKyAgICAgICAgICAgICAgICAmJiAoKGxlZnQgJiBQcmVkaWN0RG91YmxlKSB8fCAo
cmlnaHQgJiBQcmVkaWN0RG91YmxlKSkpIHsKKyAgICAgICAgICAgICAgICB0b0RvdWJsZShub2Rl
LmNoaWxkMSgpKTsKKyAgICAgICAgICAgICAgICB0b0RvdWJsZShub2RlLmNoaWxkMigpKTsKICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJKHJldmlz
aW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVK
SVQ2NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIwNDcsNiArMjA0NywxNSBAQCB2b2lkIFNwZWN1
bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAgICAgICAgICAgICBicmVhazsKICAgICAg
ICAgfQogICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPnNo
b3VsZFVzZURvdWJsZUZvcm1hdCgpKSB7CisgICAgICAgICAgICBGUFJUZW1wb3JhcnkgcmVzdWx0
KHRoaXMpOworICAgICAgICAgICAgbV9qaXQubG9hZERvdWJsZShKSVRDb21waWxlcjo6YWRkcmVz
c0Zvcihub2RlLmxvY2FsKCkpLCByZXN1bHQuZnByKCkpOworICAgICAgICAgICAgVmlydHVhbFJl
Z2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CisgICAgICAg
ICAgICBtX2ZwcnMucmV0YWluKHJlc3VsdC5mcHIoKSwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9y
ZGVyRG91YmxlKTsKKyAgICAgICAgICAgIG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVy
XS5pbml0RG91YmxlKG1fY29tcGlsZUluZGV4LCBub2RlLnJlZkNvdW50KCksIHJlc3VsdC5mcHIo
KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgR1BS
VGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKICAgICAgICAgaWYgKGlzSW50MzJQcmVkaWN0aW9uKHZh
bHVlLm1fdHlwZSkpIHsKICAgICAgICAgICAgIG1faml0LmxvYWQzMihKSVRDb21waWxlcjo6cGF5
bG9hZEZvcihub2RlLmxvY2FsKCkpLCByZXN1bHQuZ3ByKCkpOwpAQCAtMjEwNCwzOCArMjExMyw0
OCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAgICAgICAgIC8v
IE9TUiBleGl0LCB3b3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUgb2xkIEpJVCBpbiBhbnkgd2F5
LgogICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0Tm9kZS5jb2RlT3JpZ2luOwogICAg
ICAgICAKLSAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0ZWRUeXBlID0gbm9kZS52YXJpYWJs
ZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpOwotICAgICAgICBpZiAoaXNJbnQzMlByZWRpY3Rp
b24ocHJlZGljdGVkVHlwZSkpIHsKLSAgICAgICAgICAgIFNwZWN1bGF0ZUludGVnZXJPcGVyYW5k
IHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmUzMih2
YWx1ZS5ncHIoKSwgSklUQ29tcGlsZXI6OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7Ci0gICAg
ICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNB
cnJheVByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKLSAgICAgICAgICAgIFNwZWN1bGF0ZUNl
bGxPcGVyYW5kIGNlbGwodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAgICAgICBHUFJSZWcg
Y2VsbEdQUiA9IGNlbGwuZ3ByKCk7Ci0gICAgICAgICAgICBpZiAoIWlzQXJyYXlQcmVkaWN0aW9u
KG1fc3RhdGUuZm9yTm9kZShub2RlLmNoaWxkMSgpKS5tX3R5cGUpKQotICAgICAgICAgICAgICAg
IHNwZWN1bGF0aW9uQ2hlY2soQmFkVHlwZSwgSlNWYWx1ZVJlZ3MoY2VsbEdQUiksIG5vZGUuY2hp
bGQxKCksIG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNz
ZW1ibGVyOjpBZGRyZXNzKGNlbGxHUFIpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0ciht
X2ppdC5nbG9iYWxEYXRhKCktPmpzQXJyYXlWUHRyKSkpOwotICAgICAgICAgICAgbV9qaXQuc3Rv
cmVQdHIoY2VsbEdQUiwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9kZS5sb2NhbCgpKSk7Ci0g
ICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAo
aXNCeXRlQXJyYXlQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7Ci0gICAgICAgICAgICBTcGVj
dWxhdGVDZWxsT3BlcmFuZCBjZWxsKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAgICAg
R1BSUmVnIGNlbGxHUFIgPSBjZWxsLmdwcigpOwotICAgICAgICAgICAgaWYgKCFpc0J5dGVBcnJh
eVByZWRpY3Rpb24obV9zdGF0ZS5mb3JOb2RlKG5vZGUuY2hpbGQxKCkpLm1fdHlwZSkpCi0gICAg
ICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhCYWRUeXBlLCBKU1ZhbHVlUmVncyhjZWxsR1BS
KSwgbm9kZS5jaGlsZDEoKSwgbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpOb3RFcXVh
bCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoY2VsbEdQUiksIE1hY3JvQXNzZW1ibGVyOjpUcnVz
dGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNCeXRlQXJyYXlWUHRyKSkpOwotICAgICAg
ICAgICAgbV9qaXQuc3RvcmVQdHIoY2VsbEdQUiwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9k
ZS5sb2NhbCgpKSk7Ci0gICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkgewotICAg
ICAgICAgICAgU3BlY3VsYXRlQm9vbGVhbk9wZXJhbmQgYm9vbGVhbih0aGlzLCBub2RlLmNoaWxk
MSgpKTsKLSAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKGJvb2xlYW4uZ3ByKCksIEpJVENvbXBp
bGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOworICAgICAgICBpZiAobm9kZS52YXJpYWJs
ZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIFNw
ZWN1bGF0ZURvdWJsZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAg
ICAgICBtX2ppdC5zdG9yZURvdWJsZSh2YWx1ZS5mcHIoKSwgSklUQ29tcGlsZXI6OmFkZHJlc3NG
b3Iobm9kZS5sb2NhbCgpKSk7CiAgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7
CisgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0
byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKKyAgICAgICAgICAgIC8vIHRoaXMgYnl0ZWNvZGUgdmFy
aWFibGUgZnJvbSByZWdpc3RlcnMgb3Igb3RoZXIgbG9jYXRpb25zIGluIHRoZSByZWdpc3RlciBm
aWxlLAorICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXQgaXMgc3RvcmVkIGFzIGEgZG91YmxlLgor
ICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkg
PSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAg
ICAgICAgICAgIG1faml0LnN0b3JlUHRyKHZhbHVlLmdwcigpLCBKSVRDb21waWxlcjo6YWRkcmVz
c0Zvcihub2RlLmxvY2FsKCkpKTsKLSAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4
KTsKLSAgICAgICAgfQorICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0ZWRUeXBlID0g
bm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpOworICAgICAgICAgICAgaWYg
KGlzSW50MzJQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgU3Bl
Y3VsYXRlSW50ZWdlck9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAg
ICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS5ncHIoKSwgSklUQ29tcGlsZXI6OnBheWxvYWRG
b3Iobm9kZS5sb2NhbCgpKSk7CisgICAgICAgICAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5k
ZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5UHJlZGljdGlvbihwcmVkaWN0ZWRU
eXBlKSkgeworICAgICAgICAgICAgICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5kIGNlbGwodGhpcywg
bm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgR1BSUmVnIGNlbGxHUFIgPSBjZWxsLmdw
cigpOworICAgICAgICAgICAgICAgIGlmICghaXNBcnJheVByZWRpY3Rpb24obV9zdGF0ZS5mb3JO
b2RlKG5vZGUuY2hpbGQxKCkpLm1fdHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHNwZWN1bGF0
aW9uQ2hlY2soQmFkVHlwZSwgSlNWYWx1ZVJlZ3MoY2VsbEdQUiksIG5vZGUuY2hpbGQxKCksIG1f
aml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVyOjpB
ZGRyZXNzKGNlbGxHUFIpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX2ppdC5nbG9i
YWxEYXRhKCktPmpzQXJyYXlWUHRyKSkpOworICAgICAgICAgICAgICAgIG1faml0LnN0b3JlUHRy
KGNlbGxHUFIsIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOworICAgICAg
ICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoaXNCeXRlQXJyYXlQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CisgICAgICAgICAgICAg
ICAgU3BlY3VsYXRlQ2VsbE9wZXJhbmQgY2VsbCh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAg
ICAgICAgICAgICBHUFJSZWcgY2VsbEdQUiA9IGNlbGwuZ3ByKCk7CisgICAgICAgICAgICAgICAg
aWYgKCFpc0J5dGVBcnJheVByZWRpY3Rpb24obV9zdGF0ZS5mb3JOb2RlKG5vZGUuY2hpbGQxKCkp
Lm1fdHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHNwZWN1bGF0aW9uQ2hlY2soQmFkVHlwZSwg
SlNWYWx1ZVJlZ3MoY2VsbEdQUiksIG5vZGUuY2hpbGQxKCksIG1faml0LmJyYW5jaFB0cihNYWNy
b0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKGNlbGxHUFIpLCBN
YWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX2ppdC5nbG9iYWxEYXRhKCktPmpzQnl0ZUFy
cmF5VlB0cikpKTsKKyAgICAgICAgICAgICAgICBtX2ppdC5zdG9yZVB0cihjZWxsR1BSLCBKSVRD
b21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsKKyAgICAgICAgICAgICAgICBub1Jl
c3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQm9vbGVhblBy
ZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBTcGVjdWxhdGVCb29s
ZWFuT3BlcmFuZCBib29sZWFuKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAg
IG1faml0LnN0b3JlUHRyKGJvb2xlYW4uZ3ByKCksIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5v
ZGUubG9jYWwoKSkpOworICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSlNWYWx1ZU9wZXJhbmQgdmFs
dWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIo
dmFsdWUuZ3ByKCksIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOworICAg
ICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgICAgIH0KIAot
ICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byByZXRy
aWV2ZSB0aGUgdmFsdWUgb2YKLSAgICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBmcm9t
IHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUuCi0gICAg
ICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVT
b3VyY2U6OmZvclByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSk7CisgICAgICAgICAgICAvLyBJbmRp
Y2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgdmFsdWUg
b2YKKyAgICAgICAgICAgIC8vIHRoaXMgYnl0ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMg
b3Igb3RoZXIgbG9jYXRpb25zIGluIHRoZSByZWdpc3RlciBmaWxlLgorICAgICAgICAgICAgdmFs
dWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6
Zm9yUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKTsKKyAgICAgICAgfQogICAgICAgICBicmVhazsK
ICAgICB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3Vs
YXRpdmVKSVQuY3BwCShyZXZpc2lvbiAxMDI3MjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzc4LDYgKzc3OCw5
IEBAIHZvaWQgVmFsdWVTb3VyY2U6OmR1bXAoRklMRSogb3V0KSBjb25zdAogICAgIGNhc2UgQm9v
bGVhbkluUmVnaXN0ZXJGaWxlOgogICAgICAgICBmcHJpbnRmKG91dCwgIkJvb2wiKTsKICAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBEb3VibGVJblJlZ2lzdGVyRmlsZToKKyAgICAgICAgZnByaW50
ZihvdXQsICJEb3VibGUiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBIYXZlTm9kZToKICAg
ICAgICAgZnByaW50ZihvdXQsICJOb2RlKCVkKSIsIG1fbm9kZUluZGV4KTsKICAgICAgICAgYnJl
YWs7CkBAIC05NDAsNiArOTQzLDggQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNp
Y0Jsb2NrJgogICAgICAgICBOb2RlSW5kZXggbm9kZUluZGV4ID0gYmxvY2sudmFyaWFibGVzQXRI
ZWFkLmxvY2FsKGkpOwogICAgICAgICBpZiAobm9kZUluZGV4ID09IE5vTm9kZSkKICAgICAgICAg
ICAgIG1fdmFyaWFibGVzW2ldID0gVmFsdWVTb3VyY2UoVmFsdWVJblJlZ2lzdGVyRmlsZSk7Cisg
ICAgICAgIGVsc2UgaWYgKGF0KG5vZGVJbmRleCkudmFyaWFibGVBY2Nlc3NEYXRhKCktPnNob3Vs
ZFVzZURvdWJsZUZvcm1hdCgpKQorICAgICAgICAgICAgbV92YXJpYWJsZXNbaV0gPSBWYWx1ZVNv
dXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG1f
dmFyaWFibGVzW2ldID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rpb24oYXQobm9kZUluZGV4KS52
YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpKTsKICAgICB9CkBAIC0xMjE4LDYgKzEy
MjMsOSBAQCBWYWx1ZVJlY292ZXJ5IFNwZWN1bGF0aXZlSklUOjpjb21wdXRlVmFsCiAKICAgICBj
YXNlIEJvb2xlYW5JblJlZ2lzdGVyRmlsZToKICAgICAgICAgcmV0dXJuIFZhbHVlUmVjb3Zlcnk6
OmFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZEJvb2xlYW4oKTsKKyAgICAgICAgCisgICAg
Y2FzZSBEb3VibGVJblJlZ2lzdGVyRmlsZToKKyAgICAgICAgcmV0dXJuIFZhbHVlUmVjb3Zlcnk6
OmFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZERvdWJsZSgpOwogCiAgICAgY2FzZSBIYXZl
Tm9kZTogewogICAgICAgICBpZiAobV9qaXQuaXNDb25zdGFudCh2YWx1ZVNvdXJjZS5ub2RlSW5k
ZXgoKSkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2
ZUpJVC5oCShyZXZpc2lvbiAxMDI3MjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1NwZWN1bGF0aXZlSklULmgJKHdvcmtpbmcgY29weSkKQEAgLTUyLDYgKzUyLDcgQEAgZW51bSBW
YWx1ZVNvdXJjZUtpbmQgewogICAgIEludDMySW5SZWdpc3RlckZpbGUsCiAgICAgQ2VsbEluUmVn
aXN0ZXJGaWxlLAogICAgIEJvb2xlYW5JblJlZ2lzdGVyRmlsZSwKKyAgICBEb3VibGVJblJlZ2lz
dGVyRmlsZSwKICAgICBIYXZlTm9kZQogfTsKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdWYXJpYWJsZUFjY2Vzc0RhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1ZhcmlhYmxlQWNjZXNzRGF0YS5oCShyZXZpc2lvbiAxMDI3MjYpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZhcmlhYmxlQWNjZXNzRGF0YS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBACiAjaWZuZGVmIERGR1ZhcmlhYmxlQWNjZXNzRGF0
YV9oCiAjZGVmaW5lIERGR1ZhcmlhYmxlQWNjZXNzRGF0YV9oCiAKKyNpbmNsdWRlICJERkdPcGVy
YW5kcy5oIgogI2luY2x1ZGUgIlByZWRpY3RlZFR5cGUuaCIKICNpbmNsdWRlICJWaXJ0dWFsUmVn
aXN0ZXIuaCIKICNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KQEAgLTM1LDE2ICszNiwyMiBAQCBu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CiAKIGNsYXNzIFZhcmlhYmxlQWNjZXNzRGF0
YSA6IHB1YmxpYyBVbmlvbkZpbmQ8VmFyaWFibGVBY2Nlc3NEYXRhPiB7CiBwdWJsaWM6CisgICAg
ZW51bSBCYWxsb3QgeyBWb3RlVmFsdWUsIFZvdGVEb3VibGUgfTsKKwogICAgIFZhcmlhYmxlQWNj
ZXNzRGF0YSgpCiAgICAgICAgIDogbV9sb2NhbChzdGF0aWNfY2FzdDxWaXJ0dWFsUmVnaXN0ZXI+
KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpKQogICAgICAgICAsIG1fcHJlZGljdGlv
bihQcmVkaWN0Tm9uZSkKKyAgICAgICAgLCBtX3Nob3VsZFVzZURvdWJsZUZvcm1hdChmYWxzZSkK
ICAgICB7CisgICAgICAgIGNsZWFyVm90ZXMoKTsKICAgICB9CiAgICAgCiAgICAgVmFyaWFibGVB
Y2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlciBsb2NhbCkKICAgICAgICAgOiBtX2xvY2FsKGxvY2Fs
KQogICAgICAgICAsIG1fcHJlZGljdGlvbihQcmVkaWN0Tm9uZSkKKyAgICAgICAgLCBtX3Nob3Vs
ZFVzZURvdWJsZUZvcm1hdChmYWxzZSkKICAgICB7CisgICAgICAgIGNsZWFyVm90ZXMoKTsKICAg
ICB9CiAgICAgCiAgICAgVmlydHVhbFJlZ2lzdGVyIGxvY2FsKCkKQEAgLTY4LDYgKzc1LDU2IEBA
IHB1YmxpYzoKICAgICAgICAgcmV0dXJuIGZpbmQoKS0+bV9wcmVkaWN0aW9uOwogICAgIH0KICAg
ICAKKyAgICB2b2lkIGNsZWFyVm90ZXMoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGZpbmQoKSA9
PSB0aGlzKTsKKyAgICAgICAgbV92b3Rlc1tWb3RlVmFsdWVdID0gMDsKKyAgICAgICAgbV92b3Rl
c1tWb3RlRG91YmxlXSA9IDA7CisgICAgfQorICAgIAorICAgIHZvaWQgdm90ZShCYWxsb3QgYmFs
bG90KQorICAgIHsKKyAgICAgICAgQVNTRVJUKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiYWxsb3Qp
IDwgMik7CisgICAgICAgIG1fdm90ZXNbYmFsbG90XSsrOworICAgIH0KKyAgICAKKyAgICBkb3Vi
bGUgZG91YmxlVm90ZVJhdGlvKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChmaW5kKCkgPT0gdGhp
cyk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG1fdm90ZXNbVm90ZURvdWJs
ZV0pIC8gbV92b3Rlc1tWb3RlVmFsdWVdOworICAgIH0KKyAgICAKKyAgICBib29sIHNob3VsZFVz
ZURvdWJsZUZvcm1hdEFjY29yZGluZ1RvVm90ZSgpCisgICAgeworICAgICAgICAvLyBGSVhNRTog
bWFrZSB0aGlzIHdvcmsgZm9yIGFyZ3VtZW50cy4KKyAgICAgICAgcmV0dXJuICFvcGVyYW5kSXNB
cmd1bWVudChvcGVyYW5kKCkpICYmICgoaXNOdW1iZXJQcmVkaWN0aW9uKHByZWRpY3Rpb24oKSkg
JiYgZG91YmxlVm90ZVJhdGlvKCkgPj0gSGV1cmlzdGljczo6ZG91YmxlVm90ZVJhdGlvRm9yRG91
YmxlRm9ybWF0KSB8fCBpc0RvdWJsZVByZWRpY3Rpb24ocHJlZGljdGlvbigpKSk7CisgICAgfQor
ICAgIAorICAgIGJvb2wgc2hvdWxkVXNlRG91YmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChmaW5kKCkgPT0gdGhpcyk7CisgICAgICAgIHJldHVybiBtX3Nob3VsZFVzZURvdWJsZUZv
cm1hdDsKKyAgICB9CisgICAgCisgICAgYm9vbCB0YWxseVZvdGVzRm9yU2hvdWxkVXNlRG91Ymxl
Rm9ybWF0KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChmaW5kKCkgPT0gdGhpcyk7CisgICAgICAg
IAorICAgICAgICBib29sIG5ld1ZhbHVlT2ZTaG91bGRVc2VEb3VibGVGb3JtYXQgPSBzaG91bGRV
c2VEb3VibGVGb3JtYXRBY2NvcmRpbmdUb1ZvdGUoKTsKKyAgICAgICAgaWYgKCFuZXdWYWx1ZU9m
U2hvdWxkVXNlRG91YmxlRm9ybWF0KSB7CisgICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB3ZSdy
ZSBtb25vdG9uaWNhbGx5IGNvbnZlcnRpbmcgdG8gZm9yY2UtZG91YmxlLgorICAgICAgICAgICAg
QVNTRVJUKCFtX3Nob3VsZFVzZURvdWJsZUZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtX3Nob3VsZFVzZURvdWJsZUZv
cm1hdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIG1fc2hv
dWxkVXNlRG91YmxlRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgbWVyZ2VQcmVkaWN0aW9uKG1fcHJl
ZGljdGlvbiwgUHJlZGljdERvdWJsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICAKIHByaXZhdGU6CiAgICAgLy8gVGhpcyBpcyBzbGlnaHRseSBzcGFjZS1pbmVmZmljaWVudCwg
c2luY2UgYW55dGhpbmcgd2UncmUgdW5pZmllZCB3aXRoCiAgICAgLy8gd2lsbCBoYXZlIHRoZSBz
YW1lIG9wZXJhbmQgYW5kIHNob3VsZCBoYXZlIHRoZSBzYW1lIHByZWRpY3Rpb24uIEJ1dApAQCAt
NzYsNiArMTMzLDkgQEAgcHJpdmF0ZToKIAogICAgIFZpcnR1YWxSZWdpc3RlciBtX2xvY2FsOwog
ICAgIFByZWRpY3RlZFR5cGUgbV9wcmVkaWN0aW9uOworICAgIAorICAgIGZsb2F0IG1fdm90ZXNb
Ml07CisgICAgYm9vbCBtX3Nob3VsZFVzZURvdWJsZUZvcm1hdDsKIH07CiAKIH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpERkcKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3Vt
ZW50cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQXJn
dW1lbnRzLmNwcAkocmV2aXNpb24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvQXJndW1lbnRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzI4LDYgKzMyOCwxMyBAQCB2
b2lkIEFyZ3VtZW50czo6dGVhck9mZihDYWxsRnJhbWUqIGNhbGxGCiAgICAgICAgIGNhc2UgQWxy
ZWFkeUluUmVnaXN0ZXJGaWxlQXNVbmJveGVkQm9vbGVhbjoKICAgICAgICAgICAgIHZhbHVlID0g
anNCb29sZWFuKGxvY2F0aW9uLT51bmJveGVkQm9vbGVhbigpKTsKICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZERvdWJsZToKKyNp
ZiBVU0UoSlNWQUxVRTY0KQorICAgICAgICAgICAgdmFsdWUgPSBqc051bWJlcigqYml0d2lzZV9j
YXN0PGRvdWJsZSo+KGxvY2F0aW9uKSk7CisjZWxzZQorICAgICAgICAgICAgdmFsdWUgPSBsb2Nh
dGlvbi0+anNWYWx1ZSgpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2Fz
ZSBDb25zdGFudDoKICAgICAgICAgICAgIHZhbHVlID0gcmVjb3ZlcnkuY29uc3RhbnQoKTsKICAg
ICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1
cmlzdGljcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SGV1cmlzdGljcy5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0hldXJpc3RpY3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MCw2ICs4MCw4IEBA
IHVuc2lnbmVkIG1heGltdW1PcHRpbWl6YXRpb25EZWxheTsKIGRvdWJsZSBkZXNpcmVkUHJvZmls
ZUxpdmVuZXNzUmF0ZTsKIGRvdWJsZSBkZXNpcmVkUHJvZmlsZUZ1bGxuZXNzUmF0ZTsKIAorZG91
YmxlIGRvdWJsZVZvdGVSYXRpb0ZvckRvdWJsZUZvcm1hdDsKKwogdW5zaWduZWQgbWluaW11bU51
bWJlck9mU2NhbnNCZXR3ZWVuUmViYWxhbmNlOwogdW5zaWduZWQgZ2NNYXJrU3RhY2tTZWdtZW50
U2l6ZTsKIHVuc2lnbmVkIG1pbmltdW1OdW1iZXJPZkNlbGxzVG9LZWVwOwpAQCAtMTYyLDYgKzE2
NCw4IEBAIHZvaWQgaW5pdGlhbGl6ZUhldXJpc3RpY3MoKQogICAgIFNFVChkZXNpcmVkUHJvZmls
ZUxpdmVuZXNzUmF0ZSwgMC43NSk7CiAgICAgU0VUKGRlc2lyZWRQcm9maWxlRnVsbG5lc3NSYXRl
LCAwLjM1KTsKICAgICAKKyAgICBTRVQoZG91YmxlVm90ZVJhdGlvRm9yRG91YmxlRm9ybWF0LCAy
KTsKKyAgICAKICAgICBTRVQobWluaW11bU51bWJlck9mU2NhbnNCZXR3ZWVuUmViYWxhbmNlLCAx
MDAwMCk7CiAgICAgU0VUKGdjTWFya1N0YWNrU2VnbWVudFNpemUsICAgICAgICAgICAgICAgcGFn
ZVNpemUoKSk7CiAgICAgU0VUKG1pbmltdW1OdW1iZXJPZkNlbGxzVG9LZWVwLCAgICAgICAgICAg
MTApOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlzdGljcy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuaAko
cmV2aXNpb24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSGV1cmlz
dGljcy5oCSh3b3JraW5nIGNvcHkpCkBAIC02Niw2ICs2Niw4IEBAIGV4dGVybiB1bnNpZ25lZCBt
YXhpbXVtT3B0aW1pemF0aW9uRGVsYXkKIGV4dGVybiBkb3VibGUgZGVzaXJlZFByb2ZpbGVMaXZl
bmVzc1JhdGU7CiBleHRlcm4gZG91YmxlIGRlc2lyZWRQcm9maWxlRnVsbG5lc3NSYXRlOwogCitl
eHRlcm4gZG91YmxlIGRvdWJsZVZvdGVSYXRpb0ZvckRvdWJsZUZvcm1hdDsKKwogZXh0ZXJuIHVu
c2lnbmVkIG1pbmltdW1OdW1iZXJPZlNjYW5zQmV0d2VlblJlYmFsYW5jZTsKIGV4dGVybiB1bnNp
Z25lZCBnY01hcmtTdGFja1NlZ21lbnRTaXplOwogZXh0ZXJuIHVuc2lnbmVkIG1pbmltdW1OdW1i
ZXJPZkNlbGxzVG9LZWVwOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119157</attachid>
            <date>2011-12-13 22:46:53 -0800</date>
            <delta_ts>2011-12-13 23:08:03 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>double_patch_2.diff</filename>
            <type>text/plain</type>
            <size>43437</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAyNzQxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc0IEBA
CisyMDExLTEyLTEzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHIHNob3VsZCBpbmZlciB3aGVuIGxvY2FsIHZhcmlhYmxlcyBhcmUgZG91YmxlcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0ODAKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIEludHJvZHVj
ZWQgdGhlIG5vdGlvbiB0aGF0IGEgbG9jYWwgdmFyaWFibGUgKHRob3VnaCBub3QgYW4gYXJndW1l
bnQsIHlldCEpIGNhbgorICAgICAgICBiZSBzdG9yZWQgYXMgYSBkb3VibGUsIGFuZCB3aWxsIGJl
IGd1YXJhbnRlZWQgdG8gYWx3YXlzIGNvbnRhaW4gYSBkb3VibGUuIFRoaXMKKyAgICAgICAgcmVx
dWlyZXMgbW9yZSBtYWdpYyBpbiB0aGUgT1NSIChjb252ZXJzaW9uIGluIGJvdGggZW50cnkgYW5k
IGV4aXQpLiBUaGUgaW5mZXJlbmNlCisgICAgICAgIGlzIHF1aXRlIHVub3J0aG9kb3g6IGFsbCB1
c2VzIG9mIGEgdmFyaWFibGUgdm90ZSBvbiB3aGV0aGVyIHRoZXkgdGhpbmsgaXQgc2hvdWxkCisg
ICAgICAgIGJlIGEgZG91YmxlIG9yIGEgSlNWYWx1ZSwgYmFzZWQgb24gaG93IHRoZXkgdXNlIGl0
LiBJZiB0aGV5IHVzZSBpdCBpbiBhbiBpbnRlZ2VyCisgICAgICAgIG9yIGJveGVkIHZhbHVlIGNv
bnRleHQsIHRoZXkgdm90ZSBKU1ZhbHVlLiBJZiB0aGV5IHVzZSBpdCBpbiBhIGRvdWJsZSBjb250
ZXh0LAorICAgICAgICB0aGV5IHZvdGUgZG91YmxlLiBUaGlzIHZvdGluZyBpcyBpbnRlcmxlYXZl
ZCBpbiB0aGUgcHJvcGFnYXRvcidzIGZpeHBvaW50LCBzbworICAgICAgICB0aGF0IHZhcmlhYmxl
cyB2b3RlZCBkb3VibGUgdGhlbiBoYXZlIGEgZG91YmxlIHByZWRpY3Rpb24gcHJvcGFnYXRlZCBm
cm9tIHRoZW0uCisgICAgICAgIFRoaXMgaW50ZXJsZWF2aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGEg
dmFyaWFibGUgdGhhdCBhY3R1YWxseSBhbHdheXMgY29udGFpbnMgYW4KKyAgICAgICAgaW50ZWdl
ciB0aGF0IGFsd2F5cyBnZXRzIHVzZWQgaW4gYXJpdGhtZXRpYyB0aGF0IGludm9sdmVzIGRvdWJs
ZXMgbWF5IGVuZCB1cAorICAgICAgICBiZWluZyB2b3RlZCBkb3VibGUsIHdoaWNoIHRoZW4gbWVh
bnMgdGhhdCBhbGwgdXNlcyBvZiB0aGUgdmFyaWFibGUgd2lsbCBzZWUgYQorICAgICAgICBkb3Vi
bGUgcmF0aGVyIHRoYW4gYW4gaW50ZWdlci4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgd29y
dGggMTglIHRvIFN1blNwaWRlci8zZC1jdWJlLCA3JSB0byBLcmFrZW4vYXVkaW8tYmVhdC1kZXRl
Y3Rpb24sIDclCisgICAgICAgIHRvIEtyYWtlbi9hdWRpby1mZnQsIDYlIHRvIEtyYWtlbi9pbWFn
aW5nLWRhcmtyb29tLCAyMCUgdG8KKyAgICAgICAgS3Jha2VuL2ltYWdpbmctZ2F1c3NpYW4tYmx1
ciwgYW5kIGp1c3Qgb3ZlciAxJSB0byBLcmFrZW4vanNvbi1wYXJzZS1maW5hbmNpYWwuCisgICAg
ICAgIEl0IHJlc3VsdHMgaW4gYSAxJSBzcGVlZC11cCBvbiBTdW5TcGlkZXIgYW5kIGEgNCUgc3Bl
ZWQtdXAgaW4gS3Jha2VuLiAgU2ltaWxhcgorICAgICAgICByZXN1bHRzIG9uIEpTVkFMVUUzMl82
NCwgdGhvdWdoIHdpdGggYSBiaWdnZXIgd2luIG9uIEtyYWtlbiAoNSUpIGFuZCBubyBvdmVyYWxs
CisgICAgICAgIHdpbiBvbiBTdW5TcGlkZXIuCisKKyAgICAgICAgKiBieXRlY29kZS9WYWx1ZVJl
Y292ZXJ5Lmg6CisgICAgICAgIChKU0M6OlZhbHVlUmVjb3Zlcnk6OmFscmVhZHlJblJlZ2lzdGVy
RmlsZUFzVW5ib3hlZERvdWJsZSk6CisgICAgICAgIChKU0M6OlZhbHVlUmVjb3Zlcnk6OmR1bXAp
OgorICAgICAgICAqIGRmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpBYnN0cmFjdFN0YXRlOjpleGVjdXRlKToKKyAgICAgICAgKiBkZmcvREZHQXNzZW1ibHlIZWxw
ZXJzLmg6CisgICAgICAgIChKU0M6OkRGRzo6QXNzZW1ibHlIZWxwZXJzOjpib3hEb3VibGUpOgor
ICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmR1
bXApOgorICAgICAgICAqIGRmZy9ERkdKSVRDb21waWxlci5oOgorICAgICAgICAoSlNDOjpERkc6
OkpJVENvbXBpbGVyOjpub3RpY2VPU1JFbnRyeSk6CisgICAgICAgICogZGZnL0RGR09TUkVudHJ5
LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpwcmVwYXJlT1NSRW50cnkpOgorICAgICAgICAqIGRm
Zy9ERkdPU1JFbnRyeS5oOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHA6
CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdCk6CisgICAg
ICAgICogZGZnL0RGR1Byb3BhZ2F0b3IuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OnZvdGUpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmRvUm91bmRPZkRvdWJs
ZVZvdGluZyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cHJvcGFnYXRlUHJlZGlj
dGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmZpeHVwTm9kZSk6CisgICAg
ICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpWYWx1
ZVNvdXJjZTo6ZHVtcCk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21wdXRlVmFsdWVSZWNv
dmVyeUZvcik6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmg6CisgICAgICAgICog
ZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1
bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5j
cHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAg
ICAqIGRmZy9ERkdWYXJpYWJsZUFjY2Vzc0RhdGEuaDoKKyAgICAgICAgKEpTQzo6REZHOjpWYXJp
YWJsZUFjY2Vzc0RhdGE6OlZhcmlhYmxlQWNjZXNzRGF0YSk6CisgICAgICAgIChKU0M6OkRGRzo6
VmFyaWFibGVBY2Nlc3NEYXRhOjpjbGVhclZvdGVzKToKKyAgICAgICAgKEpTQzo6REZHOjpWYXJp
YWJsZUFjY2Vzc0RhdGE6OnZvdGUpOgorICAgICAgICAoSlNDOjpERkc6OlZhcmlhYmxlQWNjZXNz
RGF0YTo6ZG91YmxlVm90ZVJhdGlvKToKKyAgICAgICAgKEpTQzo6REZHOjpWYXJpYWJsZUFjY2Vz
c0RhdGE6OnNob3VsZFVzZURvdWJsZUZvcm1hdEFjY29yZGluZ1RvVm90ZSk6CisgICAgICAgIChK
U0M6OkRGRzo6VmFyaWFibGVBY2Nlc3NEYXRhOjpzaG91bGRVc2VEb3VibGVGb3JtYXQpOgorICAg
ICAgICAoSlNDOjpERkc6OlZhcmlhYmxlQWNjZXNzRGF0YTo6dGFsbHlWb3Rlc0ZvclNob3VsZFVz
ZURvdWJsZUZvcm1hdCk6CisgICAgICAgICogcnVudGltZS9Bcmd1bWVudHMuY3BwOgorICAgICAg
ICAoSlNDOjpBcmd1bWVudHM6OnRlYXJPZmYpOgorICAgICAgICAqIHJ1bnRpbWUvSGV1cmlzdGlj
cy5jcHA6CisgICAgICAgIChKU0M6OkhldXJpc3RpY3M6OmluaXRpYWxpemVIZXVyaXN0aWNzKToK
KyAgICAgICAgKiBydW50aW1lL0hldXJpc3RpY3MuaDoKKwogMjAxMS0xMi0xMyAgQW5kZXJzIENh
cmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29tPgogCiAgICAgICAgIFRyeSB0byBmaXggdGhlIFdp
bmRvd3MgYnVpbGQuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVmFsdWVS
ZWNvdmVyeS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9W
YWx1ZVJlY292ZXJ5LmgJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29kZS9WYWx1ZVJlY292ZXJ5LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDYgKzQ3LDcg
QEAgZW51bSBWYWx1ZVJlY292ZXJ5VGVjaG5pcXVlIHsKICAgICBBbHJlYWR5SW5SZWdpc3RlckZp
bGVBc1VuYm94ZWRJbnQzMiwKICAgICBBbHJlYWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWRDZWxs
LAogICAgIEFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZEJvb2xlYW4sCisgICAgQWxyZWFk
eUluUmVnaXN0ZXJGaWxlQXNVbmJveGVkRG91YmxlLAogICAgIC8vIEl0J3MgaW4gYSByZWdpc3Rl
ci4KICAgICBJbkdQUiwKICAgICBVbmJveGVkSW50MzJJbkdQUiwKQEAgLTEwMiw2ICsxMDMsMTMg
QEAgcHVibGljOgogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICAKKyAgICBzdGF0
aWMgVmFsdWVSZWNvdmVyeSBhbHJlYWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWREb3VibGUoKQor
ICAgIHsKKyAgICAgICAgVmFsdWVSZWNvdmVyeSByZXN1bHQ7CisgICAgICAgIHJlc3VsdC5tX3Rl
Y2huaXF1ZSA9IEFscmVhZHlJblJlZ2lzdGVyRmlsZUFzVW5ib3hlZERvdWJsZTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCiAgICAgc3RhdGljIFZhbHVlUmVjb3ZlcnkgaW5H
UFIoTWFjcm9Bc3NlbWJsZXI6OlJlZ2lzdGVySUQgZ3ByLCBEYXRhRm9ybWF0IGRhdGFGb3JtYXQp
CiAgICAgewogICAgICAgICBBU1NFUlQoZGF0YUZvcm1hdCAhPSBEYXRhRm9ybWF0Tm9uZSk7CkBA
IC0yNDcsNiArMjU1LDkgQEAgcHVibGljOgogICAgICAgICBjYXNlIEFscmVhZHlJblJlZ2lzdGVy
RmlsZUFzVW5ib3hlZEJvb2xlYW46CiAgICAgICAgICAgICBmcHJpbnRmKG91dCwgIihib29sKSIp
OwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWxyZWFkeUluUmVnaXN0ZXJGaWxl
QXNVbmJveGVkRG91YmxlOgorICAgICAgICAgICAgZnByaW50ZihvdXQsICIoZG91YmxlKSIpOwor
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSW5HUFI6CiAgICAgICAgICAgICBmcHJp
bnRmKG91dCwgIiUlciVkIiwgZ3ByKCkpOwogICAgICAgICAgICAgYnJlYWs7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHJldmlzaW9u
IDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTIwNyw2ICsyMDcsMTIgQEAgYm9vbCBBYnN0cmFjdFN0YXRl
OjpleGVjdXRlKE5vZGVJbmRleCBubwogICAgIH0KICAgICAgICAgCiAgICAgY2FzZSBTZXRMb2Nh
bDogeworICAgICAgICBpZiAobm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91
YmxlRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVy
KFByZWRpY3ROdW1iZXIpOworICAgICAgICAgICAgbV92YXJpYWJsZXMub3BlcmFuZChub2RlLmxv
Y2FsKCkpLnNldChQcmVkaWN0RG91YmxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIAogICAgICAgICBQcmVkaWN0ZWRUeXBlIHByZWRpY3RlZFR5cGUgPSBub2RlLnZh
cmlhYmxlQWNjZXNzRGF0YSgpLT5wcmVkaWN0aW9uKCk7CiAgICAgICAgIGlmIChpc0ludDMyUHJl
ZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkKICAgICAgICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEo
KSkuZmlsdGVyKFByZWRpY3RJbnQzMik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0Fzc2VtYmx5SGVscGVycy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHQXNzZW1ibHlIZWxwZXJzLmgJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHQXNzZW1ibHlIZWxwZXJzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTIxNSw2ICsyMTUsNyBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICBtb3ZlRG91YmxlVG9QdHIo
ZnByLCBncHIpOwogICAgICAgICBzdWJQdHIoR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVy
LCBncHIpOworICAgICAgICBqaXRBc3NlcnRJc0pTRG91YmxlKGdwcik7CiAgICAgICAgIHJldHVy
biBncHI7CiAgICAgfQogICAgIEZQUlJlZyB1bmJveERvdWJsZShHUFJSZWcgZ3ByLCBGUFJSZWcg
ZnByKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHJldmlzaW9u
IDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNjAsNyArMjYwLDcgQEAgdm9pZCBHcmFwaDo6ZHVtcChOb2RlSW5kZXgg
bm9kZUluZGV4LCBDbwogCiAgICAgaWYgKCFza2lwcGVkKSB7CiAgICAgICAgIGlmIChub2RlLmhh
c1ZhcmlhYmxlQWNjZXNzRGF0YSgpKQotICAgICAgICAgICAgcHJpbnRmKCIgIHByZWRpY3Rpbmcg
JXMiLCBwcmVkaWN0aW9uVG9TdHJpbmcobm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGlj
dGlvbigpKSk7CisgICAgICAgICAgICBwcmludGYoIiAgcHJlZGljdGluZyAlcywgZG91YmxlIHJh
dGlvICVsZiVzIiwgcHJlZGljdGlvblRvU3RyaW5nKG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkt
PnByZWRpY3Rpb24oKSksIG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPmRvdWJsZVZvdGVSYXRp
bygpLCBub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSA/
ICIsIGZvcmNpbmcgZG91YmxlIiA6ICIiKTsKICAgICAgICAgZWxzZSBpZiAobm9kZS5oYXNWYXJO
dW1iZXIoKSkKICAgICAgICAgICAgIHByaW50ZigiICBwcmVkaWN0aW5nICVzIiwgcHJlZGljdGlv
blRvU3RyaW5nKGdldEdsb2JhbFZhclByZWRpY3Rpb24obm9kZS52YXJOdW1iZXIoKSkpKTsKICAg
ICAgICAgZWxzZSBpZiAobm9kZS5oYXNIZWFwUHJlZGljdGlvbigpKQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkocmV2aXNpb24gMTAyNzI2KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yNjYsOCArMjY2LDExIEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9l
eHBlY3RlZFZhbHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgpOwogICAgICAgICB9CiAg
ICAgICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNpY0Jsb2NrLnZhcmlhYmxl
c0F0SGVhZC5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7Ci0gICAgICAgICAgICBpZiAoYmFz
aWNCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwobG9jYWwpID09IE5vTm9kZSkKKyAgICAgICAg
ICAgIE5vZGVJbmRleCBub2RlSW5kZXggPSBiYXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5sb2Nh
bChsb2NhbCk7CisgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IE5vTm9kZSkKICAgICAgICAg
ICAgICAgICBlbnRyeS0+bV9leHBlY3RlZFZhbHVlcy5sb2NhbChsb2NhbCkubWFrZVRvcCgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAobV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNjZXNzRGF0
YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkKKyAgICAgICAgICAgICAgICBlbnRyeS0+bV9s
b2NhbHNGb3JjZWREb3VibGUuc2V0KGxvY2FsKTsKICAgICAgICAgfQogI2Vsc2UKICAgICAgICAg
VU5VU0VEX1BBUkFNKGJhc2ljQmxvY2spOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFbnRyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFbnRyeS5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHT1NSRW50cnkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQsNiArMTA0LDE1
IEBAIHZvaWQqIHByZXBhcmVPU1JFbnRyeShFeGVjU3RhdGUqIGV4ZWMsIEMKICAgICB9CiAgICAg
CiAgICAgZm9yIChzaXplX3QgbG9jYWwgPSAwOyBsb2NhbCA8IGVudHJ5LT5tX2V4cGVjdGVkVmFs
dWVzLm51bWJlck9mTG9jYWxzKCk7ICsrbG9jYWwpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5tX2xv
Y2Fsc0ZvcmNlZERvdWJsZS5nZXQobG9jYWwpKSB7CisgICAgICAgICAgICBpZiAoIWV4ZWMtPnJl
Z2lzdGVycygpW2xvY2FsXS5qc1ZhbHVlKCkuaXNOdW1iZXIoKSkgeworI2lmIEVOQUJMRShKSVRf
VkVSQk9TRV9PU1IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgT1NSIGZhaWxlZCBiZWNh
dXNlIHZhcmlhYmxlICVsdSBpcyAlcywgZXhwZWN0ZWQgbnVtYmVyLlxuIiwgbG9jYWwsIGV4ZWMt
PnJlZ2lzdGVycygpW2xvY2FsXS5qc1ZhbHVlKCkuZGVzY3JpcHRpb24oKSk7CisjZW5kaWYKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CiAgICAgICAgIGlmICghZW50cnktPm1fZXhwZWN0ZWRWYWx1ZXMubG9j
YWwobG9jYWwpLnZhbGlkYXRlKGV4ZWMtPnJlZ2lzdGVycygpW2xvY2FsXS5qc1ZhbHVlKCkpKSB7
CiAjaWYgRU5BQkxFKEpJVF9WRVJCT1NFX09TUikKICAgICAgICAgICAgIHByaW50ZigiICAgIE9T
UiBmYWlsZWQgYmVjYXVzZSB2YXJpYWJsZSAlbHUgaXMgJXMsIGV4cGVjdGVkICIsIGxvY2FsLCBl
eGVjLT5yZWdpc3RlcnMoKVtsb2NhbF0uanNWYWx1ZSgpLmRlc2NyaXB0aW9uKCkpOwpAQCAtMTEz
LDcgKzEyMiw3IEBAIHZvaWQqIHByZXBhcmVPU1JFbnRyeShFeGVjU3RhdGUqIGV4ZWMsIEMKICAg
ICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLy8gMikg
Q2hlY2sgdGhlIHN0YWNrIGhlaWdodC4gVGhlIERGRyBKSVQgbWF5IHJlcXVpcmUgYSB0YWxsZXIg
c3RhY2sgdGhhbiB0aGUKICAgICAvLyAgICBiYXNlbGluZSBKSVQsIGluIHNvbWUgY2FzZXMuIElm
IHdlIGNhbid0IGdyb3cgdGhlIHN0YWNrLCB0aGVuIGRvbid0IGRvCiAgICAgLy8gICAgT1NSIHJp
Z2h0IG5vdy4gVGhhdCdzIHRoZSBvbmx5IG9wdGlvbiB3ZSBoYXZlIHVubGVzcyB3ZSB3YW50IGJh
c2ljIGJsb2NrCkBAIC0xMzIsMTEgKzE0MSwxOSBAQCB2b2lkKiBwcmVwYXJlT1NSRW50cnkoRXhl
Y1N0YXRlKiBleGVjLCBDCiAgICAgcHJpbnRmKCIgICAgT1NSIHNob3VsZCBzdWNjZWVkLlxuIik7
CiAjZW5kaWYKICAgICAKLSAgICAvLyAzKSBGaXggdGhlIGNhbGwgZnJhbWUuCisjaWYgVVNFKEpT
VkFMVUU2NCkKKyAgICAvLyAzKSBQZXJmb3JtIGRhdGEgZm9ybWF0IGNvbnZlcnNpb25zLgorICAg
IGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBlbnRyeS0+bV9leHBlY3RlZFZhbHVlcy5u
dW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CisgICAgICAgIGlmIChlbnRyeS0+bV9sb2NhbHNG
b3JjZWREb3VibGUuZ2V0KGxvY2FsKSkKKyAgICAgICAgICAgICpiaXR3aXNlX2Nhc3Q8ZG91Ymxl
Kj4oZXhlYy0+cmVnaXN0ZXJzKCkgKyBsb2NhbCkgPSBleGVjLT5yZWdpc3RlcnMoKVtsb2NhbF0u
anNWYWx1ZSgpLmFzTnVtYmVyKCk7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLy8gNCkgRml4
IHRoZSBjYWxsIGZyYW1lLgogICAgIAogICAgIGV4ZWMtPnNldENvZGVCbG9jayhjb2RlQmxvY2sp
OwogICAgIAotICAgIC8vIDQpIEZpbmQgYW5kIHJldHVybiB0aGUgZGVzdGluYXRpb24gbWFjaGlu
ZSBjb2RlIGFkZHJlc3MuCisgICAgLy8gNSkgRmluZCBhbmQgcmV0dXJuIHRoZSBkZXN0aW5hdGlv
biBtYWNoaW5lIGNvZGUgYWRkcmVzcy4KICAgICAKICAgICB2b2lkKiByZXN1bHQgPSBjb2RlQmxv
Y2stPmdldEpJVENvZGUoKS5leGVjdXRhYmxlQWRkcmVzc0F0T2Zmc2V0KGVudHJ5LT5tX21hY2hp
bmVDb2RlT2Zmc2V0KTsKICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
T1NSRW50cnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09T
UkVudHJ5LmgJKHJldmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHT1NSRW50cnkuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVk
ZSAiREZHQWJzdHJhY3RWYWx1ZS5oIgogI2luY2x1ZGUgIkRGR09wZXJhbmRzLmgiCisjaW5jbHVk
ZSA8d3RmL0JpdFZlY3Rvci5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIApAQCAtNDEsNiArNDIsNyBA
QCBzdHJ1Y3QgT1NSRW50cnlEYXRhIHsKICAgICB1bnNpZ25lZCBtX2J5dGVjb2RlSW5kZXg7CiAg
ICAgdW5zaWduZWQgbV9tYWNoaW5lQ29kZU9mZnNldDsKICAgICBPcGVyYW5kczxBYnN0cmFjdFZh
bHVlPiBtX2V4cGVjdGVkVmFsdWVzOworICAgIEJpdFZlY3RvciBtX2xvY2Fsc0ZvcmNlZERvdWJs
ZTsKIH07CiAKIGlubGluZSB1bnNpZ25lZCBnZXRPU1JFbnRyeURhdGFCeXRlY29kZUluZGV4KE9T
UkVudHJ5RGF0YSogb3NyRW50cnlEYXRhKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXI2NC5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyNjQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMTYsNiArMTE2LDcgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBp
bGVFeGl0KGNvbnN0IAogICAgIC8vIGV4cGVjdCBtb3N0IG9mIHRoZW0gdG8gYmUganNVbmRlZmlu
ZWQoKTsgaWYgdGhhdCdzIHRydWUgdGhlbiB3ZSBoYW5kbGUgdGhhdAogICAgIC8vIHNwZWNpYWxs
eSB0byBtaW5pbWl6ZSBjb2RlIHNpemUgYW5kIGV4ZWN1dGlvbiB0aW1lLgogICAgIGJvb2wgaGF2
ZVVuYm94ZWRJbnQzMnMgPSBmYWxzZTsKKyAgICBib29sIGhhdmVVbmJveGVkRG91YmxlcyA9IGZh
bHNlOwogICAgIGJvb2wgaGF2ZUZQUnMgPSBmYWxzZTsKICAgICBib29sIGhhdmVDb25zdGFudHMg
PSBmYWxzZTsKICAgICBib29sIGhhdmVVbmRlZmluZWQgPSBmYWxzZTsKQEAgLTE1OSw2ICsxNjAs
MTAgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNvbnN0IAogICAgICAgICAg
ICAgaGF2ZVVuYm94ZWRJbnQzMnMgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
ICAgICAKKyAgICAgICAgY2FzZSBBbHJlYWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWREb3VibGU6
CisgICAgICAgICAgICBoYXZlVW5ib3hlZERvdWJsZXMgPSB0cnVlOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAKICAgICAgICAgY2FzZSBVSW50MzJJbkdQUjoKICAgICAgICAgICAg
IGhhdmVVSW50MzJzID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTg2LDYgKzE5MSw4
IEBAIHZvaWQgT1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICAgICAgZnBy
aW50ZihzdGRlcnIsICJEaXNwbGFjZWQ9JXUgIiwgbnVtYmVyT2ZEaXNwbGFjZWRWaXJ0dWFsUmVn
aXN0ZXJzKTsKICAgICBpZiAoaGF2ZVVuYm94ZWRJbnQzMnMpCiAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiVW5ib3hlZEludDMyICIpOworICAgIGlmIChoYXZlVW5ib3hlZERvdWJsZXMpCisgICAg
ICAgIGZwcmludGYoc3RkZXJyLCAiVW5ib3hlZERvdWJsZXMgIik7CiAgICAgaWYgKGhhdmVVSW50
MzJzKQogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVJbnQzMiAiKTsKICAgICBpZiAoaGF2ZUZQ
UnMpCkBAIC0zMTIsOSArMzE5LDIzIEBAIHZvaWQgT1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhp
dChjb25zdCAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICAvLyBBdCB0aGlzIHBvaW50IGFs
bCBHUFJzIGFuZCBGUFJzIGFyZSBhdmFpbGFibGUgZm9yIHNjcmF0Y2ggdXNlLgorICAgIAorICAg
IC8vIDkpIEJveCBhbGwgdW5ib3hlZCBkb3VibGVzIGluIHRoZSByZWdpc3RlciBmaWxlLgorICAg
IGlmIChoYXZlVW5ib3hlZERvdWJsZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBp
bmRleCA8IGV4aXQubnVtYmVyT2ZSZWNvdmVyaWVzKCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAg
IGNvbnN0IFZhbHVlUmVjb3ZlcnkmIHJlY292ZXJ5ID0gZXhpdC52YWx1ZVJlY292ZXJ5KGluZGV4
KTsKKyAgICAgICAgICAgIGlmIChyZWNvdmVyeS50ZWNobmlxdWUoKSAhPSBBbHJlYWR5SW5SZWdp
c3RlckZpbGVBc1VuYm94ZWREb3VibGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICBtX2ppdC5sb2FkRG91YmxlKEFzc2VtYmx5SGVscGVyczo6YWRkcmVzc0ZvcigoVmly
dHVhbFJlZ2lzdGVyKWV4aXQub3BlcmFuZEZvckluZGV4KGluZGV4KSksIEZQUkluZm86OmZwUmVn
VDApOworICAgICAgICAgICAgbV9qaXQuYm94RG91YmxlKEZQUkluZm86OmZwUmVnVDAsIEdQUklu
Zm86OnJlZ1QwKTsKKyAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKEdQUkluZm86OnJlZ1QwLCBB
c3NlbWJseUhlbHBlcnM6OmFkZHJlc3NGb3IoKFZpcnR1YWxSZWdpc3RlcilleGl0Lm9wZXJhbmRG
b3JJbmRleChpbmRleCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBBU1NFUlQoc2Ny
YXRjaEluZGV4ID09IG51bWJlck9mUG9pc29uZWRWaXJ0dWFsUmVnaXN0ZXJzKTsKICAgICAKLSAg
ICAvLyA5KSBSZXNodWZmbGUgZGlzcGxhY2VkIHZpcnR1YWwgcmVnaXN0ZXJzLiBPcHRpbWl6ZSBm
b3IgdGhlIGNhc2UgdGhhdAorICAgIC8vIDEwKSBSZXNodWZmbGUgZGlzcGxhY2VkIHZpcnR1YWwg
cmVnaXN0ZXJzLiBPcHRpbWl6ZSBmb3IgdGhlIGNhc2UgdGhhdAogICAgIC8vICAgIHRoZSBudW1i
ZXIgb2YgZGlzcGxhY2VkIHZpcnR1YWwgcmVnaXN0ZXJzIGlzIG5vdCBtb3JlIHRoYW4gdGhlIG51
bWJlcgogICAgIC8vICAgIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCByZWdpc3RlcnMuCiAgICAgCkBA
IC00MzAsNyArNDUxLDcgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNvbnN0
IAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIC8vIDEwKSBEdW1wIGFsbCBwb2lzb25lZCB2
aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICAvLyAxMSkgRHVtcCBhbGwgcG9pc29uZWQgdmlydHVhbCBy
ZWdpc3RlcnMuCiAgICAgCiAgICAgc2NyYXRjaEluZGV4ID0gMDsKICAgICBpZiAobnVtYmVyT2ZQ
b2lzb25lZFZpcnR1YWxSZWdpc3RlcnMpIHsKQEAgLTQ1NSw3ICs0NzYsNyBAQCB2b2lkIE9TUkV4
aXRDb21waWxlcjo6Y29tcGlsZUV4aXQoY29uc3QgCiAgICAgfQogICAgIEFTU0VSVChzY3JhdGNo
SW5kZXggPT0gbnVtYmVyT2ZQb2lzb25lZFZpcnR1YWxSZWdpc3RlcnMpOwogICAgIAotICAgIC8v
IDExKSBEdW1wIGFsbCBjb25zdGFudHMuIE9wdGltaXplIGZvciBVbmRlZmluZWQsIHNpbmNlIHRo
YXQncyBhIGNvbnN0YW50IHdlIHNlZQorICAgIC8vIDEyKSBEdW1wIGFsbCBjb25zdGFudHMuIE9w
dGltaXplIGZvciBVbmRlZmluZWQsIHNpbmNlIHRoYXQncyBhIGNvbnN0YW50IHdlIHNlZQogICAg
IC8vICAgICBvZnRlbi4KIAogICAgIGlmIChoYXZlQ29uc3RhbnRzKSB7CkBAIC00NzMsNyArNDk0
LDcgQEAgdm9pZCBPU1JFeGl0Q29tcGlsZXI6OmNvbXBpbGVFeGl0KGNvbnN0IAogICAgICAgICB9
CiAgICAgfQogICAgIAotICAgIC8vIDEyKSBBZGp1c3QgdGhlIG9sZCBKSVQncyBleGVjdXRlIGNv
dW50ZXIuIFNpbmNlIHdlIGFyZSBleGl0aW5nIE9TUiwgd2Uga25vdworICAgIC8vIDEzKSBBZGp1
c3QgdGhlIG9sZCBKSVQncyBleGVjdXRlIGNvdW50ZXIuIFNpbmNlIHdlIGFyZSBleGl0aW5nIE9T
Uiwgd2Uga25vdwogICAgIC8vICAgICB0aGF0IGFsbCBuZXcgY2FsbHMgaW50byB0aGlzIGNvZGUg
d2lsbCBnbyB0byB0aGUgbmV3IEpJVCwgc28gdGhlIGV4ZWN1dGUKICAgICAvLyAgICAgY291bnRl
ciBvbmx5IGFmZmVjdHMgY2FsbCBmcmFtZXMgdGhhdCBwZXJmb3JtZWQgT1NSIGV4aXQgYW5kIGNh
bGwgZnJhbWVzCiAgICAgLy8gICAgIHRoYXQgd2VyZSBzdGlsbCBleGVjdXRpbmcgdGhlIG9sZCBK
SVQgYXQgdGhlIHRpbWUgb2YgYW5vdGhlciBjYWxsIGZyYW1lJ3MKQEAgLTUzOCwxMiArNTU5LDEy
IEBAIHZvaWQgT1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICAKICAgICBk
b25lQWRqdXN0aW5nLmxpbmsoJm1faml0KTsKICAgICAKLSAgICAvLyAxMykgTG9hZCB0aGUgcmVz
dWx0IG9mIHRoZSBsYXN0IGJ5dGVjb2RlIG9wZXJhdGlvbiBpbnRvIHJlZ1QwLgorICAgIC8vIDE0
KSBMb2FkIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYnl0ZWNvZGUgb3BlcmF0aW9uIGludG8gcmVn
VDAuCiAgICAgCiAgICAgaWYgKGV4aXQubV9sYXN0U2V0T3BlcmFuZCAhPSBzdGQ6Om51bWVyaWNf
bGltaXRzPGludD46Om1heCgpKQogICAgICAgICBtX2ppdC5sb2FkUHRyKEFzc2VtYmx5SGVscGVy
czo6YWRkcmVzc0ZvcigoVmlydHVhbFJlZ2lzdGVyKWV4aXQubV9sYXN0U2V0T3BlcmFuZCksIEdQ
UkluZm86OmNhY2hlZFJlc3VsdFJlZ2lzdGVyKTsKICAgICAKLSAgICAvLyAxNCkgRml4IGNhbGwg
ZnJhbWUocykuCisgICAgLy8gMTUpIEZpeCBjYWxsIGZyYW1lKHMpLgogICAgIAogICAgIEFTU0VS
VChtX2ppdC5iYXNlbGluZUNvZGVCbG9jaygpLT5nZXRKSVRUeXBlKCkgPT0gSklUQ29kZTo6QmFz
ZWxpbmVKSVQpOwogICAgIG1faml0LnN0b3JlUHRyKEFzc2VtYmx5SGVscGVyczo6VHJ1c3RlZElt
bVB0cihtX2ppdC5iYXNlbGluZUNvZGVCbG9jaygpKSwgQXNzZW1ibHlIZWxwZXJzOjphZGRyZXNz
Rm9yKChWaXJ0dWFsUmVnaXN0ZXIpUmVnaXN0ZXJGaWxlOjpDb2RlQmxvY2spKTsKQEAgLTU3OSw3
ICs2MDAsNyBAQCB2b2lkIE9TUkV4aXRDb21waWxlcjo6Y29tcGlsZUV4aXQoY29uc3QgCiAgICAg
aWYgKGV4aXQubV9jb2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZSkKICAgICAgICAgbV9qaXQuYWRk
UHRyKEFzc2VtYmx5SGVscGVyczo6SW1tMzIoZXhpdC5tX2NvZGVPcmlnaW4uaW5saW5lQ2FsbEZy
YW1lLT5zdGFja09mZnNldCAqIHNpemVvZihFbmNvZGVkSlNWYWx1ZSkpLCBHUFJJbmZvOjpjYWxs
RnJhbWVSZWdpc3Rlcik7CiAgICAgCi0gICAgLy8gMTUpIEp1bXAgaW50byB0aGUgY29ycmVzcG9u
ZGluZyBiYXNlbGluZSBKSVQgY29kZS4KKyAgICAvLyAxNikgSnVtcCBpbnRvIHRoZSBjb3JyZXNw
b25kaW5nIGJhc2VsaW5lIEpJVCBjb2RlLgogICAgIAogICAgIENvZGVCbG9jayogYmFzZWxpbmVD
b2RlQmxvY2sgPSBtX2ppdC5iYXNlbGluZUNvZGVCbG9ja0ZvcihleGl0Lm1fY29kZU9yaWdpbik7
CiAgICAgVmVjdG9yPEJ5dGVjb2RlQW5kTWFjaGluZU9mZnNldD4mIGRlY29kZWRDb2RlTWFwID0g
bV9qaXQuZGVjb2RlZENvZGVNYXBGb3IoYmFzZWxpbmVDb2RlQmxvY2spOwpAQCAtNTk0LDYgKzYx
NSw3IEBAIHZvaWQgT1NSRXhpdENvbXBpbGVyOjpjb21waWxlRXhpdChjb25zdCAKICAgICBBU1NF
UlQoR1BSSW5mbzo6cmVnVDEgIT0gR1BSSW5mbzo6Y2FjaGVkUmVzdWx0UmVnaXN0ZXIpOwogICAg
IAogICAgIG1faml0Lm1vdmUoQXNzZW1ibHlIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGp1bXBUYXJn
ZXQpLCBHUFJJbmZvOjpyZWdUMSk7CisgICAgCiAgICAgbV9qaXQuanVtcChHUFJJbmZvOjpyZWdU
MSk7CiAKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHUHJvcGFnYXRvci5jcHAJKHJldmlzaW9uIDEwMjcyNikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUHJvcGFnYXRvci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTY1Niw2ICs2NTYsMTEyIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBwcm9wYWdhdGVOb2Rl
UHJlZGljdGlvbnMobV9ncmFwaFttX2NvbXBpbGVJbmRleF0pOwogICAgIH0KICAgICAKKyAgICB2
b2lkIHZvdGUoTm9kZUluZGV4IG5vZGVJbmRleCwgVmFyaWFibGVBY2Nlc3NEYXRhOjpCYWxsb3Qg
YmFsbG90KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChtX2dyYXBoW25vZGVJbmRleF0ub3ApIHsK
KyAgICAgICAgY2FzZSBWYWx1ZVRvTnVtYmVyOgorICAgICAgICBjYXNlIFZhbHVlVG9Eb3VibGU6
CisgICAgICAgIGNhc2UgVmFsdWVUb0ludDMyOgorICAgICAgICBjYXNlIFVJbnQzMlRvTnVtYmVy
OgorICAgICAgICAgICAgbm9kZUluZGV4ID0gbV9ncmFwaFtub2RlSW5kZXhdLmNoaWxkMSgpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fZ3JhcGhbbm9kZUluZGV4XS5vcCA9
PSBHZXRMb2NhbCkKKyAgICAgICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS52YXJpYWJsZUFjY2Vz
c0RhdGEoKS0+dm90ZShiYWxsb3QpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHZvdGUoTm9kZSYg
bm9kZSwgVmFyaWFibGVBY2Nlc3NEYXRhOjpCYWxsb3QgYmFsbG90KQorICAgIHsKKyAgICAgICAg
aWYgKG5vZGUub3AgJiBOb2RlSGFzVmFyQXJncykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBjaGlsZElkeCA8IG5vZGUuZmlyc3RDaGls
ZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAgICAgICAgICAgICAgIHZv
dGUobV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XSwgYmFsbG90KTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuY2hpbGQx
KCkgPT0gTm9Ob2RlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2b3RlKG5vZGUuY2hp
bGQxKCksIGJhbGxvdCk7CisgICAgICAgIGlmIChub2RlLmNoaWxkMigpID09IE5vTm9kZSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdm90ZShub2RlLmNoaWxkMigpLCBiYWxsb3QpOwor
ICAgICAgICBpZiAobm9kZS5jaGlsZDMoKSA9PSBOb05vZGUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHZvdGUobm9kZS5jaGlsZDMoKSwgYmFsbG90KTsKKyAgICB9CisgICAgCisgICAg
dm9pZCBkb1JvdW5kT2ZEb3VibGVWb3RpbmcoKQorICAgIHsKKyNpZiBERkdfRU5BQkxFKERFQlVH
X1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiVm90aW5nIG9uIGRvdWJsZSB1
c2VzIG9mIGxvY2FscyBbJXVdXG4iLCBtX2NvdW50KTsKKyNlbmRpZgorICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbV9ncmFwaC5tX3ZhcmlhYmxlQWNjZXNzRGF0YS5zaXplKCk7ICsr
aSkKKyAgICAgICAgICAgIG1fZ3JhcGgubV92YXJpYWJsZUFjY2Vzc0RhdGFbaV0uZmluZCgpLT5j
bGVhclZvdGVzKCk7CisgICAgICAgIGZvciAobV9jb21waWxlSW5kZXggPSAwOyBtX2NvbXBpbGVJ
bmRleCA8IG1fZ3JhcGguc2l6ZSgpOyArK21fY29tcGlsZUluZGV4KSB7CisgICAgICAgICAgICBO
b2RlJiBub2RlID0gbV9ncmFwaFttX2NvbXBpbGVJbmRleF07CisgICAgICAgICAgICBzd2l0Y2gg
KG5vZGUub3ApIHsKKyAgICAgICAgICAgIGNhc2UgVmFsdWVBZGQ6CisgICAgICAgICAgICBjYXNl
IEFyaXRoQWRkOgorICAgICAgICAgICAgY2FzZSBBcml0aFN1YjoKKyAgICAgICAgICAgIGNhc2Ug
QXJpdGhNdWw6CisgICAgICAgICAgICBjYXNlIEFyaXRoTWluOgorICAgICAgICAgICAgY2FzZSBB
cml0aE1heDoKKyAgICAgICAgICAgIGNhc2UgQXJpdGhNb2Q6CisgICAgICAgICAgICBjYXNlIEFy
aXRoRGl2OiB7CisgICAgICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBsZWZ0ID0gbV9ncmFwaFtu
b2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCk7CisgICAgICAgICAgICAgICAgUHJlZGljdGVkVHlw
ZSByaWdodCA9IG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0ucHJlZGljdGlvbigpOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YTo6QmFsbG90IGJhbGxv
dDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJQcmVkaWN0
aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCkgJiYgIShOb2RlOjpzaG91bGRT
cGVjdWxhdGVJbnRlZ2VyKG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGls
ZDEoKV0pICYmIG5vZGUuY2FuU3BlY3VsYXRlSW50ZWdlcigpKSkKKyAgICAgICAgICAgICAgICAg
ICAgYmFsbG90ID0gVmFyaWFibGVBY2Nlc3NEYXRhOjpWb3RlRG91YmxlOworICAgICAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYmFsbG90ID0gVmFyaWFibGVBY2Nlc3NEYXRh
OjpWb3RlVmFsdWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdm90ZShub2Rl
LmNoaWxkMSgpLCBiYWxsb3QpOworICAgICAgICAgICAgICAgIHZvdGUobm9kZS5jaGlsZDIoKSwg
YmFsbG90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgQXJpdGhBYnM6CisgICAgICAgICAgICAgICAgVmFy
aWFibGVBY2Nlc3NEYXRhOjpCYWxsb3QgYmFsbG90OworICAgICAgICAgICAgICAgIGlmICghKG1f
Z3JhcGhbbm9kZS5jaGlsZDEoKV0uc2hvdWxkU3BlY3VsYXRlSW50ZWdlcigpICYmIG5vZGUuY2Fu
U3BlY3VsYXRlSW50ZWdlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgYmFsbG90ID0gVmFyaWFi
bGVBY2Nlc3NEYXRhOjpWb3RlRG91YmxlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgYmFsbG90ID0gVmFyaWFibGVBY2Nlc3NEYXRhOjpWb3RlVmFsdWU7CisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdm90ZShub2RlLmNoaWxkMSgpLCBiYWxsb3Qp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
Y2FzZSBBcml0aFNxcnQ6CisgICAgICAgICAgICAgICAgdm90ZShub2RlLmNoaWxkMSgpLCBWYXJp
YWJsZUFjY2Vzc0RhdGE6OlZvdGVEb3VibGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBWYWx1ZVRvTnVtYmVyOgorICAgICAgICAg
ICAgY2FzZSBWYWx1ZVRvRG91YmxlOgorICAgICAgICAgICAgICAgIC8vIERvbid0IHZvdGUuCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNl
IFNldExvY2FsOiB7CisgICAgICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0aW9uID0g
bV9ncmFwaFtub2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYg
KGlzRG91YmxlUHJlZGljdGlvbihwcmVkaWN0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgbm9k
ZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+dm90ZShWYXJpYWJsZUFjY2Vzc0RhdGE6OlZvdGVEb3Vi
bGUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc051bWJlclByZWRpY3Rpb24ocHJlZGlj
dGlvbikgfHwgaXNJbnQzMlByZWRpY3Rpb24ocHJlZGljdGlvbikpCisgICAgICAgICAgICAgICAg
ICAgIG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPnZvdGUoVmFyaWFibGVBY2Nlc3NEYXRhOjpW
b3RlVmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2b3RlKG5v
ZGUsIFZhcmlhYmxlQWNjZXNzRGF0YTo6Vm90ZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbV9ncmFwaC5tX3ZhcmlhYmxlQWNjZXNzRGF0YS5zaXplKCk7ICsraSkKKyAgICAgICAg
ICAgIG1fY2hhbmdlZCB8PSBtX2dyYXBoLm1fdmFyaWFibGVBY2Nlc3NEYXRhW2ldLmZpbmQoKS0+
dGFsbHlWb3Rlc0ZvclNob3VsZFVzZURvdWJsZUZvcm1hdCgpOworICAgIH0KKyAgICAKICAgICB2
b2lkIHByb3BhZ2F0ZVByZWRpY3Rpb25zKCkKICAgICB7CiAjaWYgREZHX0VOQUJMRShERUJVR19Q
Uk9QQUdBVElPTl9WRVJCT1NFKQpAQCAtNjY3LDYgKzc3Myw3IEBAIHByaXZhdGU6CiAgICAgICAg
ICAgICAvLyBGb3J3YXJkIHByb3BhZ2F0aW9uIGlzIG5lYXItb3B0aW1hbCBmb3IgYm90aCB0b3Bv
bG9naWNhbGx5LXNvcnRlZCBhbmQKICAgICAgICAgICAgIC8vIERGUy1zb3J0ZWQgY29kZS4KICAg
ICAgICAgICAgIHByb3BhZ2F0ZVByZWRpY3Rpb25zRm9yd2FyZCgpOworICAgICAgICAgICAgZG9S
b3VuZE9mRG91YmxlVm90aW5nKCk7CiAgICAgICAgICAgICBpZiAoIW1fY2hhbmdlZCkKICAgICAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIApAQCAtNjc2LDYgKzc4Myw3IEBAIHByaXZh
dGU6CiAgICAgICAgICAgICAvLyBmb3VuZCBhIHNvdW5kIHNvbHV0aW9uIGFuZCAoMikgc2hvcnQt
Y2lyY3VpdHMgYmFja3dhcmQgZmxvdy4KICAgICAgICAgICAgIG1fY2hhbmdlZCA9IGZhbHNlOwog
ICAgICAgICAgICAgcHJvcGFnYXRlUHJlZGljdGlvbnNCYWNrd2FyZCgpOworICAgICAgICAgICAg
ZG9Sb3VuZE9mRG91YmxlVm90aW5nKCk7CiAgICAgICAgIH0gd2hpbGUgKG1fY2hhbmdlZCk7CiAg
ICAgfQogICAgIApAQCAtNjg4LDcgKzc5Niw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBtX2dy
YXBoW25vZGVJbmRleF0ub3AgPSBWYWx1ZVRvRG91YmxlOwogICAgICAgICB9CiAgICAgfQotICAg
IAorCiAgICAgdm9pZCBmaXh1cE5vZGUoTm9kZSYgbm9kZSkKICAgICB7CiAgICAgICAgIGlmICgh
bm9kZS5zaG91bGRHZW5lcmF0ZSgpKQpAQCAtNzExLDExICs4MTksMTEgQEAgcHJpdmF0ZToKICAg
ICAgICAgICAgIFByZWRpY3RlZFR5cGUgbGVmdCA9IG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJl
ZGljdGlvbigpOwogICAgICAgICAgICAgUHJlZGljdGVkVHlwZSByaWdodCA9IG1fZ3JhcGhbbm9k
ZS5jaGlsZDIoKV0ucHJlZGljdGlvbigpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAo
bGVmdCAmJiByaWdodCAmJiBpc051bWJlclByZWRpY3Rpb24obGVmdCkgJiYgaXNOdW1iZXJQcmVk
aWN0aW9uKHJpZ2h0KSkgewotICAgICAgICAgICAgICAgIGlmIChsZWZ0ICYgUHJlZGljdERvdWJs
ZSkKLSAgICAgICAgICAgICAgICAgICAgdG9Eb3VibGUobm9kZS5jaGlsZDIoKSk7Ci0gICAgICAg
ICAgICAgICAgaWYgKHJpZ2h0ICYgUHJlZGljdERvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAg
dG9Eb3VibGUobm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICBpZiAobGVmdCAmJiByaWdodAor
ICAgICAgICAgICAgICAgICYmIGlzTnVtYmVyUHJlZGljdGlvbihsZWZ0KSAmJiBpc051bWJlclBy
ZWRpY3Rpb24ocmlnaHQpCisgICAgICAgICAgICAgICAgJiYgKChsZWZ0ICYgUHJlZGljdERvdWJs
ZSkgfHwgKHJpZ2h0ICYgUHJlZGljdERvdWJsZSkpKSB7CisgICAgICAgICAgICAgICAgdG9Eb3Vi
bGUobm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgdG9Eb3VibGUobm9kZS5jaGlsZDIo
KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNzM2
LDExICs4NDQsMTAgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgbGVmdCA9
IG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpOwogICAgICAgICAgICAgUHJlZGlj
dGVkVHlwZSByaWdodCA9IG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0ucHJlZGljdGlvbigpOwogICAg
ICAgICAgICAgCi0gICAgICAgICAgICBpZiAobGVmdCAmJiByaWdodCkgewotICAgICAgICAgICAg
ICAgIGlmIChsZWZ0ICYgUHJlZGljdERvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAgdG9Eb3Vi
bGUobm9kZS5jaGlsZDIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJpZ2h0ICYgUHJlZGljdERv
dWJsZSkKLSAgICAgICAgICAgICAgICAgICAgdG9Eb3VibGUobm9kZS5jaGlsZDEoKSk7CisgICAg
ICAgICAgICBpZiAobGVmdCAmJiByaWdodAorICAgICAgICAgICAgICAgICYmICgobGVmdCAmIFBy
ZWRpY3REb3VibGUpIHx8IChyaWdodCAmIFByZWRpY3REb3VibGUpKSkgeworICAgICAgICAgICAg
ICAgIHRvRG91YmxlKG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIHRvRG91YmxlKG5v
ZGUuY2hpbGQyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82
NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxh
dGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjAw
Miw2ICsyMDAyLDE1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkK
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIAorICAgICAgICBpZiAobm9k
ZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKKyAgICAg
ICAgICAgIEZQUlRlbXBvcmFyeSByZXN1bHQodGhpcyk7CisgICAgICAgICAgICBtX2ppdC5sb2Fk
RG91YmxlKEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSksIHJlc3VsdC5mcHIo
KSk7CisgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52
aXJ0dWFsUmVnaXN0ZXIoKTsKKyAgICAgICAgICAgIG1fZnBycy5yZXRhaW4ocmVzdWx0LmZwcigp
LCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJEb3VibGUpOworICAgICAgICAgICAgbV9nZW5l
cmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdLmluaXREb3VibGUobV9jb21waWxlSW5kZXgsIG5v
ZGUucmVmQ291bnQoKSwgcmVzdWx0LmZwcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIAogICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOwogICAgICAg
ICBpZiAoaXNJbnQzMlByZWRpY3Rpb24ocHJlZGljdGlvbikpIHsKICAgICAgICAgICAgIG1faml0
LmxvYWQzMihKSVRDb21waWxlcjo6cGF5bG9hZEZvcihub2RlLmxvY2FsKCkpLCByZXN1bHQuZ3By
KCkpOwpAQCAtMjA2Nyw0MyArMjA3Niw1MyBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxl
KE5vZGUmIG5vZGUpCiAgICAgICAgIAogICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0
Tm9kZS5jb2RlT3JpZ2luOwogICAgICAgICAKLSAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0
ZWRUeXBlID0gbm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpOwotICAgICAg
ICBpZiAobV9nZW5lcmF0aW9uSW5mb1thdChub2RlLmNoaWxkMSgpKS52aXJ0dWFsUmVnaXN0ZXIo
KV0ucmVnaXN0ZXJGb3JtYXQoKSA9PSBEYXRhRm9ybWF0RG91YmxlKSB7Ci0gICAgICAgICAgICBE
b3VibGVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICBpZiAobm9k
ZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKKyAgICAg
ICAgICAgIFNwZWN1bGF0ZURvdWJsZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7
CiAgICAgICAgICAgICBtX2ppdC5zdG9yZURvdWJsZSh2YWx1ZS5mcHIoKSwgSklUQ29tcGlsZXI6
OmFkZHJlc3NGb3Iobm9kZS5sb2NhbCgpKSk7CiAgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBp
bGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNJbnQzMlByZWRpY3Rpb24ocHJlZGljdGVk
VHlwZSkpIHsKLSAgICAgICAgICAgIFNwZWN1bGF0ZUludGVnZXJPcGVyYW5kIHZhbHVlKHRoaXMs
IG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS5ncHIoKSwg
SklUQ29tcGlsZXI6OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7Ci0gICAgICAgICAgICBub1Jl
c3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheVByZWRpY3Rp
b24ocHJlZGljdGVkVHlwZSkpIHsKLSAgICAgICAgICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5kIGNl
bGwodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAgICAgICBHUFJSZWcgY2VsbEdQUiA9IGNl
bGwuZ3ByKCk7Ci0gICAgICAgICAgICBpZiAoIWlzQXJyYXlQcmVkaWN0aW9uKG1fc3RhdGUuZm9y
Tm9kZShub2RlLmNoaWxkMSgpKS5tX3R5cGUpKQotICAgICAgICAgICAgICAgIHNwZWN1bGF0aW9u
Q2hlY2soQmFkVHlwZSwgSlNWYWx1ZVNvdXJjZTo6dW5ib3hlZENlbGwoY2VsbEdQUiksIG5vZGUu
Y2hpbGQxKCksIG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3Jv
QXNzZW1ibGVyOjpBZGRyZXNzKGNlbGxHUFIpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0
cihtX2ppdC5nbG9iYWxEYXRhKCktPmpzQXJyYXlWUHRyKSkpOwotICAgICAgICAgICAgbV9qaXQu
c3RvcmVQdHIoY2VsbEdQUiwgSklUQ29tcGlsZXI6OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7
Ci0gICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBp
ZiAoaXNCeXRlQXJyYXlQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7Ci0gICAgICAgICAgICBT
cGVjdWxhdGVDZWxsT3BlcmFuZCBjZWxsKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAg
ICAgR1BSUmVnIGNlbGxHUFIgPSBjZWxsLmdwcigpOwotICAgICAgICAgICAgaWYgKCFpc0J5dGVB
cnJheVByZWRpY3Rpb24obV9zdGF0ZS5mb3JOb2RlKG5vZGUuY2hpbGQxKCkpLm1fdHlwZSkpCi0g
ICAgICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhCYWRUeXBlLCBKU1ZhbHVlU291cmNlOjp1
bmJveGVkQ2VsbChjZWxsR1BSKSwgbm9kZS5jaGlsZDEoKSwgbV9qaXQuYnJhbmNoUHRyKE1hY3Jv
QXNzZW1ibGVyOjpOb3RFcXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoY2VsbEdQUiksIE1h
Y3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNCeXRlQXJy
YXlWUHRyKSkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIoY2VsbEdQUiwgSklUQ29tcGls
ZXI6OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7Ci0gICAgICAgICAgICBub1Jlc3VsdChtX2Nv
bXBpbGVJbmRleCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuUHJlZGljdGlvbihwcmVk
aWN0ZWRUeXBlKSkgewotICAgICAgICAgICAgU3BlY3VsYXRlQm9vbGVhbk9wZXJhbmQgdmFsdWUo
dGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAgICAgICBtX2ppdC5zdG9yZTMyKHZhbHVlLmdw
cigpLCBKSVRDb21waWxlcjo6cGF5bG9hZEZvcihub2RlLmxvY2FsKCkpKTsKLSAgICAgICAgICAg
IG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQg
aXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZgorICAgICAg
ICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBmcm9tIHJlZ2lzdGVycyBvciBvdGhlciBs
b2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUsCisgICAgICAgICAgICAvLyBidXQgdGhhdCBp
dCBpcyBzdG9yZWQgYXMgYSBkb3VibGUuCisgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5j
ZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERvdWJsZUluUmVnaXN0ZXJG
aWxlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVl
KHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS5w
YXlsb2FkR1BSKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwotICAg
ICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS50YWdHUFIoKSwgSklUQ29tcGlsZXI6OnRhZ0Zv
cihub2RlLmxvY2FsKCkpKTsKLSAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsK
LSAgICAgICAgfQorICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0ZWRUeXBlID0gbm9k
ZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpOworICAgICAgICAgICAgaWYgKG1f
Z2VuZXJhdGlvbkluZm9bYXQobm9kZS5jaGlsZDEoKSkudmlydHVhbFJlZ2lzdGVyKCldLnJlZ2lz
dGVyRm9ybWF0KCkgPT0gRGF0YUZvcm1hdERvdWJsZSkgeworICAgICAgICAgICAgICAgIERvdWJs
ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgbV9q
aXQuc3RvcmVEb3VibGUodmFsdWUuZnByKCksIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUu
bG9jYWwoKSkpOworICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAg
ICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnQzMlByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsK
KyAgICAgICAgICAgICAgICBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2Rl
LmNoaWxkMSgpKTsKKyAgICAgICAgICAgICAgICBtX2ppdC5zdG9yZTMyKHZhbHVlLmdwcigpLCBK
SVRDb21waWxlcjo6cGF5bG9hZEZvcihub2RlLmxvY2FsKCkpKTsKKyAgICAgICAgICAgICAgICBu
b1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlQ
cmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgU3BlY3VsYXRlQ2Vs
bE9wZXJhbmQgY2VsbCh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAgICAgICBHUFJS
ZWcgY2VsbEdQUiA9IGNlbGwuZ3ByKCk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5UHJl
ZGljdGlvbihtX3N0YXRlLmZvck5vZGUobm9kZS5jaGlsZDEoKSkubV90eXBlKSkKKyAgICAgICAg
ICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhCYWRUeXBlLCBKU1ZhbHVlU291cmNlOjp1bmJv
eGVkQ2VsbChjZWxsR1BSKSwgbm9kZS5jaGlsZDEoKSwgbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNz
ZW1ibGVyOjpOb3RFcXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoY2VsbEdQUiksIE1hY3Jv
QXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNBcnJheVZQdHIp
KSk7CisgICAgICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIoY2VsbEdQUiwgSklUQ29tcGlsZXI6
OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7CisgICAgICAgICAgICAgICAgbm9SZXN1bHQobV9j
b21waWxlSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0J5dGVBcnJheVByZWRpY3Rp
b24ocHJlZGljdGVkVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBTcGVjdWxhdGVDZWxsT3BlcmFu
ZCBjZWxsKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIEdQUlJlZyBjZWxs
R1BSID0gY2VsbC5ncHIoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQnl0ZUFycmF5UHJlZGlj
dGlvbihtX3N0YXRlLmZvck5vZGUobm9kZS5jaGlsZDEoKSkubV90eXBlKSkKKyAgICAgICAgICAg
ICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhCYWRUeXBlLCBKU1ZhbHVlU291cmNlOjp1bmJveGVk
Q2VsbChjZWxsR1BSKSwgbm9kZS5jaGlsZDEoKSwgbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1i
bGVyOjpOb3RFcXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoY2VsbEdQUiksIE1hY3JvQXNz
ZW1ibGVyOjpUcnVzdGVkSW1tUHRyKG1faml0Lmdsb2JhbERhdGEoKS0+anNCeXRlQXJyYXlWUHRy
KSkpOworICAgICAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKGNlbGxHUFIsIEpJVENvbXBpbGVy
OjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOworICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1f
Y29tcGlsZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuUHJlZGljdGlv
bihwcmVkaWN0ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIFNwZWN1bGF0ZUJvb2xlYW5PcGVy
YW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIG1faml0LnN0
b3JlMzIodmFsdWUuZ3ByKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkp
OworICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9k
ZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS5wYXlsb2Fk
R1BSKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOworICAgICAgICAg
ICAgICAgIG1faml0LnN0b3JlMzIodmFsdWUudGFnR1BSKCksIEpJVENvbXBpbGVyOjp0YWdGb3Io
bm9kZS5sb2NhbCgpKSk7CisgICAgICAgICAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgp
OworICAgICAgICAgICAgfQogCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBubyBsb25n
ZXIgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZgotICAgICAgICAvLyB0aGlzIGJ5
dGVjb2RlIHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUg
cmVnaXN0ZXIgZmlsZS4KLSAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5v
ZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6Zm9yUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKTsK
KyAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHRv
IHJldHJpZXZlIHRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJp
YWJsZSBmcm9tIHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZp
bGUuCisgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2Nh
bCgpKSA9IFZhbHVlU291cmNlOjpmb3JQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpOworICAgICAg
ICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCShyZXZpc2lvbiAxMDI3MjYpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMDQ3LDYgKzIwNDcsMTUgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZShOb2RlJiBub2RlKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAg
CisgICAgICAgIGlmIChub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVG
b3JtYXQoKSkgeworICAgICAgICAgICAgRlBSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICAg
ICAgICAgIG1faml0LmxvYWREb3VibGUoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9kZS5sb2Nh
bCgpKSwgcmVzdWx0LmZwcigpKTsKKyAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFs
UmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOworICAgICAgICAgICAgbV9mcHJzLnJl
dGFpbihyZXN1bHQuZnByKCksIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlckRvdWJsZSk7Cisg
ICAgICAgICAgICBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl0uaW5pdERvdWJsZSht
X2NvbXBpbGVJbmRleCwgbm9kZS5yZWZDb3VudCgpLCByZXN1bHQuZnByKCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIEdQUlRlbXBvcmFyeSByZXN1
bHQodGhpcyk7CiAgICAgICAgIGlmIChpc0ludDMyUHJlZGljdGlvbih2YWx1ZS5tX3R5cGUpKSB7
CiAgICAgICAgICAgICBtX2ppdC5sb2FkMzIoSklUQ29tcGlsZXI6OnBheWxvYWRGb3Iobm9kZS5s
b2NhbCgpKSwgcmVzdWx0LmdwcigpKTsKQEAgLTIxMDQsMzggKzIxMTMsNDggQEAgdm9pZCBTcGVj
dWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgICAgICAvLyBPU1IgZXhpdCwgd291
bGQgbm90IGJlIHZpc2libGUgdG8gdGhlIG9sZCBKSVQgaW4gYW55IHdheS4KICAgICAgICAgbV9j
b2RlT3JpZ2luRm9yT1NSID0gbmV4dE5vZGUuY29kZU9yaWdpbjsKICAgICAgICAgCi0gICAgICAg
IFByZWRpY3RlZFR5cGUgcHJlZGljdGVkVHlwZSA9IG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkt
PnByZWRpY3Rpb24oKTsKLSAgICAgICAgaWYgKGlzSW50MzJQcmVkaWN0aW9uKHByZWRpY3RlZFR5
cGUpKSB7Ci0gICAgICAgICAgICBTcGVjdWxhdGVJbnRlZ2VyT3BlcmFuZCB2YWx1ZSh0aGlzLCBu
b2RlLmNoaWxkMSgpKTsKLSAgICAgICAgICAgIG1faml0LnN0b3JlMzIodmFsdWUuZ3ByKCksIEpJ
VENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwotICAgICAgICAgICAgbm9SZXN1
bHQobV9jb21waWxlSW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlQcmVkaWN0aW9u
KHByZWRpY3RlZFR5cGUpKSB7Ci0gICAgICAgICAgICBTcGVjdWxhdGVDZWxsT3BlcmFuZCBjZWxs
KHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgICAgICAgICAgR1BSUmVnIGNlbGxHUFIgPSBjZWxs
LmdwcigpOwotICAgICAgICAgICAgaWYgKCFpc0FycmF5UHJlZGljdGlvbihtX3N0YXRlLmZvck5v
ZGUobm9kZS5jaGlsZDEoKSkubV90eXBlKSkKLSAgICAgICAgICAgICAgICBzcGVjdWxhdGlvbkNo
ZWNrKEJhZFR5cGUsIEpTVmFsdWVSZWdzKGNlbGxHUFIpLCBub2RlLmNoaWxkMSgpLCBtX2ppdC5i
cmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVz
cyhjZWxsR1BSKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIobV9qaXQuZ2xvYmFsRGF0
YSgpLT5qc0FycmF5VlB0cikpKTsKLSAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKGNlbGxHUFIs
IEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOwotICAgICAgICAgICAgbm9S
ZXN1bHQobV9jb21waWxlSW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQnl0ZUFycmF5UHJl
ZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkgewotICAgICAgICAgICAgU3BlY3VsYXRlQ2VsbE9wZXJh
bmQgY2VsbCh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAgICAgICAgICAgIEdQUlJlZyBjZWxsR1BS
ID0gY2VsbC5ncHIoKTsKLSAgICAgICAgICAgIGlmICghaXNCeXRlQXJyYXlQcmVkaWN0aW9uKG1f
c3RhdGUuZm9yTm9kZShub2RlLmNoaWxkMSgpKS5tX3R5cGUpKQotICAgICAgICAgICAgICAgIHNw
ZWN1bGF0aW9uQ2hlY2soQmFkVHlwZSwgSlNWYWx1ZVJlZ3MoY2VsbEdQUiksIG5vZGUuY2hpbGQx
KCksIG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzKGNlbGxHUFIpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihtX2pp
dC5nbG9iYWxEYXRhKCktPmpzQnl0ZUFycmF5VlB0cikpKTsKLSAgICAgICAgICAgIG1faml0LnN0
b3JlUHRyKGNlbGxHUFIsIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOwot
ICAgICAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYg
KGlzQm9vbGVhblByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKLSAgICAgICAgICAgIFNwZWN1
bGF0ZUJvb2xlYW5PcGVyYW5kIGJvb2xlYW4odGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAg
ICAgICBtX2ppdC5zdG9yZVB0cihib29sZWFuLmdwcigpLCBKSVRDb21waWxlcjo6YWRkcmVzc0Zv
cihub2RlLmxvY2FsKCkpKTsKKyAgICAgICAgaWYgKG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkt
PnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKSB7CisgICAgICAgICAgICBTcGVjdWxhdGVEb3VibGVP
cGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgbV9qaXQuc3Rv
cmVEb3VibGUodmFsdWUuZnByKCksIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwo
KSkpOwogICAgICAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgpOworICAgICAgICAgICAg
Ly8gSW5kaWNhdGUgdGhhdCBpdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhl
IHZhbHVlIG9mCisgICAgICAgICAgICAvLyB0aGlzIGJ5dGVjb2RlIHZhcmlhYmxlIGZyb20gcmVn
aXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0ZXIgZmlsZSwKKyAgICAgICAg
ICAgIC8vIGJ1dCB0aGF0IGl0IGlzIHN0b3JlZCBhcyBhIGRvdWJsZS4KKyAgICAgICAgICAgIHZh
bHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2Uo
RG91YmxlSW5SZWdpc3RlckZpbGUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSlNW
YWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgICAgICAgICBtX2pp
dC5zdG9yZVB0cih2YWx1ZS5ncHIoKSwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9kZS5sb2Nh
bCgpKSk7Ci0gICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIH0K
KyAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGVkVHlwZSA9IG5vZGUudmFyaWFibGVB
Y2Nlc3NEYXRhKCktPnByZWRpY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChpc0ludDMyUHJlZGlj
dGlvbihwcmVkaWN0ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIFNwZWN1bGF0ZUludGVnZXJP
cGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIG1faml0
LnN0b3JlMzIodmFsdWUuZ3ByKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwo
KSkpOworICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoaXNBcnJheVByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKKyAgICAg
ICAgICAgICAgICBTcGVjdWxhdGVDZWxsT3BlcmFuZCBjZWxsKHRoaXMsIG5vZGUuY2hpbGQxKCkp
OworICAgICAgICAgICAgICAgIEdQUlJlZyBjZWxsR1BSID0gY2VsbC5ncHIoKTsKKyAgICAgICAg
ICAgICAgICBpZiAoIWlzQXJyYXlQcmVkaWN0aW9uKG1fc3RhdGUuZm9yTm9kZShub2RlLmNoaWxk
MSgpKS5tX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKEJhZFR5
cGUsIEpTVmFsdWVSZWdzKGNlbGxHUFIpLCBub2RlLmNoaWxkMSgpLCBtX2ppdC5icmFuY2hQdHIo
TWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhjZWxsR1BS
KSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIobV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0Fy
cmF5VlB0cikpKTsKKyAgICAgICAgICAgICAgICBtX2ppdC5zdG9yZVB0cihjZWxsR1BSLCBKSVRD
b21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsKKyAgICAgICAgICAgICAgICBub1Jl
c3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQnl0ZUFycmF5
UHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIFNwZWN1bGF0ZUNl
bGxPcGVyYW5kIGNlbGwodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICAgICAgR1BS
UmVnIGNlbGxHUFIgPSBjZWxsLmdwcigpOworICAgICAgICAgICAgICAgIGlmICghaXNCeXRlQXJy
YXlQcmVkaWN0aW9uKG1fc3RhdGUuZm9yTm9kZShub2RlLmNoaWxkMSgpKS5tX3R5cGUpKQorICAg
ICAgICAgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKEJhZFR5cGUsIEpTVmFsdWVSZWdzKGNl
bGxHUFIpLCBub2RlLmNoaWxkMSgpLCBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5v
dEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhjZWxsR1BSKSwgTWFjcm9Bc3NlbWJsZXI6
OlRydXN0ZWRJbW1QdHIobV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0J5dGVBcnJheVZQdHIpKSk7Cisg
ICAgICAgICAgICAgICAgbV9qaXQuc3RvcmVQdHIoY2VsbEdQUiwgSklUQ29tcGlsZXI6OmFkZHJl
c3NGb3Iobm9kZS5sb2NhbCgpKSk7CisgICAgICAgICAgICAgICAgbm9SZXN1bHQobV9jb21waWxl
SW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Jvb2xlYW5QcmVkaWN0aW9uKHByZWRp
Y3RlZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgU3BlY3VsYXRlQm9vbGVhbk9wZXJhbmQgYm9v
bGVhbih0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAgICAgICBtX2ppdC5zdG9yZVB0
cihib29sZWFuLmdwcigpLCBKSVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsK
KyAgICAgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUu
Y2hpbGQxKCkpOworICAgICAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKHZhbHVlLmdwcigpLCBK
SVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsKKyAgICAgICAgICAgICAgICBu
b1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgLy8gSW5k
aWNhdGUgdGhhdCBpdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIHZhbHVl
IG9mCi0gICAgICAgIC8vIHRoaXMgYnl0ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMgb3Ig
b3RoZXIgbG9jYXRpb25zIGluIHRoZSByZWdpc3RlciBmaWxlLgotICAgICAgICB2YWx1ZVNvdXJj
ZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlOjpmb3JQcmVk
aWN0aW9uKHByZWRpY3RlZFR5cGUpOworICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBpdCdz
IG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCisgICAgICAgICAg
ICAvLyB0aGlzIGJ5dGVjb2RlIHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0
aW9ucyBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4KKyAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJl
bmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rpb24o
cHJlZGljdGVkVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQogCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAko
cmV2aXNpb24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxh
dGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc3OCw2ICs3NzgsOSBAQCB2b2lkIFZhbHVl
U291cmNlOjpkdW1wKEZJTEUqIG91dCkgY29uc3QKICAgICBjYXNlIEJvb2xlYW5JblJlZ2lzdGVy
RmlsZToKICAgICAgICAgZnByaW50ZihvdXQsICJCb29sIik7CiAgICAgICAgIGJyZWFrOworICAg
IGNhc2UgRG91YmxlSW5SZWdpc3RlckZpbGU6CisgICAgICAgIGZwcmludGYob3V0LCAiRG91Ymxl
Iik7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSGF2ZU5vZGU6CiAgICAgICAgIGZwcmludGYo
b3V0LCAiTm9kZSglZCkiLCBtX25vZGVJbmRleCk7CiAgICAgICAgIGJyZWFrOwpAQCAtOTQwLDYg
Kzk0Myw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKICAgICAg
ICAgTm9kZUluZGV4IG5vZGVJbmRleCA9IGJsb2NrLnZhcmlhYmxlc0F0SGVhZC5sb2NhbChpKTsK
ICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSBOb05vZGUpCiAgICAgICAgICAgICBtX3ZhcmlhYmxl
c1tpXSA9IFZhbHVlU291cmNlKFZhbHVlSW5SZWdpc3RlckZpbGUpOworICAgICAgICBlbHNlIGlm
IChhdChub2RlSW5kZXgpLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3Jt
YXQoKSkKKyAgICAgICAgICAgIG1fdmFyaWFibGVzW2ldID0gVmFsdWVTb3VyY2UoRG91YmxlSW5S
ZWdpc3RlckZpbGUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBtX3ZhcmlhYmxlc1tpXSA9
IFZhbHVlU291cmNlOjpmb3JQcmVkaWN0aW9uKGF0KG5vZGVJbmRleCkudmFyaWFibGVBY2Nlc3NE
YXRhKCktPnByZWRpY3Rpb24oKSk7CiAgICAgfQpAQCAtMTIxOCw2ICsxMjIzLDkgQEAgVmFsdWVS
ZWNvdmVyeSBTcGVjdWxhdGl2ZUpJVDo6Y29tcHV0ZVZhbAogCiAgICAgY2FzZSBCb29sZWFuSW5S
ZWdpc3RlckZpbGU6CiAgICAgICAgIHJldHVybiBWYWx1ZVJlY292ZXJ5OjphbHJlYWR5SW5SZWdp
c3RlckZpbGVBc1VuYm94ZWRCb29sZWFuKCk7CisgICAgICAgIAorICAgIGNhc2UgRG91YmxlSW5S
ZWdpc3RlckZpbGU6CisgICAgICAgIHJldHVybiBWYWx1ZVJlY292ZXJ5OjphbHJlYWR5SW5SZWdp
c3RlckZpbGVBc1VuYm94ZWREb3VibGUoKTsKIAogICAgIGNhc2UgSGF2ZU5vZGU6IHsKICAgICAg
ICAgaWYgKG1faml0LmlzQ29uc3RhbnQodmFsdWVTb3VyY2Uubm9kZUluZGV4KCkpKQpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkocmV2aXNp
b24gMTAyNzI2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJ
VC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Miw2ICs1Miw3IEBAIGVudW0gVmFsdWVTb3VyY2VLaW5k
IHsKICAgICBJbnQzMkluUmVnaXN0ZXJGaWxlLAogICAgIENlbGxJblJlZ2lzdGVyRmlsZSwKICAg
ICBCb29sZWFuSW5SZWdpc3RlckZpbGUsCisgICAgRG91YmxlSW5SZWdpc3RlckZpbGUsCiAgICAg
SGF2ZU5vZGUKIH07CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmFyaWFi
bGVBY2Nlc3NEYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdWYXJpYWJsZUFjY2Vzc0RhdGEuaAkocmV2aXNpb24gMTAyNzI2KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdWYXJpYWJsZUFjY2Vzc0RhdGEuaAkod29ya2luZyBjb3B5KQpAQCAt
MjYsNiArMjYsNyBAQAogI2lmbmRlZiBERkdWYXJpYWJsZUFjY2Vzc0RhdGFfaAogI2RlZmluZSBE
RkdWYXJpYWJsZUFjY2Vzc0RhdGFfaAogCisjaW5jbHVkZSAiREZHT3BlcmFuZHMuaCIKICNpbmNs
dWRlICJQcmVkaWN0ZWRUeXBlLmgiCiAjaW5jbHVkZSAiVmlydHVhbFJlZ2lzdGVyLmgiCiAjaW5j
bHVkZSA8d3RmL1BsYXRmb3JtLmg+CkBAIC0zNSwxNiArMzYsMjIgQEAgbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBERkcgewogCiBjbGFzcyBWYXJpYWJsZUFjY2Vzc0RhdGEgOiBwdWJsaWMgVW5p
b25GaW5kPFZhcmlhYmxlQWNjZXNzRGF0YT4gewogcHVibGljOgorICAgIGVudW0gQmFsbG90IHsg
Vm90ZVZhbHVlLCBWb3RlRG91YmxlIH07CisKICAgICBWYXJpYWJsZUFjY2Vzc0RhdGEoKQogICAg
ICAgICA6IG1fbG9jYWwoc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihzdGQ6Om51bWVyaWNf
bGltaXRzPGludD46Om1pbigpKSkKICAgICAgICAgLCBtX3ByZWRpY3Rpb24oUHJlZGljdE5vbmUp
CisgICAgICAgICwgbV9zaG91bGRVc2VEb3VibGVGb3JtYXQoZmFsc2UpCiAgICAgeworICAgICAg
ICBjbGVhclZvdGVzKCk7CiAgICAgfQogICAgIAogICAgIFZhcmlhYmxlQWNjZXNzRGF0YShWaXJ0
dWFsUmVnaXN0ZXIgbG9jYWwpCiAgICAgICAgIDogbV9sb2NhbChsb2NhbCkKICAgICAgICAgLCBt
X3ByZWRpY3Rpb24oUHJlZGljdE5vbmUpCisgICAgICAgICwgbV9zaG91bGRVc2VEb3VibGVGb3Jt
YXQoZmFsc2UpCiAgICAgeworICAgICAgICBjbGVhclZvdGVzKCk7CiAgICAgfQogICAgIAogICAg
IFZpcnR1YWxSZWdpc3RlciBsb2NhbCgpCkBAIC02OCw2ICs3NSw1NiBAQCBwdWJsaWM6CiAgICAg
ICAgIHJldHVybiBmaW5kKCktPm1fcHJlZGljdGlvbjsKICAgICB9CiAgICAgCisgICAgdm9pZCBj
bGVhclZvdGVzKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChmaW5kKCkgPT0gdGhpcyk7CisgICAg
ICAgIG1fdm90ZXNbVm90ZVZhbHVlXSA9IDA7CisgICAgICAgIG1fdm90ZXNbVm90ZURvdWJsZV0g
PSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIHZvdGUoQmFsbG90IGJhbGxvdCkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYmFsbG90KSA8IDIpOworICAgICAg
ICBtX3ZvdGVzW2JhbGxvdF0rKzsKKyAgICB9CisgICAgCisgICAgZG91YmxlIGRvdWJsZVZvdGVS
YXRpbygpCisgICAgeworICAgICAgICBBU1NFUlQoZmluZCgpID09IHRoaXMpOworICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ZvdGVzW1ZvdGVEb3VibGVdKSAvIG1fdm90ZXNb
Vm90ZVZhbHVlXTsKKyAgICB9CisgICAgCisgICAgYm9vbCBzaG91bGRVc2VEb3VibGVGb3JtYXRB
Y2NvcmRpbmdUb1ZvdGUoKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IG1ha2UgdGhpcyB3b3Jr
IGZvciBhcmd1bWVudHMuCisgICAgICAgIHJldHVybiAhb3BlcmFuZElzQXJndW1lbnQob3BlcmFu
ZCgpKSAmJiAoKGlzTnVtYmVyUHJlZGljdGlvbihwcmVkaWN0aW9uKCkpICYmIGRvdWJsZVZvdGVS
YXRpbygpID49IEhldXJpc3RpY3M6OmRvdWJsZVZvdGVSYXRpb0ZvckRvdWJsZUZvcm1hdCkgfHwg
aXNEb3VibGVQcmVkaWN0aW9uKHByZWRpY3Rpb24oKSkpOworICAgIH0KKyAgICAKKyAgICBib29s
IHNob3VsZFVzZURvdWJsZUZvcm1hdCgpCisgICAgeworICAgICAgICBBU1NFUlQoZmluZCgpID09
IHRoaXMpOworICAgICAgICByZXR1cm4gbV9zaG91bGRVc2VEb3VibGVGb3JtYXQ7CisgICAgfQor
ICAgIAorICAgIGJvb2wgdGFsbHlWb3Rlc0ZvclNob3VsZFVzZURvdWJsZUZvcm1hdCgpCisgICAg
eworICAgICAgICBBU1NFUlQoZmluZCgpID09IHRoaXMpOworICAgICAgICAKKyAgICAgICAgYm9v
bCBuZXdWYWx1ZU9mU2hvdWxkVXNlRG91YmxlRm9ybWF0ID0gc2hvdWxkVXNlRG91YmxlRm9ybWF0
QWNjb3JkaW5nVG9Wb3RlKCk7CisgICAgICAgIGlmICghbmV3VmFsdWVPZlNob3VsZFVzZURvdWJs
ZUZvcm1hdCkgeworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgd2UncmUgbW9ub3RvbmljYWxs
eSBjb252ZXJ0aW5nIHRvIGZvcmNlLWRvdWJsZS4KKyAgICAgICAgICAgIEFTU0VSVCghbV9zaG91
bGRVc2VEb3VibGVGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIAorICAgICAgICBpZiAobV9zaG91bGRVc2VEb3VibGVGb3JtYXQpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBtX3Nob3VsZFVzZURvdWJsZUZv
cm1hdCA9IHRydWU7CisgICAgICAgIG1lcmdlUHJlZGljdGlvbihtX3ByZWRpY3Rpb24sIFByZWRp
Y3REb3VibGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCiBwcml2YXRlOgog
ICAgIC8vIFRoaXMgaXMgc2xpZ2h0bHkgc3BhY2UtaW5lZmZpY2llbnQsIHNpbmNlIGFueXRoaW5n
IHdlJ3JlIHVuaWZpZWQgd2l0aAogICAgIC8vIHdpbGwgaGF2ZSB0aGUgc2FtZSBvcGVyYW5kIGFu
ZCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwcmVkaWN0aW9uLiBCdXQKQEAgLTc2LDYgKzEzMyw5IEBA
IHByaXZhdGU6CiAKICAgICBWaXJ0dWFsUmVnaXN0ZXIgbV9sb2NhbDsKICAgICBQcmVkaWN0ZWRU
eXBlIG1fcHJlZGljdGlvbjsKKyAgICAKKyAgICBmbG9hdCBtX3ZvdGVzWzJdOworICAgIGJvb2wg
bV9zaG91bGRVc2VEb3VibGVGb3JtYXQ7CiB9OwogCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZH
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Bcmd1bWVudHMuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50cy5jcHAJKHJl
dmlzaW9uIDEwMjcyNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50
cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyOCw2ICszMjgsMTMgQEAgdm9pZCBBcmd1bWVudHM6
OnRlYXJPZmYoQ2FsbEZyYW1lKiBjYWxsRgogICAgICAgICBjYXNlIEFscmVhZHlJblJlZ2lzdGVy
RmlsZUFzVW5ib3hlZEJvb2xlYW46CiAgICAgICAgICAgICB2YWx1ZSA9IGpzQm9vbGVhbihsb2Nh
dGlvbi0+dW5ib3hlZEJvb2xlYW4oKSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBBbHJlYWR5SW5SZWdpc3RlckZpbGVBc1VuYm94ZWREb3VibGU6CisjaWYgVVNFKEpTVkFMVUU2
NCkKKyAgICAgICAgICAgIHZhbHVlID0ganNOdW1iZXIoKmJpdHdpc2VfY2FzdDxkb3VibGUqPihs
b2NhdGlvbikpOworI2Vsc2UKKyAgICAgICAgICAgIHZhbHVlID0gbG9jYXRpb24tPmpzVmFsdWUo
KTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ29uc3RhbnQ6CiAg
ICAgICAgICAgICB2YWx1ZSA9IHJlY292ZXJ5LmNvbnN0YW50KCk7CiAgICAgICAgICAgICBicmVh
azsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuY3Bw
CShyZXZpc2lvbiAxMDI3MjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9IZXVy
aXN0aWNzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODAsNiArODAsOCBAQCB1bnNpZ25lZCBtYXhp
bXVtT3B0aW1pemF0aW9uRGVsYXk7CiBkb3VibGUgZGVzaXJlZFByb2ZpbGVMaXZlbmVzc1JhdGU7
CiBkb3VibGUgZGVzaXJlZFByb2ZpbGVGdWxsbmVzc1JhdGU7CiAKK2RvdWJsZSBkb3VibGVWb3Rl
UmF0aW9Gb3JEb3VibGVGb3JtYXQ7CisKIHVuc2lnbmVkIG1pbmltdW1OdW1iZXJPZlNjYW5zQmV0
d2VlblJlYmFsYW5jZTsKIHVuc2lnbmVkIGdjTWFya1N0YWNrU2VnbWVudFNpemU7CiB1bnNpZ25l
ZCBtaW5pbXVtTnVtYmVyT2ZDZWxsc1RvS2VlcDsKQEAgLTE2Miw2ICsxNjQsOCBAQCB2b2lkIGlu
aXRpYWxpemVIZXVyaXN0aWNzKCkKICAgICBTRVQoZGVzaXJlZFByb2ZpbGVMaXZlbmVzc1JhdGUs
IDAuNzUpOwogICAgIFNFVChkZXNpcmVkUHJvZmlsZUZ1bGxuZXNzUmF0ZSwgMC4zNSk7CiAgICAg
CisgICAgU0VUKGRvdWJsZVZvdGVSYXRpb0ZvckRvdWJsZUZvcm1hdCwgMik7CisgICAgCiAgICAg
U0VUKG1pbmltdW1OdW1iZXJPZlNjYW5zQmV0d2VlblJlYmFsYW5jZSwgMTAwMDApOwogICAgIFNF
VChnY01hcmtTdGFja1NlZ21lbnRTaXplLCAgICAgICAgICAgICAgIHBhZ2VTaXplKCkpOwogICAg
IFNFVChtaW5pbXVtTnVtYmVyT2ZDZWxsc1RvS2VlcCwgICAgICAgICAgIDEwKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9IZXVyaXN0aWNzLmgJKHJldmlzaW9uIDEwMjcy
NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0hldXJpc3RpY3MuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNjYsNiArNjYsOCBAQCBleHRlcm4gdW5zaWduZWQgbWF4aW11bU9wdGltaXph
dGlvbkRlbGF5CiBleHRlcm4gZG91YmxlIGRlc2lyZWRQcm9maWxlTGl2ZW5lc3NSYXRlOwogZXh0
ZXJuIGRvdWJsZSBkZXNpcmVkUHJvZmlsZUZ1bGxuZXNzUmF0ZTsKIAorZXh0ZXJuIGRvdWJsZSBk
b3VibGVWb3RlUmF0aW9Gb3JEb3VibGVGb3JtYXQ7CisKIGV4dGVybiB1bnNpZ25lZCBtaW5pbXVt
TnVtYmVyT2ZTY2Fuc0JldHdlZW5SZWJhbGFuY2U7CiBleHRlcm4gdW5zaWduZWQgZ2NNYXJrU3Rh
Y2tTZWdtZW50U2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBtaW5pbXVtTnVtYmVyT2ZDZWxsc1RvS2Vl
cDsK
</data>
<flag name="review"
          id="119075"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>