<?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>67985</bug_id>
          
          <creation_ts>2011-09-12 22:28:53 -0700</creation_ts>
          <short_desc>SpeculativeJIT::shouldSpeculateInteger(NodeIndex, NodeIndex) should return false if either node can be double</short_desc>
          <delta_ts>2011-09-14 12:23:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barraclough</cc>
    
    <cc>darin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>466135</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-12 22:28:53 -0700</bug_when>
    <thetext>SpeculativeJIT::shouldSpeculateInteger(NodeIndex, NodeIndex) currently returns false if either child node&apos;s prediction or static type is double.  But that ignores cases where the prediction says that a node can be double, but is not necessarily always double.  This is responsible for 3d-cube always failing speculation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466139</commentid>
    <comment_count>1</comment_count>
      <attachid>107145</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-12 22:44:21 -0700</bug_when>
    <thetext>Created attachment 107145
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466140</commentid>
    <comment_count>2</comment_count>
      <attachid>107146</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-12 22:45:14 -0700</bug_when>
    <thetext>Created attachment 107146
the patch - disable tiering</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466353</commentid>
    <comment_count>3</comment_count>
      <attachid>107146</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-09-13 09:53:07 -0700</bug_when>
    <thetext>Comment on attachment 107146
the patch - disable tiering

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

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:385
&gt; +    bool shouldNotSpeculateInteger(NodeIndex nodeIndex)

I think the function would be clearer with a small “why” comment in it.

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:392
&gt; +        if ((info.registerFormat() | DataFormatJS) == DataFormatJSDouble
&gt; +            || (info.spillFormat() | DataFormatJS) == DataFormatJSDouble)

I think this would read better on a single line.

I think this would read better with a small inline helper function that does the (format | DataFormatJS) == DataFormatJSDouble ditty, with a pleasant name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466477</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-13 12:48:42 -0700</bug_when>
    <thetext>Latest numbers, after fixing review:



Benchmark report for SunSpider, V8, and Kraken.

VMs tested:
&quot;TipOfTreeDyn&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc
&quot;CarefulNumber&quot; at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc

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

                                           TipOfTreeDyn           CarefulNumber                                  
SunSpider:
   3d-cube                                8.9150+-0.0876    ^     7.7930+-0.0804       ^ definitely 1.1440x faster
   3d-morph                               7.5370+-0.0902          7.4855+-0.0884       
   3d-raytrace                            7.5360+-0.0977    ?     7.6311+-0.0839       ? might be 1.0126x slower
   access-binary-trees                    2.3354+-0.0372          2.3135+-0.0356       
   access-fannkuch                       11.6601+-0.1098         11.5304+-0.1130         might be 1.0112x faster
   access-nbody                           4.2218+-0.0413    ?     4.2356+-0.1036       ?
   access-nsieve                          2.6112+-0.0352          2.5944+-0.0388       
   bitops-3bit-bits-in-byte               1.6676+-0.0246          1.6569+-0.0244       
   bitops-bits-in-byte                    3.1623+-0.0323    ?     3.2116+-0.0469       ? might be 1.0156x slower
   bitops-bitwise-and                     3.6386+-0.0488          3.5991+-0.0619         might be 1.0110x faster
   bitops-nsieve-bits                     5.4136+-0.0893          5.2968+-0.0505         might be 1.0221x faster
   controlflow-recursive                  1.9968+-0.0268          1.9722+-0.0360         might be 1.0125x faster
   crypto-aes                             7.0017+-0.1240    ?     7.1120+-0.1322       ? might be 1.0158x slower
   crypto-md5                             2.7654+-0.0302          2.7281+-0.0393         might be 1.0137x faster
   crypto-sha1                            2.2182+-0.0332    ?     2.2460+-0.0375       ? might be 1.0126x slower
   date-format-tofte                     10.5351+-0.6234         10.2592+-0.1074         might be 1.0269x faster
   date-format-xparb                      8.5383+-0.1030    ?     8.5800+-0.0866       ?
   math-cordic                            6.2498+-0.0663          6.1611+-0.0573         might be 1.0144x faster
   math-partial-sums                      7.3615+-0.0760    ?     7.3637+-0.0856       ?
   math-spectral-norm                     2.6108+-0.0393          2.5595+-0.0199         might be 1.0200x faster
   regexp-dna                            10.7612+-0.0966         10.7408+-0.0993       
   string-base64                          5.7395+-0.0641          5.7239+-0.0994       
   string-fasta                           8.1985+-0.0748          8.1984+-0.0780       
   string-tagcloud                       12.0131+-0.1120         11.8731+-0.1400         might be 1.0118x faster
   string-unpack-code                    18.8384+-0.1434    ?    18.8713+-0.1348       ?
   string-validate-input                  6.6322+-0.0814          6.5925+-0.0770       

   &lt;arithmetic&gt;                           6.5446+-0.0304    ^     6.4742+-0.0158       ^ definitely 1.0109x faster
   &lt;geometric&gt;                            5.3974+-0.0176    ^     5.3469+-0.0141       ^ definitely 1.0094x faster
   &lt;harmonic&gt;                             4.3934+-0.0150    ^     4.3596+-0.0174       ^ definitely 1.0077x faster

                                           TipOfTreeDyn           CarefulNumber                                  
V8:
   crypto                                86.3936+-0.5222         86.3028+-0.5295       
   deltablue                            258.3522+-1.0382        258.0643+-0.8435       
   earley-boyer                          95.5925+-0.4492    ?    95.7731+-0.5052       ?
   raytrace                              79.5224+-1.7899    ^    77.2884+-0.2945       ^ definitely 1.0289x faster
   regexp                               108.1042+-0.4954    !   109.5729+-0.5820       ! definitely 1.0136x slower
   richards                             218.5178+-0.9283        216.9693+-0.7558       
   splay                                102.8957+-0.5062        102.4142+-0.4951       

   &lt;arithmetic&gt;                         135.6255+-0.3987        135.1979+-0.2049       
   &lt;geometric&gt;                          122.4050+-0.4774        121.9538+-0.1870       
   &lt;harmonic&gt;                           112.7881+-0.5597        112.2687+-0.2024       

                                           TipOfTreeDyn           CarefulNumber                                  
Kraken:
   ai-astar                            1142.1542+-16.8952   ?  1147.8947+-5.4359       ?
   audio-beat-detection                 471.3633+-2.0838    ?   474.5726+-2.0400       ?
   audio-dft                            428.1801+-2.8580        426.9048+-3.1434       
   audio-fft                            372.7386+-3.3193    ^   367.4533+-1.4467       ^ definitely 1.0144x faster
   audio-oscillator                     356.0643+-1.2339    ?   358.4645+-1.3424       ?
   imaging-darkroom                     512.1170+-1.3347    ?   512.1290+-1.4023       ?
   imaging-desaturate                   220.0034+-0.8839    ?   220.7472+-1.5117       ?
   imaging-gaussian-blur               1748.7651+-5.6377       1739.4238+-5.6024       
   json-parse-financial                  49.5538+-0.3005         49.4683+-0.2822       
   json-stringify-tinderbox              69.9394+-0.4919         69.3957+-0.2913       
   stanford-crypto-aes                  146.0683+-0.7982    ?   146.5923+-0.5881       ?
   stanford-crypto-ccm                  113.7544+-0.5470        113.6844+-0.5826       
   stanford-crypto-pbkdf2               405.6344+-2.1291    ?   405.7448+-1.5264       ?
   stanford-crypto-sha256-iterative     152.0317+-0.7024    ?   152.3759+-0.7158       ?

   &lt;arithmetic&gt;                         442.0263+-1.3448        441.7751+-0.4788       
   &lt;geometric&gt;                          283.2216+-0.4956        283.1418+-0.3289       
   &lt;harmonic&gt;                           181.6587+-0.4115        181.4143+-0.3218       

                                           TipOfTreeDyn           CarefulNumber                                  
All benchmarks:
   &lt;arithmetic&gt;                         155.4874+-0.4033        155.3099+-0.1591       
   &lt;geometric&gt;                           27.9512+-0.0539    ^    27.7888+-0.0422       ^ definitely 1.0058x faster
   &lt;harmonic&gt;                             7.7594+-0.0259    ^     7.7007+-0.0300       ^ definitely 1.0076x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466487</commentid>
    <comment_count>5</comment_count>
      <attachid>107217</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-13 13:04:53 -0700</bug_when>
    <thetext>Created attachment 107217
the patch - fix review, did some refactoring</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466509</commentid>
    <comment_count>6</comment_count>
      <attachid>107217</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-09-13 13:37:53 -0700</bug_when>
    <thetext>Comment on attachment 107217
the patch - fix review, did some refactoring

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

r=me but please don&apos;t check in the accidental change to Platform.h.

&gt; Source/JavaScriptCore/ChangeLog:38
&gt; +        * dfg/DFGGenerationInfo.h:
&gt; +        (JSC::DFG::isJSFormat):
&gt; +        (JSC::DFG::isJSInteger):
&gt; +        (JSC::DFG::isJSDouble):
&gt; +        (JSC::DFG::isJSCell):
&gt; +        (JSC::DFG::isJSBoolean):
&gt; +        (JSC::DFG::GenerationInfo::isJSFormat):
&gt; +        (JSC::DFG::GenerationInfo::isJSInteger):
&gt; +        (JSC::DFG::GenerationInfo::isJSDouble):
&gt; +        (JSC::DFG::GenerationInfo::isJSCell):
&gt; +        (JSC::DFG::GenerationInfo::isJSBoolean):
&gt; +        * dfg/DFGJITCodeGenerator.cpp:
&gt; +        (JSC::DFG::JITCodeGenerator::isKnownInteger):
&gt; +        (JSC::DFG::JITCodeGenerator::isKnownNumeric):
&gt; +        (JSC::DFG::JITCodeGenerator::isKnownCell):
&gt; +        (JSC::DFG::JITCodeGenerator::isKnownNotInteger):
&gt; +        (JSC::DFG::JITCodeGenerator::isKnownBoolean):
&gt; +        * dfg/DFGJITCodeGenerator.h:
&gt; +        * dfg/DFGNonSpeculativeJIT.cpp:
&gt; +        (JSC::DFG::NonSpeculativeJIT::compile):
&gt; +        * dfg/DFGSpeculativeJIT.h:
&gt; +        (JSC::DFG::SpeculativeJIT::isInteger):
&gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateDouble):
&gt; +        (JSC::DFG::SpeculativeJIT::shouldNotSpeculateInteger):
&gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateInteger):

It&apos;s great to put line-by-line comments next to this auto-generated helper text, but in cases where you don&apos;t do that, I think it&apos;s better just to delete the text.

&gt; Source/JavaScriptCore/dfg/DFGGenerationInfo.h:124
&gt; +inline bool isJSFormat(DataFormat format, DataFormat expectedFormat)
&gt; +{
&gt; +    ASSERT(expectedFormat &amp; DataFormatJS);
&gt; +    return (format | DataFormatJS) == expectedFormat;
&gt; +}

This is way better!

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:400
&gt; +        return !(shouldNotSpeculateInteger(op1) || shouldNotSpeculateInteger(op2)) &amp;&amp; (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2));

The fight between shouldNotSpeculateInteger() and shouldSpeculateInteger() is a bit mind-bending, but I don&apos;t have a specific suggestion to make right now.

&gt; Source/JavaScriptCore/wtf/Platform.h:968
&gt; -#define ENABLE_TIERED_COMPILATION 0
&gt; +#define ENABLE_TIERED_COMPILATION 1

Hey man, if you want to enable it so badly, why don&apos;t you just submit a patch? ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466514</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-13 13:44:20 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 107217 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=107217&amp;action=review
&gt; 
&gt; r=me but please don&apos;t check in the accidental change to Platform.h.

Ooops!

&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:38
&gt; &gt; +        * dfg/DFGGenerationInfo.h:
&gt; &gt; +        (JSC::DFG::isJSFormat):
&gt; &gt; +        (JSC::DFG::isJSInteger):
&gt; &gt; +        (JSC::DFG::isJSDouble):
&gt; &gt; +        (JSC::DFG::isJSCell):
&gt; &gt; +        (JSC::DFG::isJSBoolean):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSFormat):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSInteger):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSDouble):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSCell):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSBoolean):
&gt; &gt; +        * dfg/DFGJITCodeGenerator.cpp:
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownInteger):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownNumeric):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownCell):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownNotInteger):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownBoolean):
&gt; &gt; +        * dfg/DFGJITCodeGenerator.h:
&gt; &gt; +        * dfg/DFGNonSpeculativeJIT.cpp:
&gt; &gt; +        (JSC::DFG::NonSpeculativeJIT::compile):
&gt; &gt; +        * dfg/DFGSpeculativeJIT.h:
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::isInteger):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateDouble):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldNotSpeculateInteger):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateInteger):
&gt; 
&gt; It&apos;s great to put line-by-line comments next to this auto-generated helper text, but in cases where you don&apos;t do that, I think it&apos;s better just to delete the text.

OK - I&apos;ll switch this to putting comments next to the auto-generated text.

&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:400
&gt; &gt; +        return !(shouldNotSpeculateInteger(op1) || shouldNotSpeculateInteger(op2)) &amp;&amp; (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2));
&gt; 
&gt; The fight between shouldNotSpeculateInteger() and shouldSpeculateInteger() is a bit mind-bending, but I don&apos;t have a specific suggestion to make right now.
&gt; 
&gt; &gt; Source/JavaScriptCore/wtf/Platform.h:968
&gt; &gt; -#define ENABLE_TIERED_COMPILATION 0
&gt; &gt; +#define ENABLE_TIERED_COMPILATION 1
&gt; 
&gt; Hey man, if you want to enable it so badly, why don&apos;t you just submit a patch? ;)

Turns out that this patch is probably a prerequisite for enabling it, but it may not be sufficient.  In browser, we&apos;re seeing somewhat different speculations with awkward behavior as a result.  This patch will fix part, but not all, of that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466560</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-09-13 14:45:56 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; &gt; Source/JavaScriptCore/ChangeLog:38
&gt; &gt; +        * dfg/DFGGenerationInfo.h:
&gt; &gt; +        (JSC::DFG::isJSFormat):
&gt; &gt; +        (JSC::DFG::isJSInteger):
&gt; &gt; +        (JSC::DFG::isJSDouble):
&gt; &gt; +        (JSC::DFG::isJSCell):
&gt; &gt; +        (JSC::DFG::isJSBoolean):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSFormat):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSInteger):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSDouble):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSCell):
&gt; &gt; +        (JSC::DFG::GenerationInfo::isJSBoolean):
&gt; &gt; +        * dfg/DFGJITCodeGenerator.cpp:
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownInteger):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownNumeric):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownCell):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownNotInteger):
&gt; &gt; +        (JSC::DFG::JITCodeGenerator::isKnownBoolean):
&gt; &gt; +        * dfg/DFGJITCodeGenerator.h:
&gt; &gt; +        * dfg/DFGNonSpeculativeJIT.cpp:
&gt; &gt; +        (JSC::DFG::NonSpeculativeJIT::compile):
&gt; &gt; +        * dfg/DFGSpeculativeJIT.h:
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::isInteger):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateDouble):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldNotSpeculateInteger):
&gt; &gt; +        (JSC::DFG::SpeculativeJIT::shouldSpeculateInteger):
&gt; 
&gt; It&apos;s great to put line-by-line comments next to this auto-generated helper text, but in cases where you don&apos;t do that, I think it&apos;s better just to delete the text.

I’m not sure I agree. Some people like to be able to search for modified functions by deleting the change log. Lets not belabor the point in this patch, but might want to talk to others, perhaps including Maciej, about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466565</commentid>
    <comment_count>9</comment_count>
      <attachid>107234</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-13 14:49:30 -0700</bug_when>
    <thetext>Created attachment 107234
the patch - fix review, and hardened shouldSpeculateInteger() even more

Here are the latest perf numbers:



Benchmark report for SunSpider, V8, and Kraken.

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/octonary/OpenSource/WebKitBuild/Release/jsc
&quot;TipOfTreeDyn&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc
&quot;CarefulNumber&quot; at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. 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              TipOfTreeDyn           CarefulNumber        CarefulNumber v. TipOfTree
SunSpider:
   3d-cube                                7.7000+-0.1110    !     9.0728+-0.2063    ^     7.7518+-0.1422       ?
   3d-morph                               7.4553+-0.1671    ?     7.5690+-0.1943          7.4558+-0.1516       ?
   3d-raytrace                            7.6957+-0.2284          7.5390+-0.1541    ?     7.7188+-0.2071       ?
   access-binary-trees                    2.2838+-0.0962    ?     2.4106+-0.1220          2.2463+-0.0583         might be 1.0167x faster
   access-fannkuch                       11.7680+-0.1695         11.6634+-0.1932    ?    11.7183+-0.2692       
   access-nbody                           4.2794+-0.0558          4.2430+-0.1707          4.1893+-0.0973         might be 1.0215x faster
   access-nsieve                          2.6066+-0.1488          2.5871+-0.0419          2.5849+-0.0392       
   bitops-3bit-bits-in-byte               1.7161+-0.0694          1.6783+-0.0393    ?     1.6990+-0.0539         might be 1.0101x faster
   bitops-bits-in-byte                    3.2165+-0.0406    ?     3.2256+-0.0493          3.1281+-0.0669         might be 1.0283x faster
   bitops-bitwise-and                     3.6744+-0.0978          3.5958+-0.1036          3.5818+-0.0980         might be 1.0258x faster
   bitops-nsieve-bits                     5.4681+-0.1144          5.4025+-0.1006          5.3010+-0.1118         might be 1.0315x faster
   controlflow-recursive                  1.9870+-0.0448    ?     2.0253+-0.0299          1.9628+-0.0425         might be 1.0123x faster
   crypto-aes                             6.6115+-0.1839    !     7.3610+-0.4124          7.1159+-0.3231       ? might be 1.0763x slower
   crypto-md5                             2.9036+-0.0785          2.7903+-0.0977          2.7666+-0.1011         might be 1.0495x faster
   crypto-sha1                            2.3284+-0.0785          2.2361+-0.0427    ^     2.1552+-0.0330       ^ definitely 1.0804x faster
   date-format-tofte                     10.3591+-0.4120         10.3206+-0.2688         10.2628+-0.2429       
   date-format-xparb                      8.4283+-0.2384    ?     8.9335+-0.3087          8.5139+-0.1523       ? might be 1.0102x slower
   math-cordic                            6.3591+-0.1185          6.3367+-0.0792    ^     6.1589+-0.0684       ^ definitely 1.0325x faster
   math-partial-sums                      7.7329+-0.1796    ^     7.3818+-0.1621          7.3804+-0.1093       ^ definitely 1.0478x faster
   math-spectral-norm                     2.5507+-0.1063    ?     2.6231+-0.0423          2.6071+-0.0585       ? might be 1.0221x slower
   regexp-dna                            10.8829+-0.2408    ?    11.0444+-0.3196         10.9296+-0.1949       ?
   string-base64                          6.0589+-0.2107          5.8801+-0.2482    ?     5.9180+-0.1902         might be 1.0238x faster
   string-fasta                           7.3014+-0.1081    !     8.3146+-0.2175          8.3007+-0.1999       ! definitely 1.1369x slower
   string-tagcloud                       12.1434+-0.4217         12.0108+-0.3340         11.9435+-0.3274         might be 1.0167x faster
   string-unpack-code                    19.1970+-0.5470         19.0773+-0.4865         18.8295+-0.3295         might be 1.0195x faster
   string-validate-input                  7.1812+-0.2631          6.8250+-0.2467          6.7450+-0.3059         might be 1.0647x faster

   &lt;arithmetic&gt;                           6.5342+-0.0469    !     6.6211+-0.0351    ^     6.4987+-0.0275       
   &lt;geometric&gt;                            5.4040+-0.0381    ?     5.4584+-0.0191    ^     5.3546+-0.0229       
   &lt;harmonic&gt;                             4.4180+-0.0393    ?     4.4379+-0.0164    ^     4.3547+-0.0310         might be 1.0145x faster

                                            TipOfTree              TipOfTreeDyn           CarefulNumber        CarefulNumber v. TipOfTree
V8:
   crypto                                92.6777+-1.0560    ^    85.8287+-0.6768         84.6729+-1.3058       ^ definitely 1.0945x faster
   deltablue                            271.7779+-2.4911    ^   258.1274+-2.1974        257.1388+-2.2389       ^ definitely 1.0569x faster
   earley-boyer                          95.3850+-0.7488    ?    95.9525+-0.9046    ?    96.9092+-1.7912       ? might be 1.0160x slower
   raytrace                              78.7186+-0.7819         77.7404+-0.5089         76.6954+-0.5746       ^ definitely 1.0264x faster
   regexp                               108.6307+-0.6516    ?   109.0979+-1.1529        107.6484+-0.5817       
   richards                             231.8681+-2.1057    ^   218.4648+-1.6917        218.0566+-1.9601       ^ definitely 1.0633x faster
   splay                                101.9574+-0.4023    ?   102.9560+-0.8176    ?   102.9860+-0.8933       ? might be 1.0101x slower

   &lt;arithmetic&gt;                         140.1451+-0.4827    ^   135.4525+-0.3950        134.8725+-0.5967       ^ definitely 1.0391x faster
   &lt;geometric&gt;                          125.3196+-0.3113    ^   122.1319+-0.3559        121.4995+-0.4868       ^ definitely 1.0314x faster
   &lt;harmonic&gt;                           114.7691+-0.3329    ^   112.4043+-0.3475        111.7151+-0.4317       ^ definitely 1.0273x faster

                                            TipOfTree              TipOfTreeDyn           CarefulNumber        CarefulNumber v. TipOfTree
Kraken:
   ai-astar                            1115.9489+-13.6925   ?  1127.2781+-4.3517    !  1148.8542+-9.6147       ! definitely 1.0295x slower
   audio-beat-detection                 483.6177+-5.5121    ^   468.2725+-3.1906    ?   472.6012+-2.7622       ^ definitely 1.0233x faster
   audio-dft                            435.9011+-11.7825       422.9108+-2.6337    ?   425.0530+-5.1124         might be 1.0255x faster
   audio-fft                            368.5819+-1.3054    ?   369.9146+-3.2159    ^   365.7559+-0.3816       ^ definitely 1.0077x faster
   audio-oscillator                     381.7322+-1.6193    ^   356.1275+-2.5445        353.8487+-2.4433       ^ definitely 1.0788x faster
   imaging-darkroom                     536.6514+-4.1188    ^   511.1556+-3.5697        509.2351+-2.1197       ^ definitely 1.0538x faster
   imaging-desaturate                   622.3301+-2.8078    ^   219.1983+-2.3835        218.1094+-0.8011       ^ definitely 2.8533x faster
   imaging-gaussian-blur               1737.6811+-4.6308       1735.7990+-10.7049   ?  1742.4213+-8.1005       ?
   json-parse-financial                  49.0553+-0.3802    ?    49.3396+-0.5432    !    50.7809+-0.6047       ! definitely 1.0352x slower
   json-stringify-tinderbox              69.8076+-1.5159         69.1354+-0.3432         68.6172+-0.2549         might be 1.0173x faster
   stanford-crypto-aes                  146.7155+-2.4606        144.8160+-0.6303    ?   145.1716+-0.4200         might be 1.0106x faster
   stanford-crypto-ccm                  114.1883+-2.5628        114.1723+-1.0068    ^   112.0443+-0.7322         might be 1.0191x faster
   stanford-crypto-pbkdf2               333.9798+-2.2400    !   401.9650+-2.1643        401.8433+-2.0952       ! definitely 1.2032x slower
   stanford-crypto-sha256-iterative     132.0898+-0.7086    !   150.4716+-0.4734    ^   148.9359+-0.9755       ! definitely 1.1275x slower

   &lt;arithmetic&gt;                         466.3058+-1.7094    ^   438.6111+-0.8533    ?   440.2337+-1.1670       ^ definitely 1.0592x faster
   &lt;geometric&gt;                          300.2954+-1.1813    ^   281.3736+-0.5503    ?   281.4741+-0.5687       ^ definitely 1.0669x faster
   &lt;harmonic&gt;                           185.3853+-0.8586    ^   180.5717+-0.6557    ?   181.0842+-0.6153       ^ definitely 1.0238x faster

                                            TipOfTree              TipOfTreeDyn           CarefulNumber        CarefulNumber v. TipOfTree
All benchmarks:
   &lt;arithmetic&gt;                         163.3869+-0.4742    ^   154.4866+-0.2504    ?   154.8158+-0.3607       ^ definitely 1.0554x faster
   &lt;geometric&gt;                           28.5619+-0.0953    ^    28.0616+-0.0556    ^    27.7467+-0.0759       ^ definitely 1.0294x faster
   &lt;harmonic&gt;                             7.8052+-0.0677    ?     7.8354+-0.0283    ^     7.6916+-0.0537         might be 1.0148x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466698</commentid>
    <comment_count>10</comment_count>
      <attachid>107234</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-09-13 17:01:49 -0700</bug_when>
    <thetext>Comment on attachment 107234
the patch - fix review, and hardened shouldSpeculateInteger() even more

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

r=me but please remove stray printfs.

&gt; Source/JavaScriptCore/ChangeLog:9
&gt; +        This is a 17% speed-up on 3b-cube.

Typo: &quot;3b&quot;.

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:390
&gt; +            printf(&quot;%d is a double constant.\n&quot;, nodeIndex);

Stray printf.

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:400
&gt; +            printf(&quot;%d produces a double.\n&quot;, nodeIndex);

And here.

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:405
&gt; +            printf(&quot;%d has a double prediction.\n&quot;, nodeIndex);

And here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>467232</commentid>
    <comment_count>11</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-09-14 12:23:52 -0700</bug_when>
    <thetext>Landed in r95060.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107145</attachid>
            <date>2011-09-12 22:44:21 -0700</date>
            <delta_ts>2011-09-12 22:45:14 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>carefulnumber_patch_1.diff</filename>
            <type>text/plain</type>
            <size>2685</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTUwMTYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAK
KzIwMTEtMDktMTIgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBT
cGVjdWxhdGl2ZUpJVDo6c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihOb2RlSW5kZXgsIE5vZGVJbmRl
eCkgc2hvdWxkCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBlaXRoZXIgbm9kZSBjYW4gYmUgZG91
YmxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAg
ICAgVGhpcyBpcyBhIDEyJSBzcGVlZC11cCBvbiAzZC1jdWJlLCBhbmQgaXMgbmV1dHJhbCBlbHNl
d2hlcmUuCisKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuaDoKKyAgICAgICAgKEpT
Qzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6c2hvdWxkTm90U3BlY3VsYXRlSW50ZWdlcik6CisgICAg
ICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OnNob3VsZFNwZWN1bGF0ZUludGVnZXIpOgor
CiAyMDExLTA5LTEyICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAg
SmF2YVNjcmlwdENvcmUgZG9lcyBub3QgaGF2ZSBiYXNlbGluZS0+c3BlY3VsYXRpdmUgT1NSCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShy
ZXZpc2lvbiA5NTAxNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQuaAkod29ya2luZyBjb3B5KQpAQCAtMzgyLDkgKzM4MiwyNSBAQCBwcml2YXRlOgogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIAorICAgIGJvb2wgc2hvdWxkTm90U3BlY3Vs
YXRlSW50ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4KQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9k
ZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKKyAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHZp
cnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CisgICAgICAgIEdlbmVyYXRp
b25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOworCisgICAg
ICAgIGlmICgoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9y
bWF0SlNEb3VibGUKKyAgICAgICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0KCkgfCBEYXRhRm9y
bWF0SlMpID09IERhdGFGb3JtYXRKU0RvdWJsZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAKKyAgICAgICAgaWYgKG1faml0LmdyYXBoKCkuZ2V0UHJlZGljdGlvbihub2RlKSAm
IFByZWRpY3REb3VibGUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCiAgICAgYm9vbCBzaG91bGRTcGVjdWxhdGVJ
bnRlZ2VyKE5vZGVJbmRleCBvcDEsIE5vZGVJbmRleCBvcDIpCiAgICAgewotICAgICAgICByZXR1
cm4gIShzaG91bGRTcGVjdWxhdGVEb3VibGUob3AxKSB8fCBzaG91bGRTcGVjdWxhdGVEb3VibGUo
b3AyKSkgJiYgKHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3AxKSB8fCBzaG91bGRTcGVjdWxhdGVJ
bnRlZ2VyKG9wMikpOworICAgICAgICByZXR1cm4gIShzaG91bGROb3RTcGVjdWxhdGVJbnRlZ2Vy
KG9wMSkgfHwgc2hvdWxkTm90U3BlY3VsYXRlSW50ZWdlcihvcDIpKSAmJiAoc2hvdWxkU3BlY3Vs
YXRlSW50ZWdlcihvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3AyKSk7CiAgICAgfQog
CiAgICAgYm9vbCBjb21wYXJlKE5vZGUmLCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25hbENvbmRp
dGlvbiwgTWFjcm9Bc3NlbWJsZXI6OkRvdWJsZUNvbmRpdGlvbiwgWl9ERkdPcGVyYXRpb25fRUpK
KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmgJKHJldmlzaW9uIDk1MDE2
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkp
CkBAIC05NjUsNyArOTY1LDcgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRU5BQkxFX1RJRVJF
RF9DT01QSUxBVElPTikKLSNkZWZpbmUgRU5BQkxFX1RJRVJFRF9DT01QSUxBVElPTiAwCisjZGVm
aW5lIEVOQUJMRV9USUVSRURfQ09NUElMQVRJT04gMQogI2VuZGlmCiAKIC8qIEN1cnJlbnRseSBv
bmx5IGltcGxlbWVudGVkIGZvciBKU1ZBTFVFNjQsIG9ubHkgdGVzdGVkIG9uIFBMQVRGT1JNKE1B
QykgKi8K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107146</attachid>
            <date>2011-09-12 22:45:14 -0700</date>
            <delta_ts>2011-09-13 13:04:53 -0700</delta_ts>
            <desc>the patch - disable tiering</desc>
            <filename>carefulnumber_patch_1.diff</filename>
            <type>text/plain</type>
            <size>2226</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTUwMTYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAK
KzIwMTEtMDktMTIgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBT
cGVjdWxhdGl2ZUpJVDo6c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihOb2RlSW5kZXgsIE5vZGVJbmRl
eCkgc2hvdWxkCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBlaXRoZXIgbm9kZSBjYW4gYmUgZG91
YmxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAg
ICAgVGhpcyBpcyBhIDEyJSBzcGVlZC11cCBvbiAzZC1jdWJlLCBhbmQgaXMgbmV1dHJhbCBlbHNl
d2hlcmUuCisKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuaDoKKyAgICAgICAgKEpT
Qzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6c2hvdWxkTm90U3BlY3VsYXRlSW50ZWdlcik6CisgICAg
ICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OnNob3VsZFNwZWN1bGF0ZUludGVnZXIpOgor
CiAyMDExLTA5LTEyICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAg
SmF2YVNjcmlwdENvcmUgZG9lcyBub3QgaGF2ZSBiYXNlbGluZS0+c3BlY3VsYXRpdmUgT1NSCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShy
ZXZpc2lvbiA5NTAxNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQuaAkod29ya2luZyBjb3B5KQpAQCAtMzgyLDkgKzM4MiwyNSBAQCBwcml2YXRlOgogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIAorICAgIGJvb2wgc2hvdWxkTm90U3BlY3Vs
YXRlSW50ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4KQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9k
ZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKKyAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHZp
cnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CisgICAgICAgIEdlbmVyYXRp
b25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOworCisgICAg
ICAgIGlmICgoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9y
bWF0SlNEb3VibGUKKyAgICAgICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0KCkgfCBEYXRhRm9y
bWF0SlMpID09IERhdGFGb3JtYXRKU0RvdWJsZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAKKyAgICAgICAgaWYgKG1faml0LmdyYXBoKCkuZ2V0UHJlZGljdGlvbihub2RlKSAm
IFByZWRpY3REb3VibGUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCiAgICAgYm9vbCBzaG91bGRTcGVjdWxhdGVJ
bnRlZ2VyKE5vZGVJbmRleCBvcDEsIE5vZGVJbmRleCBvcDIpCiAgICAgewotICAgICAgICByZXR1
cm4gIShzaG91bGRTcGVjdWxhdGVEb3VibGUob3AxKSB8fCBzaG91bGRTcGVjdWxhdGVEb3VibGUo
b3AyKSkgJiYgKHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3AxKSB8fCBzaG91bGRTcGVjdWxhdGVJ
bnRlZ2VyKG9wMikpOworICAgICAgICByZXR1cm4gIShzaG91bGROb3RTcGVjdWxhdGVJbnRlZ2Vy
KG9wMSkgfHwgc2hvdWxkTm90U3BlY3VsYXRlSW50ZWdlcihvcDIpKSAmJiAoc2hvdWxkU3BlY3Vs
YXRlSW50ZWdlcihvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3AyKSk7CiAgICAgfQog
CiAgICAgYm9vbCBjb21wYXJlKE5vZGUmLCBNYWNyb0Fzc2VtYmxlcjo6UmVsYXRpb25hbENvbmRp
dGlvbiwgTWFjcm9Bc3NlbWJsZXI6OkRvdWJsZUNvbmRpdGlvbiwgWl9ERkdPcGVyYXRpb25fRUpK
KTsK
</data>
<flag name="review"
          id="103776"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107217</attachid>
            <date>2011-09-13 13:04:53 -0700</date>
            <delta_ts>2011-09-13 14:49:30 -0700</delta_ts>
            <desc>the patch - fix review, did some refactoring</desc>
            <filename>carefulnumber_patch_2.diff</filename>
            <type>text/plain</type>
            <size>11279</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTUwMzkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDIgQEAK
KzIwMTEtMDktMTMgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBT
cGVjdWxhdGl2ZUpJVDo6c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihOb2RlSW5kZXgsIE5vZGVJbmRl
eCkgc2hvdWxkCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBlaXRoZXIgbm9kZSBjYW4gYmUgZG91
YmxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAg
ICAgVGhpcyBpcyBhIDEyJSBzcGVlZC11cCBvbiAzZC1jdWJlLCBhbmQgaXMgbmV1dHJhbCBlbHNl
d2hlcmUuCisgICAgICAgIAorICAgICAgICBJbnN0ZWFkIG9mIGFkZGluZyB5ZXQgYW5vdGhlciB1
c2Ugb2YgdGhlIChmb3JtYXQgJiBEYXRhRm9ybWF0SlMpID09IGV4cGVjdGVkCisgICAgICAgIGlk
aW9tLCBJIHJlZmFjdG9yZWQgYWxsIHVzZXMgb2YgaXQgaW50byBoZWxwZXIgbWV0aG9kcyBpbiBH
ZW5lcmF0aW9uSW5mby4KKworICAgICAgICAqIGRmZy9ERkdHZW5lcmF0aW9uSW5mby5oOgorICAg
ICAgICAoSlNDOjpERkc6OmlzSlNGb3JtYXQpOgorICAgICAgICAoSlNDOjpERkc6OmlzSlNJbnRl
Z2VyKToKKyAgICAgICAgKEpTQzo6REZHOjppc0pTRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZH
Ojppc0pTQ2VsbCk6CisgICAgICAgIChKU0M6OkRGRzo6aXNKU0Jvb2xlYW4pOgorICAgICAgICAo
SlNDOjpERkc6OkdlbmVyYXRpb25JbmZvOjppc0pTRm9ybWF0KToKKyAgICAgICAgKEpTQzo6REZH
OjpHZW5lcmF0aW9uSW5mbzo6aXNKU0ludGVnZXIpOgorICAgICAgICAoSlNDOjpERkc6OkdlbmVy
YXRpb25JbmZvOjppc0pTRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZHOjpHZW5lcmF0aW9uSW5m
bzo6aXNKU0NlbGwpOgorICAgICAgICAoSlNDOjpERkc6OkdlbmVyYXRpb25JbmZvOjppc0pTQm9v
bGVhbik6CisgICAgICAgICogZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAo
SlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25JbnRlZ2VyKToKKyAgICAgICAgKEpT
Qzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTnVtZXJpYyk6CisgICAgICAgIChKU0M6
OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bkNlbGwpOgorICAgICAgICAoSlNDOjpERkc6
OkpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25Ob3RJbnRlZ2VyKToKKyAgICAgICAgKEpTQzo6REZH
OjpKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duQm9vbGVhbik6CisgICAgICAgICogZGZnL0RGR0pJ
VENvZGVHZW5lcmF0b3IuaDoKKyAgICAgICAgKiBkZmcvREZHTm9uU3BlY3VsYXRpdmVKSVQuY3Bw
OgorICAgICAgICAoSlNDOjpERkc6Ok5vblNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAg
ICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuaDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxh
dGl2ZUpJVDo6aXNJbnRlZ2VyKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6
c2hvdWxkU3BlY3VsYXRlRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJ
VDo6c2hvdWxkTm90U3BlY3VsYXRlSW50ZWdlcik6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3Vs
YXRpdmVKSVQ6OnNob3VsZFNwZWN1bGF0ZUludGVnZXIpOgorCiAyMDExLTA5LTEzICBTYW0gV2Vp
bmlnICA8c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mIHNo
b3VsZCB1c2UgSlNWYWx1ZTo6Z2V0KCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHR2VuZXJhdGlvbkluZm8uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0dlbmVyYXRpb25JbmZvLmgJKHJldmlzaW9uIDk1MDM2KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdHZW5lcmF0aW9uSW5mby5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcs
NiArMTE3LDMyIEBAIGlubGluZSBib29sIG5lZWREYXRhRm9ybWF0Q29udmVyc2lvbihEYXQKICAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAoraW5saW5lIGJvb2wgaXNKU0Zvcm1hdChEYXRhRm9ybWF0IGZv
cm1hdCwgRGF0YUZvcm1hdCBleHBlY3RlZEZvcm1hdCkKK3sKKyAgICBBU1NFUlQoZXhwZWN0ZWRG
b3JtYXQgJiBEYXRhRm9ybWF0SlMpOworICAgIHJldHVybiAoZm9ybWF0IHwgRGF0YUZvcm1hdEpT
KSA9PSBleHBlY3RlZEZvcm1hdDsKK30KKworaW5saW5lIGJvb2wgaXNKU0ludGVnZXIoRGF0YUZv
cm1hdCBmb3JtYXQpCit7CisgICAgcmV0dXJuIGlzSlNGb3JtYXQoZm9ybWF0LCBEYXRhRm9ybWF0
SlNJbnRlZ2VyKTsKK30KKworaW5saW5lIGJvb2wgaXNKU0RvdWJsZShEYXRhRm9ybWF0IGZvcm1h
dCkKK3sKKyAgICByZXR1cm4gaXNKU0Zvcm1hdChmb3JtYXQsIERhdGFGb3JtYXRKU0RvdWJsZSk7
Cit9CisKK2lubGluZSBib29sIGlzSlNDZWxsKERhdGFGb3JtYXQgZm9ybWF0KQoreworICAgIHJl
dHVybiBpc0pTRm9ybWF0KGZvcm1hdCwgRGF0YUZvcm1hdEpTQ2VsbCk7Cit9CisKK2lubGluZSBi
b29sIGlzSlNCb29sZWFuKERhdGFGb3JtYXQgZm9ybWF0KQoreworICAgIHJldHVybiBpc0pTRm9y
bWF0KGZvcm1hdCwgRGF0YUZvcm1hdEpTQm9vbGVhbik7Cit9CisKIC8vID09PSBHZW5lcmF0aW9u
SW5mbyA9PT0KIC8vCiAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQg
c3RhdHVzIG9mIGEgbGl2ZSB2YWx1ZXMgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KQEAgLTIwOCw2
ICsyMzQsMzEgQEAgcHVibGljOgogICAgIERhdGFGb3JtYXQgcmVnaXN0ZXJGb3JtYXQoKSB7IHJl
dHVybiBtX3JlZ2lzdGVyRm9ybWF0OyB9CiAgICAgLy8gR2V0IHRoZSBmb3JtYXQgb2YgdGhlIHZh
bHVlIGFzIGl0IGlzIHNwaWxsZWQgaW4gdGhlIFJlZ2lzdGVyRmlsZSAob3IgJ25vbmUnKS4KICAg
ICBEYXRhRm9ybWF0IHNwaWxsRm9ybWF0KCkgeyByZXR1cm4gbV9zcGlsbEZvcm1hdDsgfQorICAg
IAorICAgIGJvb2wgaXNKU0Zvcm1hdChEYXRhRm9ybWF0IGV4cGVjdGVkRm9ybWF0KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIERGRzo6aXNKU0Zvcm1hdChyZWdpc3RlckZvcm1hdCgpLCBleHBlY3Rl
ZEZvcm1hdCkgfHwgREZHOjppc0pTRm9ybWF0KHNwaWxsRm9ybWF0KCksIGV4cGVjdGVkRm9ybWF0
KTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc0pTSW50ZWdlcigpCisgICAgeworICAgICAgICBy
ZXR1cm4gaXNKU0Zvcm1hdChEYXRhRm9ybWF0SlNJbnRlZ2VyKTsKKyAgICB9CisgICAgCisgICAg
Ym9vbCBpc0pTRG91YmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0pTRm9ybWF0KERhdGFG
b3JtYXRKU0RvdWJsZSk7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNKU0NlbGwoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGlzSlNGb3JtYXQoRGF0YUZvcm1hdEpTQ2VsbCk7CisgICAgfQorICAg
IAorICAgIGJvb2wgaXNKU0Jvb2xlYW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzSlNGb3Jt
YXQoRGF0YUZvcm1hdEpTQm9vbGVhbik7CisgICAgfQogCiAgICAgLy8gR2V0IHRoZSBtYWNoaW5l
IHJlc2lzdGVyIGN1cnJlbnRseSBob2xkaW5nIHRoZSB2YWx1ZS4KICAgICBHUFJSZWcgZ3ByKCkg
eyBBU1NFUlQobV9yZWdpc3RlckZvcm1hdCAmJiBtX3JlZ2lzdGVyRm9ybWF0ICE9IERhdGFGb3Jt
YXREb3VibGUpOyByZXR1cm4gdS5ncHI7IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmNwcAkocmV2aXNpb24gOTUwMzYpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNjIsMTYgKzM2Miw3IEBAIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93
bkludGVnZXIoTm8KICAgICAKICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlv
bkluZm9bbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKV07CiAKLSAgICBEYXRhRm9ybWF0IHJlZ2lzdGVy
Rm9ybWF0ID0gaW5mby5yZWdpc3RlckZvcm1hdCgpOwotICAgIGlmIChyZWdpc3RlckZvcm1hdCAh
PSBEYXRhRm9ybWF0Tm9uZSkKLSAgICAgICAgcmV0dXJuIChyZWdpc3RlckZvcm1hdCB8IERhdGFG
b3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTSW50ZWdlcjsKLQotICAgIERhdGFGb3JtYXQgc3BpbGxG
b3JtYXQgPSBpbmZvLnNwaWxsRm9ybWF0KCk7Ci0gICAgaWYgKHNwaWxsRm9ybWF0ICE9IERhdGFG
b3JtYXROb25lKQotICAgICAgICByZXR1cm4gKHNwaWxsRm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9
PSBEYXRhRm9ybWF0SlNJbnRlZ2VyOwotCi0gICAgQVNTRVJUKGlzQ29uc3RhbnQobm9kZUluZGV4
KSk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpbmZvLmlzSlNJbnRlZ2VyKCk7CiB9
CiAKIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk51bWVyaWMoTm9kZUluZGV4IG5vZGVJ
bmRleCkKQEAgLTM4NiwzMyArMzc3LDEyIEBAIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93
bk51bWVyaWMoTm8KICAgICAKICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlv
bkluZm9bbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKV07CiAKLSAgICBEYXRhRm9ybWF0IHJlZ2lzdGVy
Rm9ybWF0ID0gaW5mby5yZWdpc3RlckZvcm1hdCgpOwotICAgIGlmIChyZWdpc3RlckZvcm1hdCAh
PSBEYXRhRm9ybWF0Tm9uZSkKLSAgICAgICAgcmV0dXJuIChyZWdpc3RlckZvcm1hdCB8IERhdGFG
b3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTSW50ZWdlcgotICAgICAgICAgICAgfHwgKHJlZ2lzdGVy
Rm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNEb3VibGU7Ci0KLSAgICBEYXRh
Rm9ybWF0IHNwaWxsRm9ybWF0ID0gaW5mby5zcGlsbEZvcm1hdCgpOwotICAgIGlmIChzcGlsbEZv
cm1hdCAhPSBEYXRhRm9ybWF0Tm9uZSkKLSAgICAgICAgcmV0dXJuIChzcGlsbEZvcm1hdCB8IERh
dGFGb3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTSW50ZWdlcgotICAgICAgICAgICAgfHwgKHNwaWxs
Rm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNEb3VibGU7Ci0KLSAgICBBU1NF
UlQoaXNDb25zdGFudChub2RlSW5kZXgpKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IGluZm8uaXNKU0ludGVnZXIoKSB8fCBpbmZvLmlzSlNEb3VibGUoKTsKIH0KIAogYm9vbCBKSVRD
b2RlR2VuZXJhdG9yOjppc0tub3duQ2VsbChOb2RlSW5kZXggbm9kZUluZGV4KQogewotICAgIEdl
bmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1ttX2ppdC5ncmFwaCgpW25vZGVJ
bmRleF0udmlydHVhbFJlZ2lzdGVyKCldOwotICAgIAotICAgIERhdGFGb3JtYXQgcmVnaXN0ZXJG
b3JtYXQgPSBpbmZvLnJlZ2lzdGVyRm9ybWF0KCk7Ci0gICAgaWYgKHJlZ2lzdGVyRm9ybWF0ICE9
IERhdGFGb3JtYXROb25lKQotICAgICAgICByZXR1cm4gKHJlZ2lzdGVyRm9ybWF0IHwgRGF0YUZv
cm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNDZWxsOwotICAgIAotICAgIERhdGFGb3JtYXQgc3BpbGxG
b3JtYXQgPSBpbmZvLnNwaWxsRm9ybWF0KCk7Ci0gICAgaWYgKHNwaWxsRm9ybWF0ICE9IERhdGFG
b3JtYXROb25lKQotICAgICAgICByZXR1cm4gKHNwaWxsRm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9
PSBEYXRhRm9ybWF0SlNDZWxsOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4g
bV9nZW5lcmF0aW9uSW5mb1ttX2ppdC5ncmFwaCgpW25vZGVJbmRleF0udmlydHVhbFJlZ2lzdGVy
KCldLmlzSlNDZWxsKCk7CiB9CiAKIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk5vdElu
dGVnZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKQEAgLTQyMSw5ICszOTEsNyBAQCBib29sIEpJVENv
ZGVHZW5lcmF0b3I6OmlzS25vd25Ob3RJbnRlZ2VyCiAgICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1
YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CiAgICAgR2VuZXJhdGlvbkluZm8m
IGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07CiAgICAgCi0gICAgcmV0
dXJuIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRK
U0RvdWJsZQotICAgICAgICB8fCAoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZvcm1hdEpT
KSA9PSBEYXRhRm9ybWF0SlNDZWxsCi0gICAgICAgIHx8IChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkg
fCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0Jvb2xlYW4KKyAgICByZXR1cm4gaW5mby5p
c0pTRG91YmxlKCkgfHwgaW5mby5pc0pTQ2VsbCgpIHx8IGluZm8uaXNKU0Jvb2xlYW4oKQogICAg
ICAgICB8fCAobm9kZS5pc0NvbnN0YW50KCkgJiYgIXZhbHVlT2ZKU0NvbnN0YW50KG5vZGVJbmRl
eCkuaXNJbnQzMigpKTsKIH0KIApAQCAtNDM5LDggKzQwNyw3IEBAIGJvb2wgSklUQ29kZUdlbmVy
YXRvcjo6aXNLbm93bkJvb2xlYW4oTm8KICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lz
dGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsKICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9
IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lzdGVyXTsKICAgICAKLSAgICByZXR1cm4gKGlu
Zm8ucmVnaXN0ZXJGb3JtYXQoKSB8IERhdGFGb3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTQm9vbGVh
bgotICAgICAgICB8fCAoaW5mby5zcGlsbEZvcm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRh
Rm9ybWF0SlNCb29sZWFuOworICAgIHJldHVybiBpbmZvLmlzSlNCb29sZWFuKCk7CiB9CiAKIHRl
bXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJKHJldmlzaW9uIDk1MDM2KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQwNyw3ICs0MDcsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIG1faml0LnN0
b3JlUHRyKHJlZywgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Ioc3BpbGxNZSkpOwogICAgICAgICBp
bmZvLnNwaWxsKChEYXRhRm9ybWF0KShzcGlsbEZvcm1hdCB8IERhdGFGb3JtYXRKUykpOwogICAg
IH0KLQorICAgIAogICAgIGJvb2wgaXNLbm93bkludGVnZXIoTm9kZUluZGV4KTsKICAgICBib29s
IGlzS25vd25OdW1lcmljKE5vZGVJbmRleCk7CiAgICAgYm9vbCBpc0tub3duQ2VsbChOb2RlSW5k
ZXgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb25TcGVjdWxhdGl2ZUpJ
VC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb25TcGVj
dWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDk1MDM2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdOb25TcGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU3Nyw3ICs1
NzcsNyBAQCB2b2lkIE5vblNwZWN1bGF0aXZlSklUOjpjb21waWxlKFNwZWN1bGF0CiAgICAgICAg
IH0KIAogICAgICAgICBHZW5lcmF0aW9uSW5mbyYgY2hpbGRJbmZvID0gbV9nZW5lcmF0aW9uSW5m
b1ttX2ppdC5ncmFwaCgpW25vZGUuY2hpbGQxKCldLnZpcnR1YWxSZWdpc3RlcigpXTsKLSAgICAg
ICAgaWYgKChjaGlsZEluZm8ucmVnaXN0ZXJGb3JtYXQoKSB8IERhdGFGb3JtYXRKUykgPT0gRGF0
YUZvcm1hdEpTRG91YmxlKSB7CisgICAgICAgIGlmIChpc0pTRG91YmxlKGNoaWxkSW5mby5yZWdp
c3RlckZvcm1hdCgpKSkgewogICAgICAgICAgICAgRG91YmxlT3BlcmFuZCBvcDEodGhpcywgbm9k
ZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOwogICAg
ICAgICAgICAgRlBSUmVnIGZwciA9IG9wMS5mcHIoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHJldmlzaW9uIDk1MDM2KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zNTEsOCArMzUxLDcgQEAgcHJpdmF0ZToKICAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHZp
cnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CiAgICAgICAgIEdlbmVyYXRp
b25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwogICAgICAg
ICAKLSAgICAgICAgcmV0dXJuIChpbmZvLnJlZ2lzdGVyRm9ybWF0KCkgfCBEYXRhRm9ybWF0SlMp
ID09IERhdGFGb3JtYXRKU0ludGVnZXIKLSAgICAgICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0
KCkgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0ludGVnZXI7CisgICAgICAgIHJldHVy
biBpbmZvLmlzSlNJbnRlZ2VyKCk7CiAgICAgfQogICAgIAogICAgIGJvb2wgc2hvdWxkU3BlY3Vs
YXRlSW50ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4KQpAQCAtMzY1LDE1ICszNjQsMTQgQEAgcHJp
dmF0ZToKICAgICAgICAgCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KKyAgICAKICAg
ICBib29sIHNob3VsZFNwZWN1bGF0ZURvdWJsZShOb2RlSW5kZXggbm9kZUluZGV4KQogICAgIHsK
ICAgICAgICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKICAgICAgICAg
VmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7
CiAgICAgICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFs
UmVnaXN0ZXJdOwogCi0gICAgICAgIGlmICgoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZv
cm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNEb3VibGUKLSAgICAgICAgICAgIHx8IChpbmZvLnNwaWxs
Rm9ybWF0KCkgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0RvdWJsZSkKKyAgICAgICAg
aWYgKGluZm8uaXNKU0RvdWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
IAogICAgICAgICBpZiAoaXNEb3VibGVQcmVkaWN0aW9uKG1faml0LmdyYXBoKCkuZ2V0UHJlZGlj
dGlvbihub2RlKSkpCkBAIC0zODIsOSArMzgwLDI0IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICB9CiAgICAgCisgICAgYm9vbCBzaG91bGROb3RTcGVjdWxhdGVJbnRlZ2Vy
KE5vZGVJbmRleCBub2RlSW5kZXgpCisgICAgeworICAgICAgICBOb2RlJiBub2RlID0gbV9qaXQu
Z3JhcGgoKVtub2RlSW5kZXhdOworICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lz
dGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsKKyAgICAgICAgR2VuZXJhdGlvbkluZm8mIGlu
Zm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdpc3Rlcl07CisKKyAgICAgICAgaWYgKGlu
Zm8uaXNKU0RvdWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAg
ICAgICBpZiAobV9qaXQuZ3JhcGgoKS5nZXRQcmVkaWN0aW9uKG5vZGUpICYgUHJlZGljdERvdWJs
ZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKyAgICAKICAgICBib29sIHNob3VsZFNwZWN1bGF0ZUludGVnZXIoTm9kZUlu
ZGV4IG9wMSwgTm9kZUluZGV4IG9wMikKICAgICB7Ci0gICAgICAgIHJldHVybiAhKHNob3VsZFNw
ZWN1bGF0ZURvdWJsZShvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZURvdWJsZShvcDIpKSAmJiAoc2hv
dWxkU3BlY3VsYXRlSW50ZWdlcihvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3AyKSk7
CisgICAgICAgIHJldHVybiAhKHNob3VsZE5vdFNwZWN1bGF0ZUludGVnZXIob3AxKSB8fCBzaG91
bGROb3RTcGVjdWxhdGVJbnRlZ2VyKG9wMikpICYmIChzaG91bGRTcGVjdWxhdGVJbnRlZ2VyKG9w
MSkgfHwgc2hvdWxkU3BlY3VsYXRlSW50ZWdlcihvcDIpKTsKICAgICB9CiAKICAgICBib29sIGNv
bXBhcmUoTm9kZSYsIE1hY3JvQXNzZW1ibGVyOjpSZWxhdGlvbmFsQ29uZGl0aW9uLCBNYWNyb0Fz
c2VtYmxlcjo6RG91YmxlQ29uZGl0aW9uLCBaX0RGR09wZXJhdGlvbl9FSkopOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmgJKHdvcmtpbmcgY29weSkKQEAgLTk2NSw3ICs5
NjUsNyBAQAogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChFTkFCTEVfVElFUkVEX0NPTVBJTEFUSU9O
KQotI2RlZmluZSBFTkFCTEVfVElFUkVEX0NPTVBJTEFUSU9OIDAKKyNkZWZpbmUgRU5BQkxFX1RJ
RVJFRF9DT01QSUxBVElPTiAxCiAjZW5kaWYKIAogLyogQ3VycmVudGx5IG9ubHkgaW1wbGVtZW50
ZWQgZm9yIEpTVkFMVUU2NCwgb25seSB0ZXN0ZWQgb24gUExBVEZPUk0oTUFDKSAqLwo=
</data>
<flag name="review"
          id="103855"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107234</attachid>
            <date>2011-09-13 14:49:30 -0700</date>
            <delta_ts>2011-09-13 17:01:49 -0700</delta_ts>
            <desc>the patch - fix review, and hardened shouldSpeculateInteger() even more</desc>
            <filename>carefulnumber_patch_3.diff</filename>
            <type>text/plain</type>
            <size>27524</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTUwNDQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzMgQEAK
KzIwMTEtMDktMTMgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBT
cGVjdWxhdGl2ZUpJVDo6c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihOb2RlSW5kZXgsIE5vZGVJbmRl
eCkgc2hvdWxkCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBlaXRoZXIgbm9kZSBjYW4gYmUgZG91
YmxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAg
ICAgVGhpcyBpcyBhIDE3JSBzcGVlZC11cCBvbiAzYi1jdWJlLgorICAgICAgICAKKyAgICAgICAg
VGhpcyByZXF1aXJlZCBhbGxvd2luZyB1cyB0byBjaGVjayBpZiBhIGNvbnN0YW50IGlzIGRvdWJs
ZSBidXQgbm90CisgICAgICAgIGludGVnZXIsIGFuZCBtYWtpbmcgdGhlIHNob3VsZFNwZWN1bGF0
ZUludGVnZXIoKSBjaGVjayB0ZXN0IGZvcgorICAgICAgICBhbnkgaGludHMgb2YgZG91Ymx5LW5l
c3MgaW4gaXRzIG9wZXJhbmRzLiBUaGlzIGFsc28gcmVxdWlyZWQKKyAgICAgICAgY2hhbmdpbmcg
c29tZSB0ZXJtaW5vbG9neTogcHJldmlvdXNseSAiaXNEb3VibGUiIG9mdGVuIG1lYW50CisgICAg
ICAgICJpc0RvdWJsZSBvciBpc0ludDMyIi4gIE5vdyAiaXNEb3VibGUiIG1lYW5zIGV4YWN0bHkg
d2hhdCB0aGUgbmFtZQorICAgICAgICBzdWdnZXN0cywgYW5kICJpc051bWJlciIgbWVhbnMgImlz
RG91YmxlIG9yIGlzSW50MzIiLgorCisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNw
cDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6dG9OdW1iZXIpOgorICAgICAg
ICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAgKiBkZmcv
REZHR2VuZXJhdGlvbkluZm8uaDoKKyAgICAgICAgKEpTQzo6REZHOjppc0pTRm9ybWF0KToKKyAg
ICAgICAgKEpTQzo6REZHOjppc0pTSW50ZWdlcik6CisgICAgICAgIChKU0M6OkRGRzo6aXNKU0Rv
dWJsZSk6CisgICAgICAgIChKU0M6OkRGRzo6aXNKU0NlbGwpOgorICAgICAgICAoSlNDOjpERkc6
OmlzSlNCb29sZWFuKToKKyAgICAgICAgKEpTQzo6REZHOjpHZW5lcmF0aW9uSW5mbzo6aXNKU0Zv
cm1hdCk6CisgICAgICAgIChKU0M6OkRGRzo6R2VuZXJhdGlvbkluZm86OmlzSlNJbnRlZ2VyKToK
KyAgICAgICAgKEpTQzo6REZHOjpHZW5lcmF0aW9uSW5mbzo6aXNKU0RvdWJsZSk6CisgICAgICAg
IChKU0M6OkRGRzo6R2VuZXJhdGlvbkluZm86OmlzSlNDZWxsKToKKyAgICAgICAgKEpTQzo6REZH
OjpHZW5lcmF0aW9uSW5mbzo6aXNKU0Jvb2xlYW4pOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5o
OgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjppc051bWJlckNvbnN0YW50KToKKyAgICAgICAg
KEpTQzo6REZHOjpHcmFwaDo6dmFsdWVPZk51bWJlckNvbnN0YW50KToKKyAgICAgICAgKiBkZmcv
REZHSklUQ29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVy
YXRvcjo6ZmlsbEludGVnZXIpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6
OmZpbGxEb3VibGUpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OmZpbGxK
U1ZhbHVlKToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duSW50
ZWdlcik6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk51bWVy
aWMpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25DZWxsKToK
KyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duTm90SW50ZWdlcik6
CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bkJvb2xlYW4pOgor
ICAgICAgICAqIGRmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChKU0M6OkRGRzo6
SklUQ29kZUdlbmVyYXRvcjo6c2lsZW50RmlsbEZQUik6CisgICAgICAgIChKU0M6OkRGRzo6SklU
Q29kZUdlbmVyYXRvcjo6aXNOdW1iZXJDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6SklU
Q29kZUdlbmVyYXRvcjo6dmFsdWVPZk51bWJlckNvbnN0YW50KToKKyAgICAgICAgKEpTQzo6REZH
OjpKSVRDb2RlR2VuZXJhdG9yOjppbml0Q29uc3RhbnRJbmZvKToKKyAgICAgICAgKiBkZmcvREZH
SklUQ29tcGlsZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpmaWxsTnVt
ZXJpY1RvRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6ZmlsbFRvSlMp
OgorICAgICAgICAqIGRmZy9ERkdKSVRDb21waWxlci5oOgorICAgICAgICAoSlNDOjpERkc6OkpJ
VENvbXBpbGVyOjppc051bWJlckNvbnN0YW50KToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21w
aWxlcjo6dmFsdWVPZk51bWJlckNvbnN0YW50KToKKyAgICAgICAgKiBkZmcvREZHTm9kZS5oOgor
ICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OmlzRG91YmxlQ29uc3RhbnQpOgorICAgICAgICAoSlND
OjpERkc6Ok5vZGU6OmlzTnVtYmVyQ29uc3RhbnQpOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6
OnZhbHVlT2ZOdW1iZXJDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6Tm9kZTo6aGFzTnVt
YmVyUmVzdWx0KToKKyAgICAgICAgKiBkZmcvREZHTm9uU3BlY3VsYXRpdmVKSVQuY3BwOgorICAg
ICAgICAoSlNDOjpERkc6Ok5vblNwZWN1bGF0aXZlSklUOjprbm93bkNvbnN0YW50QXJpdGhPcCk6
CisgICAgICAgIChKU0M6OkRGRzo6Tm9uU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAg
ICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3Vs
YXRpdmVKSVQ6OmZpbGxTcGVjdWxhdGVEb3VibGUpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxh
dGl2ZUpJVC5oOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjppc0ludGVnZXIp
OgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpzaG91bGRTcGVjdWxhdGVEb3Vi
bGUpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpzaG91bGROb3RTcGVjdWxh
dGVJbnRlZ2VyKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6c2hvdWxkU3Bl
Y3VsYXRlSW50ZWdlcik6CisKIDIwMTEtMDktMTMgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQu
b3JnPgogCiAgICAgICAgIFJlbW92ZSBFTkFCTEVfU1ZHX0ZPUkVJR05fT0JKRUNUIGFzIGl0IGlz
IGEgcmVxdWlyZWQgcGFydCBvZiBIVE1MNQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlzaW9uIDk1MDM2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTIxNiw3ICsyMTYsNyBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAgTm9kZSYgbm9kZSA9
IG1fZ3JhcGhbaW5kZXhdOwogCi0gICAgICAgIGlmIChub2RlLmhhc0RvdWJsZVJlc3VsdCgpIHx8
IG5vZGUuaGFzSW50MzJSZXN1bHQoKSkKKyAgICAgICAgaWYgKG5vZGUuaGFzTnVtYmVyUmVzdWx0
KCkpCiAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAKICAgICAgICAgaWYgKG5vZGUub3AgPT0g
SlNDb25zdGFudCkgewpAQCAtNzU5LDcgKzc1OSw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBh
cnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgICAgICB3ZWFrbHlQcmVkaWN0SW50MzIob3Ax
KTsKICAgICAgICAgICAgICAgICB3ZWFrbHlQcmVkaWN0SW50MzIob3AyKTsKICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGlmIChtX2dyYXBoW29wMV0uaGFzTnVtZXJpY1Jlc3VsdCgpICYmIG1f
Z3JhcGhbb3AyXS5oYXNOdW1lcmljUmVzdWx0KCkpCisgICAgICAgICAgICBpZiAobV9ncmFwaFtv
cDFdLmhhc051bWJlclJlc3VsdCgpICYmIG1fZ3JhcGhbb3AyXS5oYXNOdW1iZXJSZXN1bHQoKSkK
ICAgICAgICAgICAgICAgICBzZXQoY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZCwgYWRk
VG9HcmFwaChBcml0aEFkZCwgdG9OdW1iZXIob3AxKSwgdG9OdW1iZXIob3AyKSkpOwogICAgICAg
ICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHNldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5v
cGVyYW5kLCBhZGRUb0dyYXBoKFZhbHVlQWRkLCBvcDEsIG9wMikpOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdHZW5lcmF0aW9uSW5mby5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR2VuZXJhdGlvbkluZm8uaAkocmV2aXNpb24gOTUwMzYp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dlbmVyYXRpb25JbmZvLmgJKHdvcmtp
bmcgY29weSkKQEAgLTExNyw2ICsxMTcsMzIgQEAgaW5saW5lIGJvb2wgbmVlZERhdGFGb3JtYXRD
b252ZXJzaW9uKERhdAogICAgIHJldHVybiB0cnVlOwogfQogCitpbmxpbmUgYm9vbCBpc0pTRm9y
bWF0KERhdGFGb3JtYXQgZm9ybWF0LCBEYXRhRm9ybWF0IGV4cGVjdGVkRm9ybWF0KQoreworICAg
IEFTU0VSVChleHBlY3RlZEZvcm1hdCAmIERhdGFGb3JtYXRKUyk7CisgICAgcmV0dXJuIChmb3Jt
YXQgfCBEYXRhRm9ybWF0SlMpID09IGV4cGVjdGVkRm9ybWF0OworfQorCitpbmxpbmUgYm9vbCBp
c0pTSW50ZWdlcihEYXRhRm9ybWF0IGZvcm1hdCkKK3sKKyAgICByZXR1cm4gaXNKU0Zvcm1hdChm
b3JtYXQsIERhdGFGb3JtYXRKU0ludGVnZXIpOworfQorCitpbmxpbmUgYm9vbCBpc0pTRG91Ymxl
KERhdGFGb3JtYXQgZm9ybWF0KQoreworICAgIHJldHVybiBpc0pTRm9ybWF0KGZvcm1hdCwgRGF0
YUZvcm1hdEpTRG91YmxlKTsKK30KKworaW5saW5lIGJvb2wgaXNKU0NlbGwoRGF0YUZvcm1hdCBm
b3JtYXQpCit7CisgICAgcmV0dXJuIGlzSlNGb3JtYXQoZm9ybWF0LCBEYXRhRm9ybWF0SlNDZWxs
KTsKK30KKworaW5saW5lIGJvb2wgaXNKU0Jvb2xlYW4oRGF0YUZvcm1hdCBmb3JtYXQpCit7Cisg
ICAgcmV0dXJuIGlzSlNGb3JtYXQoZm9ybWF0LCBEYXRhRm9ybWF0SlNCb29sZWFuKTsKK30KKwog
Ly8gPT09IEdlbmVyYXRpb25JbmZvID09PQogLy8KIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0
cmFjayB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBsaXZlIHZhbHVlcyBkdXJpbmcgY29kZSBnZW5l
cmF0aW9uLgpAQCAtMjA4LDYgKzIzNCwzMSBAQCBwdWJsaWM6CiAgICAgRGF0YUZvcm1hdCByZWdp
c3RlckZvcm1hdCgpIHsgcmV0dXJuIG1fcmVnaXN0ZXJGb3JtYXQ7IH0KICAgICAvLyBHZXQgdGhl
IGZvcm1hdCBvZiB0aGUgdmFsdWUgYXMgaXQgaXMgc3BpbGxlZCBpbiB0aGUgUmVnaXN0ZXJGaWxl
IChvciAnbm9uZScpLgogICAgIERhdGFGb3JtYXQgc3BpbGxGb3JtYXQoKSB7IHJldHVybiBtX3Nw
aWxsRm9ybWF0OyB9CisgICAgCisgICAgYm9vbCBpc0pTRm9ybWF0KERhdGFGb3JtYXQgZXhwZWN0
ZWRGb3JtYXQpCisgICAgeworICAgICAgICByZXR1cm4gREZHOjppc0pTRm9ybWF0KHJlZ2lzdGVy
Rm9ybWF0KCksIGV4cGVjdGVkRm9ybWF0KSB8fCBERkc6OmlzSlNGb3JtYXQoc3BpbGxGb3JtYXQo
KSwgZXhwZWN0ZWRGb3JtYXQpOworICAgIH0KKyAgICAKKyAgICBib29sIGlzSlNJbnRlZ2VyKCkK
KyAgICB7CisgICAgICAgIHJldHVybiBpc0pTRm9ybWF0KERhdGFGb3JtYXRKU0ludGVnZXIpOwor
ICAgIH0KKyAgICAKKyAgICBib29sIGlzSlNEb3VibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGlzSlNGb3JtYXQoRGF0YUZvcm1hdEpTRG91YmxlKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBp
c0pTQ2VsbCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNKU0Zvcm1hdChEYXRhRm9ybWF0SlND
ZWxsKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc0pTQm9vbGVhbigpCisgICAgeworICAgICAg
ICByZXR1cm4gaXNKU0Zvcm1hdChEYXRhRm9ybWF0SlNCb29sZWFuKTsKKyAgICB9CiAKICAgICAv
LyBHZXQgdGhlIG1hY2hpbmUgcmVzaXN0ZXIgY3VycmVudGx5IGhvbGRpbmcgdGhlIHZhbHVlLgog
ICAgIEdQUlJlZyBncHIoKSB7IEFTU0VSVChtX3JlZ2lzdGVyRm9ybWF0ICYmIG1fcmVnaXN0ZXJG
b3JtYXQgIT0gRGF0YUZvcm1hdERvdWJsZSk7IHJldHVybiB1LmdwcjsgfQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTIxNCw2ICsyMTQs
MTAgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIGF0KG5vZGVJbmRleCkuaXNEb3Vi
bGVDb25zdGFudChjb2RlQmxvY2spOwogICAgIH0KKyAgICBib29sIGlzTnVtYmVyQ29uc3RhbnQo
Q29kZUJsb2NrKiBjb2RlQmxvY2ssIE5vZGVJbmRleCBub2RlSW5kZXgpCisgICAgeworICAgICAg
ICByZXR1cm4gYXQobm9kZUluZGV4KS5pc051bWJlckNvbnN0YW50KGNvZGVCbG9jayk7CisgICAg
fQogICAgIGJvb2wgaXNCb29sZWFuQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxvY2ssIE5vZGVJ
bmRleCBub2RlSW5kZXgpCiAgICAgewogICAgICAgICByZXR1cm4gYXQobm9kZUluZGV4KS5pc0Jv
b2xlYW5Db25zdGFudChjb2RlQmxvY2spOwpAQCAtMjI3LDkgKzIzMSw5IEBAIHB1YmxpYzoKICAg
ICB7CiAgICAgICAgIHJldHVybiBhdChub2RlSW5kZXgpLnZhbHVlT2ZJbnQzMkNvbnN0YW50KGNv
ZGVCbG9jayk7CiAgICAgfQotICAgIGRvdWJsZSB2YWx1ZU9mRG91YmxlQ29uc3RhbnQoQ29kZUJs
b2NrKiBjb2RlQmxvY2ssIE5vZGVJbmRleCBub2RlSW5kZXgpCisgICAgZG91YmxlIHZhbHVlT2ZO
dW1iZXJDb25zdGFudChDb2RlQmxvY2sqIGNvZGVCbG9jaywgTm9kZUluZGV4IG5vZGVJbmRleCkK
ICAgICB7Ci0gICAgICAgIHJldHVybiBhdChub2RlSW5kZXgpLnZhbHVlT2ZEb3VibGVDb25zdGFu
dChjb2RlQmxvY2spOworICAgICAgICByZXR1cm4gYXQobm9kZUluZGV4KS52YWx1ZU9mTnVtYmVy
Q29uc3RhbnQoY29kZUJsb2NrKTsKICAgICB9CiAgICAgYm9vbCB2YWx1ZU9mQm9vbGVhbkNvbnN0
YW50KENvZGVCbG9jayogY29kZUJsb2NrLCBOb2RlSW5kZXggbm9kZUluZGV4KQogICAgIHsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9y
LmNwcAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJ
VENvZGVHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OSw4ICs1OSw4IEBAIEdQUlJl
ZyBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSW50ZWdlcihOb2QKICAgICAgICAgICAgICAgICByZXR1
cm5Gb3JtYXQgPSBEYXRhRm9ybWF0SW50ZWdlcjsKICAgICAgICAgICAgICAgICByZXR1cm4gZ3By
OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzRG91YmxlQ29uc3RhbnQobm9kZUlu
ZGV4KSkgewotICAgICAgICAgICAgICAgIEpTVmFsdWUganNWYWx1ZSA9IGpzTnVtYmVyKHZhbHVl
T2ZEb3VibGVDb25zdGFudChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChpc051bWJlckNv
bnN0YW50KG5vZGVJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBKU1ZhbHVlIGpzVmFsdWUgPSBq
c051bWJlcih2YWx1ZU9mTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSk7CiAgICAgICAgICAgICAg
ICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc1Zh
bHVlKSksIGdwcik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFTU0VS
VChpc0pTQ29uc3RhbnQobm9kZUluZGV4KSk7CkBAIC0xMzAsOSArMTMwLDkgQEAgRlBSUmVnIEpJ
VENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUoTm9kZQogICAgICAgICAgICAgICAgIG1fZ3Bycy5y
ZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJDb25zdGFudCk7CiAgICAgICAg
ICAgICAgICAgaW5mby5maWxsSW50ZWdlcihncHIpOwogICAgICAgICAgICAgICAgIHVubG9jayhn
cHIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RvdWJsZUNvbnN0YW50KG5vZGVJbmRleCkp
IHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXJDb25zdGFudChub2RlSW5kZXgpKSB7
CiAgICAgICAgICAgICAgICAgRlBSUmVnIGZwciA9IGZwckFsbG9jYXRlKCk7Ci0gICAgICAgICAg
ICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8
dm9pZCo+KHJlaW50ZXJwcmV0RG91YmxlVG9JbnRwdHIodmFsdWVPZkRvdWJsZUNvbnN0YW50KG5v
ZGVJbmRleCkpKSksIGdwcik7CisgICAgICAgICAgICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2Vt
Ymxlcjo6SW1tUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0RG91YmxlVG9J
bnRwdHIodmFsdWVPZk51bWJlckNvbnN0YW50KG5vZGVJbmRleCkpKSksIGdwcik7CiAgICAgICAg
ICAgICAgICAgbV9qaXQubW92ZVB0clRvRG91YmxlKGdwciwgZnByKTsKICAgICAgICAgICAgICAg
ICB1bmxvY2soZ3ByKTsKIApAQCAtMjUzLDkgKzI1Myw5IEBAIEdQUlJlZyBKSVRDb2RlR2VuZXJh
dG9yOjpmaWxsSlNWYWx1ZShOb2QKICAgICAgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdw
ciwgRGF0YUZvcm1hdEpTSW50ZWdlcik7CiAgICAgICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVl
ID0ganNOdW1iZXIodmFsdWVPZkludDMyQ29uc3RhbnQobm9kZUluZGV4KSk7CiAgICAgICAgICAg
ICAgICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShq
c1ZhbHVlKSksIGdwcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRG91YmxlQ29uc3RhbnQo
bm9kZUluZGV4KSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlckNvbnN0YW50KG5v
ZGVJbmRleCkpIHsKICAgICAgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgRGF0YUZv
cm1hdEpTRG91YmxlKTsKLSAgICAgICAgICAgICAgICBKU1ZhbHVlIGpzVmFsdWUoSlNWYWx1ZTo6
RW5jb2RlQXNEb3VibGUsIHZhbHVlT2ZEb3VibGVDb25zdGFudChub2RlSW5kZXgpKTsKKyAgICAg
ICAgICAgICAgICBKU1ZhbHVlIGpzVmFsdWUoSlNWYWx1ZTo6RW5jb2RlQXNEb3VibGUsIHZhbHVl
T2ZOdW1iZXJDb25zdGFudChub2RlSW5kZXgpKTsKICAgICAgICAgICAgICAgICBtX2ppdC5tb3Zl
KE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzVmFsdWUpKSwgZ3ByKTsK
ICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKGlzSlNDb25zdGFu
dChub2RlSW5kZXgpKTsKQEAgLTM2Miw1NyArMzYyLDI3IEBAIGJvb2wgSklUQ29kZUdlbmVyYXRv
cjo6aXNLbm93bkludGVnZXIoTm8KICAgICAKICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1f
Z2VuZXJhdGlvbkluZm9bbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKV07CiAKLSAgICBEYXRhRm9ybWF0
IHJlZ2lzdGVyRm9ybWF0ID0gaW5mby5yZWdpc3RlckZvcm1hdCgpOwotICAgIGlmIChyZWdpc3Rl
ckZvcm1hdCAhPSBEYXRhRm9ybWF0Tm9uZSkKLSAgICAgICAgcmV0dXJuIChyZWdpc3RlckZvcm1h
dCB8IERhdGFGb3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTSW50ZWdlcjsKLQotICAgIERhdGFGb3Jt
YXQgc3BpbGxGb3JtYXQgPSBpbmZvLnNwaWxsRm9ybWF0KCk7Ci0gICAgaWYgKHNwaWxsRm9ybWF0
ICE9IERhdGFGb3JtYXROb25lKQotICAgICAgICByZXR1cm4gKHNwaWxsRm9ybWF0IHwgRGF0YUZv
cm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNJbnRlZ2VyOwotCi0gICAgQVNTRVJUKGlzQ29uc3RhbnQo
bm9kZUluZGV4KSk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpbmZvLmlzSlNJbnRl
Z2VyKCk7CiB9CiAKIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk51bWVyaWMoTm9kZUlu
ZGV4IG5vZGVJbmRleCkKIHsKLSAgICBpZiAoaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCkgfHwg
aXNEb3VibGVDb25zdGFudChub2RlSW5kZXgpKQorICAgIGlmIChpc0ludDMyQ29uc3RhbnQobm9k
ZUluZGV4KSB8fCBpc051bWJlckNvbnN0YW50KG5vZGVJbmRleCkpCiAgICAgICAgIHJldHVybiB0
cnVlOwogCiAgICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKICAgICAK
LSAgICBpZiAobm9kZS5oYXNOdW1lcmljUmVzdWx0KCkpCisgICAgaWYgKG5vZGUuaGFzTnVtYmVy
UmVzdWx0KCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIAogICAgIEdlbmVyYXRpb25JbmZv
JiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1tub2RlLnZpcnR1YWxSZWdpc3RlcigpXTsKIAotICAg
IERhdGFGb3JtYXQgcmVnaXN0ZXJGb3JtYXQgPSBpbmZvLnJlZ2lzdGVyRm9ybWF0KCk7Ci0gICAg
aWYgKHJlZ2lzdGVyRm9ybWF0ICE9IERhdGFGb3JtYXROb25lKQotICAgICAgICByZXR1cm4gKHJl
Z2lzdGVyRm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNJbnRlZ2VyCi0gICAg
ICAgICAgICB8fCAocmVnaXN0ZXJGb3JtYXQgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRK
U0RvdWJsZTsKLQotICAgIERhdGFGb3JtYXQgc3BpbGxGb3JtYXQgPSBpbmZvLnNwaWxsRm9ybWF0
KCk7Ci0gICAgaWYgKHNwaWxsRm9ybWF0ICE9IERhdGFGb3JtYXROb25lKQotICAgICAgICByZXR1
cm4gKHNwaWxsRm9ybWF0IHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNJbnRlZ2VyCi0g
ICAgICAgICAgICB8fCAoc3BpbGxGb3JtYXQgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRK
U0RvdWJsZTsKLQotICAgIEFTU0VSVChpc0NvbnN0YW50KG5vZGVJbmRleCkpOwotICAgIHJldHVy
biBmYWxzZTsKKyAgICByZXR1cm4gaW5mby5pc0pTSW50ZWdlcigpIHx8IGluZm8uaXNKU0RvdWJs
ZSgpOwogfQogCiBib29sIEpJVENvZGVHZW5lcmF0b3I6OmlzS25vd25DZWxsKE5vZGVJbmRleCBu
b2RlSW5kZXgpCiB7Ci0gICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZv
W21faml0LmdyYXBoKClbbm9kZUluZGV4XS52aXJ0dWFsUmVnaXN0ZXIoKV07Ci0gICAgCi0gICAg
RGF0YUZvcm1hdCByZWdpc3RlckZvcm1hdCA9IGluZm8ucmVnaXN0ZXJGb3JtYXQoKTsKLSAgICBp
ZiAocmVnaXN0ZXJGb3JtYXQgIT0gRGF0YUZvcm1hdE5vbmUpCi0gICAgICAgIHJldHVybiAocmVn
aXN0ZXJGb3JtYXQgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0NlbGw7Ci0gICAgCi0g
ICAgRGF0YUZvcm1hdCBzcGlsbEZvcm1hdCA9IGluZm8uc3BpbGxGb3JtYXQoKTsKLSAgICBpZiAo
c3BpbGxGb3JtYXQgIT0gRGF0YUZvcm1hdE5vbmUpCi0gICAgICAgIHJldHVybiAoc3BpbGxGb3Jt
YXQgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0NlbGw7Ci0gICAgCi0gICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiBtX2dlbmVyYXRpb25JbmZvW21faml0LmdyYXBoKClbbm9kZUlu
ZGV4XS52aXJ0dWFsUmVnaXN0ZXIoKV0uaXNKU0NlbGwoKTsKIH0KIAogYm9vbCBKSVRDb2RlR2Vu
ZXJhdG9yOjppc0tub3duTm90SW50ZWdlcihOb2RlSW5kZXggbm9kZUluZGV4KQpAQCAtNDIxLDkg
KzM5MSw3IEBAIGJvb2wgSklUQ29kZUdlbmVyYXRvcjo6aXNLbm93bk5vdEludGVnZXIKICAgICBW
aXJ0dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsK
ICAgICBHZW5lcmF0aW9uSW5mbyYgaW5mbyA9IG1fZ2VuZXJhdGlvbkluZm9bdmlydHVhbFJlZ2lz
dGVyXTsKICAgICAKLSAgICByZXR1cm4gKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSB8IERhdGFGb3Jt
YXRKUykgPT0gRGF0YUZvcm1hdEpTRG91YmxlCi0gICAgICAgIHx8IChpbmZvLnJlZ2lzdGVyRm9y
bWF0KCkgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0NlbGwKLSAgICAgICAgfHwgKGlu
Zm8ucmVnaXN0ZXJGb3JtYXQoKSB8IERhdGFGb3JtYXRKUykgPT0gRGF0YUZvcm1hdEpTQm9vbGVh
bgorICAgIHJldHVybiBpbmZvLmlzSlNEb3VibGUoKSB8fCBpbmZvLmlzSlNDZWxsKCkgfHwgaW5m
by5pc0pTQm9vbGVhbigpCiAgICAgICAgIHx8IChub2RlLmlzQ29uc3RhbnQoKSAmJiAhdmFsdWVP
ZkpTQ29uc3RhbnQobm9kZUluZGV4KS5pc0ludDMyKCkpOwogfQogCkBAIC00MzksOCArNDA3LDcg
QEAgYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjppc0tub3duQm9vbGVhbihObwogICAgIFZpcnR1YWxS
ZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIgPSBub2RlLnZpcnR1YWxSZWdpc3RlcigpOwogICAgIEdl
bmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwog
ICAgIAotICAgIHJldHVybiAoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9
PSBEYXRhRm9ybWF0SlNCb29sZWFuCi0gICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0KCkgfCBE
YXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0Jvb2xlYW47CisgICAgcmV0dXJuIGluZm8uaXNK
U0Jvb2xlYW4oKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3Iu
aAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENv
ZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMjg4LDggKzI4OCw4IEBAIHByb3RlY3Rl
ZDoKICAgICAgICAgQVNTRVJUKGluZm8ucmVnaXN0ZXJGb3JtYXQoKSA9PSBEYXRhRm9ybWF0RG91
YmxlKTsKIAogICAgICAgICBpZiAobm9kZS5pc0NvbnN0YW50KCkpIHsKLSAgICAgICAgICAgIEFT
U0VSVChpc0RvdWJsZUNvbnN0YW50KG5vZGVJbmRleCkpOwotICAgICAgICAgICAgbV9qaXQubW92
ZShKSVRDb21waWxlcjo6SW1tUHRyKGJpdHdpc2VfY2FzdDx2b2lkKj4odmFsdWVPZkRvdWJsZUNv
bnN0YW50KG5vZGVJbmRleCkpKSwgY2FuVHJhbXBsZSk7CisgICAgICAgICAgICBBU1NFUlQoaXNO
dW1iZXJDb25zdGFudChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgIG1faml0Lm1vdmUoSklUQ29t
cGlsZXI6OkltbVB0cihiaXR3aXNlX2Nhc3Q8dm9pZCo+KHZhbHVlT2ZOdW1iZXJDb25zdGFudChu
b2RlSW5kZXgpKSksIGNhblRyYW1wbGUpOwogICAgICAgICAgICAgbV9qaXQubW92ZVB0clRvRG91
YmxlKGNhblRyYW1wbGUsIGluZm8uZnByKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAg
ICB9CkBAIC00MDcsNyArNDA3LDcgQEAgcHJvdGVjdGVkOgogICAgICAgICBtX2ppdC5zdG9yZVB0
cihyZWcsIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKHNwaWxsTWUpKTsKICAgICAgICAgaW5mby5z
cGlsbCgoRGF0YUZvcm1hdCkoc3BpbGxGb3JtYXQgfCBEYXRhRm9ybWF0SlMpKTsKICAgICB9Ci0K
KyAgICAKICAgICBib29sIGlzS25vd25JbnRlZ2VyKE5vZGVJbmRleCk7CiAgICAgYm9vbCBpc0tu
b3duTnVtZXJpYyhOb2RlSW5kZXgpOwogICAgIGJvb2wgaXNLbm93bkNlbGwoTm9kZUluZGV4KTsK
QEAgLTQyMSw5ICs0MjEsMTAgQEAgcHJvdGVjdGVkOgogICAgIGJvb2wgaXNKU0NvbnN0YW50KE5v
ZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0dXJuIG1faml0LmlzSlNDb25zdGFudChub2RlSW5kZXgp
OyB9CiAgICAgYm9vbCBpc0ludDMyQ29uc3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1
cm4gbV9qaXQuaXNJbnQzMkNvbnN0YW50KG5vZGVJbmRleCk7IH0KICAgICBib29sIGlzRG91Ymxl
Q29uc3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gbV9qaXQuaXNEb3VibGVDb25z
dGFudChub2RlSW5kZXgpOyB9CisgICAgYm9vbCBpc051bWJlckNvbnN0YW50KE5vZGVJbmRleCBu
b2RlSW5kZXgpIHsgcmV0dXJuIG1faml0LmlzTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KTsgfQog
ICAgIGJvb2wgaXNCb29sZWFuQ29uc3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4g
bV9qaXQuaXNCb29sZWFuQ29uc3RhbnQobm9kZUluZGV4KTsgfQogICAgIGludDMyX3QgdmFsdWVP
ZkludDMyQ29uc3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gbV9qaXQudmFsdWVP
ZkludDMyQ29uc3RhbnQobm9kZUluZGV4KTsgfQotICAgIGRvdWJsZSB2YWx1ZU9mRG91YmxlQ29u
c3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gbV9qaXQudmFsdWVPZkRvdWJsZUNv
bnN0YW50KG5vZGVJbmRleCk7IH0KKyAgICBkb3VibGUgdmFsdWVPZk51bWJlckNvbnN0YW50KE5v
ZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0dXJuIG1faml0LnZhbHVlT2ZOdW1iZXJDb25zdGFudChu
b2RlSW5kZXgpOyB9CiAgICAgSlNWYWx1ZSB2YWx1ZU9mSlNDb25zdGFudChOb2RlSW5kZXggbm9k
ZUluZGV4KSB7IHJldHVybiBtX2ppdC52YWx1ZU9mSlNDb25zdGFudChub2RlSW5kZXgpOyB9CiAg
ICAgYm9vbCB2YWx1ZU9mQm9vbGVhbkNvbnN0YW50KE5vZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0
dXJuIG1faml0LnZhbHVlT2ZCb29sZWFuQ29uc3RhbnQobm9kZUluZGV4KTsgfQogICAgIGJvb2wg
aXNOdWxsQ29uc3RhbnQoTm9kZUluZGV4IG5vZGVJbmRleCkKQEAgLTY2Nyw3ICs2NjgsNyBAQCBw
cm90ZWN0ZWQ6CiAgICAgfQogICAgIHZvaWQgaW5pdENvbnN0YW50SW5mbyhOb2RlSW5kZXggbm9k
ZUluZGV4KQogICAgIHsKLSAgICAgICAgQVNTRVJUKGlzSW50MzJDb25zdGFudChub2RlSW5kZXgp
IHx8IGlzRG91YmxlQ29uc3RhbnQobm9kZUluZGV4KSB8fCBpc0pTQ29uc3RhbnQobm9kZUluZGV4
KSk7CisgICAgICAgIEFTU0VSVChpc0ludDMyQ29uc3RhbnQobm9kZUluZGV4KSB8fCBpc051bWJl
ckNvbnN0YW50KG5vZGVJbmRleCkgfHwgaXNKU0NvbnN0YW50KG5vZGVJbmRleCkpOwogICAgICAg
ICBOb2RlJiBub2RlID0gbV9qaXQuZ3JhcGgoKVtub2RlSW5kZXhdOwogICAgICAgICBtX2dlbmVy
YXRpb25JbmZvW25vZGUudmlydHVhbFJlZ2lzdGVyKCldLmluaXRDb25zdGFudChub2RlSW5kZXgs
IG5vZGUucmVmQ291bnQoKSk7CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdKSVRDb21waWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdKSVRDb21waWxlci5jcHAJKHJldmlzaW9uIDk1MDM2KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDgg
KzQ1LDggQEAgdm9pZCBKSVRDb21waWxlcjo6ZmlsbE51bWVyaWNUb0RvdWJsZShObwogICAgIE5v
ZGUmIG5vZGUgPSBncmFwaCgpW25vZGVJbmRleF07CiAKICAgICBpZiAobm9kZS5pc0NvbnN0YW50
KCkpIHsKLSAgICAgICAgQVNTRVJUKGlzRG91YmxlQ29uc3RhbnQobm9kZUluZGV4KSk7Ci0gICAg
ICAgIG1vdmUoTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPihy
ZWludGVycHJldERvdWJsZVRvSW50cHRyKHZhbHVlT2ZEb3VibGVDb25zdGFudChub2RlSW5kZXgp
KSkpLCB0ZW1wb3JhcnkpOworICAgICAgICBBU1NFUlQoaXNOdW1iZXJDb25zdGFudChub2RlSW5k
ZXgpKTsKKyAgICAgICAgbW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKHJlaW50ZXJwcmV0X2Nh
c3Q8dm9pZCo+KHJlaW50ZXJwcmV0RG91YmxlVG9JbnRwdHIodmFsdWVPZk51bWJlckNvbnN0YW50
KG5vZGVJbmRleCkpKSksIHRlbXBvcmFyeSk7CiAgICAgICAgIG1vdmVQdHJUb0RvdWJsZSh0ZW1w
b3JhcnksIGZwcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbG9hZFB0cihhZGRyZXNzRm9yKG5v
ZGUudmlydHVhbFJlZ2lzdGVyKCkpLCB0ZW1wb3JhcnkpOwpAQCAtODYsOCArODYsOCBAQCB2b2lk
IEpJVENvbXBpbGVyOjpmaWxsVG9KUyhOb2RlSW5kZXggbm9kCiAgICAgICAgIGlmIChpc0ludDMy
Q29uc3RhbnQobm9kZUluZGV4KSkgewogICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVlID0ganNO
dW1iZXIodmFsdWVPZkludDMyQ29uc3RhbnQobm9kZUluZGV4KSk7CiAgICAgICAgICAgICBtb3Zl
KE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzVmFsdWUpKSwgZ3ByKTsK
LSAgICAgICAgfSBlbHNlIGlmIChpc0RvdWJsZUNvbnN0YW50KG5vZGVJbmRleCkpIHsKLSAgICAg
ICAgICAgIEpTVmFsdWUganNWYWx1ZShKU1ZhbHVlOjpFbmNvZGVBc0RvdWJsZSwgdmFsdWVPZkRv
dWJsZUNvbnN0YW50KG5vZGVJbmRleCkpOworICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyQ29u
c3RhbnQobm9kZUluZGV4KSkgeworICAgICAgICAgICAgSlNWYWx1ZSBqc1ZhbHVlKEpTVmFsdWU6
OkVuY29kZUFzRG91YmxlLCB2YWx1ZU9mTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSk7CiAgICAg
ICAgICAgICBtb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzVmFs
dWUpKSwgZ3ByKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFTU0VSVChpc0pTQ29u
c3RhbnQobm9kZUluZGV4KSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJ
VENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdK
SVRDb21waWxlci5oCShyZXZpc2lvbiA5NTAzNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjUxLDExICsyNTEsMTIgQEAg
cHVibGljOgogICAgIGJvb2wgaXNKU0NvbnN0YW50KE5vZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0
dXJuIGdyYXBoKCkuaXNKU0NvbnN0YW50KG5vZGVJbmRleCk7IH0KICAgICBib29sIGlzSW50MzJD
b25zdGFudChOb2RlSW5kZXggbm9kZUluZGV4KSB7IHJldHVybiBncmFwaCgpLmlzSW50MzJDb25z
dGFudChjb2RlQmxvY2soKSwgbm9kZUluZGV4KTsgfQogICAgIGJvb2wgaXNEb3VibGVDb25zdGFu
dChOb2RlSW5kZXggbm9kZUluZGV4KSB7IHJldHVybiBncmFwaCgpLmlzRG91YmxlQ29uc3RhbnQo
Y29kZUJsb2NrKCksIG5vZGVJbmRleCk7IH0KKyAgICBib29sIGlzTnVtYmVyQ29uc3RhbnQoTm9k
ZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gZ3JhcGgoKS5pc051bWJlckNvbnN0YW50KGNvZGVC
bG9jaygpLCBub2RlSW5kZXgpOyB9CiAgICAgYm9vbCBpc0Jvb2xlYW5Db25zdGFudChOb2RlSW5k
ZXggbm9kZUluZGV4KSB7IHJldHVybiBncmFwaCgpLmlzQm9vbGVhbkNvbnN0YW50KGNvZGVCbG9j
aygpLCBub2RlSW5kZXgpOyB9CiAgICAgLy8gSGVscGVyIG1ldGhvZHMgZ2V0IGNvbnN0YW50IHZh
bHVlcyBmcm9tIG5vZGVzLgogICAgIEpTVmFsdWUgdmFsdWVPZkpTQ29uc3RhbnQoTm9kZUluZGV4
IG5vZGVJbmRleCkgeyByZXR1cm4gZ3JhcGgoKS52YWx1ZU9mSlNDb25zdGFudChjb2RlQmxvY2so
KSwgbm9kZUluZGV4KTsgfQogICAgIGludDMyX3QgdmFsdWVPZkludDMyQ29uc3RhbnQoTm9kZUlu
ZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gZ3JhcGgoKS52YWx1ZU9mSW50MzJDb25zdGFudChjb2Rl
QmxvY2soKSwgbm9kZUluZGV4KTsgfQotICAgIGRvdWJsZSB2YWx1ZU9mRG91YmxlQ29uc3RhbnQo
Tm9kZUluZGV4IG5vZGVJbmRleCkgeyByZXR1cm4gZ3JhcGgoKS52YWx1ZU9mRG91YmxlQ29uc3Rh
bnQoY29kZUJsb2NrKCksIG5vZGVJbmRleCk7IH0KKyAgICBkb3VibGUgdmFsdWVPZk51bWJlckNv
bnN0YW50KE5vZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0dXJuIGdyYXBoKCkudmFsdWVPZk51bWJl
ckNvbnN0YW50KGNvZGVCbG9jaygpLCBub2RlSW5kZXgpOyB9CiAgICAgYm9vbCB2YWx1ZU9mQm9v
bGVhbkNvbnN0YW50KE5vZGVJbmRleCBub2RlSW5kZXgpIHsgcmV0dXJuIGdyYXBoKCkudmFsdWVP
ZkJvb2xlYW5Db25zdGFudChjb2RlQmxvY2soKSwgbm9kZUluZGV4KTsgfQogCiAgICAgLy8gVGhl
c2UgbWV0aG9kcyBKSVQgZ2VuZXJhdGUgZHluYW1pYywgZGVidWctb25seSBjaGVja3MgLSBha2lu
IHRvIEFTU0VSVHMuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkocmV2aXNp
b24gOTUwMzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMTIyLDcgKzEyMiw3IEBAIHByaXZhdGU6CiAKIC8vIFRoZXNlIHZhbHVlcyBy
ZWNvcmQgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBub2RlIChhcyBjaGVja2VkIGJ5IE5vZGVSZXN1
bHRNYXNrLCBhYm92ZSksIDAgZm9yIG5vIHJlc3VsdC4KICNkZWZpbmUgTm9kZVJlc3VsdEpTICAg
ICAgMHgxMDAwCi0jZGVmaW5lIE5vZGVSZXN1bHREb3VibGUgIDB4MjAwMAorI2RlZmluZSBOb2Rl
UmVzdWx0TnVtYmVyICAweDIwMDAKICNkZWZpbmUgTm9kZVJlc3VsdEludDMyICAgMHgzMDAwCiAj
ZGVmaW5lIE5vZGVSZXN1bHRCb29sZWFuIDB4NDAwMAogCkBAIC0xNDcsMTYgKzE0NywxNiBAQCBw
cml2YXRlOgogICAgIC8qIEJpdHdpc2Ugb3BlcmF0b3JzIGNhbGwgVG9JbnQzMiBvbiB0aGVpciBv
cGVyYW5kcy4gKi9cCiAgICAgbWFjcm8oVmFsdWVUb0ludDMyLCBOb2RlUmVzdWx0SW50MzIgfCBO
b2RlTXVzdEdlbmVyYXRlKSBcCiAgICAgLyogVXNlZCB0byBib3ggdGhlIHJlc3VsdCBvZiBVUlNo
aWZ0IG5vZGVzIChyZXN1bHQgaGFzIHJhbmdlIDAuLjJeMzItMSkuICovXAotICAgIG1hY3JvKFVJ
bnQzMlRvTnVtYmVyLCBOb2RlUmVzdWx0RG91YmxlKSBcCisgICAgbWFjcm8oVUludDMyVG9OdW1i
ZXIsIE5vZGVSZXN1bHROdW1iZXIpIFwKICAgICBcCiAgICAgLyogTm9kZXMgZm9yIGFyaXRobWV0
aWMgb3BlcmF0aW9ucy4gKi9cCi0gICAgbWFjcm8oQXJpdGhBZGQsIE5vZGVSZXN1bHREb3VibGUp
IFwKLSAgICBtYWNybyhBcml0aFN1YiwgTm9kZVJlc3VsdERvdWJsZSkgXAotICAgIG1hY3JvKEFy
aXRoTXVsLCBOb2RlUmVzdWx0RG91YmxlKSBcCi0gICAgbWFjcm8oQXJpdGhEaXYsIE5vZGVSZXN1
bHREb3VibGUpIFwKLSAgICBtYWNybyhBcml0aE1vZCwgTm9kZVJlc3VsdERvdWJsZSkgXAorICAg
IG1hY3JvKEFyaXRoQWRkLCBOb2RlUmVzdWx0TnVtYmVyKSBcCisgICAgbWFjcm8oQXJpdGhTdWIs
IE5vZGVSZXN1bHROdW1iZXIpIFwKKyAgICBtYWNybyhBcml0aE11bCwgTm9kZVJlc3VsdE51bWJl
cikgXAorICAgIG1hY3JvKEFyaXRoRGl2LCBOb2RlUmVzdWx0TnVtYmVyKSBcCisgICAgbWFjcm8o
QXJpdGhNb2QsIE5vZGVSZXN1bHROdW1iZXIpIFwKICAgICAvKiBBcml0aG1ldGljIG9wZXJhdG9y
cyBjYWxsIFRvTnVtYmVyIG9uIHRoZWlyIG9wZXJhbmRzLiAqL1wKLSAgICBtYWNybyhWYWx1ZVRv
TnVtYmVyLCBOb2RlUmVzdWx0RG91YmxlIHwgTm9kZU11c3RHZW5lcmF0ZSkgXAorICAgIG1hY3Jv
KFZhbHVlVG9OdW1iZXIsIE5vZGVSZXN1bHROdW1iZXIgfCBOb2RlTXVzdEdlbmVyYXRlKSBcCiAg
ICAgXAogICAgIC8qIEFkZCBvZiB2YWx1ZXMgbWF5IGVpdGhlciBiZSBhcml0aG1ldGljLCBvciBy
ZXN1bHQgaW4gc3RyaW5nIGNvbmNhdGVuYXRpb24uICovXAogICAgIG1hY3JvKFZhbHVlQWRkLCBO
b2RlUmVzdWx0SlMgfCBOb2RlTXVzdEdlbmVyYXRlKSBcCkBAIC0zMTcsNyArMzE3LDE3IEBAIHN0
cnVjdCBOb2RlIHsKICAgICAKICAgICBib29sIGlzRG91YmxlQ29uc3RhbnQoQ29kZUJsb2NrKiBj
b2RlQmxvY2spCiAgICAgewotICAgICAgICByZXR1cm4gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZK
U0NvbnN0YW50KGNvZGVCbG9jaykuaXNOdW1iZXIoKTsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBp
c0NvbnN0YW50KCkgJiYgdmFsdWVPZkpTQ29uc3RhbnQoY29kZUJsb2NrKS5pc0RvdWJsZSgpOwor
ICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgQVNTRVJUKCFpc0ludDMyQ29uc3RhbnQo
Y29kZUJsb2NrKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGJv
b2wgaXNOdW1iZXJDb25zdGFudChDb2RlQmxvY2sqIGNvZGVCbG9jaykKKyAgICB7CisgICAgICAg
IGJvb2wgcmVzdWx0ID0gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZKU0NvbnN0YW50KGNvZGVCbG9j
aykuaXNOdW1iZXIoKTsKKyAgICAgICAgQVNTRVJUKHJlc3VsdCA9PSAoaXNJbnQzMkNvbnN0YW50
KGNvZGVCbG9jaykgfHwgaXNEb3VibGVDb25zdGFudChjb2RlQmxvY2spKSk7CisgICAgICAgIHJl
dHVybiByZXN1bHQ7CiAgICAgfQogICAgIAogICAgIGJvb2wgaXNCb29sZWFuQ29uc3RhbnQoQ29k
ZUJsb2NrKiBjb2RlQmxvY2spCkBAIC0zMzAsMTAgKzM0MCwxMCBAQCBzdHJ1Y3QgTm9kZSB7CiAg
ICAgICAgIEFTU0VSVChpc0ludDMyQ29uc3RhbnQoY29kZUJsb2NrKSk7CiAgICAgICAgIHJldHVy
biB2YWx1ZU9mSlNDb25zdGFudChjb2RlQmxvY2spLmFzSW50MzIoKTsKICAgICB9Ci0KLSAgICBk
b3VibGUgdmFsdWVPZkRvdWJsZUNvbnN0YW50KENvZGVCbG9jayogY29kZUJsb2NrKQorICAgIAor
ICAgIGRvdWJsZSB2YWx1ZU9mTnVtYmVyQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiAg
ICAgewotICAgICAgICBBU1NFUlQoaXNEb3VibGVDb25zdGFudChjb2RlQmxvY2spKTsKKyAgICAg
ICAgQVNTRVJUKGlzTnVtYmVyQ29uc3RhbnQoY29kZUJsb2NrKSk7CiAgICAgICAgIHJldHVybiB2
YWx1ZU9mSlNDb25zdGFudChjb2RlQmxvY2spLnVuY2hlY2tlZEdldE51bWJlcigpOwogICAgIH0K
ICAgICAKQEAgLTM5MCwxMiArNDAwLDEyIEBAIHN0cnVjdCBOb2RlIHsKICAgICB7CiAgICAgICAg
IHJldHVybiAob3AgJiBOb2RlUmVzdWx0TWFzaykgPT0gTm9kZVJlc3VsdEludDMyOwogICAgIH0K
LQotICAgIGJvb2wgaGFzRG91YmxlUmVzdWx0KCkKKyAgICAKKyAgICBib29sIGhhc051bWJlclJl
c3VsdCgpCiAgICAgewotICAgICAgICByZXR1cm4gKG9wICYgTm9kZVJlc3VsdE1hc2spID09IE5v
ZGVSZXN1bHREb3VibGU7CisgICAgICAgIHJldHVybiAob3AgJiBOb2RlUmVzdWx0TWFzaykgPT0g
Tm9kZVJlc3VsdE51bWJlcjsKICAgICB9Ci0KKyAgICAKICAgICBib29sIGhhc0pTUmVzdWx0KCkK
ICAgICB7CiAgICAgICAgIHJldHVybiAob3AgJiBOb2RlUmVzdWx0TWFzaykgPT0gTm9kZVJlc3Vs
dEpTOwpAQCAtNDA2LDEyICs0MTYsNiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIHJldHVybiAo
b3AgJiBOb2RlUmVzdWx0TWFzaykgPT0gTm9kZVJlc3VsdEJvb2xlYW47CiAgICAgfQogCi0gICAg
Ly8gQ2hlY2sgZm9yIGludGVnZXJzIG9yIGRvdWJsZXMuCi0gICAgYm9vbCBoYXNOdW1lcmljUmVz
dWx0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBoYXNJbnQzMlJlc3VsdCgpIHx8IGhhc0RvdWJs
ZVJlc3VsdCgpOwotICAgIH0KLQogICAgIGJvb2wgaXNKdW1wKCkKICAgICB7CiAgICAgICAgIHJl
dHVybiBvcCAmIE5vZGVJc0p1bXA7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R05vblNwZWN1bGF0aXZlSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR05vblNwZWN1bGF0aXZlSklULmNwcAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vblNwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTkyLDcgKzE5Miw3IEBAIHZvaWQgTm9uU3BlY3VsYXRpdmVKSVQ6Omtub3duQ29u
c3RhbnRBcmkKICAgICAgICAgaGF2ZVZhbHVlLmxpbmsoJm1faml0KTsKICAgICB9CiAgICAgCi0g
ICAgbV9qaXQubW92ZShNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9p
ZCo+KHJlaW50ZXJwcmV0RG91YmxlVG9JbnRwdHIodmFsdWVPZkRvdWJsZUNvbnN0YW50KGltbUNo
aWxkKSkpKSwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC5tb3ZlKE1hY3JvQXNzZW1ibGVyOjpJbW1Q
dHIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVpbnRlcnByZXREb3VibGVUb0ludHB0cih2YWx1
ZU9mTnVtYmVyQ29uc3RhbnQoaW1tQ2hpbGQpKSkpLCByZXN1bHRHUFIpOwogICAgIG1faml0Lm1v
dmVQdHJUb0RvdWJsZShyZXN1bHRHUFIsIHRtcDFGUFIpOwogICAgIHN3aXRjaCAob3ApIHsKICAg
ICBjYXNlIFZhbHVlQWRkOgpAQCAtNTc3LDcgKzU3Nyw3IEBAIHZvaWQgTm9uU3BlY3VsYXRpdmVK
SVQ6OmNvbXBpbGUoU3BlY3VsYXQKICAgICAgICAgfQogCiAgICAgICAgIEdlbmVyYXRpb25JbmZv
JiBjaGlsZEluZm8gPSBtX2dlbmVyYXRpb25JbmZvW21faml0LmdyYXBoKClbbm9kZS5jaGlsZDEo
KV0udmlydHVhbFJlZ2lzdGVyKCldOwotICAgICAgICBpZiAoKGNoaWxkSW5mby5yZWdpc3RlckZv
cm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9PSBEYXRhRm9ybWF0SlNEb3VibGUpIHsKKyAgICAgICAg
aWYgKGlzSlNEb3VibGUoY2hpbGRJbmZvLnJlZ2lzdGVyRm9ybWF0KCkpKSB7CiAgICAgICAgICAg
ICBEb3VibGVPcGVyYW5kIG9wMSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKICAgICAgICAgICAgIEdQ
UlRlbXBvcmFyeSByZXN1bHQodGhpcyk7CiAgICAgICAgICAgICBGUFJSZWcgZnByID0gb3AxLmZw
cigpOwpAQCAtNTk3LDcgKzU5Nyw3IEBAIHZvaWQgTm9uU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUo
U3BlY3VsYXQKIAogICAgIGNhc2UgVmFsdWVUb051bWJlcjogewogICAgICAgICBBU1NFUlQoIWlz
SW50MzJDb25zdGFudChub2RlLmNoaWxkMSgpKSk7Ci0gICAgICAgIEFTU0VSVCghaXNEb3VibGVD
b25zdGFudChub2RlLmNoaWxkMSgpKSk7CisgICAgICAgIEFTU0VSVCghaXNOdW1iZXJDb25zdGFu
dChub2RlLmNoaWxkMSgpKSk7CiAKICAgICAgICAgaWYgKGlzS25vd25OdW1lcmljKG5vZGUuY2hp
bGQxKCkpKSB7CiAgICAgICAgICAgICBKU1ZhbHVlT3BlcmFuZCBvcDEodGhpcywgbm9kZS5jaGls
ZDEoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0
aXZlSklULmNwcAkocmV2aXNpb24gOTUwMzYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcyLDkgKzI3Miw5IEBA
IEZQUlJlZyBTcGVjdWxhdGl2ZUpJVDo6ZmlsbFNwZWN1bGF0ZURvdWIKICAgICAgICAgICAgICAg
ICBpbmZvLmZpbGxEb3VibGUoZnByKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZnByOwogICAg
ICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzRG91YmxlQ29uc3RhbnQobm9kZUluZGV4KSkg
eworICAgICAgICAgICAgaWYgKGlzTnVtYmVyQ29uc3RhbnQobm9kZUluZGV4KSkgewogICAgICAg
ICAgICAgICAgIEZQUlJlZyBmcHIgPSBmcHJBbGxvY2F0ZSgpOwotICAgICAgICAgICAgICAgIG1f
aml0Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPihy
ZWludGVycHJldERvdWJsZVRvSW50cHRyKHZhbHVlT2ZEb3VibGVDb25zdGFudChub2RlSW5kZXgp
KSkpLCBncHIpOworICAgICAgICAgICAgICAgIG1faml0Lm1vdmUoTWFjcm9Bc3NlbWJsZXI6Oklt
bVB0cihyZWludGVycHJldF9jYXN0PHZvaWQqPihyZWludGVycHJldERvdWJsZVRvSW50cHRyKHZh
bHVlT2ZOdW1iZXJDb25zdGFudChub2RlSW5kZXgpKSkpLCBncHIpOwogICAgICAgICAgICAgICAg
IG1faml0Lm1vdmVQdHJUb0RvdWJsZShncHIsIGZwcik7CiAgICAgICAgICAgICAgICAgdW5sb2Nr
KGdwcik7CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVK
SVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0
aXZlSklULmgJKHJldmlzaW9uIDk1MDM2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNTEsOCArMzUxLDcgQEAgcHJp
dmF0ZToKICAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmly
dHVhbFJlZ2lzdGVyKCk7CiAgICAgICAgIEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0
aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJdOwogICAgICAgICAKLSAgICAgICAgcmV0dXJuIChpbmZv
LnJlZ2lzdGVyRm9ybWF0KCkgfCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0ludGVnZXIK
LSAgICAgICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0KCkgfCBEYXRhRm9ybWF0SlMpID09IERh
dGFGb3JtYXRKU0ludGVnZXI7CisgICAgICAgIHJldHVybiBpbmZvLmlzSlNJbnRlZ2VyKCk7CiAg
ICAgfQogICAgIAogICAgIGJvb2wgc2hvdWxkU3BlY3VsYXRlSW50ZWdlcihOb2RlSW5kZXggbm9k
ZUluZGV4KQpAQCAtMzY1LDE1ICszNjQsMTggQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICB9Ci0KKyAgICAKICAgICBib29sIHNob3VsZFNwZWN1bGF0ZURv
dWJsZShOb2RlSW5kZXggbm9kZUluZGV4KQogICAgIHsKKyAgICAgICAgaWYgKGlzRG91YmxlQ29u
c3RhbnQobm9kZUluZGV4KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCiAgICAgICAgIE5v
ZGUmIG5vZGUgPSBtX2ppdC5ncmFwaCgpW25vZGVJbmRleF07CisKICAgICAgICAgVmlydHVhbFJl
Z2lzdGVyIHZpcnR1YWxSZWdpc3RlciA9IG5vZGUudmlydHVhbFJlZ2lzdGVyKCk7CiAgICAgICAg
IEdlbmVyYXRpb25JbmZvJiBpbmZvID0gbV9nZW5lcmF0aW9uSW5mb1t2aXJ0dWFsUmVnaXN0ZXJd
OwogCi0gICAgICAgIGlmICgoaW5mby5yZWdpc3RlckZvcm1hdCgpIHwgRGF0YUZvcm1hdEpTKSA9
PSBEYXRhRm9ybWF0SlNEb3VibGUKLSAgICAgICAgICAgIHx8IChpbmZvLnNwaWxsRm9ybWF0KCkg
fCBEYXRhRm9ybWF0SlMpID09IERhdGFGb3JtYXRKU0RvdWJsZSkKKyAgICAgICAgaWYgKGluZm8u
aXNKU0RvdWJsZSgpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIAogICAgICAg
ICBpZiAoaXNEb3VibGVQcmVkaWN0aW9uKG1faml0LmdyYXBoKCkuZ2V0UHJlZGljdGlvbihub2Rl
KSkpCkBAIC0zODIsOSArMzg0LDM0IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICB9CiAgICAgCisgICAgYm9vbCBzaG91bGROb3RTcGVjdWxhdGVJbnRlZ2VyKE5vZGVJbmRl
eCBub2RlSW5kZXgpCisgICAgeworICAgICAgICBpZiAoaXNEb3VibGVDb25zdGFudChub2RlSW5k
ZXgpKSB7CisgICAgICAgICAgICBwcmludGYoIiVkIGlzIGEgZG91YmxlIGNvbnN0YW50LlxuIiwg
bm9kZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAg
ICAgTm9kZSYgbm9kZSA9IG1faml0LmdyYXBoKClbbm9kZUluZGV4XTsKKworICAgICAgICBWaXJ0
dWFsUmVnaXN0ZXIgdmlydHVhbFJlZ2lzdGVyID0gbm9kZS52aXJ0dWFsUmVnaXN0ZXIoKTsKKyAg
ICAgICAgR2VuZXJhdGlvbkluZm8mIGluZm8gPSBtX2dlbmVyYXRpb25JbmZvW3ZpcnR1YWxSZWdp
c3Rlcl07CisKKyAgICAgICAgaWYgKGluZm8uaXNKU0RvdWJsZSgpKSB7CisgICAgICAgICAgICBw
cmludGYoIiVkIHByb2R1Y2VzIGEgZG91YmxlLlxuIiwgbm9kZUluZGV4KTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9qaXQuZ3Jh
cGgoKS5nZXRQcmVkaWN0aW9uKG5vZGUpICYgUHJlZGljdERvdWJsZSkgeworICAgICAgICAgICAg
cHJpbnRmKCIlZCBoYXMgYSBkb3VibGUgcHJlZGljdGlvbi5cbiIsIG5vZGVJbmRleCk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICAKICAgICBib29sIHNob3VsZFNwZWN1bGF0ZUludGVnZXIoTm9k
ZUluZGV4IG9wMSwgTm9kZUluZGV4IG9wMikKICAgICB7Ci0gICAgICAgIHJldHVybiAhKHNob3Vs
ZFNwZWN1bGF0ZURvdWJsZShvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZURvdWJsZShvcDIpKSAmJiAo
c2hvdWxkU3BlY3VsYXRlSW50ZWdlcihvcDEpIHx8IHNob3VsZFNwZWN1bGF0ZUludGVnZXIob3Ay
KSk7CisgICAgICAgIHJldHVybiAhKHNob3VsZE5vdFNwZWN1bGF0ZUludGVnZXIob3AxKSB8fCBz
aG91bGROb3RTcGVjdWxhdGVJbnRlZ2VyKG9wMikpICYmIChzaG91bGRTcGVjdWxhdGVJbnRlZ2Vy
KG9wMSkgfHwgc2hvdWxkU3BlY3VsYXRlSW50ZWdlcihvcDIpKTsKICAgICB9CiAKICAgICBib29s
IGNvbXBhcmUoTm9kZSYsIE1hY3JvQXNzZW1ibGVyOjpSZWxhdGlvbmFsQ29uZGl0aW9uLCBNYWNy
b0Fzc2VtYmxlcjo6RG91YmxlQ29uZGl0aW9uLCBaX0RGR09wZXJhdGlvbl9FSkopOwo=
</data>
<flag name="review"
          id="103875"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>